TestRunner.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. # RUN: %{python} %s
  2. #
  3. # END.
  4. import unittest
  5. import platform
  6. import os.path
  7. import tempfile
  8. import lit
  9. from lit.TestRunner import ParserKind, IntegratedTestKeywordParser, \
  10. parseIntegratedTestScript
  11. class TestIntegratedTestKeywordParser(unittest.TestCase):
  12. inputTestCase = None
  13. @staticmethod
  14. def load_keyword_parser_lit_tests():
  15. """
  16. Create and load the LIT test suite and test objects used by
  17. TestIntegratedTestKeywordParser
  18. """
  19. # Create the global config object.
  20. lit_config = lit.LitConfig.LitConfig(progname='lit',
  21. path=[],
  22. quiet=False,
  23. useValgrind=False,
  24. valgrindLeakCheck=False,
  25. singleProcess=False,
  26. valgrindArgs=[],
  27. noExecute=False,
  28. debug=False,
  29. isWindows=(
  30. platform.system() == 'Windows'),
  31. params={})
  32. TestIntegratedTestKeywordParser.litConfig = lit_config
  33. # Perform test discovery.
  34. test_path = os.path.dirname(os.path.dirname(__file__))
  35. inputs = [os.path.join(test_path, 'Inputs/testrunner-custom-parsers/')]
  36. assert os.path.isdir(inputs[0])
  37. run = lit.run.Run(lit_config,
  38. lit.discovery.find_tests_for_inputs(lit_config, inputs))
  39. assert len(run.tests) == 1 and "there should only be one test"
  40. TestIntegratedTestKeywordParser.inputTestCase = run.tests[0]
  41. @staticmethod
  42. def make_parsers():
  43. def custom_parse(line_number, line, output):
  44. if output is None:
  45. output = []
  46. output += [part for part in line.split(' ') if part.strip()]
  47. return output
  48. return [
  49. IntegratedTestKeywordParser("MY_TAG.", ParserKind.TAG),
  50. IntegratedTestKeywordParser("MY_DNE_TAG.", ParserKind.TAG),
  51. IntegratedTestKeywordParser("MY_LIST:", ParserKind.LIST),
  52. IntegratedTestKeywordParser("MY_RUN:", ParserKind.COMMAND),
  53. IntegratedTestKeywordParser("MY_CUSTOM:", ParserKind.CUSTOM,
  54. custom_parse)
  55. ]
  56. @staticmethod
  57. def get_parser(parser_list, keyword):
  58. for p in parser_list:
  59. if p.keyword == keyword:
  60. return p
  61. assert False and "parser not found"
  62. @staticmethod
  63. def parse_test(parser_list):
  64. script = parseIntegratedTestScript(
  65. TestIntegratedTestKeywordParser.inputTestCase,
  66. additional_parsers=parser_list, require_script=False)
  67. assert not isinstance(script, lit.Test.Result)
  68. assert isinstance(script, list)
  69. assert len(script) == 0
  70. def test_tags(self):
  71. parsers = self.make_parsers()
  72. self.parse_test(parsers)
  73. tag_parser = self.get_parser(parsers, 'MY_TAG.')
  74. dne_tag_parser = self.get_parser(parsers, 'MY_DNE_TAG.')
  75. self.assertTrue(tag_parser.getValue())
  76. self.assertFalse(dne_tag_parser.getValue())
  77. def test_lists(self):
  78. parsers = self.make_parsers()
  79. self.parse_test(parsers)
  80. list_parser = self.get_parser(parsers, 'MY_LIST:')
  81. self.assertEqual(list_parser.getValue(),
  82. ['one', 'two', 'three', 'four'])
  83. def test_commands(self):
  84. parsers = self.make_parsers()
  85. self.parse_test(parsers)
  86. cmd_parser = self.get_parser(parsers, 'MY_RUN:')
  87. value = cmd_parser.getValue()
  88. self.assertEqual(len(value), 2) # there are only two run lines
  89. self.assertEqual(value[0].strip(), "%dbg(MY_RUN: at line 4) baz")
  90. self.assertEqual(value[1].strip(), "%dbg(MY_RUN: at line 7) foo bar")
  91. def test_custom(self):
  92. parsers = self.make_parsers()
  93. self.parse_test(parsers)
  94. custom_parser = self.get_parser(parsers, 'MY_CUSTOM:')
  95. value = custom_parser.getValue()
  96. self.assertEqual(value, ['a', 'b', 'c'])
  97. def test_bad_keywords(self):
  98. def custom_parse(line_number, line, output):
  99. return output
  100. try:
  101. IntegratedTestKeywordParser("TAG_NO_SUFFIX", ParserKind.TAG),
  102. self.fail("TAG_NO_SUFFIX failed to raise an exception")
  103. except ValueError as e:
  104. pass
  105. except BaseException as e:
  106. self.fail("TAG_NO_SUFFIX raised the wrong exception: %r" % e)
  107. try:
  108. IntegratedTestKeywordParser("TAG_WITH_COLON:", ParserKind.TAG),
  109. self.fail("TAG_WITH_COLON: failed to raise an exception")
  110. except ValueError as e:
  111. pass
  112. except BaseException as e:
  113. self.fail("TAG_WITH_COLON: raised the wrong exception: %r" % e)
  114. try:
  115. IntegratedTestKeywordParser("LIST_WITH_DOT.", ParserKind.LIST),
  116. self.fail("LIST_WITH_DOT. failed to raise an exception")
  117. except ValueError as e:
  118. pass
  119. except BaseException as e:
  120. self.fail("LIST_WITH_DOT. raised the wrong exception: %r" % e)
  121. try:
  122. IntegratedTestKeywordParser("CUSTOM_NO_SUFFIX",
  123. ParserKind.CUSTOM, custom_parse),
  124. self.fail("CUSTOM_NO_SUFFIX failed to raise an exception")
  125. except ValueError as e:
  126. pass
  127. except BaseException as e:
  128. self.fail("CUSTOM_NO_SUFFIX raised the wrong exception: %r" % e)
  129. # Both '.' and ':' are allowed for CUSTOM keywords.
  130. try:
  131. IntegratedTestKeywordParser("CUSTOM_WITH_DOT.",
  132. ParserKind.CUSTOM, custom_parse),
  133. except BaseException as e:
  134. self.fail("CUSTOM_WITH_DOT. raised an exception: %r" % e)
  135. try:
  136. IntegratedTestKeywordParser("CUSTOM_WITH_COLON:",
  137. ParserKind.CUSTOM, custom_parse),
  138. except BaseException as e:
  139. self.fail("CUSTOM_WITH_COLON: raised an exception: %r" % e)
  140. try:
  141. IntegratedTestKeywordParser("CUSTOM_NO_PARSER:",
  142. ParserKind.CUSTOM),
  143. self.fail("CUSTOM_NO_PARSER: failed to raise an exception")
  144. except ValueError as e:
  145. pass
  146. except BaseException as e:
  147. self.fail("CUSTOM_NO_PARSER: raised the wrong exception: %r" % e)
  148. if __name__ == '__main__':
  149. TestIntegratedTestKeywordParser.load_keyword_parser_lit_tests()
  150. unittest.main(verbosity=2)