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