# Copyright 2022 The Dawn Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

################################################################################
# A copy of src/dawn/tests/BUILD.gn
# These targets are referenced by external code. We cannot simply alias the
# targets in src/dawn/tests/BUILD.gn due to an issue with resolving runtime
# dependencies via 'group' aliases. This whole file should be removed once
# the external targets are updated to use the new BUILD.gn file.
# TODO(crbug.com/dawn/1275) - remove this file.
################################################################################

import("../../scripts/dawn_overrides_with_defaults.gni")

import("//testing/test.gni")
import("${dawn_root}/generator/dawn_generator.gni")
import("${dawn_root}/scripts/dawn_features.gni")

group("tests") {
  testonly = true
  public_deps = [
    ":dawn_end2end_tests_temp_group",
    ":dawn_perf_tests_temp_group",
    ":dawn_unittests_temp_group",
  ]
  data_deps = [
    ":dawn_end2end_tests_temp_group",
    ":dawn_perf_tests_temp_group",
    ":dawn_unittests_temp_group",
  ]
}

###############################################################################
# Temporary Dawn test targets and groups - crbug.com/dawn/1275
###############################################################################
# Proxy groups so that we can have Chromium point to the group, while we move
# the target in Dawn's BUILD.gn files.
# However, it is not possible to move a target around with a proxy group without
# breaking swarming tests. We also add temporary executables target that is are
# duplicates of those in //src/tests that will be used temporarily while we
# switch targets.

group("dawn_unittests_temp_group") {
  testonly = true
  public_deps = [ "${dawn_root}/src/dawn/tests:dawn_unittests" ]
  data_deps = [ "${dawn_root}/src/dawn/tests:dawn_unittests" ]
}

group("dawn_end2end_tests_temp_group") {
  testonly = true
  public_deps = [ ":dawn_end2end_tests_temp" ]
  data_deps = [ ":dawn_end2end_tests_temp" ]
}

group("dawn_perf_tests_temp_group") {
  testonly = true
  public_deps = [ ":dawn_perf_tests_temp" ]
  data_deps = [ ":dawn_perf_tests_temp" ]
}

test("dawn_end2end_tests_temp") {
  configs += [ "${dawn_root}/src/dawn/common:internal_config" ]

  deps = [
    "${dawn_root}/src/dawn:cpp",
    "${dawn_root}/src/dawn:proc",
    "${dawn_root}/src/dawn/common",
    "${dawn_root}/src/dawn/native:static",
    "${dawn_root}/src/dawn/tests:end2end_tests_sources",
    "${dawn_root}/src/dawn/tests:gmock_and_gtest",
    "${dawn_root}/src/dawn/tests:white_box_tests_sources",
    "${dawn_root}/src/dawn/utils",
    "${dawn_root}/src/dawn/wire",
  ]

  sources = [
    "${dawn_root}/src/dawn/tests/DawnTest.cpp",
    "${dawn_root}/src/dawn/tests/DawnTest.h",
  ]

  libs = []

  # When building inside Chromium, use their gtest main function because it is
  # needed to run in swarming correctly.
  if (build_with_chromium) {
    deps += [ "${dawn_root}/src/dawn/tests:end2end_tests_main" ]
  } else {
    sources += [ "${dawn_root}/src/dawn/tests/End2EndTestsMain.cpp" ]
  }

  if (dawn_enable_opengl) {
    deps += [ "${dawn_root}/src/dawn/utils:glfw" ]
  }

  if (is_chromeos) {
    libs += [ "gbm" ]
  }
}

test("dawn_perf_tests_temp") {
  configs += [ "${dawn_root}/src/dawn/common:internal_config" ]

  deps = [
    "${dawn_root}/src/dawn:cpp",
    "${dawn_root}/src/dawn:proc",
    "${dawn_root}/src/dawn/common",
    "${dawn_root}/src/dawn/native",
    "${dawn_root}/src/dawn/tests:gmock_and_gtest",
    "${dawn_root}/src/dawn/utils",
    "${dawn_root}/src/dawn/wire",
    "${dawn_root}/src/dawn_platform",
  ]

  sources = [
    "${dawn_root}/src/dawn/tests/DawnTest.cpp",
    "${dawn_root}/src/dawn/tests/DawnTest.h",
    "${dawn_root}/src/dawn/tests/ParamGenerator.h",
    "${dawn_root}/src/dawn/tests/ToggleParser.cpp",
    "${dawn_root}/src/dawn/tests/ToggleParser.h",
    "${dawn_root}/src/dawn/tests/perf_tests/BufferUploadPerf.cpp",
    "${dawn_root}/src/dawn/tests/perf_tests/DawnPerfTest.cpp",
    "${dawn_root}/src/dawn/tests/perf_tests/DawnPerfTest.h",
    "${dawn_root}/src/dawn/tests/perf_tests/DawnPerfTestPlatform.cpp",
    "${dawn_root}/src/dawn/tests/perf_tests/DawnPerfTestPlatform.h",
    "${dawn_root}/src/dawn/tests/perf_tests/DrawCallPerf.cpp",
    "${dawn_root}/src/dawn/tests/perf_tests/ShaderRobustnessPerf.cpp",
    "${dawn_root}/src/dawn/tests/perf_tests/SubresourceTrackingPerf.cpp",
  ]

  libs = []

  # When building inside Chromium, use their gtest main function and the
  # other perf test scaffolding in order to run in swarming correctly.
  if (build_with_chromium) {
    deps += [ "${dawn_root}/src/dawn/tests:perf_tests_main" ]
    data_deps = [ "//testing:run_perf_test" ]
  } else {
    sources += [ "${dawn_root}/src/dawn/tests/PerfTestsMain.cpp" ]
  }

  if (dawn_enable_metal) {
    frameworks = [ "IOSurface.framework" ]
  }

  if (dawn_enable_opengl) {
    deps += [ "${dawn_root}/src/dawn/utils:glfw" ]
  }
}
