# Copyright 2018 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""Unit tests for buildbucket_v2."""
from datetime import date
from datetime import datetime

from chromite.third_party.google.protobuf import field_mask_pb2
from chromite.third_party.google.protobuf.struct_pb2 import Struct, Value
from chromite.third_party.google.protobuf.timestamp_pb2 import Timestamp
from chromite.third_party.infra_libs.buildbucket.proto import (
    build_pb2, builder_pb2, builds_service_pb2, common_pb2, step_pb2)

from chromite.cbuildbot import cbuildbot_alerts
from chromite.lib import buildbucket_v2
from chromite.lib import constants
from chromite.lib import cros_test_lib
from chromite.lib import metadata_lib
from chromite.lib.luci.prpc.client import Client
from chromite.lib.luci.prpc.client import ProtocolError
from chromite.lib.luci.prpc.client import new_request

SUCCESS_BUILD = {'infra': {
                    'swarming': {
                        'botDimensions': [
                          {
                              'key': 'cores',
                              'value': '32'
                          },
                          {
                              'key': 'cpu',
                              'value': 'x86'
                          },
                          {
                              'key': 'cpu',
                              'value': 'x86-64'
                          },
                          {
                              'key': 'cpu',
                              'value': 'x86-64-Haswell_GCE'
                          },
                          {
                              'key': 'cpu',
                              'value': 'x86-64-avx2'
                          },
                          {
                              'key': 'gce',
                              'value': '1'
                          },
                          {
                              'key': 'gcp',
                              'value': 'chromeos-bot'
                          },
                          {
                              'key': 'id',
                              'value': 'chromeos-ci-test-bot'
                          },
                          {
                              'key': 'image',
                              'value': 'chromeos-bionic-21021400-a1c0533ad76'
                          },
                          {
                              'key': 'machine_type',
                              'value': 'e2-standard-32'
                          },
                          {
                              'key': 'pool',
                              'value': 'ChromeOS'
                          },
                          {
                              'key': 'role',
                              'value': 'legacy-release'
                          },
                          {
                              'key': 'zone',
                              'value': 'us-central1-b'
                          }
                      ]
                  }
              }
        }


