# 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.
"""Recipe for computing test owners, for use by Flake Fetcher

Reads a test manifest from GCS that's expected to be a list of JSON objects,
each of which contains a test name and the test's GN label.

Then the recipe uses a Fuchsia checkout to compute test owners and Monorail
components based on the nearest OWNERS file to the GN label. Finally, the
recipe uploads the owners data to another JSON file in GCS that Flake Fetcher
uses to assign bugs for flaky tests to the tests' owners and put the bugs in
the appropriate components.
"""

import re

from recipe_engine.recipe_api import Property

DEPS = [
    "fuchsia/checkout",
    "fuchsia/gsutil",
    "fuchsia/status_check",
    "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"),
    "test_manifest_gcs_bucket": Property(
        kind=str, help="GCS bucket to pull test manifest from"
    ),
    "test_manifest_gcs_path": Property(
        kind=str,
        help="Path to  within `test_manifest_gcs_bucket` to file mapping test names to GN labels",
    ),
    "owners_gcs_bucket": Property(kind=str, help="GCS bucket to upload test owners to"),
    "owners_gcs_path": Property(
        kind=str,
        help="Path within `owners_gcs_bucket` to upload the test owners manifest to",
    ),
}

# OWNERS file lines that match this regex (a very crude email matcher) will be
# considered to represent owners.
OWNER_REGEX = re.compile(r"^\S+@\S+$")

# OWNERS file lines that match this regex indicate Monorail bug components.
BUG_COMPONENT_REGEX = re.compile(r"^# COMPONENT: (\S+)$")


def RunSteps(
    api,
    manifest,
    remote,
    test_manifest_gcs_bucket,
    test_manifest_gcs_path,
    owners_gcs_bucket,
    owners_gcs_path,
):
    checkout_dir = api.path["start_dir"].join("checkout")
    api.checkout.with_options(
        path=checkout_dir,
        manifest=manifest,
        remote=remote,
        # No need to fetch CIPD packages, we only need to look at OWNERS
        # files and those are always checked into git.
        fetch_packages=False,
        run_hooks=False,
    )

    workdir = api.path.mkdtemp("workdir")
    test_manifest_path = workdir.join("test_manifest.json")
    api.gsutil.download(
        name="download test manifest",
        src_bucket=test_manifest_gcs_bucket,
        src=test_manifest_gcs_path,
        dest=test_manifest_path,
    )

    owners_path = workdir.join("test_owners.json")
    with api.context(cwd=checkout_dir):
        api.step(
            "find owners",
            [api.resource("find_owners.py"), test_manifest_path, owners_path],
        )

    api.gsutil.upload(
        name="upload test owners",
        src=owners_path,
        bucket=owners_gcs_bucket,
        dst=owners_gcs_path,
    )


def GenTests(api):
    yield (
        api.status_check.test("basic")
        + api.properties(
            manifest="fuchsia/flower",
            remote="https://fuchsia.googlesource.com/integration",
            test_manifest_gcs_bucket="tests",
            test_manifest_gcs_path="test_manifest.json",
            owners_gcs_bucket="owners",
            owners_gcs_path="test_owners.json",
        )
    )
