xref: /openbmc/qemu/scripts/xml-preprocess-test.py (revision b111569da9f82fdf05df03184836a4564adef599)
1*9b286e76SMarc-André Lureau#!/usr/bin/env python3
2*9b286e76SMarc-André Lureau#
3*9b286e76SMarc-André Lureau# Copyright (c) 2023 Red Hat, Inc.
4*9b286e76SMarc-André Lureau#
5*9b286e76SMarc-André Lureau# SPDX-License-Identifier: MIT
6*9b286e76SMarc-André Lureau"""Unit tests for xml-preprocess"""
7*9b286e76SMarc-André Lureau
8*9b286e76SMarc-André Lureauimport contextlib
9*9b286e76SMarc-André Lureauimport importlib
10*9b286e76SMarc-André Lureauimport os
11*9b286e76SMarc-André Lureauimport platform
12*9b286e76SMarc-André Lureauimport subprocess
13*9b286e76SMarc-André Lureauimport tempfile
14*9b286e76SMarc-André Lureauimport unittest
15*9b286e76SMarc-André Lureaufrom io import StringIO
16*9b286e76SMarc-André Lureau
17*9b286e76SMarc-André Lureauxmlpp = importlib.import_module("xml-preprocess")
18*9b286e76SMarc-André Lureau
19*9b286e76SMarc-André Lureau
20*9b286e76SMarc-André Lureauclass TestXmlPreprocess(unittest.TestCase):
21*9b286e76SMarc-André Lureau    """Tests for xml-preprocess.Preprocessor"""
22*9b286e76SMarc-André Lureau
23*9b286e76SMarc-André Lureau    def test_preprocess_xml(self):
24*9b286e76SMarc-André Lureau        with tempfile.NamedTemporaryFile(mode="w", delete=False) as temp_file:
25*9b286e76SMarc-André Lureau            temp_file.write("<root></root>")
26*9b286e76SMarc-André Lureau            temp_file_name = temp_file.name
27*9b286e76SMarc-André Lureau        result = xmlpp.preprocess_xml(temp_file_name)
28*9b286e76SMarc-André Lureau        self.assertEqual(result, "<root></root>")
29*9b286e76SMarc-André Lureau        os.remove(temp_file_name)
30*9b286e76SMarc-André Lureau
31*9b286e76SMarc-André Lureau    def test_save_xml(self):
32*9b286e76SMarc-André Lureau        with tempfile.NamedTemporaryFile(mode="w", delete=False) as temp_file:
33*9b286e76SMarc-André Lureau            temp_file_name = temp_file.name
34*9b286e76SMarc-André Lureau            xmlpp.save_xml("<root></root>", temp_file_name)
35*9b286e76SMarc-André Lureau        self.assertTrue(os.path.isfile(temp_file_name))
36*9b286e76SMarc-André Lureau        os.remove(temp_file_name)
37*9b286e76SMarc-André Lureau
38*9b286e76SMarc-André Lureau    def test_include(self):
39*9b286e76SMarc-André Lureau        with tempfile.NamedTemporaryFile(mode="w", delete=False) as inc_file:
40*9b286e76SMarc-André Lureau            inc_file.write("<included>Content from included file</included>")
41*9b286e76SMarc-André Lureau            inc_file_name = inc_file.name
42*9b286e76SMarc-André Lureau        xml_str = f"<?include {inc_file_name} ?>"
43*9b286e76SMarc-André Lureau        expected = "<included>Content from included file</included>"
44*9b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
45*9b286e76SMarc-André Lureau        result = xpp.preprocess(xml_str)
46*9b286e76SMarc-André Lureau        self.assertEqual(result, expected)
47*9b286e76SMarc-André Lureau        os.remove(inc_file_name)
48*9b286e76SMarc-André Lureau        self.assertRaises(FileNotFoundError, xpp.preprocess, xml_str)
49*9b286e76SMarc-André Lureau
50*9b286e76SMarc-André Lureau    def test_envvar(self):
51*9b286e76SMarc-André Lureau        os.environ["TEST_ENV_VAR"] = "TestValue"
52*9b286e76SMarc-André Lureau        xml_str = "<root>$(env.TEST_ENV_VAR)</root>"
53*9b286e76SMarc-André Lureau        expected = "<root>TestValue</root>"
54*9b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
55*9b286e76SMarc-André Lureau        result = xpp.preprocess(xml_str)
56*9b286e76SMarc-André Lureau        self.assertEqual(result, expected)
57*9b286e76SMarc-André Lureau        self.assertRaises(KeyError, xpp.preprocess, "$(env.UNKNOWN)")
58*9b286e76SMarc-André Lureau
59*9b286e76SMarc-André Lureau    def test_sys_var(self):
60*9b286e76SMarc-André Lureau        xml_str = "<root>$(sys.ARCH)</root>"
61*9b286e76SMarc-André Lureau        expected = f"<root>{platform.architecture()[0]}</root>"
62*9b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
63*9b286e76SMarc-André Lureau        result = xpp.preprocess(xml_str)
64*9b286e76SMarc-André Lureau        self.assertEqual(result, expected)
65*9b286e76SMarc-André Lureau        self.assertRaises(KeyError, xpp.preprocess, "$(sys.UNKNOWN)")
66*9b286e76SMarc-André Lureau
67*9b286e76SMarc-André Lureau    def test_cus_var(self):
68*9b286e76SMarc-André Lureau        xml_str = "<root>$(var.USER)</root>"
69*9b286e76SMarc-André Lureau        expected = "<root></root>"
70*9b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
71*9b286e76SMarc-André Lureau        result = xpp.preprocess(xml_str)
72*9b286e76SMarc-André Lureau        self.assertEqual(result, expected)
73*9b286e76SMarc-André Lureau        xml_str = "<?define USER=FOO?><root>$(var.USER)</root>"
74*9b286e76SMarc-André Lureau        expected = "<root>FOO</root>"
75*9b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
76*9b286e76SMarc-André Lureau        result = xpp.preprocess(xml_str)
77*9b286e76SMarc-André Lureau        self.assertEqual(result, expected)
78*9b286e76SMarc-André Lureau
79*9b286e76SMarc-André Lureau    def test_error_warning(self):
80*9b286e76SMarc-André Lureau        xml_str = "<root><?warning \"test warn\"?></root>"
81*9b286e76SMarc-André Lureau        expected = "<root></root>"
82*9b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
83*9b286e76SMarc-André Lureau        out = StringIO()
84*9b286e76SMarc-André Lureau        with contextlib.redirect_stdout(out):
85*9b286e76SMarc-André Lureau            result = xpp.preprocess(xml_str)
86*9b286e76SMarc-André Lureau        self.assertEqual(result, expected)
87*9b286e76SMarc-André Lureau        self.assertEqual(out.getvalue(), "[Warning]: test warn\n")
88*9b286e76SMarc-André Lureau        self.assertRaises(RuntimeError, xpp.preprocess, "<?error \"test\"?>")
89*9b286e76SMarc-André Lureau
90*9b286e76SMarc-André Lureau    def test_cmd(self):
91*9b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
92*9b286e76SMarc-André Lureau        result = xpp.preprocess('<root><?cmd "echo hello world"?></root>')
93*9b286e76SMarc-André Lureau        self.assertEqual(result, "<root>hello world</root>")
94*9b286e76SMarc-André Lureau        self.assertRaises(
95*9b286e76SMarc-André Lureau            subprocess.CalledProcessError,
96*9b286e76SMarc-André Lureau            xpp.preprocess, '<?cmd "test-unknown-cmd"?>'
97*9b286e76SMarc-André Lureau        )
98*9b286e76SMarc-André Lureau
99*9b286e76SMarc-André Lureau    def test_foreach(self):
100*9b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
101*9b286e76SMarc-André Lureau        result = xpp.preprocess(
102*9b286e76SMarc-André Lureau            '<root><?foreach x in a;b;c?>$(var.x)<?endforeach?></root>'
103*9b286e76SMarc-André Lureau        )
104*9b286e76SMarc-André Lureau        self.assertEqual(result, "<root>abc</root>")
105*9b286e76SMarc-André Lureau
106*9b286e76SMarc-André Lureau    def test_if_elseif(self):
107*9b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
108*9b286e76SMarc-André Lureau        result = xpp.preprocess('<root><?if True?>ok<?endif?></root>')
109*9b286e76SMarc-André Lureau        self.assertEqual(result, "<root>ok</root>")
110*9b286e76SMarc-André Lureau        result = xpp.preprocess('<root><?if False?>ok<?endif?></root>')
111*9b286e76SMarc-André Lureau        self.assertEqual(result, "<root></root>")
112*9b286e76SMarc-André Lureau        result = xpp.preprocess('<root><?if True?>ok<?else?>ko<?endif?></root>')
113*9b286e76SMarc-André Lureau        self.assertEqual(result, "<root>ok</root>")
114*9b286e76SMarc-André Lureau        result = xpp.preprocess('<root><?if False?>ok<?else?>ko<?endif?></root>')
115*9b286e76SMarc-André Lureau        self.assertEqual(result, "<root>ko</root>")
116*9b286e76SMarc-André Lureau        result = xpp.preprocess(
117*9b286e76SMarc-André Lureau            '<root><?if False?>ok<?elseif True?>ok2<?else?>ko<?endif?></root>'
118*9b286e76SMarc-André Lureau        )
119*9b286e76SMarc-André Lureau        self.assertEqual(result, "<root>ok2</root>")
120*9b286e76SMarc-André Lureau        result = xpp.preprocess(
121*9b286e76SMarc-André Lureau            '<root><?if False?>ok<?elseif False?>ok<?else?>ko<?endif?></root>'
122*9b286e76SMarc-André Lureau        )
123*9b286e76SMarc-André Lureau        self.assertEqual(result, "<root>ko</root>")
124*9b286e76SMarc-André Lureau
125*9b286e76SMarc-André Lureau    def test_ifdef(self):
126*9b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
127*9b286e76SMarc-André Lureau        result = xpp.preprocess('<root><?ifdef USER?>ok<?else?>ko<?endif?></root>')
128*9b286e76SMarc-André Lureau        self.assertEqual(result, "<root>ko</root>")
129*9b286e76SMarc-André Lureau        result = xpp.preprocess(
130*9b286e76SMarc-André Lureau            '<?define USER=FOO?><root><?ifdef USER?>ok<?else?>ko<?endif?></root>'
131*9b286e76SMarc-André Lureau        )
132*9b286e76SMarc-André Lureau        self.assertEqual(result, "<root>ok</root>")
133*9b286e76SMarc-André Lureau
134*9b286e76SMarc-André Lureau
135*9b286e76SMarc-André Lureauif __name__ == "__main__":
136*9b286e76SMarc-André Lureau    unittest.main()
137