def testTriggerV2BuildFailed(self, mock_post):
    mock_build = Build()
    mock_headers = {'X-Prpc-Grpc-Code': '0'}
    binary_data = mock_build.SerializeToString()
    mock_post.return_value = (403, binary_data, mock_headers)

    builder = BuilderID(project='chromium', bucket='try', builder='linux-rel')
    gitiles_commit = GitilesCommit(
        project='gitiles/project',
        host='gitiles.host.com',
        ref='refs/heads/master',
        id='git_hash')
    properties = {
        'property1': 'property1',
        'property2': ['property2'],
        'property3': {
            'property3-key': 'property3-value'
        }
    }
    tags = [{'key': 'tag-key', 'value': 'tag-value'}]
    dimensions = [{'key': 'gpu', 'value': 'NVidia'}]

    build = buildbucket_client.TriggerV2Build(
        builder, gitiles_commit, properties, tags=tags, dimensions=dimensions)
    self.assertIsNone(build)
Example #2
0
    def testGetStepLogViewUrlPartialMatching(self, partial_match,
                                             full_step_name,
                                             expected_url_in_build1,
                                             expected_url_in_build2):
        mock_step1 = Step()
        mock_step1.name = 'step_name'
        mock_log1 = common_pb2.Log()
        mock_log1.name = 'log'
        mock_log1.view_url = 'view_url'
        mock_step1.logs.extend([mock_log1])

        mock_step2 = Step()
        mock_step2.name = 'step_name_longer'
        mock_log2 = common_pb2.Log()
        mock_log2.name = 'log'
        mock_log2.view_url = 'view_url_partial_match'
        mock_step2.logs.extend([mock_log2])

        mock_build1 = Build()
        mock_build1.steps.extend([mock_step1, mock_step2])
        self.assertEqual(
            expected_url_in_build1,
            step_util._GetStepLogViewUrl(mock_build1,
                                         full_step_name,
                                         'log',
                                         partial_match=partial_match))

        mock_build2 = Build()
        mock_build2.steps.extend([mock_step2])
        self.assertEqual(
            expected_url_in_build2,
            step_util._GetStepLogViewUrl(mock_build2,
                                         full_step_name,
                                         'log',
                                         partial_match=partial_match))
  def testGetBuildNumberFromBuildId(self, mock_post):
    build_id = 10000
    expected_build_number = 12345
    mock_build = Build()
    mock_build.id = build_id
    mock_build.status = 12
    mock_build.output.properties['mastername'] = 'chromium.linux'
    mock_build.output.properties['buildername'] = 'Linux Builder'
    mock_build.output.properties['buildnumber'] = expected_build_number
    mock_build.output.properties.get_or_create_struct(
        'swarm_hashes_ref/heads/mockmaster(at){#123}'
    )['mock_target'] = 'mock_hash'
    gitiles_commit = mock_build.input.gitiles_commit
    gitiles_commit.host = 'gitiles.host'
    gitiles_commit.project = 'gitiles/project'
    gitiles_commit.ref = 'refs/heads/mockmaster'
    mock_build.builder.project = 'mock_luci_project'
    mock_build.builder.bucket = 'mock_bucket'
    mock_build.builder.builder = 'Linux Builder'
    mock_headers = {'X-Prpc-Grpc-Code': '0'}
    binary_data = mock_build.SerializeToString()
    mock_post.return_value = (200, binary_data, mock_headers)

    self.assertEqual(expected_build_number,
                     buildbucket_client.GetBuildNumberFromBuildId(build_id))
