# 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 disabled tests, for use in test metrics dashboards

Traverses files looking for flags associated with disabled tests.
"""

from PB.recipes.fuchsia.disabled_tests import InputProperties

PYTHON_VERSION_COMPATIBILITY = "PY3"

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

PROPERTIES = InputProperties


def RunSteps(api, props):
    checkout_dir = api.checkout.with_options(
        manifest=props.manifest,
        remote=props.remote,
        # No need to fetch CIPD packages, we only need to look at
        # files and those are always checked into git.
        fetch_packages=False,
    )

    with api.context(cwd=checkout_dir):
        tests = api.step(
            "find disabled tests",
            [
                api.resource("find_disabled_tests.py"),
                api.json.output(),
            ],
            step_test_data=lambda: api.json.test_api.output(
                [
                    {
                        "path": "src/foo/bar",
                        "line_number": 100,
                        "bug": "12345",
                        "compiled": False,
                    },
                ]
            ),
        ).json.output

    bq_rows = []

    for test in tests:
        bq_rows.append(test)

    if not props.dry_run:
        api.bqupload.insert(
            "upload to bigquery",
            project="tq-resilience-data",
            dataset="test_metrics",
            table="disabled_tests",
            rows=bq_rows,
        )


def GenTests(api):
    def properties(**kwargs):
        props = {
            "manifest": "fuchsia/flower",
            "remote": "https://fuchsia.googlesource.com/integration",
        }
        props.update(kwargs)
        return api.properties(**props)

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

    yield api.status_check.test("dry_run") + properties(dry_run=True)
