# Copyright (c) 2020, the Dart project authors. All rights reserved. Use of this
# source code is governed by a BSD-style license that can be found in the
# LICENSE file.
#
# This recipe runs the presubmit. It checks that presubmit checks still pass
# when a CL is rebased (other changes may have landed and cause it to fail even
# though all checks passed when the CL was uploaded).
from recipe_engine import post_process

DEPS = [
    'depot_tools/gclient',
    'depot_tools/presubmit',
    'depot_tools/tryserver',
    'recipe_engine/buildbucket',
    'recipe_engine/context',
    'recipe_engine/json',
    'recipe_engine/path',
]

PYTHON_VERSION_COMPATIBILITY = "PY3"


def RunSteps(api):
  # prepare() runs bot_update, which requires a gclient config. This creates a
  # synthethic gclient config so that the recipe also works for projects that
  # don't use gclient.
  gclient_config = api.gclient.make_config()
  solution = gclient_config.solutions.add()
  solution.url = api.tryserver.gerrit_change_repo_url
  solution.name = api.tryserver.gerrit_change.project
  gclient_config.got_revision_mapping[solution.name] = 'got_revision'
  api.gclient.c = gclient_config

  with api.context(cwd=api.path['cache'].join('builder')):
    bot_update = api.presubmit.prepare()
    # execute() doesn't raise a StepFailure on error, but returns an error code.
    return api.presubmit.execute(bot_update, skip_owners=True)


def GenTests(api):
  yield api.test(
      'success',
      api.buildbucket.try_build(
          build_number=1357,
          builder='presubmit-try',
          git_repo='https://dart.googlesource.com/sdk',
          project='dart',
      ),
      api.step_data(
          'presubmit',
          api.json.output({
              'errors': [],
              'notifications': [],
              'warnings': []
          })),
      api.post_process(post_process.StatusSuccess),
  )

  yield api.test(
      'failure',
      api.buildbucket.try_build(
          build_number=1357,
          builder='presubmit-try',
          git_repo='https://dart.googlesource.com/sdk',
          project='dart',
      ),
      api.step_data(
          'presubmit',
          api.json.output({
              'errors': [{
                  'message': 'ERROR',
                  'long_text': 'ERROR: occured'
              }],
              'notifications': [],
              'warnings': []
          }),
          retcode=1),
      api.post_process(post_process.StatusFailure),
  )