Example #4
0
    def testUpdateCompileFailuresWithFirstFailureInfoPrevBuildInfraFailure(
            self, mock_prev_builds, mock_get_build):
        """Test for previous build failed with different steps."""
        mock_step1 = Step()
        mock_step1.name = 'compile'
        mock_step1.status = common_pb2.INFRA_FAILURE
        build_122_id = 8000000000122
        build_122 = Build(id=build_122_id,
                          builder=self.builder,
                          number=self.build_number - 1,
                          status=common_pb2.FAILURE)
        build_122.steps.extend([mock_step1])

        build_121_id = 8000000000121
        build_121 = Build(id=build_121_id,
                          builder=self.builder,
                          number=self.build_number - 2,
                          status=common_pb2.SUCCESS)
        build_121.input.gitiles_commit.id = 'git_sha_121'
        build_121_info = {
            'id': build_121_id,
            'number': self.build_number - 2,
            'commit_id': 'git_sha_121'
        }

        mock_prev_builds.return_value = SearchBuildsResponse(
            builds=[build_122, build_121])
        mock_get_build.return_value = build_122

        detailed_compile_failures = {
            'compile': {
                'failures': {
                    frozenset(['target1', 'target2']): {
                        'rule': 'CXX',
                        'first_failed_build': self.build_info,
                        'last_passed_build': None,
                    },
                },
                'first_failed_build': self.build_info,
                'last_passed_build': None,
            },
        }

        pre_compile_analysis.UpdateCompileFailuresWithFirstFailureInfo(
            self.context, self.build, detailed_compile_failures)

        expected_failures = {
            'compile': {
                'failures': {
                    frozenset(['target1', 'target2']): {
                        'rule': 'CXX',
                        'first_failed_build': self.build_info,
                        'last_passed_build': build_121_info,
                    },
                },
                'first_failed_build': self.build_info,
                'last_passed_build': build_121_info,
            },
        }
        self.assertEqual(expected_failures, detailed_compile_failures)
Example #5
0
    def testGetBlameListForV2Build(self, mock_search_build, mock_revisions):
        gitiles_project = 'chromium/src'
        gitiles_host = 'chromium.googlesource.com'
        gitiles_ref = 'refs/heads/master'

        build = Build(id=80000000123)
        build.input.gitiles_commit.project = gitiles_project
        build.input.gitiles_commit.host = gitiles_host
        build.input.gitiles_commit.ref = gitiles_ref
        build.input.gitiles_commit.id = 'rev4'

        previous_build = Build(id=80000000122)
        previous_build.input.gitiles_commit.project = gitiles_project
        previous_build.input.gitiles_commit.host = gitiles_host
        previous_build.input.gitiles_commit.ref = gitiles_ref
        previous_build.input.gitiles_commit.id = 'rev1'
        mock_search_build.return_value = SearchBuildsResponse(
            builds=[previous_build])

        expected_blame_list = ['rev4', 'rev3', 'rev2']
        mock_revisions.return_value = expected_blame_list

        self.assertEqual(expected_blame_list,
                         buildbot.GetBlameListForV2Build(build))

        mock_revisions.assert_called_once_with(
            'rev1', 'rev4',
            'https://chromium.googlesource.com/chromium/src.git')
    def testSucessfulPushTryJob(self, mock_post, *_):
        mock_build = Build()
        mock_build.id = 8945610992972640896
        mock_build.status = 12
        mock_build.output.properties['mastername'] = 'luci.chromium.findit'
        mock_build.output.properties['buildername'] = ('findit_variable')
        mock_build.output.properties['target_mastername'] = 'chromium.linux'
        mock_build.output.properties['target_buildername'] = (
            'linux_chromium_compile_dbg_ng')
        mock_build.output.properties.get_or_create_struct(
            'swarm_hashes_ref/heads/mockmaster(at){#123}_with_patch'
        )['mock_target'] = 'mock_hash'
        mock_build.output.properties.get_or_create_struct(
            'swarm_hashes_ref/heads/mockmaster(at){#123}_without_patch'
        )['mock_target'] = 'mock_hash_without'
        mock_build.output.properties['repository'] = (
            'https://test.googlesource.com/team/project.git')
        mock_build.output.properties['gitiles_ref'] = 'refs/heads/mockmaster'
        mock_change = mock_build.input.gerrit_changes.add()
        mock_change.host = 'mock.gerrit.host'
        mock_change.change = 12345
        mock_change.patchset = 1
        mock_build.builder.project = 'mock_luci_project'
        mock_build.builder.bucket = 'mock_bucket'
        mock_build.builder.builder = 'findit_variable'
        mock_headers = {'X-Prpc-Grpc-Code': '0'}
        binary_data = mock_build.SerializeToString()
        mock_post.return_value = (200, binary_data, mock_headers)

        request_body = json.dumps({
            'message': {
                'attributes': {
                    'build_id': str(mock_build.id),
                },
                'data':
                base64.b64encode(
                    json.dumps({
                        'build': {
                            'project': 'chromium',
                            'bucket': 'luci.chromium.ci',
                            'status': 'COMPLETED',
                            'parameters_json': '{"builder_name": "builder"}',
                        }
                    })),
            },
        })
        response = self.test_app.post('/index-isolated-builds?format=json',
                                      params=request_body)
        self.assertEqual(200, response.status_int)
        self.assertEqual(
            123,
            IsolatedTarget.get_by_id(
                '8945610992972640896/mock_target').commit_position)
        self.assertEqual(2, len(json.loads(response.body)['created_rows']))

        # Ensure target values were used.
        entry = IsolatedTarget.get_by_id('8945610992972640896/mock_target')
        self.assertEqual('chromium.linux', entry.master_name)
        self.assertEqual('linux_chromium_compile_dbg_ng', entry.builder_name)
