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))
예제 #6
0
 def ExtractSignalsForCompileFailure(self, failure_info):
   return extract_compile_signal.ExtractSignalsForCompileFailure(
       failure_info, FinditHttpClient())
예제 #7
0
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))