def testInitiate_ScheduleBuild(self, put, _): # We then need to make sure that the buildbucket put was called. put.return_value = {'build': {'id': '345982437987234'}} # This time we don't seed the isolate for the change to force the build. self.assertDictEqual( { 'find_isolate_chromium@7c7e90be': { 'bucket': 'luci.bucket', 'buildbucket_result': { 'build': { 'id': '345982437987234' }, }, 'builder': 'Mac Builder', 'change': mock.ANY, 'status': 'ongoing', 'target': 'telemetry_perf_tests', 'tries': 1, }, }, task_module.Evaluate( self.job, event_module.Event( type='initiate', target_task='find_isolate_chromium@7c7e90be', payload={}), find_isolate.Evaluator(self.job))) self.assertEqual(1, put.call_count)
def testUpdate_MissingIsolates_InvalidJson(self, get_build_status): json = '{ invalid }' get_build_status.return_value = { 'build': { 'status': 'COMPLETED', 'result': 'SUCCESS', 'result_details_json': json, } } self.assertDictEqual( { 'find_isolate_chromium@7c7e90be': { 'bucket': 'luci.bucket', 'buildbucket_result': { 'build': { 'id': '345982437987234' } }, 'buildbucket_job_status': mock.ANY, 'builder': 'Mac Builder', 'change': mock.ANY, 'status': 'failed', 'errors': mock.ANY, 'target': 'telemetry_perf_tests', 'tries': 1, }, }, task_module.Evaluate( self.job, event_module.Event( type='update', target_task='find_isolate_chromium@7c7e90be', payload={'status': 'build_completed'}), find_isolate.Evaluator(self.job))) self.assertEqual(1, get_build_status.call_count)
def testInitiate_FoundIsolate(self, *_): # Seed the isolate for this change. change = change_module.Change( commits=[change_module.Commit('chromium', '7c7e90be')]) isolate.Put((('Mac Builder', change, 'telemetry_perf_tests', 'https://isolate.server', '7c7e90be'), )) # Then ensure that we can find the seeded isolate for the specified # revision. self.assertDictEqual( { 'find_isolate_chromium@7c7e90be': { 'bucket': 'luci.bucket', 'builder': 'Mac Builder', 'change': mock.ANY, 'isolate_hash': '7c7e90be', 'isolate_server': 'https://isolate.server', 'status': 'completed', 'target': 'telemetry_perf_tests', }, }, task_module.Evaluate( self.job, event_module.Event( type='initiate', target_task='find_isolate_chromium@7c7e90be', payload={}), find_isolate.Evaluator(self.job)))
def setUp(self): super(FindIsolateEvaluatorUpdateTests, self).setUp() # Here we set up the pre-requisite for polling, where we've already had a # successful build scheduled. with mock.patch('dashboard.services.buildbucket_service.Put') as put: put.return_value = {'build': {'id': '345982437987234'}} self.assertDictEqual( { 'find_isolate_chromium@7c7e90be': { 'buildbucket_result': { 'build': { 'id': '345982437987234' } }, 'status': 'ongoing', 'builder': 'Mac Builder', 'bucket': 'luci.bucket', 'change': mock.ANY, 'target': 'telemetry_perf_tests', 'tries': 1, }, }, task_module.Evaluate( self.job, event_module.Event( type='initiate', target_task='find_isolate_chromium@7c7e90be', payload={}), find_isolate.Evaluator(self.job))) self.assertEqual(1, put.call_count)
def testUpdate_BuildFailed_HardFailure(self, get_build_status): get_build_status.return_value = { 'build': { 'status': 'COMPLETED', 'result': 'FAILURE', 'result_details_json': '{}', } } self.assertDictEqual( { 'find_isolate_chromium@7c7e90be': { 'bucket': 'luci.bucket', 'buildbucket_result': { 'build': { 'id': '345982437987234' }, }, 'buildbucket_job_status': mock.ANY, 'builder': 'Mac Builder', 'build_url': mock.ANY, 'change': mock.ANY, 'status': 'failed', 'target': 'telemetry_perf_tests', 'errors': [mock.ANY], 'tries': 1, }, }, task_module.Evaluate( self.job, event_module.Event( type='update', target_task='find_isolate_chromium@7c7e90be', payload={'status': 'build_completed'}), find_isolate.Evaluator(self.job))) self.assertEqual(1, get_build_status.call_count) self.assertEqual( { 'find_isolate_chromium@7c7e90be': { 'completed': True, 'exception': mock.ANY, 'details': [{ 'key': 'builder', 'value': 'Mac Builder', 'url': None, }, { 'key': 'build', 'value': '345982437987234', 'url': mock.ANY, }] } }, task_module.Evaluate( self.job, event_module.Event( type='unimportant', target_task=None, payload={}), find_isolate.Serializer()))
def __init__(self, job): # We gather all the evaluators from the modules we know. super(ExecutionEngine, self).__init__(evaluators=[ evaluators.DispatchByTaskType( { 'find_isolate': find_isolate.Evaluator(job), 'find_culprit': performance_bisection.Evaluator(job), 'read_value': read_value.Evaluator(job), 'run_test': run_test.Evaluator(job), }), # We then always lift the task payload up, skipping some of the # larger objects that we know we are not going to need when deciding # what the end result is. evaluators.TaskPayloadLiftingEvaluator( exclude_keys=EXCLUDED_PAYLOAD_KEYS) ])
def testUpdate_MissingIsolates_Revision(self, get_build_status): json = """ { "properties": { "isolate_server": "https://isolate.server", "swarm_hashes_refs/heads/master(at)7c7e90be_without_patch": {"telemetry_perf_tests": "192923affe212adf"} } }""" get_build_status.return_value = { 'build': { 'status': 'COMPLETED', 'result': 'SUCCESS', 'result_details_json': json, } } self.assertDictEqual( { 'find_isolate_chromium@7c7e90be': { 'bucket': 'luci.bucket', 'builder': 'Mac Builder', 'build_url': mock.ANY, 'buildbucket_result': { 'build': { 'id': '345982437987234' } }, 'buildbucket_job_status': mock.ANY, 'change': mock.ANY, 'status': 'failed', 'target': 'telemetry_perf_tests', 'tries': 1, 'errors': mock.ANY, }, }, task_module.Evaluate( self.job, event_module.Event( type='update', target_task='find_isolate_chromium@7c7e90be', payload={'status': 'build_completed'}), find_isolate.Evaluator(self.job))) self.assertEqual(1, get_build_status.call_count)
def testUpdate_BuildFailed_Cancelled(self, get_build_status): get_build_status.return_value = { 'build': { 'status': 'COMPLETED', 'result': 'CANCELLED', 'result_details_json': '{}', } } self.assertDictEqual( { 'find_isolate_chromium@7c7e90be': { 'bucket': 'luci.bucket', 'builder': 'Mac Builder', 'buildbucket_result': { 'build': { 'id': '345982437987234' } }, 'buildbucket_job_status': { 'status': 'COMPLETED', 'result': 'CANCELLED', 'result_details_json': '{}', }, 'build_url': mock.ANY, 'change': mock.ANY, 'errors': [mock.ANY], 'status': 'cancelled', 'target': 'telemetry_perf_tests', 'tries': 1, }, }, task_module.Evaluate( self.job, event_module.Event( type='update', target_task='find_isolate_chromium@7c7e90be', payload={'status': 'build_completed'}), find_isolate.Evaluator(self.job))) self.assertEqual(1, get_build_status.call_count)
def testUpdate_BuildSuccessful(self, put, get_build_status): # First we're going to initiate so we have a build scheduled. put.return_value = {'build': {'id': '345982437987234'}} self.assertDictEqual( { 'find_isolate_chromium@7c7e90be': { 'bucket': 'luci.bucket', 'buildbucket_result': { 'build': { 'id': '345982437987234' }, }, 'builder': 'Mac Builder', 'change': mock.ANY, 'status': 'ongoing', 'target': 'telemetry_perf_tests', 'tries': 1, }, }, task_module.Evaluate( self.job, event_module.Event( type='initiate', target_task='find_isolate_chromium@7c7e90be', payload={}), find_isolate.Evaluator(self.job))) self.assertEqual(1, put.call_count) # Now we send an update event which should cause us to poll the status of # the build on demand. json = """ { "properties": { "got_revision_cp": "refs/heads/master@7c7e90be", "isolate_server": "https://isolate.server", "swarm_hashes_refs/heads/master(at)7c7e90be_without_patch": {"telemetry_perf_tests": "192923affe212adf"} } }""" get_build_status.return_value = { 'build': { 'status': 'COMPLETED', 'result': 'SUCCESS', 'result_details_json': json, } } self.assertDictEqual( { 'find_isolate_chromium@7c7e90be': { 'bucket': 'luci.bucket', 'buildbucket_job_status': mock.ANY, 'buildbucket_result': { 'build': { 'id': '345982437987234' } }, 'builder': 'Mac Builder', 'change': mock.ANY, 'isolate_hash': '192923affe212adf', 'isolate_server': 'https://isolate.server', 'status': 'completed', 'target': 'telemetry_perf_tests', 'tries': 1, }, }, task_module.Evaluate( self.job, event_module.Event( type='update', target_task='find_isolate_chromium@7c7e90be', payload={'status': 'build_completed'}), find_isolate.Evaluator(self.job))) self.assertEqual(1, get_build_status.call_count)