Example #7
0
 def testGetRecentCompletedBuilds(self, mock_fn):
     mock_fn.return_value = SearchBuildsResponse(
         builds=[Build(number=34),
                 Build(number=33),
                 Build(number=32)])
     self.assertEqual([34, 33, 32],
                      buildbot.GetRecentCompletedBuilds(
                          'm', 'b', RetryHttpClient()))
Example #8
0
    def testExtractBuildInfoFromV2BuildComplete(self, *_):
        master_name = 'chromium.linux'
        builder_name = 'Linux Tests'
        bucket = 'ci'
        build_id = 8765000000056123
        build_number = 56123
        build_start_time = datetime(2019, 5, 21)
        build_end_time = datetime(2019, 5, 21, 1)
        gitiles_id = 'rev4'

        build = Build(id=build_id,
                      number=build_number,
                      builder=BuilderID(project='chromium',
                                        bucket=bucket,
                                        builder=builder_name))
        build.input.gitiles_commit.project = 'chromium/src'
        build.input.gitiles_commit.host = 'chromium.googlesource.com'
        build.input.gitiles_commit.ref = 'refs/heads/master'
        build.input.gitiles_commit.id = gitiles_id
        build.input.properties['$recipe_engine/runtime'] = {'is_luci': True}
        build.input.properties['parent_buildername'] = 'Linux Builder'
        build.input.properties['parent_mastername'] = 'chromium.linux'

        build.create_time.FromDatetime(build_start_time)
        build.end_time.FromDatetime(build_end_time)
        build.status = common_pb2.FAILURE

        step1 = Step(name='s1', status=common_pb2.SUCCESS)
        log = step1.logs.add()
        log.name = 'stdout'
        step2 = Step(name='s2', status=common_pb2.SUCCESS)
        step3 = Step(name='s3', status=common_pb2.FAILURE)
        log = step3.logs.add()
        log.name = 'stdout'
        step4 = Step(name='s4', status=common_pb2.FAILURE)
        step_fr = Step(name='Failure reason', status=common_pb2.FAILURE)
        build.steps.extend([step1, step2, step3, step4, step_fr])

        build_info = buildbot.ExtractBuildInfoFromV2Build(
            master_name, builder_name, build_number, build)

        self.assertEqual(master_name, build_info.master_name)
        self.assertEqual(builder_name, build_info.builder_name)
        self.assertEqual(build_number, build_info.build_number)
        self.assertEqual(build_start_time, build_info.build_start_time)
        self.assertEqual(build_end_time, build_info.build_end_time)
        self.assertEqual(gitiles_id, build_info.chromium_revision)
        self.assertEqual(654332, build_info.commit_position)
        self.assertTrue(build_info.completed)
        self.assertEqual(common_pb2.FAILURE, build_info.result)
        self.assertItemsEqual(['rev2', 'rev3'], build_info.blame_list)
        self.assertItemsEqual(['s3'], build_info.failed_steps)
        self.assertItemsEqual(['s1'], build_info.passed_steps)
        self.assertItemsEqual(['s3', 's4', 'Failure reason'],
                              build_info.not_passed_steps)
        self.assertEqual(bucket, build_info.buildbucket_bucket)
        self.assertEqual(str(build_id), build_info.buildbucket_id)
        self.assertTrue(build_info.is_luci)
