test_o3de_editor_test.py 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. """
  2. Copyright (c) Contributors to the Open 3D Engine Project.
  3. For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. SPDX-License-Identifier: Apache-2.0 OR MIT
  5. """
  6. import unittest
  7. import pytest
  8. import unittest.mock as mock
  9. import ly_test_tools.o3de.editor_test as editor_test
  10. pytestmark = pytest.mark.SUITE_smoke
  11. class TestEditorTestSuite(unittest.TestCase):
  12. @mock.patch('ly_test_tools.o3de.editor_test_utils.kill_all_ly_processes')
  13. def test_TestData_ValidAP_TeardownAPOnce(self, mock_kill_processes):
  14. mock_editor_test_suite = editor_test.EditorTestSuite()
  15. mock_test_data_generator = mock_editor_test_suite._collected_test_data(mock.MagicMock())
  16. mock_asset_processor = mock.MagicMock()
  17. for test_data in mock_test_data_generator:
  18. test_data.asset_processor = mock_asset_processor
  19. mock_asset_processor.teardown.assert_called()
  20. assert test_data.asset_processor is None
  21. mock_kill_processes.assert_called_once_with(include_asset_processor=True)
  22. @mock.patch('ly_test_tools.o3de.editor_test_utils.kill_all_ly_processes')
  23. def test_TestData_NoAP_NoTeardownAP(self, mock_kill_processes):
  24. mock_editor_test_suite = editor_test.EditorTestSuite()
  25. mock_test_data_generator = mock_editor_test_suite._collected_test_data(mock.MagicMock())
  26. for test_data in mock_test_data_generator:
  27. test_data.asset_processor = None
  28. mock_kill_processes.assert_called_once_with(include_asset_processor=False)
  29. @mock.patch('ly_test_tools.o3de.editor_test.EditorTestSuite.filter_session_shared_tests')
  30. def test_PytestCustomModifyItems_FunctionsMatch_AddsRunners(self, mock_filter_tests):
  31. class MockTestSuite(editor_test.EditorTestSuite):
  32. pass
  33. mock_func_1 = mock.MagicMock()
  34. mock_test = mock.MagicMock()
  35. runner_1 = editor_test.EditorTestSuite.Runner('mock_runner_1', mock_func_1, [mock_test])
  36. mock_run_pytest_func = mock.MagicMock()
  37. runner_1.run_pytestfunc = mock_run_pytest_func
  38. mock_result_pytestfuncs = [mock.MagicMock()]
  39. runner_1.result_pytestfuncs = mock_result_pytestfuncs
  40. mock_items = []
  41. mock_items.extend(mock_result_pytestfuncs)
  42. MockTestSuite._runners = [runner_1]
  43. mock_test_1 = mock.MagicMock()
  44. mock_test_2 = mock.MagicMock()
  45. mock_filter_tests.return_value = [mock_test_1, mock_test_2]
  46. MockTestSuite.pytest_custom_modify_items(mock.MagicMock(), mock_items, mock.MagicMock())
  47. assert mock_items == [mock_run_pytest_func, mock_result_pytestfuncs[0]]
  48. def test_GetSingleTests_NoSingleTests_EmptyList(self):
  49. class MockTestSuite(editor_test.EditorTestSuite):
  50. pass
  51. mock_test_suite = MockTestSuite()
  52. tests = mock_test_suite.get_single_tests()
  53. assert len(tests) == 0
  54. def test_GetSingleTests_OneSingleTests_ReturnsOne(self):
  55. class MockTestSuite(editor_test.EditorTestSuite):
  56. class MockSingleTest(editor_test.EditorSingleTest):
  57. pass
  58. mock_test_suite = MockTestSuite()
  59. tests = mock_test_suite.get_single_tests()
  60. assert len(tests) == 1
  61. assert tests[0].__name__ == "MockSingleTest"
  62. assert issubclass(tests[0], editor_test.EditorSingleTest)
  63. def test_GetSingleTests_AllTests_ReturnsOnlySingles(self):
  64. class MockTestSuite(editor_test.EditorTestSuite):
  65. class MockSingleTest(editor_test.EditorSingleTest):
  66. pass
  67. class MockAnotherSingleTest(editor_test.EditorSingleTest):
  68. pass
  69. class MockNotSingleTest(editor_test.EditorSharedTest):
  70. pass
  71. mock_test_suite = MockTestSuite()
  72. tests = mock_test_suite.get_single_tests()
  73. assert len(tests) == 2
  74. for test in tests:
  75. assert issubclass(test, editor_test.EditorSingleTest)
  76. def test_GetSharedTests_NoSharedTests_EmptyList(self):
  77. class MockTestSuite(editor_test.EditorTestSuite):
  78. pass
  79. mock_test_suite = MockTestSuite()
  80. tests = mock_test_suite.get_shared_tests()
  81. assert len(tests) == 0
  82. def test_GetSharedTests_OneSharedTests_ReturnsOne(self):
  83. class MockTestSuite(editor_test.EditorTestSuite):
  84. class MockSharedTest(editor_test.EditorSharedTest):
  85. pass
  86. mock_test_suite = MockTestSuite()
  87. tests = mock_test_suite.get_shared_tests()
  88. assert len(tests) == 1
  89. assert tests[0].__name__ == 'MockSharedTest'
  90. assert issubclass(tests[0], editor_test.EditorSharedTest)
  91. def test_GetSharedTests_AllTests_ReturnsOnlyShared(self):
  92. class MockTestSuite(editor_test.EditorTestSuite):
  93. class MockSharedTest(editor_test.EditorSharedTest):
  94. pass
  95. class MockAnotherSharedTest(editor_test.EditorSharedTest):
  96. pass
  97. class MockNotSharedTest(editor_test.EditorSingleTest):
  98. pass
  99. mock_test_suite = MockTestSuite()
  100. tests = mock_test_suite.get_shared_tests()
  101. assert len(tests) == 2
  102. for test in tests:
  103. assert issubclass(test, editor_test.EditorSharedTest)
  104. @mock.patch('ly_test_tools.o3de.editor_test.EditorTestSuite.filter_session_shared_tests')
  105. @mock.patch('ly_test_tools.o3de.editor_test.EditorTestSuite.get_shared_tests')
  106. def test_GetSessionSharedTests_Valid_CallsCorrectly(self, mock_get_shared_tests, mock_filter_session):
  107. editor_test.EditorTestSuite.get_session_shared_tests(mock.MagicMock())
  108. assert mock_get_shared_tests.called
  109. assert mock_filter_session.called
  110. @mock.patch('ly_test_tools.o3de.multi_test_framework.skip_pytest_runtest_setup', mock.MagicMock())
  111. def test_FilterSessionSharedTests_OneSharedTest_ReturnsOne(self):
  112. def mock_test():
  113. pass
  114. mock_test.originalname = 'mock_test'
  115. mock_test.__name__ = mock_test.originalname
  116. mock_session_items = [mock_test]
  117. mock_shared_tests = [mock_test]
  118. selected_tests = editor_test.EditorTestSuite.filter_session_shared_tests(mock_session_items, mock_shared_tests)
  119. assert selected_tests == mock_session_items
  120. assert len(selected_tests) == 1
  121. @mock.patch('ly_test_tools.o3de.multi_test_framework.skip_pytest_runtest_setup', mock.MagicMock())
  122. def test_FilterSessionSharedTests_ManyTests_ReturnsCorrectTests(self):
  123. def mock_test():
  124. pass
  125. def mock_test_2():
  126. pass
  127. def mock_test_3():
  128. pass
  129. mock_test.originalname = 'mock_test'
  130. mock_test.__name__ = mock_test.originalname
  131. mock_test_2.originalname = 'mock_test_2'
  132. mock_test_2.__name__ = mock_test_2.originalname
  133. mock_test_3.originalname = 'mock_test_3'
  134. mock_test_3.__name__ = mock_test_3.originalname
  135. mock_session_items = [mock_test, mock_test_2]
  136. mock_shared_tests = [mock_test, mock_test_2, mock_test_3]
  137. selected_tests = editor_test.EditorTestSuite.filter_session_shared_tests(mock_session_items, mock_shared_tests)
  138. assert selected_tests == mock_session_items
  139. @mock.patch('ly_test_tools.o3de.multi_test_framework.skip_pytest_runtest_setup')
  140. def test_FilterSessionSharedTests_SkipOneTest_ReturnsCorrectTests(self, mock_skip):
  141. def mock_test():
  142. pass
  143. def mock_test_2():
  144. pass
  145. def mock_test_3():
  146. pass
  147. mock_skip.side_effect = [True, Exception]
  148. mock_test.originalname = 'mock_test'
  149. mock_test.__name__ = mock_test.originalname
  150. mock_test_2.originalname = 'mock_test_2'
  151. mock_test_2.__name__ = mock_test_2.originalname
  152. mock_test_3.originalname = 'mock_test_3'
  153. mock_test_3.__name__ = mock_test_3.originalname
  154. mock_session_items = [mock_test, mock_test_2]
  155. mock_shared_tests = [mock_test, mock_test_2, mock_test_3]
  156. selected_tests = editor_test.EditorTestSuite.filter_session_shared_tests(mock_session_items, mock_shared_tests)
  157. assert selected_tests == [mock_test]
  158. @mock.patch('ly_test_tools.o3de.multi_test_framework.skip_pytest_runtest_setup', mock.MagicMock(side_effect=Exception))
  159. def test_FilterSessionSharedTests_ExceptionDuringSkipSetup_SkipsAddingTest(self):
  160. def mock_test():
  161. pass
  162. mock_test.originalname = 'mock_test'
  163. mock_test.__name__ = mock_test.originalname
  164. mock_session_items = [mock_test]
  165. mock_shared_tests = [mock_test]
  166. selected_tests = editor_test.EditorTestSuite.filter_session_shared_tests(mock_session_items, mock_shared_tests)
  167. assert len(selected_tests) == 0
  168. def test_FilterSharedTests_TrueParams_ReturnsTrueTests(self):
  169. mock_test = mock.MagicMock()
  170. mock_test.is_batchable = True
  171. mock_test.is_parallelizable = True
  172. mock_test_2 = mock.MagicMock()
  173. mock_test_2.is_batchable = False
  174. mock_test_2.is_parallelizable = False
  175. mock_shared_tests = [mock_test, mock_test_2]
  176. filtered_tests = editor_test.EditorTestSuite.filter_shared_tests(
  177. mock_shared_tests, is_batchable=True, is_parallelizable=True)
  178. assert filtered_tests == [mock_test]
  179. def test_FilterSharedTests_FalseParams_ReturnsFalseTests(self):
  180. mock_test = mock.MagicMock()
  181. mock_test.is_batchable = True
  182. mock_test.is_parallelizable = True
  183. mock_test_2 = mock.MagicMock()
  184. mock_test_2.is_batchable = False
  185. mock_test_2.is_parallelizable = False
  186. mock_shared_tests = [mock_test, mock_test_2]
  187. filtered_tests = editor_test.EditorTestSuite.filter_shared_tests(
  188. mock_shared_tests, is_batchable=False, is_parallelizable=False)
  189. assert filtered_tests == [mock_test_2]