test_o3de_atom_tools_test.py 10.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  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.atom_tools_test as atom_tools_test
  10. pytestmark = pytest.mark.SUITE_smoke
  11. class TestAtomToolsTestSuite(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 = atom_tools_test.AtomToolsTestSuite()
  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 = atom_tools_test.AtomToolsTestSuite()
  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.atom_tools_test.AtomToolsTestSuite.filter_session_shared_tests')
  30. def test_PytestCustomModifyItems_FunctionsMatch_AddsRunners(self, mock_filter_tests):
  31. class MockTestSuite(atom_tools_test.AtomToolsTestSuite):
  32. pass
  33. mock_func_1 = mock.MagicMock()
  34. mock_test = mock.MagicMock()
  35. runner_1 = atom_tools_test.AtomToolsTestSuite.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(atom_tools_test.AtomToolsTestSuite):
  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(atom_tools_test.AtomToolsTestSuite):
  56. class MockSingleTest(atom_tools_test.AtomToolsSingleTest):
  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], atom_tools_test.AtomToolsSingleTest)
  63. def test_GetSingleTests_AllTests_ReturnsOnlySingles(self):
  64. class MockTestSuite(atom_tools_test.AtomToolsTestSuite):
  65. class MockSingleTest(atom_tools_test.AtomToolsSingleTest):
  66. pass
  67. class MockAnotherSingleTest(atom_tools_test.AtomToolsSingleTest):
  68. pass
  69. class MockNotSingleTest(atom_tools_test.AtomToolsSharedTest):
  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, atom_tools_test.AtomToolsSingleTest)
  76. def test_GetSharedTests_NoSharedTests_EmptyList(self):
  77. class MockTestSuite(atom_tools_test.AtomToolsTestSuite):
  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(atom_tools_test.AtomToolsTestSuite):
  84. class MockSharedTest(atom_tools_test.AtomToolsSharedTest):
  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], atom_tools_test.AtomToolsSharedTest)
  91. def test_GetSharedTests_AllTests_ReturnsOnlyShared(self):
  92. class MockTestSuite(atom_tools_test.AtomToolsTestSuite):
  93. class MockSharedTest(atom_tools_test.AtomToolsSharedTest):
  94. pass
  95. class MockAnotherSharedTest(atom_tools_test.AtomToolsSharedTest):
  96. pass
  97. class MockNotSharedTest(atom_tools_test.AtomToolsSingleTest):
  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, atom_tools_test.AtomToolsSharedTest)
  104. @mock.patch('ly_test_tools.o3de.atom_tools_test.AtomToolsTestSuite.filter_session_shared_tests')
  105. @mock.patch('ly_test_tools.o3de.atom_tools_test.AtomToolsTestSuite.get_shared_tests')
  106. def test_GetSessionSharedTests_Valid_CallsCorrectly(self, mock_get_shared_tests, mock_filter_session):
  107. atom_tools_test.AtomToolsTestSuite.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 = atom_tools_test.AtomToolsTestSuite.filter_session_shared_tests(
  119. mock_session_items, mock_shared_tests)
  120. assert selected_tests == mock_session_items
  121. assert len(selected_tests) == 1
  122. @mock.patch('ly_test_tools.o3de.multi_test_framework.skip_pytest_runtest_setup', mock.MagicMock())
  123. def test_FilterSessionSharedTests_ManyTests_ReturnsCorrectTests(self):
  124. def mock_test():
  125. pass
  126. def mock_test_2():
  127. pass
  128. def mock_test_3():
  129. pass
  130. mock_test.originalname = 'mock_test'
  131. mock_test.__name__ = mock_test.originalname
  132. mock_test_2.originalname = 'mock_test_2'
  133. mock_test_2.__name__ = mock_test_2.originalname
  134. mock_test_3.originalname = 'mock_test_3'
  135. mock_test_3.__name__ = mock_test_3.originalname
  136. mock_session_items = [mock_test, mock_test_2]
  137. mock_shared_tests = [mock_test, mock_test_2, mock_test_3]
  138. selected_tests = atom_tools_test.AtomToolsTestSuite.filter_session_shared_tests(
  139. mock_session_items, mock_shared_tests)
  140. assert selected_tests == mock_session_items
  141. @mock.patch('ly_test_tools.o3de.multi_test_framework.skip_pytest_runtest_setup')
  142. def test_FilterSessionSharedTests_SkipOneTest_ReturnsCorrectTests(self, mock_skip):
  143. def mock_test():
  144. pass
  145. def mock_test_2():
  146. pass
  147. def mock_test_3():
  148. pass
  149. mock_skip.side_effect = [True, Exception]
  150. mock_test.originalname = 'mock_test'
  151. mock_test.__name__ = mock_test.originalname
  152. mock_test_2.originalname = 'mock_test_2'
  153. mock_test_2.__name__ = mock_test_2.originalname
  154. mock_test_3.originalname = 'mock_test_3'
  155. mock_test_3.__name__ = mock_test_3.originalname
  156. mock_session_items = [mock_test, mock_test_2]
  157. mock_shared_tests = [mock_test, mock_test_2, mock_test_3]
  158. selected_tests = atom_tools_test.AtomToolsTestSuite.filter_session_shared_tests(
  159. mock_session_items, mock_shared_tests)
  160. assert selected_tests == [mock_test]
  161. @mock.patch(
  162. 'ly_test_tools.o3de.multi_test_framework.skip_pytest_runtest_setup', mock.MagicMock(side_effect=Exception))
  163. def test_FilterSessionSharedTests_ExceptionDuringSkipSetup_SkipsAddingTest(self):
  164. def mock_test():
  165. pass
  166. mock_test.originalname = 'mock_test'
  167. mock_test.__name__ = mock_test.originalname
  168. mock_session_items = [mock_test]
  169. mock_shared_tests = [mock_test]
  170. selected_tests = atom_tools_test.AtomToolsTestSuite.filter_session_shared_tests(
  171. mock_session_items, mock_shared_tests)
  172. assert len(selected_tests) == 0
  173. def test_FilterSharedTests_TrueParams_ReturnsTrueTests(self):
  174. mock_test = mock.MagicMock()
  175. mock_test.is_batchable = True
  176. mock_test.is_parallelizable = True
  177. mock_test_2 = mock.MagicMock()
  178. mock_test_2.is_batchable = False
  179. mock_test_2.is_parallelizable = False
  180. mock_shared_tests = [mock_test, mock_test_2]
  181. filtered_tests = atom_tools_test.AtomToolsTestSuite.filter_shared_tests(
  182. mock_shared_tests, is_batchable=True, is_parallelizable=True)
  183. assert filtered_tests == [mock_test]
  184. def test_FilterSharedTests_FalseParams_ReturnsFalseTests(self):
  185. mock_test = mock.MagicMock()
  186. mock_test.is_batchable = True
  187. mock_test.is_parallelizable = True
  188. mock_test_2 = mock.MagicMock()
  189. mock_test_2.is_batchable = False
  190. mock_test_2.is_parallelizable = False
  191. mock_shared_tests = [mock_test, mock_test_2]
  192. filtered_tests = atom_tools_test.AtomToolsTestSuite.filter_shared_tests(
  193. mock_shared_tests, is_batchable=False, is_parallelizable=False)
  194. assert filtered_tests == [mock_test_2]