| #!/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__) |