# Copyright 2017 The LUCI Authors. All rights reserved.
# Use of this source code is governed under the Apache License, Version 2.0
# that can be found in the LICENSE file.

"""This file is a recipe demonstrating the buildbucket recipe module."""

from PB.go.chromium.org.luci.buildbucket.proto import common as common_pb2

DEPS = [
  'buildbucket',
  'platform',
  'properties',
  'raw_io',
  'step',
]


def RunSteps(api):
  build = api.buildbucket.build
  if build.builder.bucket == 'try':
    assert build.builder.project == 'proj'
    assert build.builder.builder == 'try-builder'
    assert '-review' in build.input.gerrit_changes[0].host
    assert build.input.gitiles_commit.id == 'a' * 40
    assert (build.input.gitiles_commit.project ==
            build.input.gerrit_changes[0].project)
  elif build.builder.bucket == 'ci':
    assert build.builder.project == 'proj-internal'
    assert build.builder.builder == 'ci-builder'
    gm = build.input.gitiles_commit
    assert 'chrome-internal.googlesource.com' == gm.host
    assert 'repo' == gm.project
    assert len(build.tags) == 2
    assert build.tags[0].key == 'user_agent'
    assert build.tags[0].value == 'cq'
    assert build.tags[1].key == 'user_agent'
    assert build.tags[1].value == 'recipe'
  else:
    return

  # Note: this is not needed when running on LUCI. Buildbucket will use the
  # default account associated with the task.
  api.buildbucket.use_service_account_key('some-fake-key.json')

  build_parameters = {
      'builder_name': 'linux_perf_bisect',
      'properties': {
          'bisect_config': {
              'bad_revision': '351054',
              'bug_id': 537649,
              'command': ('src/tools/perf/run_benchmark -v '
                          '--browser=release --output-format=chartjson '
                          '--also-run-disabled-tests speedometer'),
              'good_revision': '351045',
              'gs_bucket': 'chrome-perf',
              'max_time_minutes': '20',
              'metric': 'Total/Total',
              'recipe_tester_name': 'linux_perf_bisect',
              'repeat_count': '10',
              'test_type': 'perf'
          },
      }
  }
  build_tags = {'master': 'overriden.master.url',
                'builder': 'overriden_builder'}
  build_tags2 = {'master': 'someother.master.url', 'builder': 'some_builder'}
  build_parameters_mac = build_parameters.copy()
  build_parameters_mac['builder_name'] = 'mac_perf_bisect'
  example_bucket = 'master.user.username'

  put_build_result = api.buildbucket.put(
      [{'bucket': example_bucket,
        'parameters': build_parameters,
        'tags': build_tags},
       {'bucket': example_bucket,
        'parameters': build_parameters_mac,
        'tags': build_tags2}])

  new_job_id = put_build_result.stdout['builds'][0]['id']

  get_build_result = api.buildbucket.get_build(new_job_id)
  if get_build_result.stdout['build']['status'] == 'SCHEDULED':
    api.buildbucket.cancel_build(new_job_id)

  # Setting values for expectations coverage only.
  api.buildbucket.set_buildbucket_host('cr-buildbucket-test.appspot.com')
  api.buildbucket.set_output_gitiles_commit(
    common_pb2.GitilesCommit(
        host='chromium.googlesource.com',
        project='infra/infra',
        ref='refs/heads/master',
        id='a' * 40,
        position=42,
    ),
  )

  api.step('build_url', cmd=None).presentation.step_text = (
      api.buildbucket.build_url())

  api.step('builder_cache', cmd=None).presentation.step_text = (
      str(api.buildbucket.builder_cache_path)
  )


def GenTests(api):
  mock_buildbucket_multi_response ="""
    {
      "builds":[{
       "status": "SCHEDULED",
       "created_ts": "1459200369835900",
       "bucket": "user.username",
       "result_details_json": "null",
       "status_changed_ts": "1459200369835930",
       "created_by": "user:username@example.com",
       "updated_ts": "1459200369835940",
       "utcnow_ts": "1459200369962370",
       "parameters_json": "{\\"This_has_been\\": \\"removed\\"}",
       "id": "9016911228971028736"
      }, {
       "status": "SCHEDULED",
       "created_ts": "1459200369835999",
       "bucket": "user.username",
       "result_details_json": "null",
       "status_changed_ts": "1459200369835988",
       "created_by": "user:username@example.com",
       "updated_ts": "1459200369835944",
       "utcnow_ts": "1459200369962377",
       "parameters_json": "{\\"This_has_been\\": \\"removed\\"}",
       "id": "9016911228971328738"
      }
       ],
     "kind": "buildbucket#resourcesItem",
     "etag": "\\"8uCIh8TRuYs4vPN3iWmly9SJMqw\\""
   }
  """
  mock_buildbucket_single_response = """
    {
      "build":{
       "status": "SCHEDULED",
       "created_ts": "1459200369835900",
       "bucket": "user.username",
       "result_details_json": "null",
       "status_changed_ts": "1459200369835930",
       "created_by": "user:username@example.com",
       "updated_ts": "1459200369835940",
       "utcnow_ts": "1459200369962370",
       "parameters_json": "{\\"This_has_been\\": \\"removed\\"}",
       "id": "9016911228971028736"
       },
     "kind": "buildbucket#resourcesItem",
     "etag": "\\"8uCIh8TRuYs4vPN3iWmly9SJMqw\\""
   }
  """
  yield (api.test('basic-try') +
         api.buildbucket.try_build(
             project='proj',
             builder='try-builder',
             git_repo='https://chrome-internal.googlesource.com/a/repo.git',
             revision='a' * 40,
             build_number=123) +
         api.step_data(
             'buildbucket.put',
             stdout=api.raw_io.output_text(mock_buildbucket_multi_response)) +
         api.step_data(
             'buildbucket.get',
             stdout=api.raw_io.output_text(mock_buildbucket_single_response)))
  yield (api.test('basic-ci-win') +
         api.buildbucket.ci_build(
             project='proj-internal',
             bucket='ci',
             builder='ci-builder',
             git_repo='https://chrome-internal.googlesource.com/a/repo.git',
             build_number=0,
             tags=api.buildbucket.tags(user_agent=['cq', 'recipe'])) +
         api.step_data(
             'buildbucket.put',
             stdout=api.raw_io.output_text(mock_buildbucket_multi_response)) +
         api.step_data(
             'buildbucket.get',
             stdout=api.raw_io.output_text(mock_buildbucket_single_response)) +
         api.platform('win', 32))

  yield (api.test('no_properties'))
