diff options
author | David Bradford <david.bradford@mongodb.com> | 2019-01-23 12:10:41 -0500 |
---|---|---|
committer | David Bradford <david.bradford@mongodb.com> | 2019-02-05 14:25:33 -0500 |
commit | 17f25a473b0f1f7f132fecbc41581224aa324828 (patch) | |
tree | 837983dc1353447f1623f80c2d490c64060668c8 /buildscripts | |
parent | f31cd5adaafd74b57317c4e7403123feea69d347 (diff) | |
download | mongo-17f25a473b0f1f7f132fecbc41581224aa324828.tar.gz |
SERVER-39138: Properly handle new suites when splitting suites
(cherry picked from commit eee822dc06f5f1514cb1a3f5930940ccf95f2e41)
Diffstat (limited to 'buildscripts')
-rwxr-xr-x | buildscripts/evergreen_generate_resmoke_tasks.py | 13 | ||||
-rw-r--r-- | buildscripts/tests/test_evergreen_generate_resmoke_tasks.py | 22 |
2 files changed, 30 insertions, 5 deletions
diff --git a/buildscripts/evergreen_generate_resmoke_tasks.py b/buildscripts/evergreen_generate_resmoke_tasks.py index 19fd7c4662e..0108c889f4f 100755 --- a/buildscripts/evergreen_generate_resmoke_tasks.py +++ b/buildscripts/evergreen_generate_resmoke_tasks.py @@ -100,8 +100,9 @@ def get_config_options(cmd_line_options, config_file): # pylint: disable=too-many-locals config_file_data = read_config.read_config_file(config_file) - fallback_num_sub_suites = read_config.get_config_value( - "fallback_num_sub_suites", cmd_line_options, config_file_data, required=True) + fallback_num_sub_suites = int( + read_config.get_config_value("fallback_num_sub_suites", cmd_line_options, config_file_data, + required=True)) max_sub_suites = read_config.get_config_value("max_sub_suites", cmd_line_options, config_file_data) project = read_config.get_config_value("project", cmd_line_options, config_file_data, @@ -534,6 +535,10 @@ class Main(object): try: evg_stats = self.get_evg_stats(self.config_options.project, start_date, end_date, self.config_options.task, self.config_options.variant) + if not evg_stats: + # This is probably a new suite, since there is no test history, just use the + # fallback values. + return self.calculate_fallback_suites() target_execution_time_secs = self.config_options.target_resmoke_time * 60 return self.calculate_suites_from_evg_stats(evg_stats, target_execution_time_secs) except requests.HTTPError as err: @@ -572,9 +577,9 @@ class Main(object): def calculate_fallback_suites(self): """Divide tests into a fixed number of suites.""" num_suites = self.config_options.fallback_num_sub_suites - tests = self.list_tests() + self.test_list = self.list_tests() suites = [Suite() for _ in range(num_suites)] - for idx, test_file in enumerate(tests): + for idx, test_file in enumerate(self.test_list): suites[idx % num_suites].add_test(test_file, 0) return suites diff --git a/buildscripts/tests/test_evergreen_generate_resmoke_tasks.py b/buildscripts/tests/test_evergreen_generate_resmoke_tasks.py index 767b8891922..af6fdadf9d1 100644 --- a/buildscripts/tests/test_evergreen_generate_resmoke_tasks.py +++ b/buildscripts/tests/test_evergreen_generate_resmoke_tasks.py @@ -473,6 +473,7 @@ class MainTest(unittest.TestCase): self.assertEqual(10, len(suite.tests)) def test_calculate_suites_fallback(self): + n_tests = 100 response = Mock() response.status_code = requests.codes.SERVICE_UNAVAILABLE evg = Mock() @@ -482,14 +483,33 @@ class MainTest(unittest.TestCase): main.options = Mock() main.options.execution_time_minutes = 10 main.config_options = self.get_mock_options() - main.list_tests = Mock(return_value=["test{}.js".format(i) for i in range(100)]) + main.list_tests = Mock(return_value=["test{}.js".format(i) for i in range(n_tests)]) + + suites = main.calculate_suites(_DATE, _DATE) + + self.assertEqual(main.config_options.fallback_num_sub_suites, len(suites)) + for suite in suites: + self.assertEqual(50, len(suite.tests)) + self.assertEqual(n_tests, len(main.test_list)) + + def test_calculate_suites_uses_fallback_for_no_results(self): + n_tests = 100 + evg = Mock() + evg.test_stats.return_value = [] + + main = grt.Main(evg) + main.options = Mock() + main.config_options = self.get_mock_options() + main.list_tests = Mock(return_value=["test{}.js".format(i) for i in range(n_tests)]) suites = main.calculate_suites(_DATE, _DATE) self.assertEqual(main.config_options.fallback_num_sub_suites, len(suites)) for suite in suites: self.assertEqual(50, len(suite.tests)) + self.assertEqual(n_tests, len(main.test_list)) + def test_calculate_suites_error(self): response = Mock() response.status_code = requests.codes.INTERNAL_SERVER_ERROR |