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


DEPS = [
  'build',
  'recipe_engine/path',
  'recipe_engine/platform',
  'recipe_engine/properties',
  'recipe_engine/raw_io',
  'run',
  'vars',
]


def RunSteps(api):
  api.vars.setup()
  checkout_root = api.vars.cache_dir.join('work')
  out_dir = checkout_root.join(
      'skia', 'out', api.vars.builder_name, api.vars.configuration)
  api.build(checkout_root=checkout_root, out_dir=out_dir)
  dst = api.vars.swarming_out_dir.join('out', api.vars.configuration)
  api.build.copy_build_products(out_dir=out_dir, dst=dst)
  api.run.check_failure()


TEST_BUILDERS = [
  'Build-Debian9-Clang-arm-Release-Flutter_Android_Docker',
  'Build-Debian10-GCC-x86-Debug-Docker',
  'Build-Debian10-GCC-x86_64-Debug-Docker',
  'Build-Debian10-GCC-x86_64-Release-NoGPU_Docker',
  'Build-Debian10-GCC-x86_64-Release-Shared_Docker',
  'Build-Debian10-Clang-arm-Release-Android_API26',
  'Build-Debian10-Clang-arm-Release-Android_ASAN',
  'Build-Debian10-Clang-arm-Release-Chromebook_GLES',
  'Build-Debian9-Clang-x86_64-Debug-Chromebook_GLES_Docker',
  'Build-Debian9-Clang-x86_64-Release-Chromebook_GLES_Docker',
  'Build-Debian10-Clang-arm-Release-Flutter_Android',
  'Build-Debian10-Clang-arm64-Release-Android_Wuffs',
  'Build-Debian10-Clang-x86_64-Debug-Chromebook_GLES',
  'Build-Debian10-Clang-x86_64-Debug-Coverage',
  'Build-Debian10-Clang-x86_64-Debug-MSAN',
  'Build-Debian10-Clang-x86_64-Debug-TSAN',
  'Build-Debian10-Clang-x86_64-Debug-SK_CPU_LIMIT_SSE41',
  'Build-Debian10-Clang-x86_64-Debug-SafeStack',
  'Build-Debian10-Clang-x86_64-Debug-SwiftShader_MSAN',
  'Build-Debian10-Clang-x86_64-Debug-SwiftShader_TSAN',
  'Build-Debian10-Clang-x86_64-Debug-Tidy',
  "Build-Debian10-Clang-x86_64-Debug-V1only",
  "Build-Debian10-Clang-x86_64-Debug-V1andV2",
  "Build-Debian10-Clang-x86_64-Debug-V2only",
  'Build-Debian10-Clang-x86_64-Debug-Wuffs',
  'Build-Debian10-Clang-x86_64-Release-ANGLE',
  'Build-Debian10-Clang-x86_64-Release-ASAN',
  'Build-Debian10-Clang-x86_64-Release-CMake',
  'Build-Debian10-Clang-x86_64-Release-Fast',
  'Build-Debian10-Clang-x86_64-Release-NoDEPS',
  'Build-Debian10-Clang-x86_64-Release-Static',
  'Build-Debian10-Clang-x86_64-Release-SwiftShader',
  'Build-Debian10-Clang-x86_64-Release-Vulkan',
  'Build-Debian10-EMCC-asmjs-Debug-PathKit',
  'Build-Debian10-EMCC-asmjs-Release-PathKit',
  'Build-Debian10-EMCC-wasm-Debug-CanvasKit',
  'Build-Debian10-EMCC-wasm-Debug-PathKit',
  'Build-Debian10-EMCC-wasm-Release-CanvasKit_CPU',
  'Build-Debian10-EMCC-wasm-Release-PathKit',
  'Build-Mac-Clang-arm64-Debug-Android_Vulkan',
  'Build-Mac-Clang-arm64-Debug-iOS',
  "Build-Mac-Clang-arm64-Debug-Graphite",
  "Build-Mac-Clang-arm64-Release-Graphite",
  'Build-Mac-Xcode11.4.1-arm64-Debug-iOS',
  'Build-Mac-Clang-x86_64-Debug-ASAN',
  'Build-Mac-Clang-x86_64-Debug-CommandBuffer',
  'Build-Mac-Clang-x86_64-Debug-Metal',
  'Build-Win-Clang-arm64-Release-Android',
  'Build-Win-Clang-x86-Debug-Exceptions',
  'Build-Win-Clang-x86_64-Debug-ANGLE',
  'Build-Win-Clang-x86_64-Release-Direct3D',
  'Build-Win-Clang-x86_64-Release-Shared',
  "Build-Win-Clang-x86_64-Release-Dawn",
  'Build-Win-Clang-x86_64-Release-Vulkan',
  'Housekeeper-PerCommit-CheckGeneratedFiles',
]

# Default properties used for TEST_BUILDERS.
defaultProps = lambda buildername: dict(
  buildername=buildername,
  repository='https://skia.googlesource.com/skia.git',
  revision='abc123',
  path_config='kitchen',
  patch_set=2,
  swarm_out_dir='[SWARM_OUT_DIR]'
)

def GenTests(api):
  for buildername in TEST_BUILDERS:
    test = (
      api.test(buildername) +
      api.properties(**defaultProps(buildername))
    )
    if 'Win' in buildername:
      test += api.platform('win', 64)
    yield test

  yield (
      api.test('unknown-docker-image') +
      api.properties(**defaultProps('Build-Unix-GCC-x86_64-Release-Docker')) +
      api.expect_exception('Exception')
  )
