xref: /qemu/scripts/xml-preprocess-test.py (revision 9b286e76)
19b286e76SMarc-André Lureau#!/usr/bin/env python3
29b286e76SMarc-André Lureau#
39b286e76SMarc-André Lureau# Copyright (c) 2023 Red Hat, Inc.
49b286e76SMarc-André Lureau#
59b286e76SMarc-André Lureau# SPDX-License-Identifier: MIT
69b286e76SMarc-André Lureau"""Unit tests for xml-preprocess"""
79b286e76SMarc-André Lureau
89b286e76SMarc-André Lureauimport contextlib
99b286e76SMarc-André Lureauimport importlib
109b286e76SMarc-André Lureauimport os
119b286e76SMarc-André Lureauimport platform
129b286e76SMarc-André Lureauimport subprocess
139b286e76SMarc-André Lureauimport tempfile
149b286e76SMarc-André Lureauimport unittest
159b286e76SMarc-André Lureaufrom io import StringIO
169b286e76SMarc-André Lureau
179b286e76SMarc-André Lureauxmlpp = importlib.import_module("xml-preprocess")
189b286e76SMarc-André Lureau
199b286e76SMarc-André Lureau
209b286e76SMarc-André Lureauclass TestXmlPreprocess(unittest.TestCase):
219b286e76SMarc-André Lureau    """Tests for xml-preprocess.Preprocessor"""
229b286e76SMarc-André Lureau
239b286e76SMarc-André Lureau    def test_preprocess_xml(self):
249b286e76SMarc-André Lureau        with tempfile.NamedTemporaryFile(mode="w", delete=False) as temp_file:
259b286e76SMarc-André Lureau            temp_file.write("<root></root>")
269b286e76SMarc-André Lureau            temp_file_name = temp_file.name
279b286e76SMarc-André Lureau        result = xmlpp.preprocess_xml(temp_file_name)
289b286e76SMarc-André Lureau        self.assertEqual(result, "<root></root>")
299b286e76SMarc-André Lureau        os.remove(temp_file_name)
309b286e76SMarc-André Lureau
319b286e76SMarc-André Lureau    def test_save_xml(self):
329b286e76SMarc-André Lureau        with tempfile.NamedTemporaryFile(mode="w", delete=False) as temp_file:
339b286e76SMarc-André Lureau            temp_file_name = temp_file.name
349b286e76SMarc-André Lureau            xmlpp.save_xml("<root></root>", temp_file_name)
359b286e76SMarc-André Lureau        self.assertTrue(os.path.isfile(temp_file_name))
369b286e76SMarc-André Lureau        os.remove(temp_file_name)
379b286e76SMarc-André Lureau
389b286e76SMarc-André Lureau    def test_include(self):
399b286e76SMarc-André Lureau        with tempfile.NamedTemporaryFile(mode="w", delete=False) as inc_file:
409b286e76SMarc-André Lureau            inc_file.write("<included>Content from included file</included>")
419b286e76SMarc-André Lureau            inc_file_name = inc_file.name
429b286e76SMarc-André Lureau        xml_str = f"<?include {inc_file_name} ?>"
439b286e76SMarc-André Lureau        expected = "<included>Content from included file</included>"
449b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
459b286e76SMarc-André Lureau        result = xpp.preprocess(xml_str)
469b286e76SMarc-André Lureau        self.assertEqual(result, expected)
479b286e76SMarc-André Lureau        os.remove(inc_file_name)
489b286e76SMarc-André Lureau        self.assertRaises(FileNotFoundError, xpp.preprocess, xml_str)
499b286e76SMarc-André Lureau
509b286e76SMarc-André Lureau    def test_envvar(self):
519b286e76SMarc-André Lureau        os.environ["TEST_ENV_VAR"] = "TestValue"
529b286e76SMarc-André Lureau        xml_str = "<root>$(env.TEST_ENV_VAR)</root>"
539b286e76SMarc-André Lureau        expected = "<root>TestValue</root>"
549b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
559b286e76SMarc-André Lureau        result = xpp.preprocess(xml_str)
569b286e76SMarc-André Lureau        self.assertEqual(result, expected)
579b286e76SMarc-André Lureau        self.assertRaises(KeyError, xpp.preprocess, "$(env.UNKNOWN)")
589b286e76SMarc-André Lureau
599b286e76SMarc-André Lureau    def test_sys_var(self):
609b286e76SMarc-André Lureau        xml_str = "<root>$(sys.ARCH)</root>"
619b286e76SMarc-André Lureau        expected = f"<root>{platform.architecture()[0]}</root>"
629b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
639b286e76SMarc-André Lureau        result = xpp.preprocess(xml_str)
649b286e76SMarc-André Lureau        self.assertEqual(result, expected)
659b286e76SMarc-André Lureau        self.assertRaises(KeyError, xpp.preprocess, "$(sys.UNKNOWN)")
669b286e76SMarc-André Lureau
679b286e76SMarc-André Lureau    def test_cus_var(self):
689b286e76SMarc-André Lureau        xml_str = "<root>$(var.USER)</root>"
699b286e76SMarc-André Lureau        expected = "<root></root>"
709b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
719b286e76SMarc-André Lureau        result = xpp.preprocess(xml_str)
729b286e76SMarc-André Lureau        self.assertEqual(result, expected)
739b286e76SMarc-André Lureau        xml_str = "<?define USER=FOO?><root>$(var.USER)</root>"
749b286e76SMarc-André Lureau        expected = "<root>FOO</root>"
759b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
769b286e76SMarc-André Lureau        result = xpp.preprocess(xml_str)
779b286e76SMarc-André Lureau        self.assertEqual(result, expected)
789b286e76SMarc-André Lureau
799b286e76SMarc-André Lureau    def test_error_warning(self):
809b286e76SMarc-André Lureau        xml_str = "<root><?warning \"test warn\"?></root>"
819b286e76SMarc-André Lureau        expected = "<root></root>"
829b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
839b286e76SMarc-André Lureau        out = StringIO()
849b286e76SMarc-André Lureau        with contextlib.redirect_stdout(out):
859b286e76SMarc-André Lureau            result = xpp.preprocess(xml_str)
869b286e76SMarc-André Lureau        self.assertEqual(result, expected)
879b286e76SMarc-André Lureau        self.assertEqual(out.getvalue(), "[Warning]: test warn\n")
889b286e76SMarc-André Lureau        self.assertRaises(RuntimeError, xpp.preprocess, "<?error \"test\"?>")
899b286e76SMarc-André Lureau
909b286e76SMarc-André Lureau    def test_cmd(self):
919b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
929b286e76SMarc-André Lureau        result = xpp.preprocess('<root><?cmd "echo hello world"?></root>')
939b286e76SMarc-André Lureau        self.assertEqual(result, "<root>hello world</root>")
949b286e76SMarc-André Lureau        self.assertRaises(
959b286e76SMarc-André Lureau            subprocess.CalledProcessError,
969b286e76SMarc-André Lureau            xpp.preprocess, '<?cmd "test-unknown-cmd"?>'
979b286e76SMarc-André Lureau        )
989b286e76SMarc-André Lureau
999b286e76SMarc-André Lureau    def test_foreach(self):
1009b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
1019b286e76SMarc-André Lureau        result = xpp.preprocess(
1029b286e76SMarc-André Lureau            '<root><?foreach x in a;b;c?>$(var.x)<?endforeach?></root>'
1039b286e76SMarc-André Lureau        )
1049b286e76SMarc-André Lureau        self.assertEqual(result, "<root>abc</root>")
1059b286e76SMarc-André Lureau
1069b286e76SMarc-André Lureau    def test_if_elseif(self):
1079b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
1089b286e76SMarc-André Lureau        result = xpp.preprocess('<root><?if True?>ok<?endif?></root>')
1099b286e76SMarc-André Lureau        self.assertEqual(result, "<root>ok</root>")
1109b286e76SMarc-André Lureau        result = xpp.preprocess('<root><?if False?>ok<?endif?></root>')
1119b286e76SMarc-André Lureau        self.assertEqual(result, "<root></root>")
1129b286e76SMarc-André Lureau        result = xpp.preprocess('<root><?if True?>ok<?else?>ko<?endif?></root>')
1139b286e76SMarc-André Lureau        self.assertEqual(result, "<root>ok</root>")
1149b286e76SMarc-André Lureau        result = xpp.preprocess('<root><?if False?>ok<?else?>ko<?endif?></root>')
1159b286e76SMarc-André Lureau        self.assertEqual(result, "<root>ko</root>")
1169b286e76SMarc-André Lureau        result = xpp.preprocess(
1179b286e76SMarc-André Lureau            '<root><?if False?>ok<?elseif True?>ok2<?else?>ko<?endif?></root>'
1189b286e76SMarc-André Lureau        )
1199b286e76SMarc-André Lureau        self.assertEqual(result, "<root>ok2</root>")
1209b286e76SMarc-André Lureau        result = xpp.preprocess(
1219b286e76SMarc-André Lureau            '<root><?if False?>ok<?elseif False?>ok<?else?>ko<?endif?></root>'
1229b286e76SMarc-André Lureau        )
1239b286e76SMarc-André Lureau        self.assertEqual(result, "<root>ko</root>")
1249b286e76SMarc-André Lureau
1259b286e76SMarc-André Lureau    def test_ifdef(self):
1269b286e76SMarc-André Lureau        xpp = xmlpp.Preprocessor()
1279b286e76SMarc-André Lureau        result = xpp.preprocess('<root><?ifdef USER?>ok<?else?>ko<?endif?></root>')
1289b286e76SMarc-André Lureau        self.assertEqual(result, "<root>ko</root>")
1299b286e76SMarc-André Lureau        result = xpp.preprocess(
1309b286e76SMarc-André Lureau            '<?define USER=FOO?><root><?ifdef USER?>ok<?else?>ko<?endif?></root>'
1319b286e76SMarc-André Lureau        )
1329b286e76SMarc-André Lureau        self.assertEqual(result, "<root>ok</root>")
1339b286e76SMarc-André Lureau
1349b286e76SMarc-André Lureau
1359b286e76SMarc-André Lureauif __name__ == "__main__":
1369b286e76SMarc-André Lureau    unittest.main()
137