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
|
# Copyright (C) 2025 Siemens
#
# SPDX-License-Identifier: MIT
import io
from pathlib import Path
import pytest
import xml.etree.ElementTree as ET
from debsbom.bomwriter.bomwriter import BomWriter
from debsbom.export.exporter import GraphExporter, GraphOutputFormat
from debsbom.sbom import SBOMType
from test_generation import sbom_generator
def test_export_format_from_str():
assert GraphOutputFormat.from_str("graphml") == GraphOutputFormat.GRAPHML
with pytest.raises(RuntimeError):
GraphOutputFormat.from_str("foo")
@pytest.mark.parametrize("sbom_type", list(SBOMType))
def test_export_graphml(tmpdir, sbom_generator, sbom_type):
match sbom_type:
case SBOMType.SPDX:
_spdx_tools = pytest.importorskip("spdx_tools")
case SBOMType.CycloneDX:
_cyclonedx = pytest.importorskip("cyclonedx")
case _:
assert False, "unreachable"
NAMESPACE = "http://graphml.graphdrawing.org/xmlns"
def get_name(node):
for data in node.findall(f"{{{NAMESPACE}}}data"):
if data.get("key") == "d_name":
return data.text
return None
dbom = sbom_generator("tests/root/tree", sbom_types=[sbom_type])
outdir = Path(tmpdir)
dbom.generate(str(outdir / "sbom"), validate=False)
exporter = GraphExporter.create(
outdir / f"sbom.{sbom_type}.json", sbom_type, GraphOutputFormat.GRAPHML
)
buffer = io.BytesIO()
with io.TextIOWrapper(buffer) as wrapper:
exporter.export(wrapper)
wrapper.flush()
wrapper.seek(0)
tree = ET.parse(wrapper)
root = tree.getroot()
assert root.tag == f"{{{NAMESPACE}}}graphml"
node_tag = f"{{{NAMESPACE}}}node"
assert any(map(lambda n: get_name(n) == "binutils", root.iter(node_tag)))
edge_tag = f"{{{NAMESPACE}}}edge"
assert any(map(lambda n: "binutils" in n.get("id"), root.iter(edge_tag)))
|