Example #9
0
 def testGetStepLogFromBuildObjectPartialMatch(self, mock_get_log_url):
     step_util.GetStepLogFromBuildObject(Build(), 'full_step_name',
                                         'http_client')
     self.assertIn(False, mock_get_log_url.call_args[0])
     step_util.GetStepLogFromBuildObject(Build(),
                                         'full_step_name',
                                         'http_client',
                                         partial_match=True)
     self.assertIn(True, mock_get_log_url.call_args[0])
  def testGetV2BuildByBuilderAndBuildNumber(self, mock_post):
    master_name = 'tryserver.chromium.win'

    mock_build = Build()
    mock_build.input.properties['mastername'] = master_name
    mock_headers = {'X-Prpc-Grpc-Code': '0'}
    binary_data = mock_build.SerializeToString()
    mock_post.return_value = (200, binary_data, mock_headers)

    build = buildbucket_client.GetV2BuildByBuilderAndBuildNumber(
        'chromium', 'try', 'win10_chromium_x64_rel_ng', 123)
    self.assertEqual(master_name, build.input.properties['mastername'])
    def testSucessfulPushCIBuild(self, mock_post, *_):
        mock_build = Build()
        mock_build.id = 8945610992972640896
        mock_build.status = 12
        mock_build.output.properties['mastername'] = 'chromium.linux'
        mock_build.output.properties['buildername'] = 'Linux Builder'
        mock_build.output.properties.get_or_create_struct(
            'swarm_hashes_ref/heads/mockmaster(at){#123}'
        )['mock_target'] = 'mock_hash'
        gitiles_commit = mock_build.input.gitiles_commit
        gitiles_commit.host = 'gitiles.host'
        gitiles_commit.project = 'gitiles/project'
        gitiles_commit.ref = 'refs/heads/mockmaster'
        mock_build.builder.project = 'mock_luci_project'
        mock_build.builder.bucket = 'mock_bucket'
        mock_build.builder.builder = 'Linux Builder'
        mock_headers = {'X-Prpc-Grpc-Code': '0'}
        binary_data = mock_build.SerializeToString()
        mock_post.return_value = (200, binary_data, mock_headers)

        request_body = json.dumps({
            'message': {
                'attributes': {
                    'build_id': str(mock_build.id),
                },
                'data':
                base64.b64encode(
                    json.dumps({
                        'build': {
                            'project': 'chromium',
                            'bucket': 'luci.chromium.ci',
                            'status': 'COMPLETED',
                            'parameters_json': '{"builder_name": "builder"}',
                        }
                    })),
            },
        })
        response = self.test_app.post('/index-isolated-builds?format=json',
                                      params=request_body)
        self.assertEqual(200, response.status_int)
        self.assertEqual(
            123,
            IsolatedTarget.get_by_id(
                '8945610992972640896/mock_target').commit_position)
        self.assertEqual(
            8945610992972640896,
            IsolatedTarget.get_by_id(
                '8945610992972640896/mock_target').build_id)
        self.assertEqual(1, len(json.loads(response.body)['created_rows']))
