Add desc.json schema validation with compliance/data_gen extensions
Rename scripts utlities to tosa_* such as tosa_json2numpy
Signed-off-by: Jeremy Johnson <jeremy.johnson@arm.com>
Change-Id: Ie8d584e2afb189fb74cf96b39590c7c27444ba14
diff --git a/scripts/schemavalidation/schemavalidation.py b/scripts/schemavalidation/schemavalidation.py
new file mode 100644
index 0000000..2848edf
--- /dev/null
+++ b/scripts/schemavalidation/schemavalidation.py
@@ -0,0 +1,79 @@
+# Copyright (c) 2023, ARM Limited.
+# SPDX-License-Identifier: Apache-2.0
+"""Validates desc.json against its JSON schema."""
+import json
+from pathlib import Path
+
+from jsonschema import validate
+from referencing import Registry
+from referencing import Resource
+
+TD_SCHEMA_FULL = "full"
+TD_SCHEMA_DATA_GEN = "data_gen"
+TD_SCHEMA_COMPLIANCE = "compliance"
+
+# Default file info
+SCRIPT = Path(__file__).absolute()
+TD_SCHEMAS = {
+ TD_SCHEMA_DATA_GEN: "datagen-config.schema.json",
+ TD_SCHEMA_COMPLIANCE: "compliance-config.schema.json",
+ TD_SCHEMA_FULL: "desc.schema.json",
+}
+
+
+class TestDescSchemaValidator:
+ def __init__(self):
+ """Initialize by loading all the schemas and setting up a registry."""
+ self.registry = Registry()
+ self.schemas = {}
+ for key, name in TD_SCHEMAS.items():
+ schema_path = SCRIPT.parent / name
+ with schema_path.open("r") as fd:
+ schema = json.load(fd)
+ self.schemas[key] = schema
+ if key != TD_SCHEMA_FULL:
+ resource = Resource.from_contents(schema)
+ self.registry = self.registry.with_resource(uri=name, resource=resource)
+
+ def validate_config(self, config, schema_type=TD_SCHEMA_FULL):
+ """Validate the whole (or partial) config versus the relevant schema."""
+ validate(config, self.schemas[schema_type], registry=self.registry)
+
+
+def main(argv=None):
+ """Command line interface for the schema validation."""
+ import argparse
+
+ parser = argparse.ArgumentParser()
+ parser.add_argument(
+ "path", type=Path, help="the path to the test directory to validate"
+ )
+ args = parser.parse_args(argv)
+ test_path = args.path
+
+ if not test_path.is_dir():
+ print(f"ERROR: Invalid directory - {test_path}")
+ return 2
+
+ test_desc_path = test_path / "desc.json"
+
+ if not test_desc_path.is_file():
+ print(f"ERROR: No test description found: {test_desc_path}")
+ return 2
+
+ # Load the JSON desc.json
+ try:
+ with test_desc_path.open("r") as fd:
+ test_desc = json.load(fd)
+ except Exception as e:
+ print(f"ERROR: Loading {test_desc_path} - {repr(e)}")
+ return 2
+
+ sv = TestDescSchemaValidator()
+ sv.validate_config(test_desc, TD_SCHEMA_FULL)
+
+ return 0
+
+
+if __name__ == "__main__":
+ exit(main())