def testCompileNotSupport(self): failure_info = copy.deepcopy(_COMPILE_FAILURE_INFO) failure_info['failed_steps']['compile']['supported'] = False self.assertEqual({}, extract_compile_signal.ExtractSignalsForCompileFailure( CompileFailureInfo.FromSerializable(failure_info), None))
def testGetCompileStepSignalFromNinjaJsonOutput(self, _): master_name = 'm' builder_name = 'b' build_number = 123 self._CreateAndSaveWfAnanlysis(master_name, builder_name, build_number) signals = extract_compile_signal.ExtractSignalsForCompileFailure( CompileFailureInfo.FromSerializable(_COMPILE_FAILURE_INFO), None) expected_failed_edges = [{ 'output_nodes': ['a/b.o'], 'rule': 'CXX', 'dependencies': ['b.h', 'b.c'] }] self.assertEqual(expected_failed_edges, signals['compile']['failed_edges'])
def testCompileNotInFailedSteps(self): failure_info = { 'master_name': 'm', 'builder_name': 'b', 'build_number': 123, 'failed': True, 'chromium_revision': 'a_git_hash', 'failed_steps': { 'a': { 'last_pass': 122, 'current_failure': 123, 'first_failure': 123, } } } self.assertEqual({}, extract_compile_signal.ExtractSignalsForCompileFailure( CompileFailureInfo.FromSerializable(failure_info), None))
def testCompileStepSignalFromCachedStepLog(self): master_name = 'm' builder_name = 'b' build_number = 123 step_name = 'compile' step = WfStep.Create(master_name, builder_name, build_number, step_name) step.log_data = _NINJA_OUTPUT_JSON step.put() self._CreateAndSaveWfAnanlysis(master_name, builder_name, build_number) signals = extract_compile_signal.ExtractSignalsForCompileFailure( CompileFailureInfo.FromSerializable(_COMPILE_FAILURE_INFO), None) expected_failed_edges = [{ 'output_nodes': ['a/b.o'], 'rule': 'CXX', 'dependencies': ['b.h', 'b.c'] }] self.assertEqual(expected_failed_edges, signals['compile']['failed_edges'])
def testFailedToGetFailureLog(self, *_): self.assertEqual( {}, extract_compile_signal.ExtractSignalsForCompileFailure( CompileFailureInfo.FromSerializable(_COMPILE_FAILURE_INFO), None))
def ExtractSignalsForCompileFailure(self, failure_info): return extract_compile_signal.ExtractSignalsForCompileFailure( failure_info, FinditHttpClient())
def HeuristicAnalysisForCompile(heuristic_params): """Identifies culprit CL. Args: heuristic_params (CompileHeuristicAnalysisParameters): A structured object with 2 fields: failure_info (CompileFailureInfo): An object of failure info for the current failed build. build_completed (bool): If the build is completed. Returns: A CompileHeuristicAnalysisOutput object with information about failure_info, signals and heuristic_result. """ failure_info = heuristic_params.failure_info master_name = failure_info.master_name builder_name = failure_info.builder_name build_number = failure_info.build_number # 1. Detects first failed builds for failed compile step, # updates failure_info. failure_info = ci_failure.CheckForFirstKnownFailure( master_name, builder_name, build_number, failure_info) analysis = WfAnalysis.Get(master_name, builder_name, build_number) analysis.failure_info = failure_info.ToSerializable() analysis.put() # Lacking chromium_revision indicates something is wrong in Findit, assert failure_info.chromium_revision, ( 'No end_revision when pulling change logs.') # 2. Extracts failure signal. signals = extract_compile_signal.ExtractSignalsForCompileFailure( failure_info, FinditHttpClient()) # 3. Gets change_logs. change_logs = git.PullChangeLogs( ci_failure.GetGoodRevision(failure_info), failure_info.chromium_revision) # 4. Gets deps info. deps_info = deps.ExtractDepsInfo(failure_info, change_logs) # 5. Analyzes the compile failure using information collected above. heuristic_result, suspected_cls = AnalyzeCompileFailure( failure_info, change_logs, deps_info, signals) # Save results and other info to analysis. build_failure_analysis.SaveAnalysisAfterHeuristicAnalysisCompletes( master_name, builder_name, build_number, heuristic_result, suspected_cls) # Save suspected_cls to data_store. build_failure_analysis.SaveSuspectedCLs(suspected_cls, master_name, builder_name, build_number, failure_info.failure_type) # Monitors analysis status change. RecordCompileFailureAnalysisStateChange(master_name, builder_name, analysis_status.COMPLETED, analysis_approach_type.HEURISTIC) return CompileHeuristicAnalysisOutput( failure_info=failure_info, signals=CompileFailureSignals.FromSerializable(signals), heuristic_result=CompileHeuristicResult.FromSerializable( heuristic_result))