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__)
|