summaryrefslogtreecommitdiff
path: root/tools/unittests/test_kdoc_test_schema.py
blob: 9eceeba0044021b747fd33b80f5cbb2c8104ee3b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/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__)