test_parser_builder.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. #!/usr/bin/env -S python3 -B
  2. #
  3. # Copyright (c) 2023 Project CHIP Authors
  4. #
  5. # Licensed under the Apache License, Version 2.0 (the 'License');
  6. # you may not use this file except in compliance with the License.
  7. # You may obtain a copy of the License at
  8. #
  9. # http://www.apache.org/licenses/LICENSE-2.0
  10. #
  11. # Unless required by applicable law or agreed to in writing, software
  12. # distributed under the License is distributed on an 'AS IS' BASIS,
  13. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. # See the License for the specific language governing permissions and
  15. # limitations under the License.
  16. import unittest
  17. from unittest.mock import mock_open, patch
  18. from matter_yamltests.hooks import TestParserHooks
  19. from matter_yamltests.parser import TestParser
  20. from matter_yamltests.parser_builder import TestParserBuilder, TestParserBuilderConfig
  21. simple_yaml = '''
  22. name: Hello World
  23. '''
  24. valid_yaml = '''
  25. name: TestOnOff
  26. tests:
  27. - label: "Toggle the light"
  28. cluster: "OnOff"
  29. command: "Toggle"
  30. - label: "Toggle the light"
  31. cluster: "OnOff"
  32. command: "Toggle"
  33. '''
  34. invalid_yaml = '''
  35. name: TestOnOff
  36. tests:
  37. - label: "Toggle the light"
  38. cluster: "OnOff"
  39. command: "Toggle"
  40. - label: "Toggle the light"
  41. cluster: "OnOff"
  42. command: "Toggle"
  43. - label: "Toggle the light"
  44. cluster: "OnOff"
  45. command: "Toggle"
  46. - label: "Toggle the light"
  47. cluster_wrong_key: "OnOff"
  48. command: "Toggle"
  49. - label: "Toggle the light"
  50. cluster: "OnOff"
  51. command: "Toggle"
  52. '''
  53. class TestHooks(TestParserHooks):
  54. def __init__(self):
  55. self.start_count = 0
  56. self.stop_count = 0
  57. self.test_start_count = 0
  58. self.test_failure_count = 0
  59. self.test_success_count = 0
  60. def parsing_start(self, count):
  61. self.start_count += 1
  62. def parsing_stop(self, duration):
  63. self.stop_count += 1
  64. def test_parsing_start(self, name):
  65. self.test_start_count += 1
  66. def test_parsing_success(self, duration):
  67. self.test_success_count += 1
  68. def test_parsing_failure(self, exception, duration):
  69. self.test_failure_count += 1
  70. def mock_open_with_parameter_content(content):
  71. file_object = mock_open(read_data=content).return_value
  72. file_object.__iter__.return_value = content.splitlines(True)
  73. return file_object
  74. @patch('builtins.open', new=mock_open_with_parameter_content)
  75. class TestSuiteParserBuilder(unittest.TestCase):
  76. def test_parser_builder_config_defaults(self):
  77. parser_builder_config = TestParserBuilderConfig()
  78. self.assertIsInstance(parser_builder_config, TestParserBuilderConfig)
  79. self.assertIsNotNone(parser_builder_config.tests)
  80. self.assertIsNotNone(parser_builder_config.parser_config)
  81. self.assertIsNotNone(parser_builder_config.options)
  82. self.assertIsNotNone(parser_builder_config.hooks)
  83. def test_parser_builder_config_with_tests(self):
  84. tests = [simple_yaml, simple_yaml]
  85. parser_builder_config = TestParserBuilderConfig(tests)
  86. self.assertIsInstance(parser_builder_config, TestParserBuilderConfig)
  87. self.assertIsNotNone(parser_builder_config.tests)
  88. self.assertEqual(len(tests), len(parser_builder_config.tests))
  89. self.assertIsNotNone(parser_builder_config.parser_config)
  90. self.assertIsNotNone(parser_builder_config.options)
  91. def test_parser_builder_default(self):
  92. parser_builder = TestParserBuilder()
  93. self.assertIsInstance(parser_builder, TestParserBuilder)
  94. self.assertRaises(StopIteration, next, parser_builder)
  95. def test_parser_builder_with_empty_config(self):
  96. parser_builder_config = TestParserBuilderConfig()
  97. parser_builder = TestParserBuilder(parser_builder_config)
  98. self.assertIsInstance(parser_builder, TestParserBuilder)
  99. self.assertRaises(StopIteration, next, parser_builder)
  100. def test_parser_builder_with_a_single_test(self):
  101. tests = [valid_yaml]
  102. parser_builder_config = TestParserBuilderConfig(tests)
  103. parser_builder = TestParserBuilder(parser_builder_config)
  104. self.assertIsInstance(parser_builder, TestParserBuilder)
  105. self.assertIsInstance(next(parser_builder), TestParser)
  106. self.assertRaises(StopIteration, next, parser_builder)
  107. def test_parser_builder_with_a_multiple_tests(self):
  108. tests = [valid_yaml] * 5
  109. parser_builder_config = TestParserBuilderConfig(tests)
  110. parser_builder = TestParserBuilder(parser_builder_config)
  111. self.assertIsInstance(parser_builder, TestParserBuilder)
  112. for i in range(0, 5):
  113. self.assertIsInstance(next(parser_builder), TestParser)
  114. self.assertRaises(StopIteration, next, parser_builder)
  115. def test_parser_builder_config_hooks_single_test_with_multiple_steps(self):
  116. tests = [valid_yaml]
  117. hooks = TestHooks()
  118. parser_builder_config = TestParserBuilderConfig(tests, hooks=hooks)
  119. parser_builder = TestParserBuilder(parser_builder_config)
  120. self.assertIsInstance(parser_builder, TestParserBuilder)
  121. for parser in parser_builder:
  122. pass
  123. self.assertRaises(StopIteration, next, parser_builder)
  124. self.assertEqual(hooks.start_count, 1)
  125. self.assertEqual(hooks.stop_count, 1)
  126. self.assertEqual(hooks.test_start_count, 1)
  127. self.assertEqual(hooks.test_success_count, 1)
  128. self.assertEqual(hooks.test_failure_count, 0)
  129. def test_parser_builder_config_hooks_multiple_test_with_multiple_steps(self):
  130. tests = [valid_yaml] * 5
  131. hooks = TestHooks()
  132. parser_builder_config = TestParserBuilderConfig(tests, hooks=hooks)
  133. parser_builder = TestParserBuilder(parser_builder_config)
  134. self.assertIsInstance(parser_builder, TestParserBuilder)
  135. for parser in parser_builder:
  136. pass
  137. self.assertRaises(StopIteration, next, parser_builder)
  138. self.assertEqual(hooks.start_count, 1)
  139. self.assertEqual(hooks.stop_count, 1)
  140. self.assertEqual(hooks.test_start_count, 5)
  141. self.assertEqual(hooks.test_success_count, 5)
  142. self.assertEqual(hooks.test_failure_count, 0)
  143. def test_parser_builder_config_with_errors(self):
  144. tests = [invalid_yaml]
  145. hooks = TestHooks()
  146. parser_builder_config = TestParserBuilderConfig(tests, hooks=hooks)
  147. parser_builder = TestParserBuilder(parser_builder_config)
  148. self.assertIsInstance(parser_builder, TestParserBuilder)
  149. for parser in parser_builder:
  150. pass
  151. self.assertRaises(StopIteration, next, parser_builder)
  152. self.assertEqual(hooks.start_count, 1)
  153. self.assertEqual(hooks.stop_count, 1)
  154. self.assertEqual(hooks.test_start_count, 1)
  155. self.assertEqual(hooks.test_success_count, 0)
  156. self.assertEqual(hooks.test_failure_count, 1)
  157. if __name__ == '__main__':
  158. unittest.main()