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

from recipe_engine import post_process
from recipe_engine import types

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

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


def RunSteps(api):
  # Convert from FrozenDict
  req_body = types.thaw(api.properties.get('request_kwargs'))
  tags = api.properties.get('tags')
  # This is needed to provide coverage for the tags() method in api.py.
  tags = api.buildbucket.tags(**tags) if tags else tags
  req = api.buildbucket.schedule_request(tags=tags, **req_body)
  api.buildbucket.schedule([req])

  api.buildbucket.run(
      [req],
      raise_if_unsuccessful=api.properties.get('raise_failed_status'),
      timeout=5000,
  )

  api.buildbucket.run([], step_name='run nothing')


def GenTests(api):

  def test(test_name, response=None, tags=None, **req):
    req.setdefault('builder', 'linux')
    return (
      api.test(test_name) +
      api.runtime(is_experimental=False) +
      api.buildbucket.try_build(
          project='chromium',
          builder='Builder',
          git_repo='https://chromium.googlesource.com/chromium/src',
          revision='a' * 40,
          tags=api.buildbucket.tags(buildset='bs', unrelated='a'),
      ) +
      api.properties(request_kwargs=req, tags=tags, response=response)
    )

  yield test('basic')

  yield test('exe_cipd_version', exe_cipd_version='some_ver')

  yield test(
      test_name='tags',
      tags={'a': 'b'}
  )

  yield test(
      test_name='dimensions',
      dimensions=[{'key': 'os', 'value': 'Windows'}]
  )

  yield test(
      test_name='critical',
      critical=True,
  )

  yield test(
      test_name='properties',
      properties={
          'str': 'b',
          'obj': {
              'p': 1,
          },
      }
  )

  yield test(
      test_name='experimental',
      experimental=common_pb2.YES,
  )

  yield test(
      test_name='non-experimental',
      experimental=common_pb2.NO,
  )

  yield test(
      test_name='experiments',
      experiments={
          'luci.exp_foo': True,
          'luci.exp_bar': False,
      },
  )

  err_batch_res = builds_service_pb2.BatchResponse(
      responses=[
        dict(
            error=dict(
                code=1,
                message='bad',
            ),
        ),
      ],
  )
  yield (
      test(test_name='error') +
      api.buildbucket.simulated_schedule_output(err_batch_res)
  )
  yield (
      test(test_name='mirror_failure') +
      api.properties(raise_failed_status=True) +
      api.buildbucket.simulated_collect_output([
        api.buildbucket.ci_build_message(
            build_id=8922054662172514001, status='FAILURE'),
      ], step_name='buildbucket.run.collect')
  )

  yield (
      test(test_name='infra_error') +
      api.override_step_data(
          'buildbucket.schedule',
          api.json.invalid(None),
          retcode=1
      ) +
      api.post_process(post_process.StatusException) +
      api.post_process(
          post_process.ResultReasonRE,
          r'Buildbucket Internal Error'
      ) +
      api.post_process(post_process.DropExpectation)
  )
