mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-16 06:41:39 -04:00
Create a simple kdoc-test.yaml to be used to create unit tests for kernel-doc parser and output classes. For now, all we want is a simple function mapped on a yaml test using the defined schema. To be sure that the schema is followed, add an unittest for the file, which will also validate that the schema is properly parsed. It should be noticed that the .TH definition for the man format contains a timestamp. We'll need to handle that when dealing with the actual implementation for the ManOutput class unit tests. Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org> Signed-off-by: Jonathan Corbet <corbet@lwn.net> Message-ID: <74883976348c964f00161696d525c33ddd8c7641.1773823995.git.mchehab+huawei@kernel.org>
95 lines
2.6 KiB
Python
Executable File
95 lines
2.6 KiB
Python
Executable File
#!/usr/bin/env python3
|
||
# SPDX-License-Identifier: GPL-2.0
|
||
"""
|
||
Unit‑test driver for kernel‑doc YAML tests.
|
||
|
||
Two kinds of tests are defined:
|
||
|
||
* **Schema‑validation tests** – if ``jsonschema`` is available, the
|
||
YAML files in this directory are validated against the JSON‑Schema
|
||
described in ``kdoc-test-schema.yaml``. When the library is not
|
||
present, a warning is emitted and the validation step is simply
|
||
skipped – the dynamic kernel‑doc tests still run.
|
||
|
||
* **Kernel‑doc tests** – dynamically generate one test method per
|
||
scenario in ``kdoc-test.yaml``. Each method simply forwards
|
||
the data to ``self.run_test`` – you only need to implement that
|
||
helper in your own code.
|
||
|
||
File names are kept as module‑level constants so that the
|
||
implementation stays completely independent of ``pathlib``.
|
||
"""
|
||
|
||
import os
|
||
import sys
|
||
import warnings
|
||
import yaml
|
||
import unittest
|
||
from typing import Any, Dict, List
|
||
|
||
SRC_DIR = os.path.dirname(os.path.realpath(__file__))
|
||
sys.path.insert(0, os.path.join(SRC_DIR, "../lib/python"))
|
||
|
||
from unittest_helper import run_unittest
|
||
|
||
|
||
#
|
||
# Files to read
|
||
#
|
||
BASE = os.path.realpath(os.path.dirname(__file__))
|
||
|
||
SCHEMA_FILE = os.path.join(BASE, "kdoc-test-schema.yaml")
|
||
TEST_FILE = os.path.join(BASE, "kdoc-test.yaml")
|
||
|
||
#
|
||
# Schema‑validation test
|
||
#
|
||
class TestYAMLSchemaValidation(unittest.TestCase):
|
||
"""
|
||
Checks if TEST_FILE matches SCHEMA_FILE.
|
||
"""
|
||
|
||
@classmethod
|
||
def setUpClass(cls):
|
||
"""
|
||
Import jsonschema if available.
|
||
"""
|
||
|
||
try:
|
||
from jsonschema import Draft7Validator
|
||
except ImportError:
|
||
print("Warning: jsonschema package not available. Skipping schema validation")
|
||
cls.validator = None
|
||
return
|
||
|
||
with open(SCHEMA_FILE, encoding="utf-8") as fp:
|
||
cls.schema = yaml.safe_load(fp)
|
||
|
||
cls.validator = Draft7Validator(cls.schema)
|
||
|
||
def test_kdoc_test_yaml_followsschema(self):
|
||
"""
|
||
Run jsonschema validation if the validator is available.
|
||
If not, emit a warning and return without failing.
|
||
"""
|
||
if self.validator is None:
|
||
return
|
||
|
||
with open(TEST_FILE, encoding="utf-8") as fp:
|
||
data = yaml.safe_load(fp)
|
||
|
||
errors = self.validator.iter_errors(data)
|
||
|
||
msgs = []
|
||
for error in errors:
|
||
msgs.append(error.message)
|
||
|
||
if msgs:
|
||
self.fail("Schema validation failed:\n\t" + "\n\t".join(msgs))
|
||
|
||
# --------------------------------------------------------------------
|
||
# Entry point
|
||
# --------------------------------------------------------------------
|
||
if __name__ == "__main__":
|
||
run_unittest(__file__)
|