aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests
diff options
context:
space:
mode:
authorJ08nY2025-09-25 16:28:49 +0200
committerJ08nY2025-09-25 16:28:49 +0200
commitdaf9ec03ea0b7706079c834bef62d978caed29b1 (patch)
tree997f251567dff857a8e9889b92ea8e319596d31a /tests
parentbce2ef9d06f52a98eb543d0760e0f9cd5108bed6 (diff)
downloadsec-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.py37
-rw-r--r--tests/cc/test_cc_certificate.py10
-rw-r--r--tests/cc/test_cc_dataset.py16
-rw-r--r--tests/data/cc/certificate/fictional_cert.json220
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"
}