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

"""API for recipe_engine testing."""

import datetime

from recipe_engine import post_process
from PB.recipe_modules.flutter.recipe_testing.tests.full import InputProperties

DEPS = [
    "flutter/recipe_testing",
    "fuchsia/buildbucket_util",
    "recipe_engine/json",
    "recipe_engine/path",
    "recipe_engine/properties",
]

ONE_DAY = int(datetime.timedelta(days=1).total_seconds())
MAX_BUILD_AGE_SECONDS = int(datetime.timedelta(days=28).total_seconds())

PROPERTIES = InputProperties


def RunSteps(api, props):  # pylint: disable=invalid-name
  recipes_path = api.path.start_dir / "recipe_path"

  api.recipe_testing.run_lint(recipes_path, allowlist=r"allowed_module")
  api.recipe_testing.run_unit_tests(recipes_path)

  selftest_cl = "https://flutter-review.googlesource.com/c/recipes/+/123456"
  selftest_builder = "flutter/try/foo.bar-debug"
  api.recipe_testing.run_tests(
      recipes_path,
      selftest_cl,
      props.recipe_testing_options,
      selftest_builder=selftest_builder,
  )


def GenTests(api):  # pylint: disable=invalid-name

  test = api.recipe_testing

  project = "flutter"

  yield (
      api.buildbucket_util.test("recursive_ls") + api.recipe_testing.options() +
      api.recipe_testing.commit_queue_config_data(project, "empty") +
      test.affected_recipes_data(
          affected_recipes=[],
          recipe_files=["flutter/flutter.py", "abc.resources/bar.py", "abc.py"],
      )
  )

  yield (
      api.buildbucket_util.test("recipes_cfg") + api.recipe_testing.options() +
      api.recipe_testing.commit_queue_config_data(project, "empty") +
      test.affected_recipes_data(
          affected_recipes=[],
          recipe_files=["a.py", "b.py", "c.py", "d.py", "e.py"],
          changed_files=["infra/config/recipes.cfg"],
      )
  )

  yield (
      api.buildbucket_util.test("recipe_proto") + api.recipe_testing.options() +
      api.recipe_testing.commit_queue_config_data(project) +
      test.affected_recipes_data(
          affected_recipes=[],
          changed_files=["recipe_proto/infra/flutter.proto"],
      )
  )

  yield (
      api.buildbucket_util.test("no_build_old_build_ignored_build") +
      api.recipe_testing.options() +
      api.recipe_testing.commit_queue_config_data(project) +
      test.affected_recipes_data(["flutter"]) + test.build_data(
          "fuchsia/try/cobalt-x64-linux",
          "cobalt",
          age_seconds=MAX_BUILD_AGE_SECONDS - ONE_DAY,
          skip=True,
      ) + test.build_data(
          "fuchsia/try/core.x64-debug",
          "fuchsia",
          age_seconds=MAX_BUILD_AGE_SECONDS + ONE_DAY,
      ) + test.no_build("fuchsia/try/core.arm64-debug")
  )

  yield (
      api.buildbucket_util.test("excluded") + api.recipe_testing.options([
          api.recipe_testing.project(excluded_buckets=("try",))
      ]) + api.properties(ignored_buckets=["try"]) +
      api.recipe_testing.commit_queue_config_data(project) +
      test.affected_recipes_data(["flutter"]) + api.post_process(
          post_process.MustRun,
          "excluding 3 builders from bucket flutter/try",
      )
  )

  yield (
      api.buildbucket_util.test("two_pass_one_skip") +
      api.recipe_testing.options() +
      api.recipe_testing.commit_queue_config_data(project) +
      test.affected_recipes_data(["fuchsia"]) +
      test.build_data("fuchsia/try/cobalt-x64-linux", "cobalt", skip=True) +
      test.build_data(
          "fuchsia/try/core.x64-debug", "fuchsia", cl_cached=True, fake_id=100
      ) +
      test.build_data("fuchsia/try/core.arm64-debug", "fuchsia", fake_id=200)
  )

  yield (
      api.buildbucket_util.test("fuchsia_recipe_unaffected") +
      api.recipe_testing.options() +
      api.recipe_testing.commit_queue_config_data(project) +
      test.affected_recipes_data(["qemu"]) +
      test.build_data("fuchsia/try/cobalt-x64-linux", "cobalt", skip=True) +
      test.build_data("fuchsia/try/core.x64-debug", "fuchsia", skip=True) +
      test.build_data("fuchsia/try/core.arm64-debug", "fuchsia", skip=True)
  )

  yield (
      api.buildbucket_util.test("recipes") + api.recipe_testing.options() +
      api.recipe_testing.commit_queue_config_data(project, "recipes-only") +
      test.affected_recipes_data(["recipes"]) +
      test.build_data("fuchsia/try/recipes", "recipes")
  )

  yield (
      api.buildbucket_util.test("with_buildbucket") +
      api.recipe_testing.commit_queue_config_data(project) +
      test.affected_recipes_data(["fuchsia"]) + test.build_data(
          "fuchsia/try/cobalt-x64-linux",
          "cobalt",
          skip=True,
          using_led=False,
          exe_cipd_version="refs/heads/main"
      ) + test.build_data(
          "fuchsia/try/core.x64-debug",
          "fuchsia",
          cl_cached=True,
          fake_id=100,
          using_led=False,
          exe_cipd_version="refs/heads/main"
      ) + test.build_data(
          "fuchsia/try/core.arm64-debug",
          "fuchsia",
          fake_id=200,
          using_led=False,
          exe_cipd_version="refs/heads/main"
      ) + test.existing_green_tryjobs(["fuchsia/try/core.arm64-release"])
      # This line only affects coverage. It's sufficiently tested in other
      # modules that use this module.
      + api.recipe_testing.options(
          use_buildbucket=True,
          projects=(api.recipe_testing.project(),),
      ) + api.step_data("gerrit get cl info 12345", api.json.output({})) +
      api.properties(
          buildset='patch/gerrit/flutter-review.googlesource.com/12345/1'
      )
  )

  yield (
      api.buildbucket_util.test("recipes_with_buildbucket") +
      api.recipe_testing.commit_queue_config_data(project, "recipes-only") +
      test.affected_recipes_data(["recipes"]) +
      test.build_data("fuchsia/try/recipes", "recipes", using_led=False) +
      api.recipe_testing.options(use_buildbucket=True)
  )

  yield (
      api.buildbucket_util.test("no_latest_cl") + api.recipe_testing.options() +
      api.recipe_testing.commit_queue_config_data(project) +
      test.affected_recipes_data(["fuchsia"]) +
      test.build_data("fuchsia/try/core.x64-debug", "fuchsia", cl_cached=True) +
      test.build_data(
          "fuchsia/try/core.arm64-debug",
          "fuchsia",
          num_log_entries=0,
          fake_id=200,
      )
  )

  yield (
      api.buildbucket_util.test("depth", status="INFRA_FAILURE") +
      api.properties(**{"$flutter/recipe_testing": {"recipe_depth": 2}})
  )
