# Copyright 2020 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
"""Recipe for testing Recipes."""

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

DEPS = [
    'fuchsia/build_input_resolver',
    'fuchsia/checkout',
    'fuchsia/commit_queue',
    'fuchsia/gitiles',
    'fuchsia/recipe_testing',
    'fuchsia/status_check',
    'recipe_engine/buildbucket',
    'recipe_engine/context',
    'recipe_engine/path',
    'recipe_engine/properties',
]

PROPERTIES = {
    'project':
        Property(kind=str, help='Jiri remote manifest project', default=None),
    'manifest':
        Property(kind=str, help='Jiri manifest to use'),
    'remote':
        Property(kind=str, help='Remote manifest repository'),
    'unittest_only':
        Property(kind=bool, help='Finish after unit tests', default=False),
}

# If this build is being triggered from a change to this recipe, we need
# to explicitly pass a CL. The most recent passing run of
# fuchsia.try/recipes could take anywhere from about three to 200 minutes,
# and the three minute version does not test much of what this recipe
# actually does. In that case alter the recipes build to run on a specific
# CL that modifies the cobalt recipe alone. (The cobalt build usually
# takes less than 10 minutes.)
SELFTEST_CL = 'https://fuchsia-review.googlesource.com/c/303171'


def RunSteps(api, project, manifest, remote, unittest_only):
  """Run tests for recipes."""

  # Resolve the build input to always contain a Gitiles commit.
  api.build_input_resolver.resolve()

  with api.context(infra_steps=True):
    api.checkout.with_options(
        path=api.path['start_dir'],
        manifest=manifest,
        remote=remote,
        project=project,
        build_input=api.buildbucket.build.input,
    )

  recipes_path = api.path['start_dir'].join('infra', 'recipes')

  api.recipe_testing.run_unit_tests(recipes_path)

  if not unittest_only:
    api.recipe_testing.run_led_tests(recipes_path, SELFTEST_CL)


def GenTests(api):  # pylint: disable=invalid-name
  yield (api.status_check.test('cq_try') +
         api.build_input_resolver.set_gerrit_branch() +
         api.gitiles.refs('refs', ['refs/heads/master', 'c' * 40]) +
         api.commit_queue.test_data() +
         api.recipe_testing.affected_recipes_data(['none']) +
         api.recipe_testing.build_data(
             'fuchsia/try/fuchsia-x64-debug', 'fuchsia', skip=True) +
         api.recipe_testing.build_data(
             'fuchsia/try/fuchsia-arm64-debug', 'fuchsia', skip=True) +
         api.recipe_testing.build_data(
             'fuchsia/try/cobalt-x64-linux', 'cobalt', skip=True) +
         api.buildbucket.try_build(
             git_repo='https://fuchsia.googlesource.com/infra/recipes') +
         api.properties(
             manifest='manifest/minimal',
             remote='https://fuchsia.googlesource.com/infra/recipes',
         ))