class BuildbucketV2Test(cros_test_lib.MockTestCase):
  """Tests for buildbucket_v2."""
  # pylint: disable=attribute-defined-outside-init

  def testCreatesClient(self):
    ret = buildbucket_v2.BuildbucketV2(test_env=True)
    self.assertIsInstance(ret.client, Client)

  def testBatchCancelBuilds(self):
    fake_field_mask = field_mask_pb2.FieldMask(paths=['properties'])
    fake_batch_request = object()
    bbv2 = buildbucket_v2.BuildbucketV2()
    client = bbv2.client
    self.batch_cancel_build_request_fn = self.PatchObject(
        builds_service_pb2, 'BatchRequest', return_value=fake_batch_request)
    self.batch_cancel_function = self.PatchObject(client, 'Batch')
    bbv2.BatchCancelBuilds([1234, 1235], 'test', 'properties')
    fake_builds = [
      builds_service_pb2.BatchRequest.Request(
        cancel_build=(
          builds_service_pb2.CancelBuildRequest(
            id=1234,
            summary_markdown='test',
            fields=fake_field_mask
          ),
        ),
      ),
      builds_service_pb2.BatchRequest.Request(
        cancel_build=(
          builds_service_pb2.CancelBuildRequest(
            id=1235,
            summary_markdown='test',
            fields=fake_field_mask
          ),
        ),
      ),
    ]
    self.batch_cancel_build_request_fn.assert_called_with(
        requests=fake_builds)
    self.batch_cancel_function.assert_called_with(fake_batch_request)

  def testBatchGetBuilds(self):
    fake_field_mask = field_mask_pb2.FieldMask(paths=['properties'])
    fake_batch_request = object()
    bbv2 = buildbucket_v2.BuildbucketV2()
    client = bbv2.client
    self.batch_get_build_request_fn = self.PatchObject(
        builds_service_pb2, 'BatchRequest', return_value=fake_batch_request)
    self.batch_get_function = self.PatchObject(client, 'Batch')
    bbv2.BatchGetBuilds([1234, 1235], 'properties')
    fake_builds = [
      builds_service_pb2.BatchRequest.Request(
        get_build=(
          builds_service_pb2.GetBuildRequest(
            id=1234,
            fields=fake_field_mask
          ),
        ),
      ),
      builds_service_pb2.BatchRequest.Request(
        get_build=(
          builds_service_pb2.GetBuildRequest(
            id=1235,
            fields=fake_field_mask
          ),
        ),
      ),
    ]
    self.batch_get_build_request_fn.assert_called_with(
        requests=fake_builds)
    self.batch_get_function.assert_called_with(fake_batch_request)

  def testBatchSearchBuilds(self):
    fake_batch_request = object()
    bbv2 = buildbucket_v2.BuildbucketV2()
    builder = builder_pb2.BuilderID(project='chromeos', bucket='general')
    tag = common_pb2.StringPair(key='cbb_master_buildbucket_id',
                                value=str(1234))
    build_predicate = builds_service_pb2.BuildPredicate(
        builder=builder, tags=[tag])
    client = bbv2.client
    self.batch_search_build_request_fn = self.PatchObject(
        builds_service_pb2, 'BatchRequest', return_value=fake_batch_request)
    self.batch_search_function = self.PatchObject(client, 'Batch')
    search_request = [builds_service_pb2.SearchBuildsRequest(
      predicate=build_predicate)]
    bbv2.BatchSearchBuilds(search_request)
    fake_builds = [
      builds_service_pb2.BatchRequest.Request(
        search_builds=(
          builds_service_pb2.SearchBuildsRequest(
            predicate=build_predicate,
          ),
        ),
      ),
    ]
    self.batch_search_build_request_fn.assert_called_with(
        requests=fake_builds)
    self.batch_search_function.assert_called_with(fake_batch_request)

  def testCancelBuildWithProperties(self):
    fake_field_mask = field_mask_pb2.FieldMask(paths=['properties'])
    fake_cancel_build_request = object()
    bbv2 = buildbucket_v2.BuildbucketV2()
    client = bbv2.client
    self.cancel_build_request_fn = self.PatchObject(
        builds_service_pb2, 'CancelBuildRequest',
        return_value=fake_cancel_build_request)
    self.cancel_build_function = self.PatchObject(client, 'CancelBuild')
    bbv2.CancelBuild(1234, 'test', 'properties')
    self.cancel_build_request_fn.assert_called_with(id=1234,
        summary_markdown='test',
        fields=fake_field_mask)
    self.cancel_build_function.assert_called_with(fake_cancel_build_request)

  def testCancelBuildWithoutProperties(self):
    fake_cancel_build_request = object()
    bbv2 = buildbucket_v2.BuildbucketV2()
    client = bbv2.client
    self.cancel_build_request_fn = self.PatchObject(
        builds_service_pb2, 'CancelBuildRequest',
        return_value=fake_cancel_build_request)
    self.cancel_build_function = self.PatchObject(client, 'CancelBuild')
    bbv2.CancelBuild(1234, 'test')
    self.cancel_build_request_fn.assert_called_with(
        id=1234,
        summary_markdown='test',
        fields=None)
    self.cancel_build_function.assert_called_with(fake_cancel_build_request)

  def testGetBuildWithMultipleProperties(self):
    fake_field_mask = field_mask_pb2.FieldMask(paths=[
      'output.properties',
      'id',
      'status',
      'summary_markdown'])
    fake_get_build_request = object()
    bbv2 = buildbucket_v2.BuildbucketV2()
    client = bbv2.client
    self.get_build_request_fn = self.PatchObject(
        builds_service_pb2, 'GetBuildRequest',
        return_value=fake_get_build_request)
    self.get_build_function = self.PatchObject(client, 'GetBuild')
    bbv2.GetBuild('some-id', ['output.properties', 'id',
                              'status', 'summary_markdown'])
    self.get_build_request_fn.assert_called_with(id='some-id',
                                                 fields=fake_field_mask)
    self.get_build_function.assert_called_with(fake_get_build_request)

  def testGetBuildWithOneProperty(self):
    fake_field_mask = field_mask_pb2.FieldMask(paths=['output.properties'])
    fake_get_build_request = object()
    bbv2 = buildbucket_v2.BuildbucketV2()
    client = bbv2.client
    self.get_build_request_fn = self.PatchObject(
        builds_service_pb2, 'GetBuildRequest',
        return_value=fake_get_build_request)
    self.get_build_function = self.PatchObject(client, 'GetBuild')
    bbv2.GetBuild('some-id', 'output.properties')
    self.get_build_request_fn.assert_called_with(id='some-id',
                                                 fields=fake_field_mask)
    self.get_build_function.assert_called_with(fake_get_build_request)

  def testGetBuildWithoutProperties(self):
    fake_get_build_request = object()
    bbv2 = buildbucket_v2.BuildbucketV2()
    client = bbv2.client
    self.get_build_request_fn = self.PatchObject(
        builds_service_pb2, 'GetBuildRequest',
        return_value=fake_get_build_request)
    self.get_build_function = self.PatchObject(client, 'GetBuild')
    bbv2.GetBuild('some-id')
    self.get_build_request_fn.assert_called_with(id='some-id', fields=None)
    self.get_build_function.assert_called_with(fake_get_build_request)

  def testScheduleBuild(self):
    fake_builder = builder_pb2.BuilderID(project='chromeos',
                                      bucket='general',
                                      builder='test-builder')
    fake_field_mask = field_mask_pb2.FieldMask(paths=['properties'])
    fake_tag = common_pb2.StringPair(key='foo',
                                     value='bar')
    fake_schedule_build_request = object()
    bbv2 = buildbucket_v2.BuildbucketV2()
    client = bbv2.client
    self.schedule_build_request_fn = self.PatchObject(
        builds_service_pb2, 'ScheduleBuildRequest',
        return_value=fake_schedule_build_request)
    self.schedule_build_function = self.PatchObject(client, 'ScheduleBuild')
    bbv2.ScheduleBuild(request_id='1234', builder=fake_builder,
                       tags=fake_tag, fields='properties', critical=True)
    self.schedule_build_request_fn.assert_called_with(
        request_id='1234',
        template_build_id=None,
        builder=fake_builder,
        properties=None,
        gerrit_changes=None,
        tags=fake_tag,
        dimensions=None,
        fields=fake_field_mask,
        critical=common_pb2.YES)
    self.schedule_build_function.assert_called_with(
      fake_schedule_build_request)

  def testUpdateBuildWithProperties(self):
    fake_update_mask = field_mask_pb2.FieldMask(paths=['number'])
    fake_prop_mask = field_mask_pb2.FieldMask(paths=['properties'])
    fake_build = build_pb2.Build(id=2341,
                                 number=1234)
    fake_update_build_request = object()
    bbv2 = buildbucket_v2.BuildbucketV2()
    client = bbv2.client
    self.update_build_request_fn = self.PatchObject(
        builds_service_pb2, 'UpdateBuildRequest',
        return_value=fake_update_build_request)
    self.update_build_function = self.PatchObject(client, 'UpdateBuild')
    bbv2.UpdateBuild(fake_build, 'number', 'properties')
    self.update_build_request_fn.assert_called_with(
        build=fake_build,
        update_mask=fake_update_mask,
        fields=fake_prop_mask)
    self.update_build_function.assert_called_with(fake_update_build_request)

  def testUpdateBuildWithoutProperties(self):
    fake_update_mask = field_mask_pb2.FieldMask(paths=['number'])
    fake_build = build_pb2.Build(id=2341,
                                 number=1234)
    fake_update_build_request = object()
    bbv2 = buildbucket_v2.BuildbucketV2()
    client = bbv2.client
    self.update_build_request_fn = self.PatchObject(
        builds_service_pb2, 'UpdateBuildRequest',
        return_value=fake_update_build_request)
    self.update_build_function = self.PatchObject(client, 'UpdateBuild')
    bbv2.UpdateBuild(fake_build, 'number')
    self.update_build_request_fn.assert_called_with(
        build=fake_build,
        update_mask=fake_update_mask,
        fields=None)
    self.update_build_function.assert_called_with(fake_update_build_request)

  def testGetBuildStages(self):
    """Test the GetBuildStages functionality."""
    bbv2 = buildbucket_v2.BuildbucketV2()
    start_time = Timestamp()
    start_time.GetCurrentTime()
    step = step_pb2.Step(name='stage_name', start_time=start_time,
                         status=2)
    build_with_steps = build_pb2.Build(steps=[step])
    get_build_fn = self.PatchObject(bbv2, 'GetBuild',
                                    return_value=build_with_steps)
    get_build_status_fn = self.PatchObject(
        bbv2, 'GetBuildStatus',
        return_value={'build_config': 'something-paladin'})
    expected_result = [{
        'name': 'stage_name',
        'start_time': datetime.fromtimestamp(start_time.seconds),
        'finish_time': None,
        'buildbucket_id': 1234,
        'status': constants.BUILDER_STATUS_INFLIGHT,
        'build_config': 'something-paladin'}]
    self.assertEqual(bbv2.GetBuildStages(1234), expected_result)
    get_build_fn.assert_called_once_with(1234, properties='steps')
    get_build_status_fn.assert_called_once_with(1234)

  def testGetKilledChildBuildsWithValidId(self):
    """Test a valid query flow."""
    bbv2 = buildbucket_v2.BuildbucketV2()
    buildbucket_id = 1234
    expected_child_builds = [8921795536486453568, 8921795536486453567]
    fake_properties = Struct(fields={
        'killed_child_builds': Value(string_value=str(expected_child_builds))
    })
    fake_output = build_pb2.Build.Output(properties=fake_properties)
    fake_build = build_pb2.Build(id=1234, output=fake_output)
    self.PatchObject(buildbucket_v2.BuildbucketV2, 'GetBuild',
                     return_value=fake_build)
    builds = bbv2.GetKilledChildBuilds(buildbucket_id)
    self.assertEqual(builds, expected_child_builds)

  def testGetKilledChildBuildsWithInvalidId(self):
    """Test an unsuccessful query."""
    bbv2 = buildbucket_v2.BuildbucketV2()
    buildbucket_id = 1234
    self.PatchObject(buildbucket_v2.BuildbucketV2, 'GetBuild',
                     side_effect=ProtocolError)
    builds = bbv2.GetKilledChildBuilds(buildbucket_id)
    self.assertIsNone(builds)

  def testGetBuildStatusWithValidId(self):
    """Tests for GetBuildStatus with a valid ID."""
    props_dict = {
        'cidb_id': '1234',
        'bot_id': 'swarm-cros-34',
        'cbb_branch': 'master',
        'cbb_config': 'sludge-paladin-tryjob',
        'cbb_master_build_id': '4321',
        'platform_version':'11721.0.0',
        'milestone_version': '74',
        'full_version': 'R74-11721.0.0-b3457724',
        'critical': '1',
        'build_type': 'Try',
    }
    start_time = Timestamp()
    start_time.GetCurrentTime()
    fake_properties = Struct(fields={
        key: Value(string_value=value) for key, value in props_dict.items()
    })
    fake_output = build_pb2.Build.Output(properties=fake_properties)
    fake_build = build_pb2.Build(
        id=1234, start_time=start_time, status=2, output=fake_output)
    self.PatchObject(buildbucket_v2.BuildbucketV2, 'GetBuild',
                     return_value=fake_build)
    expected_valid_status = {
        'build_config': 'sludge-paladin-tryjob',
        'start_time': datetime.fromtimestamp(start_time.seconds),
        'finish_time': None,
        'id': 1234,
        'status': constants.BUILDER_STATUS_INFLIGHT,
        'chrome_version': None,
        'platform_version':'11721.0.0',
        'milestone_version': '74',
        'full_version': 'R74-11721.0.0-b3457724',
        'important': 1,
        'buildbucket_id': 1234,
        'summary': None,
        'master_build_id': 4321,
        'bot_hostname': 'swarm-cros-34',
        'builder_name': None,
        'build_number': None,
        'buildbot_generation': None,
        'waterfall': None,
        'deadline': None,
        'build_type': 'Try',
        'metadata_url': None,
        'toolchain_url': None,
        'branch': 'master'
    }
    bbv2 = buildbucket_v2.BuildbucketV2()
    status = bbv2.GetBuildStatus(1234)
    self.assertEqual(status, expected_valid_status)

  def testGetBuildStatusWithInvalidId(self):
    """Test the function for an ID that doesn't exist in Buildbucket."""
    expected_invalid_status = {
        'build_config': None,
        'start_time': None,
        'finish_time': None,
        'status': None,
        'id': None,
        'chrome_version': None,
        'platform_version': None,
        'milestone_version': None,
        'full_version': None,
        'important': None,
        'buildbucket_id': 0,
        'summary': None,
        'master_build_id': None,
        'bot_hostname': None,
        'builder_name': None,
        'build_number': None,
        'buildbot_generation': None,
        'waterfall': None,
        'deadline': None,
        'build_type': None,
        'metadata_url': None,
        'toolchain_url': None,
        'branch': None
    }
    self.PatchObject(buildbucket_v2.BuildbucketV2, 'GetBuild',
                     side_effect=ProtocolError)
    bbv2 = buildbucket_v2.BuildbucketV2()
    status = bbv2.GetBuildStatus(0)
    self.assertEqual(status, expected_invalid_status)

  def testSearchBuildExceptionCases(self):
    """Test scenarios where SearchBuild raises an Exception."""
    bbv2 = buildbucket_v2.BuildbucketV2()
    builder = builder_pb2.BuilderID(project='chromeos', bucket='general')
    tag = common_pb2.StringPair(key='cbb_master_buildbucket_id',
                                value=str(1234))
    build_predicate = builds_service_pb2.BuildPredicate(
        builder=builder, tags=[tag])
    with self.assertRaises(AssertionError):
      bbv2.SearchBuild(None, None, 100)
    with self.assertRaises(AssertionError):
      bbv2.SearchBuild(build_predicate, None, None)
    with self.assertRaises(AssertionError):
      bbv2.SearchBuild(build_predicate, 'str_fields', 100)

  def testSearchBuild(self):
    """Test redirection to the underlying RPC call."""
    bbv2 = buildbucket_v2.BuildbucketV2()
    builder = builder_pb2.BuilderID(project='chromeos', bucket='general')
    tag = common_pb2.StringPair(key='cbb_master_buildbucket_id',
                                value=str(1234))
    build_predicate = builds_service_pb2.BuildPredicate(
        builder=builder, tags=[tag])
    fields = field_mask_pb2.FieldMask()
    search_builds_fn = self.PatchObject(bbv2.client, 'SearchBuilds')
    bbv2.SearchBuild(build_predicate, fields=fields, page_size=123)
    search_builds_fn.assert_called_once_with(
      builds_service_pb2.SearchBuildsRequest(
        predicate=build_predicate, fields=fields, page_size=123))

  def testGetBuildHistoryIgnoreIdFoundId(self):
    """Test GetBuildHistory ignore_build_id logic."""
    # pylint: disable=unused-variable
    bbv2 = buildbucket_v2.BuildbucketV2()
    builder = builder_pb2.BuilderID(project='chromeos', bucket='general')
    tags = [common_pb2.StringPair(key='cbb_config',
                                  value='something-paladin')]
    build_list = [build_pb2.Build(id=1234),
                  build_pb2.Build(id=2341)]
    search_fn = self.PatchObject(
        bbv2, 'SearchBuild',
        return_value=builds_service_pb2.SearchBuildsResponse(builds=build_list))
    status_fn = self.PatchObject(bbv2, 'GetBuildStatus')
    bbv2.GetBuildHistory('something-paladin', 1, ignore_build_id=1234)
    fake_predicate = builds_service_pb2.BuildPredicate(
        builder=builder, tags=tags, create_time=None, build=None)
    search_fn.assert_called_once_with(fake_predicate, page_size=2)
    status_fn.assert_called_once_with(2341)

  def testGetBuildHistoryIgnoreIdWithoutId(self):
    """Test GetBuildHistory ignore_build_id logic when ID is absent."""
    bbv2 = buildbucket_v2.BuildbucketV2()
    builder = builder_pb2.BuilderID(project='chromeos', bucket='general')
    tags = [common_pb2.StringPair(key='cbb_config',
                                  value='something-paladin')]
    build_list = [build_pb2.Build(id=1234),
                  build_pb2.Build(id=2341)]
    search_fn = self.PatchObject(
        bbv2, 'SearchBuild',
        return_value=builds_service_pb2.SearchBuildsResponse(builds=build_list))
    status_fn = self.PatchObject(bbv2, 'GetBuildStatus')
    bbv2.GetBuildHistory('something-paladin', 1, ignore_build_id=1000)
    fake_predicate = builds_service_pb2.BuildPredicate(
        builder=builder, tags=tags, create_time=None, build=None)
    search_fn.assert_called_with(fake_predicate, page_size=2)
    status_fn.assert_called_with(1234)

  def testGetBuildHistoryOtherArgs(self):
    """Test GetBuildHistory's processing of (args - ignore_build_id)."""
    builder = builder_pb2.BuilderID(project='chromeos', bucket='general')
    tags = [common_pb2.StringPair(key='cbb_config',
                                  value='something-paladin'),
            common_pb2.StringPair(key='cbb_branch',
                                  value='master')]
    start_date = date(2019, 4, 16)
    create_time = buildbucket_v2.DateToTimeRange(start_date)
    fake_build = builds_service_pb2.BuildRange(start_build_id=1234)
    fake_predicate = builds_service_pb2.BuildPredicate(
        builder=builder, tags=tags, create_time=create_time, build=fake_build)
    bbv2 = buildbucket_v2.BuildbucketV2()
    search_fn = self.PatchObject(bbv2, 'SearchBuild')
    self.PatchObject(bbv2, 'GetBuildStatus')
    bbv2.GetBuildHistory('something-paladin', 10, start_date=start_date,
                         branch='master', start_build_id=1234)
    search_fn.assert_called_once_with(fake_predicate, page_size=10)

  def testGetChildStatusesSuccess(self):
    """Test GetChildStatuses when RPC succeeds."""
    bbv2 = buildbucket_v2.BuildbucketV2()
    fake_search_build_response = builds_service_pb2.SearchBuildsResponse()
    self.PatchObject(bbv2, 'SearchBuild',
                     return_value=fake_search_build_response)
    self.assertEqual(bbv2.GetChildStatuses(1234), [])
    fake_build = build_pb2.Build(id=2341)
    fake_search_build_response = builds_service_pb2.SearchBuildsResponse(
        builds=[fake_build])
    self.PatchObject(bbv2, 'SearchBuild',
                     return_value=fake_search_build_response)
    get_build_status = self.PatchObject(bbv2, 'GetBuildStatus')
    bbv2.GetChildStatuses(1234)
    get_build_status.assert_called_once_with(2341)

  def testGetStageFailures(self):
    """Test GetStageFailures logic."""
    bbv2 = buildbucket_v2.BuildbucketV2()
    fake_build_status = {'buildbucket_id': 1234,
                         'status': 'Passed!!',
                         'build_config': 'something-paladin',
                         'important': True}
    fake_stages = [
        {'name': 'stage_1', 'status':constants.BUILDER_STATUS_PASSED},
        {'name': 'stage_2', 'status':constants.BUILDER_STATUS_FAILED},
        {'name': 'stage_3', 'status':constants.BUILDER_STATUS_FORGIVEN},
    ]
    self.PatchObject(bbv2, 'GetBuildStatus', return_value=fake_build_status)
    self.PatchObject(bbv2, 'GetBuildStages', return_value=fake_stages)
    expected_answer = [
        {'stage_name': 'stage_2',
         'stage_status': constants.BUILDER_STATUS_FAILED,
         'buildbucket_id': 1234,
         'build_config': 'something-paladin',
         'build_status': 'Passed!!',
         'important': True}
    ]
    self.assertEqual(bbv2.GetStageFailures(1234), expected_answer)


