Modified: trunk/Tools/BuildSlaveSupport/ews-build/loadConfig_unittest.py (267051 => 267052)
--- trunk/Tools/BuildSlaveSupport/ews-build/loadConfig_unittest.py 2020-09-14 22:30:09 UTC (rev 267051)
+++ trunk/Tools/BuildSlaveSupport/ews-build/loadConfig_unittest.py 2020-09-14 22:39:19 UTC (rev 267052)
@@ -31,13 +31,21 @@
class ConfigDotJSONTest(unittest.TestCase):
+ def get_config(self):
+ cwd = os.path.dirname(os.path.abspath(__file__))
+ return json.load(open(os.path.join(cwd, 'config.json')))
+
+ def get_builder_from_config(self, config, builder_name):
+ for builder in config['builders']:
+ if builder_name == builder.get('name'):
+ return builder
+
def test_configuration(self):
cwd = os.path.dirname(os.path.abspath(__file__))
loadConfig.loadBuilderConfig({}, is_test_mode_enabled=True, master_prefix_path=cwd)
def test_builder_keys(self):
- cwd = os.path.dirname(os.path.abspath(__file__))
- config = json.load(open(os.path.join(cwd, 'config.json')))
+ config = self.get_config()
valid_builder_keys = ['additionalArguments', 'architectures', 'builddir', 'configuration', 'description',
'defaultProperties', 'env', 'factory', 'icon', 'locks', 'name', 'platform', 'properties',
'remotes', 'runTests', 'shortname', 'tags', 'triggers', 'triggered_by', 'workernames', 'workerbuilddir']
@@ -46,8 +54,7 @@
self.assertTrue(key in valid_builder_keys, 'Unexpected key "{}" for builder {}'.format(key, builder.get('name')))
def test_multiple_scheduers_for_builder(self):
- cwd = os.path.dirname(os.path.abspath(__file__))
- config = json.load(open(os.path.join(cwd, 'config.json')))
+ config = self.get_config()
builder_to_schduler_map = {}
triggered_by_schedulers = []
for builder in config['builders']:
@@ -62,7 +69,44 @@
self.assertTrue(buildername not in builder_to_schduler_map, 'builder {} appears multiple times in schedulers.'.format(buildername))
builder_to_schduler_map[buildername] = scheduler.get('name')
+ def test_schduler_contains_valid_builder_name(self):
+ config = self.get_config()
+ builder_name_list = [builder['name'] for builder in config['builders']]
+ for scheduler in config.get('schedulers'):
+ for buildername in scheduler.get('builderNames'):
+ self.assertTrue(buildername in builder_name_list, 'builder "{}" in scheduler "{}" is invalid.'.format(buildername, scheduler['name']))
+ def test_single_builder_for_triggerable_scheduler(self):
+ config = self.get_config()
+ for scheduler in config['schedulers']:
+ if scheduler.get('type') == 'Triggerable':
+ self.assertTrue(len(scheduler.get('builderNames')) == 1, 'scheduler "{}" triggers multiple builders.'.format(scheduler['name']))
+
+ def test_incorrect_triggered_by(self):
+ config = self.get_config()
+ schedulers_to_buildername_map = {}
+ for scheduler in config['schedulers']:
+ schedulers_to_buildername_map[scheduler['name']] = scheduler['builderNames']
+
+ for builder in config['builders']:
+ for key, value in builder.iteritems():
+ if key == 'triggered_by':
+ self.assertTrue(len(value) == 1, 'triggered_by "{}" is invalid, it should contain a single trigger.'.format(value))
+ self.assertTrue(value[0] in schedulers_to_buildername_map.keys(),
+ 'triggered_by "{}" for builder "{}" is not listed in schedulers section.'.format(value[0], builder['name']))
+
+ # Ensure that the triggered_by is correct, verify by matching that the builder for the triggered_by scheduler actually triggers current builder
+ triggered_by = value[0]
+ triggering_builder_name = schedulers_to_buildername_map.get(triggered_by)[0]
+ triggering_builder = self.get_builder_from_config(config, triggering_builder_name)
+ self.assertTrue(triggering_builder, 'builder "{}" in scheduler "{}" is invalid.'.format(triggering_builder_name, triggered_by))
+ triggering_builder_triggers = triggering_builder.get('triggers')
+ triggering_builder_triggers_buildernames = [schedulers_to_buildername_map[scheduler][0] for scheduler in triggering_builder_triggers]
+ self.assertTrue(builder['name'] in triggering_builder_triggers_buildernames,
+ 'Incorrect triggered_by "{}" in builder "{}", this builder is not in corresponding builder triggers "{}".'
+ .format(triggered_by, builder['name'], triggering_builder_triggers_buildernames))
+
+
class TagsForBuilderTest(unittest.TestCase):
def verifyTags(self, builderName, expectedTags):
tags = loadConfig.getTagsForBuilder({'name': builderName})
Modified: trunk/Tools/BuildSlaveSupport/ews-build/steps_unittest.py (267051 => 267052)
--- trunk/Tools/BuildSlaveSupport/ews-build/steps_unittest.py 2020-09-14 22:30:09 UTC (rev 267051)
+++ trunk/Tools/BuildSlaveSupport/ews-build/steps_unittest.py 2020-09-14 22:39:19 UTC (rev 267052)
@@ -2024,6 +2024,20 @@
self.expectOutcome(result=RETRY, state_string='Unable to confirm if test failures are introduced by patch, retrying build (retry)')
return self.runStep()
+ def test_clean_tree_exceed_failure_limit_with_triggered_by(self):
+ self.configureStep()
+ self.setProperty('buildername', 'iOS-13-Simulator-WK2-Tests-EWS')
+ self.setProperty('triggered_by', 'ios-13-sim-build-ews')
+ self.setProperty('first_run_failures', ['test1'])
+ self.setProperty('second_run_failures', ['test1'])
+ self.setProperty('clean_tree_results_exceed_failure_limit', True)
+ self.setProperty('clean_tree_run_failures', ['test{}'.format(i) for i in range(0, 30)])
+ message = 'Unable to confirm if test failures are introduced by patch, retrying build'
+ self.expectOutcome(result=SUCCESS, state_string=message)
+ rc = self.runStep()
+ self.assertEqual(self.getProperty('build_summary'), message)
+ return rc
+
def test_clean_tree_has_lot_of_failures(self):
self.configureStep()
self.setProperty('first_results_exceed_failure_limit', True)