summaryrefslogtreecommitdiff
path: root/buildscripts
diff options
context:
space:
mode:
authorDavid Bradford <david.bradford@mongodb.com>2019-01-23 12:10:41 -0500
committerDavid Bradford <david.bradford@mongodb.com>2019-02-05 14:25:33 -0500
commit17f25a473b0f1f7f132fecbc41581224aa324828 (patch)
tree837983dc1353447f1623f80c2d490c64060668c8 /buildscripts
parentf31cd5adaafd74b57317c4e7403123feea69d347 (diff)
downloadmongo-17f25a473b0f1f7f132fecbc41581224aa324828.tar.gz
SERVER-39138: Properly handle new suites when splitting suites
(cherry picked from commit eee822dc06f5f1514cb1a3f5930940ccf95f2e41)
Diffstat (limited to 'buildscripts')
-rwxr-xr-xbuildscripts/evergreen_generate_resmoke_tasks.py13
-rw-r--r--buildscripts/tests/test_evergreen_generate_resmoke_tasks.py22
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