# Copyright 2018 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.

import json

from google.protobuf import text_format

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


def RunSteps(api):
  text = text_format.MessageToString(api.buildbucket.build)
  api.step('build', ['echo'] + text.splitlines())
  api.step('hostname', ['echo', api.buildbucket.host])
  api.step('is_critical', ['echo', api.buildbucket.is_critical()])

  child_build_tags = [
      '%s:%s' % t
      for t in api.buildbucket.tags_for_child_build.iteritems()
  ]
  api.step('tags_for_child_build', ['echo'] + child_build_tags)

  assert api.buildbucket.bucket_v1 == api.properties.get('expected_bucket_v1')
  assert api.buildbucket.builder_name == api.buildbucket.build.builder.builder
  assert api.buildbucket.gitiles_commit == (
      api.buildbucket.build.input.gitiles_commit)


def GenTests(api):

  def case(name, **properties):
    return api.test(name) + api.properties(**properties)

  def legacy_build(name, **buildbucket_build):
    return case(name, buildbucket={'build': buildbucket_build})

  yield case('empty')

  yield case('hostname', **{
      '$recipe_engine/buildbucket': {
          'hostname': 'buildbucket.example.com',
          'build': {},
      },
  })

  yield case('serialized buildbucket property', buildbucket=json.dumps({
    'build': {'id': '123456789'}
  }))

  yield legacy_build('v1 build with id', id='123456789')

  yield legacy_build('v1 empty buildset', tags=['buildset:'])
  yield legacy_build('v1 unknown buildset format', tags=['buildset:x'])

  yield legacy_build('v1 gerrit change', tags=[
      'buildset:patch/gerrit/chromium-review.googlesource.com/1/2',
  ])

  yield legacy_build('v1 gitiles commit', tags=[
      ('buildset:commit/gitiles/chromium.googlesource.com/chromium/src/+/'
       'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'),
  ])
  yield legacy_build('v1 gitiles commit, invalid', tags=[
      'buildset:commit/gitiles/a/b/c/d'
  ])
  yield legacy_build(
      'v1 created_by',
      created_by='user:jane@example.com')
  yield legacy_build(
      'v1 created_ts',
      created_ts='1546473600000000')

  yield case(
      'buildbot gitiles commit',
      revision='a' * 40,
      branch='master',
  )
  yield case(
      'buildbot gitiles commit, parent_got_revision',
      parent_got_revision='a' * 40,
  )
  yield case(
      'buildbot gitiles commit, both revision and parent_got_revision',
      revision='a' * 40,
      parent_got_revision='b' * 40,
  )
  yield case(
      'buildbot gitiles commit, invalid revision',
      revision='deafbeef',  # too short
  )
  yield case(
      'buildbot gitiles commit, HEAD revision',
      revision='HEAD',
  )

  yield case(
      'buildbot gerrit change',
      patch_storage='gerrit',
      patch_gerrit_url='https://example.googlesource.com/',
      patch_project='a/b',
      patch_issue=1,
      patch_set=2,
      buildbucket={
        'build': {
          'tags': [
             'buildset:patch/gerrit/chromium-review.googlesource.com/1/2',
          ],
        },
      },
  )
  yield case(
      'buildbot gerrit change, patch_gerrit_url without scheme',
      patch_storage='gerrit',
      patch_gerrit_url='example.googlesource.com',
      patch_project='a/b',
      patch_issue=1,
      patch_set=2,
  )
  yield case(
      'buildbot gerrit change, patch_gerrit_url with unexpected scheme',
      patch_storage='gerrit',
      patch_gerrit_url='ftp://example.googlesource.com',
      patch_project='a/b',
      patch_issue=1,
      patch_set=2,
  )
  yield case(
      'buildbot gerrit change with revision',
      revision='a' * 40,
      patch_storage='gerrit',
      patch_gerrit_url='https://example.googlesource.com/',
      patch_project='a/b',
      patch_issue=1,
      patch_set=2,
  )
  yield case(
      'buildbot gerrit change, issue and patchset properties',
      patch_storage='gerrit',
      patch_gerrit_url='https://example.googlesource.com/',
      patch_project='a/b',
      issue=1,
      patchset=2,
  )
  yield case(
      'buildbot gerrit change, no project',
      patch_storage='gerrit',
      patch_gerrit_url='https://example.googlesource.com/',
      patch_issue=1,
      patch_set=2,
  )
  yield case(
      'buildbot gerrit change, string issue',
      patch_storage='gerrit',
      patch_gerrit_url='https://example.googlesource.com/',
      patch_project='a/b',
      patch_issue='1',
      patch_set=2,
  )
  yield case(
      'buildbot gerrit change, string issue, not a number',
      patch_storage='gerrit',
      patch_gerrit_url='https://example.googlesource.com/',
      patch_project='a/b',
      patch_issue='x',
      patch_set=2,
  )

  yield (
      legacy_build(
          'v1 luci builder id',
          project='chromium',
          bucket='luci.chromium.try',
          tags=['builder:linux']) +
      api.properties(expected_bucket_v1='luci.chromium.try'))

  yield case(
      'v1 buildbot builder id', mastername='chromium', buildername='linux')

  yield legacy_build('v1 tags', tags=['a:b', 'c:d'])
  yield legacy_build('v1 hidden tags', tags=[
      'buildset:patch/gerrit/chromium-review.googlesource.com/1/2',
      ('buildset:commit/gitiles/chromium.googlesource.com/chromium/src/+/'
       'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'),
      'build_address:bucket/builder/123',
      'builder:linux',
  ])
