# 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 PB.infra.fuchsia import Fuchsia
from recipe_engine.recipe_api import Property

DEPS = [
    'fuchsia/artifacts',
    'fuchsia/build',
    'fuchsia/buildbucket_util',
    'fuchsia/checkout',
    'fuchsia/experimental',
    'fuchsia/fuchsia',
    'fuchsia/testing',
    'fuchsia/testing_requests',
    'fuchsia/testsharder',
    'recipe_engine/buildbucket',
    'recipe_engine/isolated',
    'recipe_engine/file',
    'recipe_engine/json',
    'recipe_engine/path',
    'recipe_engine/properties',
    'recipe_engine/raw_io',
    'recipe_engine/step',
    'recipe_engine/swarming',
]

PROPERTIES = {
    'build_artifact_hash':
        Property(
            kind=str,
            help='Hash for which build artifact may be downloaded',
            default='abc'),
    'device_type':
        Property(
            kind=str,
            help='Passed through to spec field Fuchsia.Test.device_type',
            default='QEMU'),
    'pave':
        Property(
            kind=bool,
            help='Passed through to spec field Fuchsia.Test.pave',
            default=True),
    'requires_secrets':
        Property(
            kind=bool,
            help='Passed through to spec field Fuchsia.Test.requires_secrets',
            default=True),
    'test_in_shards':
        Property(
            kind=bool,
            help='Passed through to spec field Fuchsia.Test.test_in_shards',
            default=False),
    'collect_timeout_secs':
        Property(
            kind=int,
            help=('Passed through to spec field '
                  'Fuchsia.Test.collect_timeout_secs'),
            default=0),
    'deprecated':
        Property(
            kind=bool,
            help='Whether to use the deprecated code path',
            default=False),
    'per_test_timeout_secs':
        Property(
            kind=int,
            help='Passed through to spec field Fuchsia.Test.per_test_timeout_secs',
            default=0),
    'use_runtests':
        Property(kind=bool, help='Whether to use runtests', default=False),
}


def RunSteps(api, build_artifact_hash, device_type, pave, requires_secrets,
             test_in_shards, collect_timeout_secs, deprecated,
             per_test_timeout_secs, use_runtests):
  build_artifacts = api.build.BuildArtifacts.download(api, build_artifact_hash)

  # Configure context of uploaded artifacts for test task construction.
  api.artifacts.gcs_bucket = 'fuchsia-artifacts'
  api.artifacts.uuid = api.buildbucket_util.id

  test_spec = Fuchsia.Test(
      device_type=device_type,
      pave=pave,
      pool='fuchsia.tests',
      requires_secrets=requires_secrets,
      test_in_shards=test_in_shards,
      collect_timeout_secs=collect_timeout_secs,
      per_test_timeout_secs=per_test_timeout_secs,
      use_runtests=use_runtests,
  )

  if deprecated:
    shard_requests = api.testing_requests.deprecated_shard_requests(
        build_artifacts,
        api.testing_requests.deprecated_test_cmds(test_spec),
        test_spec.device_type,
        test_spec.pool,
        test_spec.timeout_secs,
        test_spec.pave,
        requires_secrets=test_spec.requires_secrets)
    assert len(shard_requests) == 1
  else:
    _ = api.testing_requests.shard_requests(
        build_artifacts, api.buildbucket.build, test_spec.per_test_timeout_secs,
        test_spec.pool, test_spec.swarming_expiration_timeout_secs,
        test_spec.swarming_io_timeout_secs, test_spec.use_runtests,
        test_spec.timeout_secs)


def GenTests(api):
  # For coverage
  api.testing_requests.task_requests_step_data(
      [api.testing_requests.task_request_jsonish(False)], '')
  api.testing_requests.default_tests()

  testsharder_tests = [
      api.testsharder.test(
          name='TEST',
          label='//path/to/test:test(//toolchain)',
          os='linux',
          path='/path/to/test',
          deps=['/path/to/dep'],
      )
  ]

  # Test cases for running Fuchsia tests as a swarming task.
  yield (api.test('deprecated_with_secrets') + api.properties(
      deprecated=True, requires_secrets=True, per_test_timeout_secs=1) +
         api.testing_requests.secrets_step_data())

  yield api.test('deprecated_non_emu') + api.properties(
      deprecated=True, pave=False, device_type='DEVICE TYPE')

  yield api.test('not-emu') + api.testing_requests.shards_step_data(shards=[
      api.testsharder.shard(
          name='NAME',
          tests=testsharder_tests,
          dimensions={'device_type': 'DEVICE TYPE'},
          netboot=True,
          service_account='my-service-account@example.com',
      )
  ]) + api.properties(
      use_runtests=True, per_test_timeout_secs=1)

  yield api.test('legacy_qemu') + api.testing_requests.shards_step_data(shards=[
      api.testsharder.shard(
          name='NAME',
          tests=testsharder_tests,
          dimensions={'device_type': 'QEMU'},
      )
  ]) + api.properties(**{
      'experimental.ssh_into_qemu': False,
      'per_test_timeout_secs': 1
  }) + api.testing_requests.args_test_data(variants=['asan'])

  yield api.test('legacy_aemu') + api.testing_requests.shards_step_data(shards=[
      api.testsharder.shard(
          name='NAME',
          tests=testsharder_tests,
          dimensions={'device_type': 'AEMU'},
      )
  ]) + api.properties(**{'experimental.ssh_into_qemu': False})

  yield api.test('qemu') + api.testing_requests.shards_step_data(shards=[
      api.testsharder.shard(
          name='NAME',
          tests=testsharder_tests,
          dimensions={'device_type': 'QEMU'},
      )
  ]) + api.properties(per_test_timeout_secs=1)

  yield api.test('aemu') + api.testing_requests.shards_step_data(shards=[
      api.testsharder.shard(
          name='NAME',
          tests=testsharder_tests,
          dimensions={'device_type': 'AEMU'},
      )
  ])
