1import infra
2import subprocess
3import json
4
5
6class CpeIdTest(infra.basetest.BRConfigTest):
7    config = ""
8    br2_external = [infra.filepath("tests/core/cpeid-br2-external")]
9
10    def get_vars(self, var):
11        cmd = ["make", "--no-print-directory", "-C", self.b.builddir,
12               "VARS=%s%%" % var, "printvars"]
13        lines = subprocess.check_output(cmd).splitlines()
14        return dict([str(x, "utf-8").split("=") for x in lines])
15
16    def get_json(self, pkg):
17        cmd = ["make", "--no-print-directory", "-C", self.b.builddir,
18               "%s-show-info" % pkg]
19        return json.loads(subprocess.check_output(cmd))
20
21    def test_pkg1(self):
22        # this package has no CPE ID information, it should not have
23        # any CPE_ID variable defined.
24        pkg_vars = self.get_vars("CPE_ID_PKG1_CPE_ID")
25        cpe_vars = ["CPE_ID_VALID", "CPE_ID_PRODUCT", "CPE_ID_VERSION", "CPE_ID_UPDATE",
26                    "CPE_ID_PREFIX", "CPE_ID"]
27        for v in cpe_vars:
28            self.assertNotIn("CPE_ID_PKG1_%s" % v, pkg_vars)
29        pkg_json = self.get_json("cpe-id-pkg1")
30        self.assertNotIn("cpe-id", pkg_json['cpe-id-pkg1'])
31
32        pkg_vars = self.get_vars("HOST_CPE_ID_PKG1_CPE_ID")
33        for v in cpe_vars:
34            self.assertNotIn("HOST_CPE_ID_PKG1_%s" % v, pkg_vars)
35        pkg_json = self.get_json("host-cpe-id-pkg1")
36        self.assertNotIn("cpe-id", pkg_json['host-cpe-id-pkg1'])
37
38    def test_pkg2(self):
39        # this package has no CPE ID information, it should not have
40        # any CPE_ID variable defined.
41        pkg_vars = self.get_vars("HOST_CPE_ID_PKG2_CPE_ID")
42        cpe_vars = ["CPE_ID_VALID", "CPE_ID_PRODUCT", "CPE_ID_VERSION", "CPE_ID_UPDATE",
43                    "CPE_ID_PREFIX", "CPE_ID"]
44        for v in cpe_vars:
45            self.assertNotIn("HOST_CPE_ID_PKG2_%s" % v, pkg_vars)
46        pkg_json = self.get_json("host-cpe-id-pkg2")
47        self.assertNotIn("cpe-id", pkg_json['host-cpe-id-pkg2'])
48
49    def test_pkg3(self):
50        # this package has just <pkg>_CPE_ID_VENDOR defined, so verify
51        # it has the default CPE_ID value, and that inheritance of the
52        # values for the host package is working
53        pkg_vars = self.get_vars("CPE_ID_PKG3_CPE_ID")
54        self.assertEqual(pkg_vars["CPE_ID_PKG3_CPE_ID"],
55                         "cpe:2.3:a:cpe-id-pkg3_project:cpe-id-pkg3:67:*:*:*:*:*:*:*")
56        self.assertEqual(pkg_vars["CPE_ID_PKG3_CPE_ID_VALID"], "YES")
57        pkg_json = self.get_json("cpe-id-pkg3")
58        self.assertEqual(pkg_json['cpe-id-pkg3']['cpe-id'],
59                         "cpe:2.3:a:cpe-id-pkg3_project:cpe-id-pkg3:67:*:*:*:*:*:*:*")
60
61        pkg_vars = self.get_vars("HOST_CPE_ID_PKG3_CPE_ID")
62        self.assertEqual(pkg_vars["HOST_CPE_ID_PKG3_CPE_ID"],
63                         "cpe:2.3:a:cpe-id-pkg3_project:cpe-id-pkg3:67:*:*:*:*:*:*:*")
64        self.assertEqual(pkg_vars["HOST_CPE_ID_PKG3_CPE_ID_VALID"], "YES")
65        pkg_json = self.get_json("host-cpe-id-pkg3")
66        self.assertEqual(pkg_json['host-cpe-id-pkg3']['cpe-id'],
67                         "cpe:2.3:a:cpe-id-pkg3_project:cpe-id-pkg3:67:*:*:*:*:*:*:*")
68
69    def test_pkg4(self):
70        # this package defines
71        # <pkg>_CPE_ID_{VENDOR,PRODUCT,VERSION,UPDATE,PREFIX},
72        # make sure we get the computed <pkg>_CPE_ID, and that it is
73        # inherited by the host variant
74        pkg_vars = self.get_vars("CPE_ID_PKG4_CPE_ID")
75        self.assertEqual(pkg_vars["CPE_ID_PKG4_CPE_ID"],
76                         "cpe:2.4:a:foo:bar:42:b2:*:*:*:*:*:*")
77        self.assertEqual(pkg_vars["CPE_ID_PKG4_CPE_ID_VALID"], "YES")
78        pkg_json = self.get_json("cpe-id-pkg4")
79        self.assertEqual(pkg_json['cpe-id-pkg4']['cpe-id'],
80                         "cpe:2.4:a:foo:bar:42:b2:*:*:*:*:*:*")
81
82        pkg_vars = self.get_vars("HOST_CPE_ID_PKG4_CPE_ID")
83        self.assertEqual(pkg_vars["HOST_CPE_ID_PKG4_CPE_ID"],
84                         "cpe:2.4:a:foo:bar:42:b2:*:*:*:*:*:*")
85        self.assertEqual(pkg_vars["HOST_CPE_ID_PKG4_CPE_ID_VALID"], "YES")
86        pkg_json = self.get_json("host-cpe-id-pkg4")
87        self.assertEqual(pkg_json['host-cpe-id-pkg4']['cpe-id'],
88                         "cpe:2.4:a:foo:bar:42:b2:*:*:*:*:*:*")
89
90    def test_pkg5(self):
91        # this package defines
92        # <pkg>_CPE_ID_{VENDOR,PRODUCT,VERSION,UPDATE,PREFIX} and
93        # HOST_<pkg>_CPE_ID_{VENDOR,PRODUCT,VERSION,UPDATE,PREFIX}
94        # separately, with different values. Make sure we get the
95        # right <pkg>_CPE_ID and HOST_<pkg>_CPE_ID values.
96        pkg_vars = self.get_vars("CPE_ID_PKG5_CPE_ID")
97        self.assertEqual(pkg_vars["CPE_ID_PKG5_CPE_ID"],
98                         "cpe:2.4:a:foo:bar:42:b2:*:*:*:*:*:*")
99        self.assertEqual(pkg_vars["CPE_ID_PKG5_CPE_ID_VALID"], "YES")
100        pkg_json = self.get_json("cpe-id-pkg5")
101        self.assertEqual(pkg_json['cpe-id-pkg5']['cpe-id'],
102                         "cpe:2.4:a:foo:bar:42:b2:*:*:*:*:*:*")
103
104        pkg_vars = self.get_vars("HOST_CPE_ID_PKG5_CPE_ID")
105        self.assertEqual(pkg_vars["HOST_CPE_ID_PKG5_CPE_ID"],
106                         "cpe:2.5:a:baz:fuz:43:b3:*:*:*:*:*:*")
107        self.assertEqual(pkg_vars["HOST_CPE_ID_PKG5_CPE_ID_VALID"], "YES")
108        pkg_json = self.get_json("host-cpe-id-pkg5")
109        self.assertEqual(pkg_json['host-cpe-id-pkg5']['cpe-id'],
110                         "cpe:2.5:a:baz:fuz:43:b3:*:*:*:*:*:*")
111