Example #12
0
def TriggerV2Build(builder,
                   gitiles_commit,
                   properties,
                   tags=None,
                   dimensions=None):
    """Triggers a build using buildbucket v2 API.

  Args:
    builder (build_pb2.BuilderID): Information about the builder the
      build runs on.
    gitiles_commit (common_pb2.GitilesCommit): Input commit the build runs.
    properties (dict): Input properties of the build.
    tags (list of dict): Tags for the build. In the format:
      [
        {
          'key': 'tag-key',
          'value': 'tag-value'
        },
        ...
      ]
    dimensions (list of dict): configured dimensions of the build. Format:
      [
        {
          'key': 'dimension-key',
          'value': 'dimension-value'
        },
        ...
      ]
  """
    request = ScheduleBuildRequest(builder=builder,
                                   gitiles_commit=gitiles_commit,
                                   tags=tags or [],
                                   dimensions=dimensions or [])
    request.properties.update(properties)

    status_code, content, response_headers = FinditHttpClient().Post(
        _BUILDBUCKET_V2_SCHEDULE_BUILD_ENDPOINT,
        request.SerializeToString(),
        headers={'Content-Type': 'application/prpc; encoding=binary'})

    if status_code == 200 and response_headers.get(
            'X-Prpc-Grpc-Code') == GRPC_OK:
        result = Build()
        result.ParseFromString(content)
        return result

    logging.warning('Unexpected status_code: %d and prpc code: %s',
                    status_code, response_headers.get('X-Prpc-Grpc-Code'))
    return None
Example #13
0
 def testGetStepLogViewUrlNoMatchingLog(self):
   build_id = 8945610992972640896
   mock_log = Step.Log()
   mock_log.name = 'another_log'
   mock_log.view_url = 'view_url'
   mock_step1 = Step()
   mock_step1.name = 's1'
   mock_step1.logs.extend([mock_log])
   mock_step2 = Step()
   mock_step2.name = 's2'
   mock_step2.logs.extend([mock_log])
   mock_build = Build()
   mock_build.id = build_id
   mock_build.steps.extend([mock_step1, mock_step2])
   self.assertIsNone(step_util._GetStepLogViewUrl(mock_build, 's2', 'log'))
Example #14
0
    def testGetCompileRerunBuildInputPropertiesOtherStep(self):
        build = Build()
        build.input.properties['build_target'] = {'name': 'abc'}

        self.assertIsNone(
            ChromeOSProjectAPI().GetCompileRerunBuildInputProperties(
                build, {}))
Example #15
0
  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])
Example #16
0
 def testGetStepLogForLuciBuildNoViewUrl(self, mock_get_build, mock_get_log,
                                         _):
   build_id = '8945610992972640896'
   mock_log = Step.Log()
   mock_log.name = 'step_metadata'
   mock_log.view_url = 'view_url'
   mock_step = Step()
   mock_step.name = 's'
   mock_step.logs.extend([mock_log])
   mock_build = Build()
   mock_build.id = int(build_id)
   mock_build.steps.extend([mock_step])
   mock_get_build.return_value = mock_build
   self.assertIsNone(
       step_util.GetStepLogForLuciBuild(build_id, 's', None, 'step_metadata'))
   self.assertFalse(mock_get_log.called)
Example #17
0
    def testGetFailuresWithMatchingCompileFailureGroupsNoExistingGroup(self):
        build_id = 8000000000122
        build = Build(builder=self.builder, number=122, id=build_id)
        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'

        last_passed_build_info = {
            'id': 8000000000121,
            'number': 121,
            'commit_id': 'git_sha_121'
        }

        output_target1 = json.dumps({
            'category': 'chromeos-base',
            'packageName': 'target1'
        })

        first_failures_in_current_build = {
            'failures': {
                'install packages': {
                    'output_targets': [frozenset([output_target1])],
                    'last_passed_build': last_passed_build_info,
                },
            },
            'last_passed_build': last_passed_build_info
        }

        self.assertEqual(
            {},
            ChromeOSProjectAPI().GetFailuresWithMatchingCompileFailureGroups(
                self.context, build, first_failures_in_current_build))
Example #18
0
    def testGetCompileRerunBuildInputProperties(self):
        build_target = 'abc'
        output_target1 = json.dumps({
            'category': 'chromeos-base',
            'packageName': 'target1'
        })
        targets = {'install packages': [output_target1]}

        build = Build()
        build.input.properties['build_target'] = {'name': build_target}

        expected_prop = {
            'recipe': 'build_target',
            'build_target': {
                'name': build_target
            },
            '$chromeos/cros_bisect': {
                'targets': [output_target1]
            },
        }

        self.assertEqual(
            expected_prop,
            ChromeOSProjectAPI().GetCompileRerunBuildInputProperties(
                build, targets))
