def testSaveFlakeCulpritsForSuspectedRevisionsNoChangeLog( self, mocked_commit_position, mocked_commit_info): master_name = 'm' builder_name = 'b' build_number = 123 step_name = 's' test_name = 't' suspected_revision = 'r1' suspected_commit_position = 995 suspected_revisions = [suspected_revision] mocked_commit_position.return_value = suspected_commit_position analysis = MasterFlakeAnalysis.Create(master_name, builder_name, build_number, step_name, test_name) analysis.data_points = [ DataPoint.Create(commit_position=1000, git_hash=suspected_revision) ] analysis.Save() mocked_commit_info.return_value = None heuristic_analysis.SaveFlakeCulpritsForSuspectedRevisions( analysis.key.urlsafe(), suspected_revisions) suspect = FlakeCulprit.Get('chromium', suspected_revision) self.assertIsNone(suspect)
def UpdateCulprit(analysis_urlsafe_key, revision, commit_position, repo_name='chromium'): """Sets culprit information. Args: analysis_urlafe_key (str): The urlsafe-key to the MasterFlakeAnalysis to update culprit information for. revision (str): The culprit's chromium revision. commit_position (int): The culprit's commit position. repo_name (str): The name of the repo the culprit is in. """ culprit = (FlakeCulprit.Get(repo_name, revision) or FlakeCulprit.Create(repo_name, revision, commit_position)) needs_updating = False if culprit.url is None: change_log = _GIT_REPO.GetChangeLog(revision) if change_log: culprit.url = change_log.code_review_url or change_log.commit_url needs_updating = True else: logging.error('Unable to retrieve change logs for %s', revision) if analysis_urlsafe_key not in culprit.flake_analysis_urlsafe_keys: culprit.flake_analysis_urlsafe_keys.append(analysis_urlsafe_key) needs_updating = True if needs_updating: culprit.put() return culprit
def SaveFlakeCulpritsForSuspectedRevisions(analysis_urlsafe_key, suspected_revisions, repo_name='chromium'): """Saves each suspect to the datastore as a FlakeCulprit. Also updates a MasterFlakeAnalysis' heuristic analysis results to include each suspect. Args: analysis_urlsafe_key (str): The urlsafe key of the MasterFlakeAnalysis to update. suspected_revisions (list): A list of revisions suspected to have caused the flakiness to create FlakeCulprits for. """ analysis = ndb.Key(urlsafe=analysis_urlsafe_key).get() assert analysis for revision in suspected_revisions: commit_position = git.GetCommitPositionFromRevision(revision) assert commit_position, 'Canot create FlakeCulprit without commit position' suspect = (FlakeCulprit.Get(repo_name, revision) or FlakeCulprit.Create(repo_name, revision, commit_position)) if suspect.url is None: commits_info = git.GetCommitsInfo([revision]) if commits_info: suspect.url = commits_info[revision]['url'] suspect.put() else: logging.error('Unable to retrieve change logs for %s', revision) continue # Save each culprit to the analysis' list of heuristic culprits. suspect_urlsafe_key = suspect.key.urlsafe() if suspect_urlsafe_key not in analysis.suspect_urlsafe_keys: analysis.suspect_urlsafe_keys.append(suspect_urlsafe_key) analysis.heuristic_analysis_status = analysis_status.COMPLETED analysis.put()
def testSaveFlakeCulpritsForSuspectedRevisions(self, mocked_commit_position, mocked_commit_info): master_name = 'm' builder_name = 'b' build_number = 123 step_name = 's' test_name = 't' suspected_revision = 'r1' suspected_commit_position = 995 suspected_revisions = [suspected_revision] mocked_commit_position.return_value = suspected_commit_position analysis = MasterFlakeAnalysis.Create(master_name, builder_name, build_number, step_name, test_name) analysis.data_points = [ DataPoint.Create(commit_position=1000, git_hash=suspected_revision) ] analysis.Save() mocked_commit_info.return_value = { suspected_revision: { 'revision': suspected_revision, 'repo_name': 'chromium', 'commit_position': suspected_commit_position, 'url': 'url', 'author': '*****@*****.**' } } heuristic_analysis.SaveFlakeCulpritsForSuspectedRevisions( analysis.key.urlsafe(), suspected_revisions) analysis = MasterFlakeAnalysis.GetVersion( master_name, builder_name, build_number, step_name, test_name) suspect = FlakeCulprit.Get('chromium', suspected_revision) self.assertIsNotNone(suspect) self.assertIn(suspect.key.urlsafe(), analysis.suspect_urlsafe_keys)