xml-preprocess-test.py 5.0 KB

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