# Copyright 2018 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 LUCI configs."""

from recipe_engine import post_process
from recipe_engine.recipe_api import Property

DEPS = [
    "fuchsia/checkout",
    "fuchsia/status_check",
    "recipe_engine/context",
    "recipe_engine/path",
    "recipe_engine/properties",
    "recipe_engine/step",
]

PROPERTIES = {
    "config_project": Property(
        kind=str, help="Jiri remote manifest project containing the luci configs"
    ),
    "prebuilt_project": Property(
        kind=str, help="Jiri remote manifest project containing the lucicfg executable",
    ),
    "manifest": Property(kind=str, help="Jiri manifest to use"),
    "remote": Property(kind=str, help="Remote manifest repository"),
    "starlark_paths": Property(kind=list, help="Starlark file paths to validate"),
}


def RunSteps(api, config_project, prebuilt_project, manifest, remote, starlark_paths):
    assert starlark_paths, "starlark_paths must not be empty"

    checkout_root = api.path["start_dir"]
    with api.context(infra_steps=True):
        api.checkout.with_options(
            path=checkout_root,
            manifest=manifest,
            remote=remote,
            project=config_project,
        )

    prebuilt_path = api.checkout.project(prebuilt_project, checkout_root)["path"]
    lucicfg_path = checkout_root.join(prebuilt_path, "tools", "lucicfg")

    config_path = checkout_root.join(
        api.checkout.project(config_project, checkout_root)["path"]
    )
    with api.step.nest("validate"), api.step.defer_results():
        for relative_path in starlark_paths:
            abs_path = config_path.join(relative_path)
            api.step(
                relative_path, [lucicfg_path, "validate", "-fail-on-warnings", abs_path]
            )


def GenTests(api):
    properties = api.properties(
        config_project="integration",
        prebuilt_project="fuchsia/prebuilt",
        manifest="manifest/infra",
        remote="https://fuchsia.googlesource.com/manifest",
        starlark_paths=["main.star", "dev.star"],
    )

    yield (api.status_check.test("starlark") + properties)

    # The second file should be validated even if the first one fails.
    yield (
        api.status_check.test("first_file_invalid", status="failure")
        + properties
        + api.step_data("validate.main.star", retcode=1)
        + api.post_process(post_process.MustRun, "validate.dev.star")
    )
