diff options
| author | J08nY | 2025-09-25 16:28:49 +0200 |
|---|---|---|
| committer | J08nY | 2025-09-25 16:28:49 +0200 |
| commit | daf9ec03ea0b7706079c834bef62d978caed29b1 (patch) | |
| tree | 997f251567dff857a8e9889b92ea8e319596d31a /tests | |
| parent | bce2ef9d06f52a98eb543d0760e0f9cd5108bed6 (diff) | |
| download | sec-certs-daf9ec03ea0b7706079c834bef62d978caed29b1.tar.gz sec-certs-daf9ec03ea0b7706079c834bef62d978caed29b1.tar.zst sec-certs-daf9ec03ea0b7706079c834bef62d978caed29b1.zip | |
Make a JSON schema for CC Certificate and Dataset objects.
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/cc/test_cc_analysis.py | 37 | ||||
| -rw-r--r-- | tests/cc/test_cc_certificate.py | 10 | ||||
| -rw-r--r-- | tests/cc/test_cc_dataset.py | 16 | ||||
| -rw-r--r-- | tests/data/cc/certificate/fictional_cert.json | 220 |
4 files changed, 173 insertions, 110 deletions
diff --git a/tests/cc/test_cc_analysis.py b/tests/cc/test_cc_analysis.py index 4606383c..42c97bac 100644 --- a/tests/cc/test_cc_analysis.py +++ b/tests/cc/test_cc_analysis.py @@ -1,14 +1,19 @@ from __future__ import annotations +import json import shutil from collections.abc import Generator from importlib import resources from pathlib import Path +from tempfile import TemporaryDirectory import pytest import tests.data.cc.analysis import tests.data.common +from jsonschema import Draft7Validator, validate +from referencing import Registry, Resource +import sec_certs.serialization.schemas from sec_certs.cert_rules import SARS_IMPLIED_FROM_EAL from sec_certs.dataset.auxiliary_dataset_handling import ( CPEDatasetHandler, @@ -258,3 +263,35 @@ def test_segment_extractor(reference_dataset: CCDataset): df = ReferenceSegmentExtractor()(reference_dataset.certs.values()) assert df is not None assert not df.empty + + +def test_schema_validate_single(reference_dataset: CCDataset): + with ( + resources.open_text(sec_certs.serialization.schemas, "cc_certificate.json") as schema_file, + TemporaryDirectory() as tmp_dir, + ): + schema = json.load(schema_file) + for cert in reference_dataset: + fname = Path(tmp_dir) / (cert.dgst + ".json") + cert.to_json(fname) + with fname.open("r") as handle: + validate(instance=json.load(handle), schema=schema) + + +def test_schema_validate_full(reference_dataset: CCDataset): + registry = Registry() + with ( + resources.open_text(sec_certs.serialization.schemas, "cc_certificate.json") as cert_schema_file, + resources.open_text(sec_certs.serialization.schemas, "cc_dataset.json") as dataset_schema_file, + ): + cert_schema = json.load(cert_schema_file) + registry = Resource.from_contents(cert_schema) @ registry + dataset_schema = json.load(dataset_schema_file) + registry = Resource.from_contents(dataset_schema) @ registry + validator = Draft7Validator(schema={"$ref": "http://sec-certs.org/schemas/cc_dataset.json"}, registry=registry) + + with TemporaryDirectory() as tmp_dir: + fname = Path(tmp_dir) / "dataset.json" + reference_dataset.to_json(fname) + with fname.open("r") as handle: + validator.validate(instance=json.load(handle)) diff --git a/tests/cc/test_cc_certificate.py b/tests/cc/test_cc_certificate.py index d24f4c30..d53663dd 100644 --- a/tests/cc/test_cc_certificate.py +++ b/tests/cc/test_cc_certificate.py @@ -7,7 +7,9 @@ from pathlib import Path import pytest import tests.data.cc.analysis import tests.data.cc.certificate +from jsonschema import validate +import sec_certs.serialization.schemas from sec_certs.dataset import CCDataset from sec_certs.sample import CCCertificate @@ -100,3 +102,11 @@ def test_cert_older_dgst(cert_one: CCCertificate): cert_one.report_link = None with pytest.raises(RuntimeError): cert_one.older_dgst + + +def test_schema_validation(data_dir: Path): + with ( + (data_dir / "fictional_cert.json").open("r") as cert, + resources.open_text(sec_certs.serialization.schemas, "cc_certificate.json") as schema, + ): + validate(json.load(cert), json.load(schema)) diff --git a/tests/cc/test_cc_dataset.py b/tests/cc/test_cc_dataset.py index 3d13edeb..071f5330 100644 --- a/tests/cc/test_cc_dataset.py +++ b/tests/cc/test_cc_dataset.py @@ -1,10 +1,13 @@ import json import shutil +from importlib import resources from pathlib import Path from tempfile import TemporaryDirectory import pytest +from jsonschema import validate +import sec_certs.serialization.schemas from sec_certs import constants from sec_certs.configuration import config from sec_certs.dataset.cc import CCDataset @@ -166,3 +169,16 @@ def test_to_pandas(toy_dataset: CCDataset): assert df.shape == (len(toy_dataset), len(CCCertificate.pandas_columns)) assert df.index.name == "dgst" assert set(df.columns) == (set(CCCertificate.pandas_columns).union({"year_from"})) - {"dgst"} + + +def test_schema_validate(toy_dataset: CCDataset): + with ( + resources.open_text(sec_certs.serialization.schemas, "cc_certificate.json") as schema_file, + TemporaryDirectory() as tmp_dir, + ): + schema = json.load(schema_file) + for cert in toy_dataset: + fname = Path(tmp_dir) / (cert.dgst + ".json") + cert.to_json(fname) + with fname.open("r") as handle: + validate(instance=json.load(handle), schema=schema) diff --git a/tests/data/cc/certificate/fictional_cert.json b/tests/data/cc/certificate/fictional_cert.json index 327aaf46..15b7f507 100644 --- a/tests/data/cc/certificate/fictional_cert.json +++ b/tests/data/cc/certificate/fictional_cert.json @@ -1,116 +1,116 @@ { - "_type": "sec_certs.sample.cc.CCCertificate", - "dgst": "8049938203b26f7b", - "status": "archived", - "category": "Sample category", - "name": "Sample certificate name", - "manufacturer": "Sample manufacturer", - "scheme": "Sample scheme", - "security_level": { - "_type": "Set", - "elements": [ - "Sample security level" - ] + "_type": "sec_certs.sample.cc.CCCertificate", + "dgst": "8049938203b26f7b", + "status": "archived", + "category": "Sample category", + "name": "Sample certificate name", + "manufacturer": "Sample manufacturer", + "scheme": "DE", + "security_level": { + "_type": "Set", + "elements": [ + "Sample security level" + ] + }, + "not_valid_before": "1900-01-02", + "not_valid_after": "1900-01-03", + "manufacturer_web": "https://path.to/manufacturer/web", + "protection_profile_links": { + "_type": "Set", + "elements": [ + "https://sample.pp" + ] + }, + "maintenance_updates": { + "_type": "Set", + "elements": [ + { + "_type": "sec_certs.sample.cc.CCCertificate.MaintenanceReport", + "maintenance_date": "1900-01-01", + "maintenance_title": "Sample maintenance", + "maintenance_report_link": "https://maintenance.up", + "maintenance_st_link": "https://maintenance.up" + } + ] + }, + "state": { + "_type": "sec_certs.sample.cc.CCCertificate.InternalState", + "report": { + "_type": "sec_certs.sample.document_state.DocumentState", + "download_ok": false, + "convert_garbage": false, + "convert_ok": false, + "extract_ok": false, + "pdf_hash": null, + "txt_hash": null }, - "not_valid_before": "1900-01-02", - "not_valid_after": "1900-01-03", - "manufacturer_web": "https://path.to/manufacturer/web", - "protection_profile_links": { - "_type": "Set", - "elements": [ - "https://sample.pp" - ] - }, - "maintenance_updates": { - "_type": "Set", - "elements": [ - { - "_type": "sec_certs.sample.cc.CCCertificate.MaintenanceReport", - "maintenance_date": "1900-01-01", - "maintenance_title": "Sample maintenance", - "maintenance_report_link": "https://maintenance.up", - "maintenance_st_link": "https://maintenance.up" - } - ] + "st": { + "_type": "sec_certs.sample.document_state.DocumentState", + "download_ok": false, + "convert_garbage": false, + "convert_ok": false, + "extract_ok": false, + "pdf_hash": null, + "txt_hash": null }, - "state": { - "_type": "sec_certs.sample.cc.CCCertificate.InternalState", - "report": { - "_type": "sec_certs.sample.document_state.DocumentState", - "download_ok": false, - "convert_garbage": false, - "convert_ok": false, - "extract_ok": false, - "pdf_hash": null, - "txt_hash": null - }, - "st": { - "_type": "sec_certs.sample.document_state.DocumentState", - "download_ok": false, - "convert_garbage": false, - "convert_ok": false, - "extract_ok": false, - "pdf_hash": null, - "txt_hash": null - }, - "cert": { - "_type": "sec_certs.sample.document_state.DocumentState", - "download_ok": false, - "convert_garbage": false, - "convert_ok": false, - "extract_ok": false, - "pdf_hash": null, - "txt_hash": null - } + "cert": { + "_type": "sec_certs.sample.document_state.DocumentState", + "download_ok": false, + "convert_garbage": false, + "convert_ok": false, + "extract_ok": false, + "pdf_hash": null, + "txt_hash": null + } + }, + "pdf_data": { + "_type": "sec_certs.sample.cc.CCCertificate.PdfData", + "report_metadata": null, + "st_metadata": null, + "cert_metadata": null, + "report_frontpage": null, + "st_frontpage": null, + "cert_frontpage": null, + "report_keywords": null, + "st_keywords": null, + "cert_keywords": null, + "report_filename": null, + "st_filename": null, + "cert_filename": null + }, + "heuristics": { + "_type": "sec_certs.sample.cc.CCCertificate.Heuristics", + "extracted_versions": null, + "cpe_matches": null, + "verified_cpe_matches": null, + "related_cves": null, + "cert_lab": null, + "cert_id": null, + "annotated_references": null, + "extracted_sars": null, + "direct_transitive_cves": null, + "indirect_transitive_cves": null, + "next_certificates": null, + "prev_certificates": null, + "report_references": { + "_type": "sec_certs.sample.certificate.References", + "directly_referenced_by": null, + "directly_referencing": null, + "indirectly_referenced_by": null, + "indirectly_referencing": null }, - "pdf_data": { - "_type": "sec_certs.sample.cc.CCCertificate.PdfData", - "report_metadata": null, - "st_metadata": null, - "cert_metadata": null, - "report_frontpage": null, - "st_frontpage": null, - "cert_frontpage": null, - "report_keywords": null, - "st_keywords": null, - "cert_keywords": null, - "report_filename": null, - "st_filename": null, - "cert_filename": null + "st_references": { + "_type": "sec_certs.sample.certificate.References", + "directly_referenced_by": null, + "directly_referencing": null, + "indirectly_referenced_by": null, + "indirectly_referencing": null }, - "heuristics": { - "_type": "sec_certs.sample.cc.CCCertificate.Heuristics", - "extracted_versions": null, - "cpe_matches": null, - "verified_cpe_matches": null, - "related_cves": null, - "cert_lab": null, - "cert_id": null, - "annotated_references": null, - "extracted_sars": null, - "direct_transitive_cves": null, - "indirect_transitive_cves": null, - "next_certificates": null, - "prev_certificates": null, - "report_references": { - "_type": "sec_certs.sample.certificate.References", - "directly_referenced_by": null, - "directly_referencing": null, - "indirectly_referenced_by": null, - "indirectly_referencing": null - }, - "st_references": { - "_type": "sec_certs.sample.certificate.References", - "directly_referenced_by": null, - "directly_referencing": null, - "indirectly_referenced_by": null, - "indirectly_referencing": null - }, - "scheme_data": null, - "protection_profiles": null, - "eal": null - }, - "report_link": "https://path.to/report/link", - "st_link": "https://path.to/st/link", - "cert_link": "https://path.to/cert/link" + "scheme_data": null, + "protection_profiles": null, + "eal": null + }, + "report_link": "https://path.to/report/link", + "st_link": "https://path.to/st/link", + "cert_link": "https://path.to/cert/link" } |
