1from __future__ import print_function
2from cpe.cpe2_3_uri import CPE2_3_URI
3
4import pytest
5
6
7class TestCPE2_3_Uri_Sparse(object):
8
9    def test_regular_cpe(self):
10        uri = 'cpe:/a:TauPan:cpe:1.2.1BETA1'
11        c = CPE2_3_URI(uri)
12        assert c.as_wfn() == 'wfn:[part="a", vendor="taupan", product="cpe", version="1\\.2\\.1beta1"]'
13        assert c.as_uri_2_3() == uri.lower()
14
15    def test_percent_encoded(self):
16        uri = 'cpe:/a:TauPan:cpe%7cextra:1.2.1BETA1'
17        c = CPE2_3_URI(uri)
18        assert c.as_wfn() == 'wfn:[part="a", vendor="taupan", product="cpe\\|extra", version="1\\.2\\.1beta1"]'
19        assert c.as_uri_2_3() == uri.lower()
20
21    def test_just_part(self):
22        uri = 'cpe:/a'
23        c = CPE2_3_URI(uri)
24        assert c.as_wfn() == 'wfn:[part="a"]'
25        assert c.as_uri_2_3() == uri.lower()
26
27    def test_just_vendor(self):
28        uri = 'cpe:/:taupan'
29        c = CPE2_3_URI(uri)
30        assert c.as_wfn() == 'wfn:[part=ANY, vendor="taupan"]'
31        assert c.as_uri_2_3() == uri.lower()
32
33    def test_just_product(self):
34        uri = 'cpe:/::cpe'
35        c = CPE2_3_URI(uri)
36        assert c.as_wfn() == 'wfn:[part=ANY, vendor=ANY, product="cpe"]'
37        assert c.as_uri_2_3() == uri.lower()
38
39    def test_just_version(self):
40        uri = 'cpe:/:::version'
41        cpe = CPE2_3_URI(uri)
42        assert cpe.as_wfn() == ('wfn:[part=ANY, vendor=ANY, product=ANY, '
43                                'version="version"'
44                                ']')
45        assert cpe.as_uri_2_3() == uri.lower()
46
47    def test_just_update(self):
48        uri = 'cpe:/::::update'
49        cpe = CPE2_3_URI(uri)
50        assert cpe.as_wfn() == ('wfn:[part=ANY, vendor=ANY, product=ANY, '
51                                'version=ANY, '
52                                'update="update"'
53                                ']')
54        assert cpe.as_uri_2_3() == uri.lower()
55
56    def test_just_legacy_edition_uri(self):
57        uri = 'cpe:/:::::legacy_edition'
58        cpe = CPE2_3_URI(uri)
59        assert cpe.as_uri_2_3() == uri.lower()
60
61    @pytest.mark.xfail
62    def test_just_legacy_edition_wfn(self):
63        uri = 'cpe:/:::::legacy_edition'
64        cpe = CPE2_3_URI(uri)
65        # not sure if this is correct, see
66        # https://github.com/nilp0inter/cpe/issues/28#issuecomment-253195951
67        assert cpe.as_wfn() == ('wfn:[part=ANY, vendor=ANY, product=ANY, '
68                                'version=ANY, '
69                                'update=ANY, '
70                                'edition="legacy_edition"'
71                                ']')
72
73    def test_full_packed_edition(self):
74        uri = 'cpe:/:::::~edition~sw_edition~target_sw~target_hw~other'
75        cpe = CPE2_3_URI(uri)
76        assert cpe.as_wfn() == ('wfn:[part=ANY, vendor=ANY, product=ANY, '
77                                'version=ANY, '
78                                'update=ANY, '
79                                'edition="edition", '
80                                'sw_edition="sw_edition", '
81                                'target_sw="target_sw", '
82                                'target_hw="target_hw", '
83                                'other="other"'
84                                ']')
85        assert cpe.as_uri_2_3() == uri.lower()
86
87    def test_legacy_edition_uri(self):
88        uri = 'cpe:/a:TauPan:cpe:1.2.1BETA1::legacy_edition'
89        c = CPE2_3_URI(uri)
90        assert c.as_uri_2_3() == uri.lower()
91
92    @pytest.mark.xfail  # see above
93    def test_legacy_edition_wfn(self):
94        uri = 'cpe:/a:TauPan:cpe:1.2.1BETA1::legacy_edition'
95        c = CPE2_3_URI(uri)
96        assert c.as_wfn() == 'wfn:[part="a", vendor="taupan", product="cpe", version="1\\.2\\.1beta1", update=ANY, edition="legacy_edition"]'
97
98    def test_legacy_edition_packed(self):
99        uri = 'cpe:/a:TauPan:cpe:1.2.1BETA1::~legacy_edition~~~~'
100        c = CPE2_3_URI(uri)
101        assert c.as_wfn() == 'wfn:[part="a", vendor="taupan", product="cpe", version="1\\.2\\.1beta1", update=ANY, edition="legacy_edition", sw_edition=ANY, target_sw=ANY, target_hw=ANY, other=ANY]'
102        assert c.as_uri_2_3() == 'cpe:/a:taupan:cpe:1.2.1beta1::legacy_edition'
103