# Copyright 2019 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.

from recipe_engine import recipe_test_api
from RECIPE_MODULES.fuchsia.testing_requests import api


class FuchsiaTestingRequestsTestApi(recipe_test_api.RecipeTestApi):

    SERIAL_LOG_NAME = api.SERIAL_LOG_NAME
    SYSLOG_NAME = api.SYSLOG_NAME
    TEST_RESULTS_DIR_NAME = api.TestingRequestsApi.TEST_RESULTS_DIR_NAME

    EXAMPLE_TESTS_JSON = [
        {
            "test": {
                "name": "hello",
                "label": "//a/b/c:hello_test(//toolchain)",
                "os": "fuchsia",
                "path": "/pkgfs/packages/path/to/hello",
                "package_url": "fuchsia-pkg://fuchsia.com/hello",
            }
        },
        {
            "test": {
                "name": "goodbye",
                "label": "//a/b/c:goodbye_test(//toolchain)",
                "os": "fuchsia",
                "path": "/pkgfs/packages/path/to/goodbye",
                "package_url": "fuchsia-pkg://fuchsia.com/goodbye",
            }
        },
    ]

    def default_tests(self):
        """Returns mock step data for the output of testsharder.

        Returns:
          list(testsharder.Test)
        """
        return [self.m.testsharder.test(**t["test"]) for t in self.EXAMPLE_TESTS_JSON]

    def task_request_jsonish(self, legacy_qemu):
        ret = self.m.swarming.example_task_request_jsonish()
        ret["tags"] = ["uses_legacy_qemu:%s" % str(legacy_qemu).lower()]
        return ret

    def task_requests_step_data(self, task_requests, step_name):
        """Returns mock step data for swarming task requests.

        This should be used by any test which calls api.testing_requests.task_requests() and expects
        to shard tests.

        Args:
          shards (seq[dict]): A set of example shards which should
            be used as step data for the result of invoking the testsharder.
          step_name (str): name to use for step data

        Returns:
          RecipeTestApi.step_data for the extract_results step.
        """
        return self.step_data(step_name, self.m.json.output(task_requests))
