aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/test_cpe.py
blob: 7b24ae598436f7fc8da67955cf844306523e3619 (plain) (blame)
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
from __future__ import annotations

from datetime import datetime, timedelta
from pathlib import Path

import pytest

from sec_certs import constants
from sec_certs.dataset import CPEDataset
from sec_certs.sample import CPE
from sec_certs.serialization.json import SerializationError


def test_cpe_dset_from_json(cpe_dataset_path: Path, cpe_dataset: CPEDataset, tmp_path: Path):
    assert CPEDataset.from_json(cpe_dataset_path) == cpe_dataset

    compressed_path = tmp_path / "dset.json.gz"
    cpe_dataset.to_json(compressed_path, compress=True)
    decompressed_dataset = CPEDataset.from_json(compressed_path, is_compressed=True)
    assert cpe_dataset == decompressed_dataset


def test_cpe_parsing():
    potentially_problematic_cpes = {
        'cpe:2.3:a:bayashi:dopvstar\\::0091:*:*:*:*:*:*:*"': ("bayashi", "dopvstar:", "0091"),
        "cpe:2.3:a:moundlabs:\\:\\:mound\\:\\::2.1.6:*:*:*:*:*:*:*": ("moundlabs", "::mound::", "2.1.6"),
        "cpe:2.3:a:lemonldap-ng:lemonldap\\:\\::*:*:*:*:*:*:*:*": (
            "lemonldap-ng",
            "lemonldap::",
            constants.CPE_VERSION_NA,
        ),
        "cpe:2.3:o:cisco:nx-os:5.0\\\\\\(3\\\\\\)u5\\\\\\(1g\\\\\\):*:*:*:*:*:*:*": (
            "cisco",
            "nx-os",
            "5.0\\(3\\)u5\\(1g\\)",
        ),
        "cpe:2.3:a:\\@thi.ng\\/egf_project:\\@thi.ng\\/egf:-:*:*:*:*:node.js:*:*": (
            "@thi.ng/egf project",
            "@thi.ng/egf",
            "-",
        ),
        "cpe:2.3:a:oracle:communications_diameter_signaling_router_idih\\:::*:*:*:*:*:*:*": (
            "oracle",
            "communications diameter signaling router idih:",
            constants.CPE_VERSION_NA,
        ),
    }
    for uri, tpl in potentially_problematic_cpes.items():
        cpe = CPE("", uri)
        assert cpe.vendor == tpl[0]
        assert cpe.item_name == tpl[1]
        assert cpe.version == tpl[2]


def test_cpe_from_to_dict(cpe_dataset: CPEDataset):
    cpe = cpe_dataset["cpe:2.3:a:ibm:security_key_lifecycle_manager:2.6.0.1:*:*:*:*:*:*:*"]
    dct = cpe.to_dict()
    other_cpe = CPE.from_dict(dct)
    assert cpe == other_cpe


def test_to_pandas(cpe_dataset: CPEDataset):
    df = cpe_dataset.to_pandas()
    assert df.shape == (len(cpe_dataset), len(CPE.pandas_columns) - 1)
    assert df.index.name == "uri"
    assert set(df.columns) == set(CPE.pandas_columns) - {"uri"}


def test_serialization_missing_path():
    dummy_dset = CPEDataset()
    with pytest.raises(SerializationError):
        dummy_dset.to_json()


@pytest.mark.remote
def test_cpe_download_from_seccerts():
    cpe_dataset = CPEDataset.from_web()
    assert len(cpe_dataset) > 100000
    assert cpe_dataset.last_update_timestamp > datetime.now() - timedelta(days=28)