Example #19
0
    def testGetFailuresWithMatchingTestFailureGroupsNoExistingGroup(self):
        build_id = 8000000000122
        build = Build(builder=self.builder, number=122, id=build_id)
        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'

        last_passed_build_info = {
            'id': 8000000000121,
            'number': 121,
            'commit_id': 'git_sha_121'
        }

        first_failures_in_current_build = {
            'failures': {
                'step': {
                    'atomic_failures': [],
                    'last_passed_build': last_passed_build_info,
                },
            },
            'last_passed_build': last_passed_build_info,
        }

        self.assertEqual(
            {},
            ChromeOSProjectAPI().GetFailuresWithMatchingTestFailureGroups(
                self.context, build, first_failures_in_current_build))
Example #20
0
 def _CreateBuildbucketBuild(self, build_id, build_number):
     build = Build(id=build_id, number=build_number)
     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'
     return build
Example #21
0
 def testGetStepLogForLuciBuild(self, mock_get_build, mock_get_log, _):
   build_id = '8945610992972640896'
   mock_log = Step.Log()
   mock_log.name = 'step_metadata'
   mock_log.view_url = 'view_url'
   mock_step = Step()
   mock_step.name = 's'
   mock_step.logs.extend([mock_log])
   mock_build = Build()
   mock_build.id = int(build_id)
   mock_build.steps.extend([mock_step])
   mock_get_build.return_value = mock_build
   self.assertEqual(
       'log',
       step_util.GetStepLogForLuciBuild(build_id, 's', None, 'step_metadata'))
   mock_get_log.assert_called_once_with('view_url', None)
Example #22
0
 def testCompileFailure(self, mock_analyzer, _):
     build = Build()
     step = build.steps.add()
     step.name = 'compile'
     step.status = common_pb2.FAILURE
     self.assertTrue(api.OnBuildFailure(self.context, build))
     mock_analyzer.assert_called_once_with(self.context, build, [step])
Example #23
0
    def testGetStepStartAndEndTime(self):
        build_id = '8945610992972640896'
        start_time = datetime.datetime(2019, 3, 6)
        end_time = datetime.datetime(2019, 3, 6, 0, 0, 10)
        step = Step()
        step.name = 's'
        step.start_time.FromDatetime(start_time)
        step.end_time.FromDatetime(end_time)
        build = Build()
        build.id = int(build_id)
        build.steps.extend([step])

        self.assertEqual((start_time, end_time),
                         step_util.GetStepStartAndEndTime(build, 's'))
        self.assertEqual((None, None),
                         step_util.GetStepStartAndEndTime(build, 's2'))
 def testGetAnalyzedBuildIdFromRerunBuild(self):
     analyzed_build_id = 8000000000123
     build = Build(tags=[{
         'key': 'analyzed_build_id',
         'value': str(analyzed_build_id)
     }])
     self.assertEqual(analyzed_build_id,
                      build_util.GetAnalyzedBuildIdFromRerunBuild(build))
Example #25
0
 def testAnalyzeTestFailureNoFirstFailure(self, mock_failures,
                                          mock_first_failure, *_):
   build = Build()
   test_failures = []
   self.assertFalse(
       test_analysis.AnalyzeTestFailure(self.context, build, test_failures))
   mock_failures.assert_called_once_with(build, test_failures)
   mock_first_failure.assert_called_once_with(self.context, build, {})
Example #26
0
 def testSkipFailedBuildNotMatchingGitilesProject(self, mocked_GetV2Build, *_):
   build = Build()
   build.input.gitiles_commit.host = 'wrong.host.com'
   build.input.gitiles_commit.project = 'wrong/project'
   mocked_GetV2Build.return_value = build
   self.assertFalse(
       api.OnBuildCompletion('project', 'ci', 'builder', 123, 'FAILURE'))
   mocked_GetV2Build.assert_called_once_with(
       123, fields=FieldMask(paths=['*']))
