# 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 = [
    "fuchsia/buildbucket_util",
    "fuchsia/commit_queue",
    "flutter/recipe_testing",
    "fuchsia/swarming_retry",
    "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"].join("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.commit_queue.test_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.commit_queue.test_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.commit_queue.test_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.commit_queue.test_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.commit_queue.test_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.commit_queue.test_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)
        + api.swarming_retry.collect_data(
            [
                test.task_result(100, "fuchsia/try/core.x64-debug"),
                test.task_result(200, "fuchsia/try/core.arm64-debug"),
            ]
        )
    )

    yield (
        api.buildbucket_util.test("fuchsia_recipe_unaffected")
        + api.recipe_testing.options()
        + api.commit_queue.test_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.commit_queue.test_data(project, "recipes-only")
        + test.affected_recipes_data(["recipes"])
        + test.build_data("fuchsia/try/recipes", "recipes")
        + api.swarming_retry.collect_data(
            [test.task_result(100, "fuchsia/try/recipes")]
        )
    )

    yield (
        api.buildbucket_util.test("with_buildbucket")
        + api.commit_queue.test_data(project)
        + test.affected_recipes_data(["fuchsia"])
        + test.build_data(
            "fuchsia/try/cobalt-x64-linux", "cobalt", skip=True, using_led=False
        )
        + test.build_data(
            "fuchsia/try/core.x64-debug",
            "fuchsia",
            cl_cached=True,
            fake_id=100,
            using_led=False,
        )
        + test.build_data(
            "fuchsia/try/core.arm64-debug",
            "fuchsia",
            fake_id=200,
            using_led=False,
        )
        + 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(),),
        )
    )

    yield (
        api.buildbucket_util.test("recipes_with_buildbucket")
        + api.commit_queue.test_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.commit_queue.test_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,
        )
        + api.swarming_retry.collect_data(
            [
                test.task_result(100, "fuchsia/try/core.x64-debug"),
                test.task_result(200, "fuchsia/try/core.arm64-debug"),
            ]
        )
    )

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