def setUp(self): super(CompileApiTest, self).setUp() self.analyzed_build_id = 8000000000000 self.context = Context(luci_project_name='chromeos', gitiles_host='gitiles.host.com', gitiles_project='project/name', gitiles_ref='ref/heads/master', gitiles_id='git_sha') self.analysis = CompileFailureAnalysis.Create( luci_project=self.context.luci_project_name, luci_bucket='postsubmit', luci_builder='Linux Builder', build_id=self.analyzed_build_id, gitiles_host=self.context.gitiles_host, gitiles_project=self.context.gitiles_project, gitiles_ref=self.context.gitiles_ref, last_passed_gitiles_id='last_passed_git_hash', last_passed_commit_position=65432, first_failed_gitiles_id=self.context.gitiles_id, first_failed_commit_position=65450, rerun_builder_id='chromeos/postsubmit/builder-bisect', compile_failure_keys=[]) self.analysis.Save() self.compile_step_name = 'compile'
def testBisectGitilesCommitFailedToGetGitilesId(self): gitiles_host = 'gitiles.host.com' gitiles_project = 'project/name' gitiles_ref = 'ref/heads/master' left_bound_gitiles_id = '100' right_bound_gitiles_id = '110' context = Context(luci_project_name='chromium', gitiles_project=gitiles_project, gitiles_host=gitiles_host, gitiles_ref=gitiles_ref, gitiles_id=right_bound_gitiles_id) left_bound_commit = self._CreateGitilesCommit(left_bound_gitiles_id, 100) right_bound_commit = self._CreateGitilesCommit(right_bound_gitiles_id, 110) revisions = {} bisect_commit, culprit_commit = analysis_util.BisectGitilesCommit( context, left_bound_commit, right_bound_commit, revisions) self.assertIsNone(bisect_commit) self.assertIsNone(culprit_commit)
def setUp(self): super(ChromeOSProjectAPITest, self).setUp() self.first_failed_commit_id = 'git_sha' self.first_failed_commit_position = 65450 self.context = Context(luci_project_name='chromeos', gitiles_host='gitiles.host.com', gitiles_project='project/name', gitiles_ref='ref/heads/master', gitiles_id='git_sha') self.builder = BuilderID(project='chromeos', bucket='postsubmit', builder='builder-postsubmit') self.group_build_id = 8000000000189 self.group_build = LuciFailedBuild.Create( luci_project=self.context.luci_project_name, luci_bucket=self.builder.bucket, luci_builder='builder2-postsubmit', build_id=self.group_build_id, legacy_build_number=12345, gitiles_host=self.context.gitiles_host, gitiles_project=self.context.gitiles_project, gitiles_ref=self.context.gitiles_ref, gitiles_id=self.context.gitiles_id, commit_position=self.first_failed_commit_position, status=20, create_time=datetime(2019, 3, 28), start_time=datetime(2019, 3, 28, 0, 1), end_time=datetime(2019, 3, 28, 1), build_failure_type=StepTypeEnum.COMPILE) self.group_build.put()
def GetBuildAndContextForAnalysis(project, build_id): """Gets all information about a build and generates context from it. Args: project (str): Luci project of the build. build_id (int): Id of the build. Returns: (buildbucket build.proto): ALL info about the build. (Context): Context of an analysis. """ build = buildbucket_client.GetV2Build(build_id, fields=FieldMask(paths=['*'])) if not build: logging.error('Failed to get build info for build %d.', build_id) return None, None if (build.input.gitiles_commit.host != projects.GERRIT_PROJECTS[project]['gitiles-host'] or build.input.gitiles_commit.project != projects.GERRIT_PROJECTS[project]['name']): logging.warning('Unexpected gitiles project for build: %r', build_id) return None, None context = Context(luci_project_name=project, gitiles_host=build.input.gitiles_commit.host, gitiles_project=build.input.gitiles_commit.project, gitiles_ref=build.input.gitiles_commit.ref, gitiles_id=build.input.gitiles_commit.id) return build, context
def testBackfillIfSkippedAnalyses(self, mock_trigger_new_analysis, mock_get_failures, *_): first_failed_build_id = 8000000000128 first_failure = TestFailure.Create( ndb.Key(LuciFailedBuild, first_failed_build_id), self.test_step_name, 'test8', first_failed_build_id=first_failed_build_id, failure_group_build_id=first_failed_build_id, properties={'needs_bisection': False}) first_failure.put() current_build_id = 8000000000123 test_failure = TestFailure.Create( ndb.Key(LuciFailedBuild, current_build_id), self.test_step_name, 'test8', first_failed_build_id=first_failed_build_id, failure_group_build_id=first_failed_build_id, merged_failure_key=first_failure.key) test_failure.put() mock_get_failures.return_value = {first_failed_build_id: [first_failure]} context = Context( luci_project_name='chromeos', gitiles_host='gitiles.host.com', gitiles_project='project/name', gitiles_ref='ref/heads/master', gitiles_id='git_sha_123') build = Build(id=current_build_id) test_analysis.BackfillIfSkippedAnalyses(context, build) mock_trigger_new_analysis.assert_called_once_with( 'ChromeOSProjectAPI', 'prev_context', 'prev_build', [first_failure])
def testBisectGitilesCommitGetCulpritCommit(self): gitiles_host = 'gitiles.host.com' gitiles_project = 'project/name' gitiles_ref = 'ref/heads/master' left_bound_gitiles_id = '100' right_bound_gitiles_id = '110' context = Context(luci_project_name='chromium', gitiles_project=gitiles_project, gitiles_host=gitiles_host, gitiles_ref=gitiles_ref, gitiles_id=right_bound_gitiles_id) left_bound_commit = self._CreateGitilesCommit(left_bound_gitiles_id, 109) right_bound_commit = self._CreateGitilesCommit(right_bound_gitiles_id, 110) revisions = {n: str(n) for n in xrange(100, 110)} bisect_commit, culprit_commit = analysis_util.BisectGitilesCommit( context, left_bound_commit, right_bound_commit, revisions) self.assertIsNone(bisect_commit) self.assertEqual(110, culprit_commit.commit_position)
def setUp(self): super(APITest, self).setUp() self.context = Context(luci_project_name='project', gitiles_host='gitiles.host.com', gitiles_project='project/name', gitiles_ref='ref/heads/master', gitiles_id='git_sha')
def testGetRepoUrlFromContext(self): context = Context(luci_project_name='chromium', gitiles_host='gitiles.host.com', gitiles_project='project/name', gitiles_ref='ref/heads/master', gitiles_id='git_sha') self.assertEqual('https://gitiles.host.com/project/name.git', git.GetRepoUrlFromContext(context))
def GetRepoUrlFromV2Build(build): """Constructs repo url from a build's info. Args: build (build_pb2.Build): Info of a build. Returns: (str): repo url. """ context = Context(luci_project_name=build.builder.project, gitiles_host=build.input.gitiles_commit.host, gitiles_project=build.input.gitiles_commit.project, gitiles_ref=build.input.gitiles_commit.ref, gitiles_id=build.input.gitiles_commit.id) return GetRepoUrlFromContext(context)
def testValidFailedBuild(self, mocked_OnBuildFailure, mocked_GetV2Build, *_): build = Build() build.input.gitiles_commit.host = 'gitiles.host.com' build.input.gitiles_commit.project = 'project/name' build.input.gitiles_commit.ref = 'ref/heads/master' build.input.gitiles_commit.id = 'git_sha' mocked_GetV2Build.return_value = build self.assertTrue( api.OnBuildCompletion('project', 'ci', 'builder', 123, 'FAILURE')) mocked_GetV2Build.assert_called_once_with( 123, fields=FieldMask(paths=['*'])) mocked_OnBuildFailure.assert_called_once_with( Context(luci_project_name='project', gitiles_host='gitiles.host.com', gitiles_project='project/name', gitiles_ref='ref/heads/master', gitiles_id='git_sha'), build)
def testSaveFailedBuild(self, _): builder = BuilderID(project='chromium', bucket='try', builder='linux-rel') build = Build( id=87654321, builder=builder, number=123, status=common_pb2.FAILURE) build.create_time.FromDatetime(datetime(2019, 4, 9)) build.start_time.FromDatetime(datetime(2019, 4, 9, 0, 1)) build.end_time.FromDatetime(datetime(2019, 4, 9, 1)) context = Context( luci_project_name='project', gitiles_host='gitiles.host.com', gitiles_project='project/name', gitiles_ref='ref/heads/master', gitiles_id='git_sha') build_entity = luci_build.SaveFailedBuild(context, build, StepTypeEnum.COMPILE) self.assertIsNotNone(build_entity)
def setUp(self): super(CompileAnalysisAPITest, self).setUp() self.build_id = 8000000000123 self.build_number = 123 self.builder = BuilderID(project='chromium', bucket='ci', builder='Linux Tests') self.build = self._MockBuild(self.build_id, self.build_number, 'git_sha_123') self.rerun_builder = BuilderID(project='chromium', bucket='try', builder='findit_variables') self.context = Context(luci_project_name='chromium', gitiles_host='gitiles.host.com', gitiles_project='project/name', gitiles_ref='ref/heads/master', gitiles_id='git_sha_123') self.build_entity = LuciFailedBuild.Create( luci_project=self.build.builder.project, luci_bucket=self.build.builder.bucket, luci_builder=self.build.builder.builder, build_id=self.build.id, legacy_build_number=self.build.number, gitiles_host=self.context.gitiles_host, gitiles_project=self.context.gitiles_project, gitiles_ref=self.context.gitiles_ref, gitiles_id=self.context.gitiles_id, commit_position=123, status=self.build.status, create_time=self.build.create_time.ToDatetime(), start_time=self.build.start_time.ToDatetime(), end_time=self.build.end_time.ToDatetime(), build_failure_type=StepTypeEnum.COMPILE) self.build_entity.put() self.analysis_api = CompileAnalysisAPI() self.compile_failure = self.analysis_api._CreateFailure( self.build_entity.key, 'compile', self.build_id, 8000000000122, None, frozenset(['a.o']), None) self.compile_failure.put()
def testOnRerunBuildCompletion(self, mocked_OnRerunBuildCompletion, mocked_GetV2Build, *_): build = Build() build.created_by = 'user:{}'.format(DEFAULT_SERVICE_ACCOUNT) build.input.gitiles_commit.host = 'gitiles.host.com' build.input.gitiles_commit.project = 'project/name' build.input.gitiles_commit.ref = 'ref/heads/master' build.input.gitiles_commit.id = 'git_sha' mocked_GetV2Build.return_value = build self.assertTrue( api.OnBuildCompletion('project', 'ci', 'r_builder', 123, 'SUCCESS')) mocked_GetV2Build.assert_called_once_with( 123, fields=FieldMask(paths=['*'])) mocked_OnRerunBuildCompletion.assert_called_once_with( Context(luci_project_name='project', gitiles_host='gitiles.host.com', gitiles_project='project/name', gitiles_ref='ref/heads/master', gitiles_id='git_sha'), build)
def setUp(self): super(PreCompileAnalysisTest, self).setUp() self.build_id = 8000000000123 self.build_number = 123 self.builder = BuilderID(project='chromium', bucket='ci', builder='Linux Tests') self.build = self._MockBuild(self.build_id, self.build_number, 'git_sha_123') self.context = Context(luci_project_name='chromium', gitiles_host='gitiles.host.com', gitiles_project='project/name', gitiles_ref='ref/heads/master', gitiles_id='git_sha_123') self.build_info = { 'id': 8000000000123, 'number': self.build_number, 'commit_id': 'git_sha_123' }
def testTriggerAnalysisForPreviousFailuresNoNeeded( self, mock_trigger_new_analysis, mock_get_failures): current_build_id = 8000000000123 test_failure = TestFailure.Create( ndb.Key(LuciFailedBuild, current_build_id), self.test_step_name, 'test8', first_failed_build_id=current_build_id, failure_group_build_id=current_build_id) test_failure.put() mock_get_failures.return_value = {} context = Context( luci_project_name='chromeos', gitiles_host='gitiles.host.com', gitiles_project='project/name', gitiles_ref='ref/heads/master', gitiles_id='git_sha_123') build = Build(id=current_build_id) test_analysis.BackfillIfSkippedAnalyses(context, build) self.assertFalse(mock_trigger_new_analysis.called)
def testGetFailedStepsInBuild(self): build_id = 8000000000123 build_number = 123 builder = BuilderID(project='chromium', bucket='try', builder='linux-rel') build = Build(id=build_id, builder=builder, number=build_number, status=common_pb2.FAILURE) step1 = Step(name='s1', status=common_pb2.SUCCESS) step2 = Step(name='compile', status=common_pb2.FAILURE) build.steps.extend([step1, step2]) context = Context(luci_project_name='chromium', gitiles_host='gitiles.host.com', gitiles_project='project/name', gitiles_ref='ref/heads/master', gitiles_id='git_sha') failed_steps = build_util.GetFailedStepsInBuild(context, build) self.assertEqual(1, len(failed_steps)) self.assertEqual('compile', failed_steps[0][0].name) self.assertEqual(StepTypeEnum.COMPILE, failed_steps[0][1])
def testAnalyzeCompileFailureBailoutChromium(self): context = Context(luci_project_name='chromium') self.assertFalse(compile_api.AnalyzeCompileFailure( context, None, None))
def testAnalyzeCompileFailureBailoutUnsupportedProject(self): context = Context(luci_project_name='unsupported') self.assertFalse(compile_api.AnalyzeCompileFailure( context, None, None))
def testAnalyzeTestFailureBailoutChromium(self): context = Context(luci_project_name='chromium') self.assertFalse(test_analysis.AnalyzeTestFailure(context, None, None))
def setUp(self): super(CompileFailureRerunAnalysisTest, self).setUp() self.build_id = 8000000000123 self.build_number = 123 self.builder = BuilderID(project='chromium', bucket='ci', builder='linux-rel') self.build = Build(id=self.build_id, builder=self.builder, number=self.build_number, status=common_pb2.FAILURE) self.build.input.gitiles_commit.host = 'gitiles.host.com' self.build.input.gitiles_commit.project = 'project/name' self.build.input.gitiles_commit.ref = 'ref/heads/master' self.build.input.gitiles_commit.id = 'git_sha_123' self.build.create_time.FromDatetime(datetime(2019, 4, 9)) self.build.start_time.FromDatetime(datetime(2019, 4, 9, 0, 1)) self.build.end_time.FromDatetime(datetime(2019, 4, 9, 1)) self.context = Context(luci_project_name='chromium', gitiles_host='gitiles.host.com', gitiles_project='project/name', gitiles_ref='ref/heads/master', gitiles_id='git_sha') build_entity = LuciFailedBuild.Create( luci_project=self.context.luci_project_name, luci_bucket=self.build.builder.bucket, luci_builder=self.build.builder.builder, build_id=self.build_id, legacy_build_number=self.build_number, gitiles_host=self.context.gitiles_host, gitiles_project=self.context.gitiles_project, gitiles_ref=self.context.gitiles_ref, gitiles_id=self.context.gitiles_id, commit_position=6000005, status=20, create_time=datetime(2019, 3, 28), start_time=datetime(2019, 3, 28, 0, 1), end_time=datetime(2019, 3, 28, 1), build_failure_type=StepTypeEnum.COMPILE) build_entity.put() self.compile_failure = CompileFailure.Create( failed_build_key=build_entity.key, step_ui_name='compile', output_targets=['a.o'], first_failed_build_id=self.build_id, failure_group_build_id=None) self.compile_failure.put() self.analysis = CompileFailureAnalysis.Create( luci_project=self.context.luci_project_name, luci_bucket=self.build.builder.bucket, luci_builder=self.build.builder.builder, build_id=self.build_id, gitiles_host=self.context.gitiles_host, gitiles_project=self.context.gitiles_project, gitiles_ref=self.context.gitiles_ref, last_passed_gitiles_id='left_sha', last_passed_commit_position=6000000, first_failed_gitiles_id=self.context.gitiles_id, first_failed_commit_position=6000005, rerun_builder_id='chromium/findit/findit-variables', compile_failure_keys=[self.compile_failure.key]) self.analysis.Save()