# 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


class FuchsiaTestingRequestsTestApi(recipe_test_api.RecipeTestApi):

  EXAMPLE_TESTS_JSON = [
      {
          'test': {
              'name': 'hello',
              'label': '//a/b/c:hello_test(//toolchain)',
              'os': 'fuchsia',
              'path': '/path/to/hello',
              'package_url': 'fuchsia-pkg://fuchsia.com/hello',
          }
      },
      {
          'test': {
              'name': 'goodbye',
              'label': '//a/b/c:goodbye_test(//toolchain)',
              'os': 'fuchsia',
              'path': '/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.shard_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))

  def shards_step_data(self,
                       shards,
                       step_name='download build artifacts.load test shards'):
    """Returns mock step data for test shards.

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

    Args:
      shards (seq[api.testsharder.Shard]): 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.m.testsharder.execute(step_name=step_name, shards=shards)

  def secrets_step_data(self):
    """Returns mock step data for the secrets pipeline.

    This should be used by any test which calls api.fuchsia.test() with
    requires_secrets is set to True.

    Returns:
      list(RecipeTestApi.step_data) for the steps around secrets decryption.
    """
    secret_name = 'auth-token'
    step_data = self.step_data(
        'process secret specs.list',
        self.m.file.listdir([
            '%s.json' % secret_name,
            'ciphertext'  # the 'ciphertext' subdir, which will be skipped.
        ]))
    step_data += self.step_data(
        'process secret specs.read spec for %s' % secret_name,
        self.m.json.output({
            'cloudkms_key_path': 'key-path',
        }))
    step_data += self.step_data(
        'process secret specs.decrypt secret for %s' % secret_name,
        self.m.raw_io.output_text('plaintext'))
    return step_data

  def args_test_data(self, target='x64', variants=None):
    args = self.m.json.output({
        'board': 'boards/x64.gni',
        'build_type': 'release',
        'product': 'products/core.gni',
        'target': target,
        'variants': variants if variants else [],
    })
    return self.step_data('download build artifacts.read args.json', args)
