File: test_export.py

package info (click to toggle)
debsbom 0.6.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,248 kB
  • sloc: python: 5,965; makefile: 31
file content (60 lines) | stat: -rw-r--r-- 1,919 bytes parent folder | download
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)))