# Copyright 2016 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 building and testing Cobalt."""

from recipe_engine.post_process import StatusSuccess
from recipe_engine.recipe_api import Property

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

PROPERTIES = {
    "manifest": Property(kind=str, help="Jiri manifest to use"),
    "remote": Property(kind=str, help="Remote manifest repository"),
}


def RunSteps(api, manifest, remote):
    api.goma.ensure()
    with api.context(infra_steps=True):
        api.checkout.fuchsia_with_options(
            path=api.path["start_dir"], manifest=manifest, remote=remote,
        )

    # Start the cobalt build process.
    with api.context(cwd=api.path["start_dir"].join("cobalt")):
        api.step("setup", ["./cobaltb.py", "setup"])
        with api.goma.build_with_goma():
            api.step(
                "build", ["./cobaltb.py", "build", "--goma_dir", api.goma.goma_dir]
            )
        api.step("lint", ["./cobaltb.py", "lint", "--all"])
        api.step("test", ["./cobaltb.py", "test"])


def GenTests(api):
    yield (
        api.status_check.test("ci")
        + api.properties(
            manifest="cobalt", remote="https://fuchsia.googlesource.com/manifest"
        )
        + api.post_process(StatusSuccess)
    )

    yield (
        api.status_check.test("cq_try")
        + api.buildbucket.try_build(git_repo="https://fuchsia.googlesource.com/cobalt")
        + api.properties(
            manifest="cobalt", remote="https://fuchsia.googlesource.com/manifest",
        )
        + api.post_process(StatusSuccess)
    )
