# Copyright 2020 The Chromium 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.recipe_api import Property

PYTHON_VERSION_COMPATIBILITY = 'PY3'

DEPS = [
    'flutter/fuchsia_util',
    'flutter/repo_util',
    'recipe_engine/assertions',
    'recipe_engine/cipd',
    'recipe_engine/file',
    'recipe_engine/path',
]


def RunSteps(api):
  checkout_path = api.path['checkout']
  metadata = api.fuchsia_util.run_test(checkout_path)
  api.fuchsia_util.collect_results(metadata)
  device_name = api.fuchsia_util.device_name()
  api.assertions.assertEqual(device_name, 'fuchsia-node')
  env, env_paths = api.fuchsia_util.fuchsia_environment(checkout_path)


def GenTests(api):
  # Empty calls for test functions coverage.
  api.fuchsia_util.run_test_data('name')
  api.fuchsia_util.device_name_data()
  # End of calls for test functions coverage.
  yield (api.test('basic') + api.fuchsia_util.device_name_data() +
         api.repo_util.flutter_environment_data() + api.step_data(
             'Fuchsia Tests.Create CAS Archive.'
             'Download Fuchsia Dependencies.'
             'Read fuchsia cipd version',
             api.file.read_text('FuchsiaSdkCipdVersion')) + api.step_data(
                 'Fuchsia Tests.Create CAS Archive.'
                 'Download Fuchsia Dependencies.'
                 'cipd describe fuchsia/sdk/core/linux-amd64',
                 api.cipd.example_describe(
                     package_name="fuchsia/sdk/core/linux-amd64",
                     version="FuchsiaSdkCipdVersion",
                     test_data_tags=[
                         "git_revision:GIT_REVISION", "jiri:JIRI_VERSION",
                         "version:FUCHSIA_VERSION"
                     ])))
  yield api.test('fuchsia_sdk_version_error') + api.step_data(
      'Fuchsia Tests.Create CAS Archive.'
      'Download Fuchsia Dependencies.'
      'Read fuchsia cipd version',
      api.file.read_text('FuchsiaSdkCipdVersion')) + api.step_data(
          'Fuchsia Tests.Create CAS Archive.'
          'Download Fuchsia Dependencies.'
          'cipd describe fuchsia/sdk/core/linux-amd64',
          api.cipd.example_describe(
              package_name="fuchsia/sdk/core/linux-amd64",
              version="FuchsiaSdkCipdVersion",
              test_data_tags=[]))