class StaticFunctionsTest(cros_test_lib.MockTestCase):
  """Test static functions in lib/buildbucket_v2.py."""
  # pylint: disable=attribute-defined-outside-init

  def testUpdateSelfBuildPropertiesNonBlocking(self):
    self.logging_function = self.PatchObject(
        cbuildbot_alerts, 'PrintKitchenSetBuildProperty')
    buildbucket_v2.UpdateSelfBuildPropertiesNonBlocking('key', 'value')
    self.logging_function.assert_called_with(
        'key', 'value')

  def testUpdateSelfCommonBuildProperties(self):
    self.underlying_function = self.PatchObject(
        buildbucket_v2, 'UpdateSelfBuildPropertiesNonBlocking')
    fake_value = 123
    fake_id = 8921795536486453568
    buildbucket_v2.UpdateSelfCommonBuildProperties(critical=True)
    self.underlying_function.assert_called_with('critical', True)
    buildbucket_v2.UpdateSelfCommonBuildProperties(cidb_id=fake_value)
    self.underlying_function.assert_called_with('cidb_id', fake_value)
    buildbucket_v2.UpdateSelfCommonBuildProperties(
        chrome_version=fake_value)
    self.underlying_function.assert_called_with('chrome_version', fake_value)
    buildbucket_v2.UpdateSelfCommonBuildProperties(
        milestone_version=fake_value)
    self.underlying_function.assert_called_with(
        'milestone_version', fake_value)
    buildbucket_v2.UpdateSelfCommonBuildProperties(
        platform_version=fake_value)
    self.underlying_function.assert_called_with(
        'platform_version', fake_value)
    buildbucket_v2.UpdateSelfCommonBuildProperties(full_version=fake_value)
    self.underlying_function.assert_called_with('full_version', fake_value)
    buildbucket_v2.UpdateSelfCommonBuildProperties(toolchain_url=fake_value)
    self.underlying_function.assert_called_with('toolchain_url', fake_value)
    buildbucket_v2.UpdateSelfCommonBuildProperties(build_type=fake_value)
    self.underlying_function.assert_called_with('build_type', fake_value)
    buildbucket_v2.UpdateSelfCommonBuildProperties(unibuild=True)
    self.underlying_function.assert_called_with('unibuild', True)
    buildbucket_v2.UpdateSelfCommonBuildProperties(suite_scheduling=True)
    self.underlying_function.assert_called_with('suite_scheduling', True)
    buildbucket_v2.UpdateSelfCommonBuildProperties(
        killed_child_builds=[fake_id, fake_value])
    self.underlying_function.assert_called_with('killed_child_builds',
                                                str([fake_id, fake_value]))
    buildbucket_v2.UpdateSelfCommonBuildProperties(board='grunt')
    self.underlying_function.assert_called_with('board', 'grunt')
    buildbucket_v2.UpdateSelfCommonBuildProperties(
        main_firmware_version='Google_Grunt.11031.62.0')
    self.underlying_function.assert_called_with(
        'main_firmware_version', 'Google_Grunt.11031.62.0')
    buildbucket_v2.UpdateSelfCommonBuildProperties(
        ec_firmware_version='aleena_v2.1.108-9ca28c388')
    self.underlying_function.assert_called_with(
        'ec_firmware_version', 'aleena_v2.1.108-9ca28c388')

  def testUpdateBuildMetadata(self):
    fake_dict = {'version': {'chrome': 'chrome_version',
                             'milestone': 'milestone_version',
                             'platform': 'platform_version',
                             'full': 'full_version'},
                 'toolchain-url': 'toolchain_url',
                 'build_type': 'canary',
                 'important': True,
                 'unibuild': True}
    self.PatchObject(metadata_lib.CBuildbotMetadata, 'GetDict',
                     return_value=fake_dict)
    self.PatchObject(buildbucket_v2, 'UpdateSelfCommonBuildProperties')
    fake_metadata = metadata_lib.CBuildbotMetadata()
    buildbucket_v2.UpdateBuildMetadata(fake_metadata)
    buildbucket_v2.UpdateSelfCommonBuildProperties.assert_called_with(
        critical=True, chrome_version='chrome_version',
        milestone_version='milestone_version',
        platform_version='platform_version',
        full_version='full_version',
        toolchain_url='toolchain_url',
        build_type='canary',
        unibuild=True,
        suite_scheduling=False,
        channels=None)

  def testBuildStepToDict(self):
    """Test the working of BuildStepToDict."""
    build_values = {
        'buildbucket_id': 1234,
        'build_config': 'something-paladin'}
    start_time = Timestamp()
    start_time.GetCurrentTime()
    step = step_pb2.Step(name='stage_name', start_time=start_time,
                         status=2)
    expected_result = {
        'name': 'stage_name',
        'start_time': datetime.fromtimestamp(start_time.seconds),
        'finish_time': None,
        'buildbucket_id': 1234,
        'status': constants.BUILDER_STATUS_INFLIGHT,
        'build_config': 'something-paladin'}

    self.assertEqual(buildbucket_v2.BuildStepToDict(step, build_values),
                     expected_result)

  def testDateToTimeRangeNoneInput(self):
    self.assertIsNone(buildbucket_v2.DateToTimeRange(None))

  def testDateToTimeRangeStartDate(self):
    date_example = date(2019, 4, 15)
    result = buildbucket_v2.DateToTimeRange(start_date=date_example)
    self.assertEqual(result.start_time.seconds, 1555286400)
    self.assertEqual(result.end_time.seconds, 0)

  def testDateToTimeRangeEndDate(self):
    date_example = date(2019, 4, 15)
    result = buildbucket_v2.DateToTimeRange(end_date=date_example)
    self.assertEqual(result.end_time.seconds, 1555372740)
    self.assertEqual(result.start_time.seconds, 0)

  def testGetStringPairValue(self):
    bot_id = buildbucket_v2.GetStringPairValue(
      SUCCESS_BUILD,
      ['infra', 'swarming', 'botDimensions'],
      'id')
    self.assertEqual(bot_id, 'chromeos-ci-test-bot')
    pool = buildbucket_v2.GetStringPairValue(
      SUCCESS_BUILD,
      ['infra', 'swarming', 'botDimensions'],
      'pool')
    self.assertEqual(pool, 'ChromeOS')
    role = buildbucket_v2.GetStringPairValue(
      SUCCESS_BUILD,
      ['infra', 'swarming', 'botDimensions'],
      'role')
    self.assertEqual(role, 'legacy-release')

  def testGetBotId(self):
    bot_id = buildbucket_v2.GetBotId(SUCCESS_BUILD)
    self.assertEqual(bot_id, 'chromeos-ci-test-bot')

  def testGetScheduledBuildDict(self):
    """test GetScheduledBuildDict."""
    config_name_1 = 'config_name_1'
    config_name_2 = 'config_name_2'
    config_name_3 = 'config_name_3'
    id_1 = 'id_1'
    id_2 = 'id_2'
    id_3 = 'id_3'

    slave_list = [(config_name_1, id_1, 1),
                  (config_name_2, id_2, 2),
                  (config_name_3, id_3, 3)]
    build_dict = buildbucket_v2.GetScheduledBuildDict(slave_list)
    self.assertEqual(len(build_dict), 3)
    self.assertEqual(build_dict[config_name_1].buildbucket_id, id_1)
    self.assertEqual(build_dict[config_name_2].buildbucket_id, id_2)
    self.assertEqual(build_dict[config_name_3].buildbucket_id, id_3)
    self.assertEqual(build_dict[config_name_1].retry, 0)
    self.assertEqual(build_dict[config_name_2].retry, 0)
    self.assertEqual(build_dict[config_name_3].retry, 0)
    self.assertEqual(build_dict[config_name_1].created_ts, 1)
    self.assertEqual(build_dict[config_name_2].created_ts, 2)
    self.assertEqual(build_dict[config_name_3].created_ts, 3)

    slave_list = [(config_name_1, id_1, 1),
                  (config_name_2, id_2, 2),
                  (config_name_1, id_3, 3)]
    build_dict = buildbucket_v2.GetScheduledBuildDict(slave_list)
    self.assertEqual(len(build_dict), 2)
    self.assertEqual(build_dict[config_name_1].buildbucket_id, id_3)
    self.assertEqual(build_dict[config_name_2].buildbucket_id, id_2)
    self.assertEqual(build_dict[config_name_1].retry, 1)
    self.assertEqual(build_dict[config_name_2].retry, 0)
    self.assertEqual(build_dict[config_name_1].created_ts, 3)
    self.assertEqual(build_dict[config_name_2].created_ts, 2)

    slave_list = [(config_name_1, id_1, 3),
                  (config_name_2, id_2, 2),
                  (config_name_1, id_3, 1)]
    build_dict = buildbucket_v2.GetScheduledBuildDict(slave_list)
    self.assertEqual(len(build_dict), 2)
    self.assertEqual(build_dict[config_name_1].buildbucket_id, id_1)
    self.assertEqual(build_dict[config_name_2].buildbucket_id, id_2)
    self.assertEqual(build_dict[config_name_1].retry, 1)
    self.assertEqual(build_dict[config_name_2].retry, 0)
    self.assertEqual(build_dict[config_name_1].created_ts, 3)
    self.assertEqual(build_dict[config_name_2].created_ts, 2)

    build_dict = buildbucket_v2.GetScheduledBuildDict([])
    self.assertEqual(build_dict, {})

    build_dict = buildbucket_v2.GetScheduledBuildDict(None)
    self.assertEqual(build_dict, {})

  def testGetBuildInfoDict(self):
    """Test GetBuildInfoDict with metadata and config."""
    metadata = metadata_lib.CBuildbotMetadata()
    slaves = [('config_1', 'bb_id_1', 0),
              ('config_1', 'bb_id_2', 1),
              ('config_2', 'bb_id_3', 2)]
    metadata.ExtendKeyListWithList(
        constants.METADATA_SCHEDULED_IMPORTANT_SLAVES, slaves)

    buildbucket_info_dict = buildbucket_v2.GetBuildInfoDict(metadata)
    self.assertEqual(len(buildbucket_info_dict), 2)
    self.assertEqual(
        buildbucket_info_dict['config_1'],
        buildbucket_v2.BuildbucketInfo('bb_id_2', 1, 1, None, None))
    self.assertEqual(
        buildbucket_info_dict['config_2'],
        buildbucket_v2.BuildbucketInfo('bb_id_3', 0, 2, None, None))

    buildbucket_info_dict_with_experimental = (
        buildbucket_v2.GetBuildInfoDict(metadata, exclude_experimental=False))
    self.assertEqual(len(buildbucket_info_dict), 2)
    self.assertEqual(
        buildbucket_info_dict_with_experimental['config_1'],
        buildbucket_v2.BuildbucketInfo('bb_id_2', 1, 1, None, None))
    self.assertEqual(
        buildbucket_info_dict_with_experimental['config_2'],
        buildbucket_v2.BuildbucketInfo('bb_id_3', 0, 2, None, None))

    metadata.UpdateWithDict({
        constants.METADATA_EXPERIMENTAL_BUILDERS: ['config_2']
    })
    buildbucket_info_dict = buildbucket_v2.GetBuildInfoDict(metadata)
    self.assertEqual(len(buildbucket_info_dict), 1)
    self.assertEqual(
        buildbucket_info_dict['config_1'],
        buildbucket_v2.BuildbucketInfo('bb_id_2', 1, 1, None, None))

    buildbucket_info_dict_with_experimental = (
        buildbucket_v2.GetBuildInfoDict(metadata, exclude_experimental=False))
    self.assertEqual(len(buildbucket_info_dict_with_experimental), 2)
    self.assertEqual(
        buildbucket_info_dict_with_experimental['config_1'],
        buildbucket_v2.BuildbucketInfo('bb_id_2', 1, 1, None, None))
    self.assertEqual(
        buildbucket_info_dict_with_experimental['config_2'],
        buildbucket_v2.BuildbucketInfo('bb_id_3', 0, 2, None, None))

  def testGetBuildbucketIds(self):
    """Test GetBuildbucketIds with metadata and config."""
    metadata = metadata_lib.CBuildbotMetadata()
    slaves = [('config_1', 'bb_id_1', 0),
              ('config_1', 'bb_id_2', 1),
              ('config_2', 'bb_id_3', 2)]
    metadata.ExtendKeyListWithList(
        constants.METADATA_SCHEDULED_IMPORTANT_SLAVES, slaves)

    buildbucket_ids = buildbucket_v2.GetBuildbucketIds(metadata)
    self.assertTrue('bb_id_2' in buildbucket_ids)
    self.assertTrue('bb_id_3' in buildbucket_ids)

  def testCredentials(self):
    fake_get_build_request = object()
    bbv2 = buildbucket_v2.BuildbucketV2(
        access_token_retriever=lambda: 'some-token')
    client = bbv2.client
    self.PatchObject(
        builds_service_pb2, 'GetBuildRequest',
        return_value=fake_get_build_request)
    get_build_function = self.PatchObject(client, 'GetBuild')
    bbv2.GetBuild('some-id')

    class DisableAuthFn(object):
      """An object that can be compared to a function"""
      def __eq__(self, fn):
        request = new_request('a', 'b', 'c', 'd', 'e')
        return not fn(request).include_auth

    get_build_function.assert_called_with(
        fake_get_build_request,
        metadata=dict(Authorization='Bearer some-token'),
        credentials=DisableAuthFn())