Example #27
0
    def testGetFailuresWithMatchingCompileFailureGroupsWithExistingGroup(self):
        build_id = 8000000000122
        build = Build(builder=self.builder, number=122, id=build_id)
        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'

        last_passed_build_info = {
            'id': 8000000000121,
            'number': 121,
            'commit_id': 'git_sha_121'
        }

        first_failures_in_current_build = {
            'failures': {
                'install packages': {
                    'output_targets': [
                        frozenset(['target1']),
                    ],
                    'last_passed_build': last_passed_build_info,
                },
            },
            'last_passed_build': last_passed_build_info
        }

        compile_failure = CompileFailure.Create(
            self.group_build.key,
            'install packages', ['target1'],
            'CXX',
            first_failed_build_id=self.group_build_id,
            last_passed_build_id=8000000000160)
        compile_failure.put()

        CompileFailureGroup.Create(
            luci_project=self.context.luci_project_name,
            luci_bucket=build.builder.bucket,
            build_id=self.group_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_build_info['commit_id'],
            last_passed_commit_position=654321,
            first_failed_gitiles_id=self.first_failed_commit_id,
            first_failed_commit_position=654340,
            compile_failure_keys=[compile_failure.key]).put()

        expected_failures_with_existing_group = {
            'install packages': {
                frozenset(['target1']): self.group_build_id
            }
        }

        self.assertEqual(
            expected_failures_with_existing_group,
            ChromeOSProjectAPI().GetFailuresWithMatchingCompileFailureGroups(
                self.context, build, first_failures_in_current_build))
Example #28
0
  def testGetBuildFailureInfo(self, mock_build, *_):
    master_name = 'm'
    builder_name = 'b'
    build_number = 223

    self._CreateAndSaveWfAnanlysis(master_name, builder_name, build_number,
                                   analysis_status.PENDING)

    build = WfBuild.Create(master_name, builder_name, build_number)
    build.build_id = '80000000223'
    build.completed = True
    build.put()

    build_223 = Build(
        id=80000000223, number=build_number, status=common_pb2.FAILURE)
    build_223.input.gitiles_commit.id = 'rev223'
    step1 = Step(name='compile', status=common_pb2.SUCCESS)
    log = step1.logs.add()
    log.name = 'stdout'
    step2 = Step(name='abc_test', status=common_pb2.FAILURE)
    log = step2.logs.add()
    log.name = 'stdout'
    build_223.steps.extend([step1, step2])
    mock_build.return_value = build_223

    failure_info, should_proceed = ci_failure.GetBuildFailureInfo(
        master_name, builder_name, build_number)

    expected_failure_info = {
        'failed': True,
        'master_name': master_name,
        'builder_name': builder_name,
        'build_number': build_number,
        'is_luci': None,
        'buildbucket_bucket': '',
        'buildbucket_id': '80000000223',
        'chromium_revision': 'rev223',
        'builds': {
            build_number: {
                'blame_list': ['rev223'],
                'chromium_revision': 'rev223'
            }
        },
        'failed_steps': {
            'abc_test': {
                'current_failure': build_number,
                'first_failure': build_number,
                'supported': True
            }
        },
        'failure_type': failure_type.TEST,
        'parent_mastername': None,
        'parent_buildername': None,
    }

    self.assertEqual(expected_failure_info, failure_info)
    self.assertTrue(should_proceed)
Example #29
0
 def testAnalyzeCompileFailureNoFirstFailure(self, mock_failures,
                                             mock_first_failure, *_):
     build = Build()
     compile_failures = []
     self.assertFalse(
         compile_api.AnalyzeCompileFailure(self.context, build,
                                           compile_failures))
     mock_failures.assert_called_once_with(build, compile_failures)
     mock_first_failure.assert_called_once_with(self.context, build, {})
Example #30
0
 def testOnRerunBuildCompletionUnsupportedPurpose(self):
     build = Build(id=800000502,
                   tags=[{
                       'key': constants.RERUN_BUILD_PURPOSE_TAG_KEY,
                       'value': 'some purpose'
                   }, {
                       'key': 'analyzed_build_id',
                       'value': '800000000'
                   }])
     self.assertFalse(api.OnRerunBuildCompletion(self.context, build))