# 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.
"""Reruns tests using previously produced build artifacts.

Outline:

* Find the last green build of `source_builder`.
* Fetch that green build's output property `child_build_id`.
* Use api.buildbucket to trigger a run of `source_builder`, but with the modifications:
    * Change the bucket to <my bucket>.
    * Set the Gitiles input to the same as that of the last green build.
    * Set `child_build_id` to the `child_build_id` from the last green build.
"""

from PB.go.chromium.org.luci.buildbucket.proto import common as common_pb2
from PB.recipes.fuchsia.fuchsia.rerun import InputProperties

DEPS = [
    "fuchsia/buildbucket_util",
    "recipe_engine/buildbucket",
    "recipe_engine/properties",
    "recipe_engine/step",
]

PROPERTIES = InputProperties


def RunSteps(api, props):
    num_builds = props.num_builds or 1
    my_build = api.buildbucket.build
    last_build_status = common_pb2.SUCCESS
    # Flaky builders are rarely successful, so we take any build.
    if props.source_builder.endswith("-flaky"):
        last_build_status = common_pb2.ENDED_MASK

    source_build = api.buildbucket_util.last_build(
        my_build.builder.project,
        props.source_bucket,
        props.source_builder,
        status=last_build_status,
    )
    if not source_build:
        raise api.step.InfraFailure(
            "Failed to find source_build for builder %s/%s/%s"
            % (my_build.builder.project, props.source_bucket, props.source_builder)
        )

    rerun_properties = {
        "child_build_id": source_build.output.properties["child_build_id"]
    }
    schedule_rerun_request = api.buildbucket.schedule_request(
        props.target_builder,
        project=my_build.builder.project,
        bucket=my_build.builder.bucket,
        properties=rerun_properties,
        gitiles_commit=source_build.input.gitiles_commit,
    )
    api.buildbucket.schedule([schedule_rerun_request] * num_builds)


def GenTests(api):
    properties = {
        "source_bucket": "source-bucket",
        "source_builder": "source-builder-flaky",
        "target_builder": "source-builder-flaky-some-suffix",
    }

    yield (
        api.buildbucket_util.test("no_search_results", status="infra_failure")
        + api.properties(**properties)
    )

    source_build = api.buildbucket.ci_build_message()
    source_build.output.properties["child_build_id"] = 123
    yield (
        api.buildbucket_util.test("success", bucket="rerun")
        + api.properties(num_builds=2, **properties)
        + api.buildbucket.simulated_search_results([source_build])
    )
