# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

from PB.recipe_modules.flutter.goma.properties import InputProperties

DEPS = [
    "flutter/goma",
    "fuchsia/status_check",
    "recipe_engine/buildbucket",
    "recipe_engine/json",
    "recipe_engine/platform",
    "recipe_engine/properties",
    "recipe_engine/step",
]


def RunSteps(api):
    # Grab goma_dir out of the context.
    api.goma.goma_dir
    with api.goma():
        # build something using goma.
        api.step("echo goma jobs", ["echo", str(api.goma.jobs)])

    api.goma.set_path(api.goma.goma_dir)


def GenTests(api):
    def goma_properties(**kwargs):
        return api.properties(**{"$flutter/goma": InputProperties(**kwargs)})

    yield api.status_check.test("mac") + api.platform.name("mac")

    yield api.status_check.test("win") + api.platform.name("win")

    yield (
        api.status_check.test("linux_goma_dir")
        + api.platform.name("linux")
        + goma_properties(goma_dir="path/to/goma")
    )

    yield (
        api.status_check.test("linux_jobs")
        + api.platform.name("linux")
        + goma_properties(jobs=80)
    )

    yield (
        api.status_check.test("linux_non_default_server")
        + api.platform.name("linux")
        + goma_properties(server="goma.fuchsia.dev")
    )

    yield (
        api.status_check.test("linux_arbitrary_toolchain")
        + api.platform.name("linux")
        + goma_properties(enable_arbitrary_toolchains=True)
    )

    yield (
        api.status_check.test("linux_start_goma_failed", status="infra_failure")
        + api.platform.name("linux")
        + api.step_data("setup goma.start goma", retcode=1)
    )

    yield (
        api.status_check.test("linux_stop_goma_failed", status="failure")
        + api.platform.name("linux")
        + api.step_data("teardown goma.stop goma", retcode=1)
    )

    yield (
        api.status_check.test("linux_invalid_goma_jsonstatus")
        + api.platform.name("linux")
        + api.step_data("teardown goma.goma jsonstatus", api.json.output(data=None))
    )

    yield (
        api.status_check.test("valid_buildname_and_build_id")
        + api.platform.name("linux")
        + api.buildbucket.try_build(project="test", builder="test")
    )

    yield (
        api.status_check.test("linux_use_http_proxy")
        + api.platform.name("linux")
        + goma_properties(
            server="rbe-prod1.endpoints.fuchsia-infra-goma-prod.cloud.goog",
            use_http2=True,
        )
    )
