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