# Copyright 2015 The ANGLE Project Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//testing/test.gni")
import("../../gni/angle.gni")
import("angle_unittests.gni")
if (angle_use_wayland) {
  import("../../build_overrides/wayland.gni")
}

declare_args() {
  build_angle_gles1_conform_tests = checkout_angle_internal
  build_angle_trace_perf_tests = false
  build_angle_perftests =
      is_win || is_linux || is_chromeos || is_android || is_apple || is_fuchsia
}

declare_args() {
  build_angle_trace_tests = is_clang && (build_angle_trace_perf_tests ||
                                         checkout_angle_restricted_traces)
  if (!build_with_chromium && is_android) {
    assert(
        !is_official_build,
        "is_official_build not supported by ANGLE for Android (https://anglebug.com/42265853)")
  }
}

if (is_android) {
  if (angle_standalone_benchmark) {
    android_assets("angle_standalone_benchmark_assets") {
      disable_compression = true
      sources = [ "$root_gen_dir/trace_list.json" ]
      foreach(trace, angle_standalone_benchmark_traces) {
        sources += [ "//src/tests/restricted_traces/" + trace + "/" + trace +
                     ".angledata.gz" ]
        sources +=
            [ "//src/tests/restricted_traces/" + trace + "/" + trace + ".json" ]

        if (angle_standalone_benchmark_goldens_dir != "") {
          sources += [ angle_standalone_benchmark_goldens_dir + "/" + trace +
                       "_golden.png" ]
        }
      }
    }
  }

  android_library("native_test_java") {
    testonly = true
    sources = [
      "test_utils/runner/android/java/src/com/android/angle/test/AngleNativeTest.java",
      "test_utils/runner/android/java/src/com/android/angle/test/TestStatusReporter.java",
    ]

    deps = [
      "//build/android:build_java",
      "//build/android/gtest_apk:native_test_instrumentation_test_runner_java",
    ]

    if (angle_standalone_benchmark) {
      sources += [ "test_utils/runner/android/java/src/com/android/angle/test/StandaloneBenchmarkActivity.java" ]
      deps += [ ":angle_standalone_benchmark_assets" ]
    } else {
      sources += [ "test_utils/runner/android/java/src/com/android/angle/test/AngleUnitTestActivity.java" ]
    }
  }

  angle_source_set("native_test_support_android") {
    testonly = true
    sources = [ "test_utils/runner/android/AngleNativeTest.cpp" ]
    deps = [ "$angle_root:angle_common" ]
  }
}

angle_test("test_utils_unittest_helper") {
  sources = [
    "../../util/test_utils_unittest_helper.cpp",
    "../../util/test_utils_unittest_helper.h",
    "test_utils/angle_test_instantiate.h",
    "test_utils/runner/TestSuite_unittest.cpp",
  ]
}

test_expectations_sources = [
  "test_expectations/GPUTestConfig.cpp",
  "test_expectations/GPUTestConfig.h",
  "test_expectations/GPUTestExpectationsParser.cpp",
  "test_expectations/GPUTestExpectationsParser.h",
]
if (is_mac) {
  test_expectations_sources_mac = [
    "test_expectations/GPUTestConfig_mac.mm",
    "test_expectations/GPUTestConfig_mac.h",
  ]
}
if (is_ios) {
  test_expectation_sources_ios = [
    "test_expectations/GPUTestConfig_ios.mm",
    "test_expectations/GPUTestConfig_ios.h",
  ]
}

angle_static_library("angle_test_expectations") {
  public_deps = [
    "$angle_root:angle_common",
    "$angle_root:angle_gpu_info_util",
  ]
  sources = test_expectations_sources
  if (is_mac) {
    sources += test_expectations_sources_mac
    frameworks = [ "Cocoa.framework" ]
  }
  if (is_ios) {
    sources += test_expectation_sources_ios
    frameworks = [ "Foundation.framework" ]
  }
  if (angle_ir) {
    configs += [ "${angle_root}:angle_translator_ir" ]
  }
}

config("angle_common_test_utils_config") {
  include_dirs = [ "." ]
  defines = []
  if (angle_enable_swiftshader) {
    defines += [ "ANGLE_ENABLE_SWIFTSHADER" ]
  }
}

template("angle_common_test_utils") {
  assert(defined(invoker.angle_util))

  angle_source_set(target_name) {
    testonly = true
    if (is_ios) {
      # shared libraries are hidden inside ios_framework_bundle, but we include
      # headers from them
      check_includes = false
    }
    public_configs = [
      ":angle_common_test_utils_config",
      "$angle_root:library_name_config",
    ]
    public_deps = [
      "$angle_root:angle_common",
      "$angle_root:angle_gpu_info_util",
      "$angle_root/util:${invoker.angle_util}",
      "//testing/gmock",
      "//testing/gtest",
      "//third_party/googletest:gmock",
      "//third_party/googletest:gtest",
    ]
    sources = [
      "$angle_root/third_party/renderdoc/src/renderdoc_app.h",
      "test_utils/MultiThreadSteps.cpp",
      "test_utils/MultiThreadSteps.h",
      "test_utils/RenderDoc.cpp",
      "test_utils/RenderDoc.h",
      "test_utils/angle_test_configs.cpp",
      "test_utils/angle_test_configs.h",
      "test_utils/angle_test_instantiate.cpp",
      "test_utils/angle_test_instantiate.h",
      "test_utils/angle_test_platform.cpp",
      "test_utils/angle_test_platform.h",
      "test_utils/gl_raii.h",
    ]
    if (is_apple) {
      sources += [
        "test_utils/angle_test_instantiate_apple.h",
        "test_utils/angle_test_instantiate_apple.mm",
      ]
    }
    data_deps = []
    if (angle_enable_vulkan_validation_layers) {
      data_deps += [ "$angle_root/src/common/vulkan:vulkan_validation_layers" ]
    }
    if (angle_enable_vulkan_api_dump_layer) {
      data_deps += [ "$angle_root/src/common/vulkan:lunarg_vulkantools" ]
    }
  }
}

angle_common_test_utils("angle_common_test_utils_shared") {
  angle_util = "angle_util"
}

angle_common_test_utils("angle_common_test_utils_static") {
  angle_util = "angle_util_static"
}

# We use this in the restricted trace tests to load driver info.
angle_test("angle_system_info_test") {
  sources = [ "angle_system_info_tests_main.cpp" ]
  deps = [
    "$angle_root:angle_gpu_info_util",
    "$angle_root:angle_static",
    "$angle_root/util:angle_util_static",
  ]
}

angle_test("angle_unittests") {
  sources = angle_unittests_sources + [ "angle_unittest_main.cpp" ]

  # Compiler tests frequently require either TranslatorGLSL or TranslatorESSL.
  # Build them only if both are enabled.
  if (angle_enable_essl && angle_enable_glsl) {
    sources += angle_unittests_compiler_tests_sources

    if (is_apple) {
      sources += angle_unittests_glsl_mac_sources
    }
  }
  if (angle_enable_metal) {
    sources += angle_unittests_msl_sources
  }

  defines = []

  if (angle_enable_hlsl) {
    sources += angle_unittests_hlsl_sources
    defines += [ "ANGLE_ENABLE_HLSL" ]
  }

  if (angle_enable_gl) {
    sources += angle_unittests_gl_sources
  }

  if (angle_enable_wgpu) {
    sources += angle_unittests_wgsl_sources
  }

  deps = [
    ":angle_test_expectations",
    "$angle_root:angle_static",
    "$angle_root:libfeature_support",
    "$angle_root/util:angle_util_static",
  ]

  if (angle_has_rapidjson) {
    deps += [ "$angle_root:angle_json_serializer" ]
  }

  if (angle_enable_vulkan) {
    sources += [ "compiler_tests/Precise_test.cpp" ]
    deps += [
      "$angle_root/src/common/spirv:angle_spirv_base",
      "$angle_root/src/common/spirv:angle_spirv_headers",
      "$angle_root/src/common/spirv:angle_spirv_parser",
      "${angle_spirv_headers_dir}:spv_headers",
    ]
  }

  if (!is_android && !is_fuchsia && !is_ios) {
    # SystemUtils.RunApp, the only unittest using a helper binary, is not
    # supported on these platforms yet.
    data_deps = [ ":test_utils_unittest_helper" ]
  }

  if (is_android) {
    data += [ "$angle_root/src/tests/angle_android_test_runner.py" ]
  }

  if (angle_has_rapidjson) {
    sources += [ "../common/serializer/JsonSerializer_unittest.cpp" ]
  }

  if (angle_ir) {
    configs += [ "${angle_root}:angle_translator_ir" ]
  }
}

if (is_ios) {
  bundle_data("angle_end2end_tests_bundle_data") {
    testonly = true
    sources = [ "angle_end2end_tests_expectations.txt" ]
    outputs = [ "{{bundle_resources_dir}}/" +
                "{{source_root_relative_dir}}/{{source_file_part}}" ]
  }
}

if (is_win || is_linux || is_chromeos || is_android || is_fuchsia || is_apple) {
  import("angle_end2end_tests.gni")

  angle_test("angle_end2end_tests") {
    include_dirs = [ "." ]

    sources = angle_end2end_tests_sources + [ "angle_end2end_tests_main.cpp" ]
    if (angle_enable_cl) {
      sources += [ "capture_tests/CapturedTestCL.cpp" ]
      configs += [ "$angle_root:opencl_no_pragma_messages" ]
    }
    libs = []
    defines = []
    if (angle_use_partition_alloc) {
      defines += [ "ANGLE_USE_PARTITION_ALLOC" ]
    }
    configs += [ "${angle_root}:libANGLE_config" ]

    if (is_ios) {
      sources += angle_end2end_tests_ios_sources
      frameworks = [ "IOSurface.framework" ]
    }
    if (is_mac) {
      sources += angle_end2end_tests_mac_sources
      frameworks = [
        "CoreFoundation.framework",
        "IOSurface.framework",
      ]
      ldflags = [
        "-weak_framework",
        "Metal",
      ]
      cflags_objcc = [
        "-Wno-nullability-completeness",
        "-Wno-unguarded-availability",
      ]
    }
    if (is_win) {
      sources += angle_end2end_tests_win_sources
    }
    if (angle_use_x11) {
      sources += [ "egl_tests/EGLX11VisualTest.cpp" ]
    }
    if (angle_use_wayland) {
      sources += [ "egl_tests/EGLWaylandTest.cpp" ]
      public_deps += [ "$wayland_protocols_gn_dir:xdg_shell_protocol" ]
    }

    deps = [
      ":angle_common_test_utils_shared",
      "$angle_root:angle_gl_enum_utils",
      "$angle_root:angle_image_util",
      "$angle_root:translator",
    ]

    if (angle_enable_cl) {
      deps += [ "$angle_root/src/libOpenCL:OpenCL_ANGLE" ]
    }

    if (is_ios) {
      deps += [ ":angle_end2end_tests_bundle_data" ]
    } else {
      data = [ "angle_end2end_tests_expectations.txt" ]
    }

    if (angle_has_rapidjson) {
      deps += [ "$angle_root:angle_json_serializer" ]
    }

    if (angle_enable_vulkan) {
      sources += [
        "gl_tests/VulkanExternalImageTest.cpp",
        "gl_tests/VulkanImageTest.cpp",
        "test_utils/VulkanHelper.cpp",
        "test_utils/VulkanHelper.h",
      ]
      deps += [ "$angle_root/src/common/vulkan" ]
    }

    if (angle_test_enable_system_egl) {
      # Don't bundle the ANGLE libraries.
    } else {
      data_deps = [ "$angle_root:angle" ]
    }

    if (is_android) {
      android_test_runner_script =
          "$angle_root/src/tests/angle_android_test_runner.py"
      data += [ "$android_test_runner_script" ]
    }

    if (angle_build_mesa) {
      data_deps += [ "$angle_root/third_party/mesa" ]
    }

    if (is_fuchsia) {
      # TODO(crbug.com/1185811): Investigate removing the requirement for
      # job_policy_ambient_mark_vmo_exec.
      test_runner_shard = "//build/config/fuchsia/test/elf_test_ambient_exec_runner.shard.test-cml"
      additional_manifest_fragments = [
        "//build/config/fuchsia/test/present_view.shard.test-cml",
        "//third_party/fuchsia-sdk/sdk/pkg/vulkan/client.shard.cml",
      ]
    }

    if (is_ios) {
      xcode_extra_attributes = {
        SUPPORTS_MACCATALYST = "YES"
      }

      # Need to bundle the libraries inside the .app.
      deps += [ "$angle_root:angle" ]
    }

    if (angle_enable_wgpu) {
      deps += [
        "${angle_dawn_dir}/include/dawn:headers",
        "${angle_dawn_dir}/src/dawn:proc",
        "${angle_dawn_dir}/src/dawn/native",
      ]
      defines += [ "ANGLE_ENABLE_WGPU" ]
    }
  }
}

if (angle_enable_cl_testing) {
  copy("opencl_icd") {
    sources = [ "$angle_root/src/tests/cl_support/ancle.icd" ]
    outputs = [ "$root_out_dir/$angle_data_dir/{{source_file_part}}" ]
  }

  template("angle_oclcts_test") {
    angle_test("angle_oclcts_${target_name}") {
      testonly = true
      sources = [ "$angle_root/src/tests/cl_support/angle_oclcts_gtest.cpp" ]

      deps = [
        "$angle_root:angle_common",
        "$angle_root:cl_includes",
        "$angle_root/third_party/OpenCL-CTS/gn:test_common",
        "$angle_root/third_party/OpenCL-CTS/gn/${invoker.group}:${invoker.suite}",
        "$angle_root/third_party/OpenCL-ICD-Loader:opencl_icd_loader",
        "//third_party/googletest:gtest",
      ]
      defines = [
        "CL_TARGET_OPENCL_VERSION=300",
        "ANGLE_CL_SUITE_NAME=\"${invoker.suite}\"",
      ]
      if (!is_android) {
        defines += [ "ANGLE_OPENCL_ICD_PATH=\"$angle_data_dir\"" ]
      }
      cflags = [
        "-Wno-deprecated-declarations",
        "-Wno-#warnings",
        "-Wno-format",
        "-Wno-vla-cxx-extension",
        "-Wno-deprecated-volatile",
        "-Wno-c++11-narrowing",
      ]
      include_dirs = [
        "$angle_root/third_party/OpenCL-CTS/src/test_common",
        "$angle_root/third_party/OpenCL-CTS/src/test_common/autotest",
        "$angle_root/third_party/OpenCL-CTS/src/test_common/harness",
        "$angle_root/third_party/OpenCL-CTS/src/test_common/miniz",
        "$angle_root/third_party/OpenCL-CTS/src/test_conformance/",
        "$angle_root/third_party/OpenCL-CTS/",
        "$angle_root/src/tests/",
      ]
      configs += [ "${angle_root}:libANGLE_config" ]

      deps += [
        ":angle_common_test_utils_static",
        "$angle_root:angle_static",
      ]
      data = [
        "$angle_root/src/tests/cl_support/openclcts_expectations.txt",
        "$angle_root/src/tests/cl_support/openclcts_mustpass.txt",
      ]

      data_deps += [
        ":opencl_icd",
        "$angle_root:libEGL",
        "$angle_root:libGLESv2",
        "$angle_root/src/libOpenCL:angle_cl",
      ]
    }
  }

  oclcts_targets = [
    "SVM svm",
    "allocations allocations",
    "api api",
    "atomics atomics",
    "basic basic",
    "buffers buffers",
    "c11_atomics c11_atomics",
    "commonfns commonfns",
    "compiler compiler",
    "computeinfo computeinfo",
    "contractions contractions",
    "conversions conversions",
    "device_execution device_execution",
    "device_partition device_partition",
    "device_timer device_timer",
    "events events",
    "extensions/cl_ext_cxx_for_opencl cl_ext_cxx_for_opencl",
    "extensions/cl_khr_command_buffer cl_khr_command_buffer",
    "extensions/cl_khr_semaphore cl_khr_semaphore",
    "generic_address_space generic_address_space",
    "geometrics geometrics",
    "half half",
    "images/clCopyImage cl_copy_images",
    "images/clFillImage cl_fill_images",
    "images/clGetInfo cl_get_info",
    "images/clReadWriteImage cl_read_write_images",
    "images/kernel_image_methods kernel_image_methods",
    "images/kernel_read_write image_streams",
    "images/samplerlessReads samplerless_reads",
    "integer_ops integer_ops",
    "math_brute_force bruteforce",
    "mem_host_flags mem_host_flags",
    "multiple_device_context multiples",
    "non_uniform_work_group non_uniform_work_group",
    "pipes pipes",
    "printf printf",
    "profiling profiling",
    "relationals relationals",
    "select select",
    "spir spir",
    "spirv_new spirv_new",

    # CTS build error, fixed in https://github.com/KhronosGroup/OpenCL-CTS/pull/1906
    #"subgroups subgroups",
    "thread_dimensions thread_dimensions",
    "vectors vectors",
    "workgroups workgroups",
  ]

  foreach(_group_and_suite_joined, oclcts_targets) {
    _group_and_suite = []
    _group_and_suite = string_split(_group_and_suite_joined)
    _group = _group_and_suite[0]
    _suite = _group_and_suite[1]

    angle_oclcts_test(_suite) {
      group = _group
      suite = _suite
    }
  }

  group("angle_openclcts") {
    testonly = true
    deps = []
    foreach(_group_and_suite_joined, oclcts_targets) {
      _group_and_suite = []
      _group_and_suite = string_split(_group_and_suite_joined)
      _suite = _group_and_suite[1]

      deps += [ ":angle_oclcts_${_suite}" ]
    }
  }
}

if (is_win || is_linux || is_chromeos || is_android || is_fuchsia || is_apple) {
  import("angle_white_box_tests.gni")

  angle_test("angle_white_box_tests") {
    include_dirs = [ "." ]
    sources = angle_white_box_tests_sources + [ "angle_generic_tests_main.cpp" ]

    if (is_win && angle_enable_d3d11) {
      sources += angle_white_box_tests_win_sources
    }

    configs += [ "${angle_root}:libANGLE_config" ]

    deps = [
      ":angle_common_test_utils_static",
      "$angle_root:angle_static",
    ]
    if (angle_use_wayland) {
      deps += [
        "$wayland_gn_dir:wayland_client",
        "$wayland_gn_dir:wayland_egl",
        "$wayland_protocols_gn_dir:xdg_shell_protocol",
      ]
    }

    deps += [ "${angle_root}:angle_gl_enum_utils" ]

    if (angle_enable_vulkan) {
      sources += angle_white_box_tests_vulkan_sources
      deps += [ "$angle_root/src/common/vulkan:angle_vulkan_entry_points" ]
    }

    if (angle_ir) {
      configs += [ "${angle_root}:angle_translator_ir" ]
    }

    if (angle_enable_metal) {
      sources += angle_white_box_tests_metal_sources
    }
  }
}

config("angle_maybe_has_histograms") {
  if (angle_has_histograms) {
    defines = [ "ANGLE_HAS_HISTOGRAMS=1" ]
    include_dirs = [ "$root_gen_dir" ]
  } else {
    defines = [ "ANGLE_HAS_HISTOGRAMS=0" ]
  }
}

config("angle_standalone_benchmark_config") {
  if (angle_standalone_benchmark) {
    defines = [ "ANGLE_STANDALONE_BENCHMARK" ]
  }
}

template("angle_perftests_common") {
  assert(defined(invoker.test_utils))

  angle_source_set(target_name) {
    testonly = true
    if (is_ios) {
      # shared libraries are hidden inside ios_framework_bundle, but we include
      # headers from them
      check_includes = false
    }
    sources = [
      "../libANGLE/trace.h",
      "perf_tests/ANGLEComputeTestCL.cpp",
      "perf_tests/ANGLEComputeTestCL.h",
      "perf_tests/ANGLEPerfTest.cpp",
      "perf_tests/ANGLEPerfTest.h",
      "perf_tests/ANGLEPerfTestArgs.cpp",
      "perf_tests/ANGLEPerfTestArgs.h",
      "perf_tests/DrawCallPerfParams.cpp",
      "perf_tests/DrawCallPerfParams.h",
      "perf_tests/third_party/perf/perf_result_reporter.cc",
      "perf_tests/third_party/perf/perf_result_reporter.h",
      "perf_tests/third_party/perf/perf_test.cc",
      "perf_tests/third_party/perf/perf_test.h",
      "test_utils/runner/HistogramWriter.h",
      "test_utils/runner/TestSuite.h",
    ]
    public_deps = [
      "$angle_root:angle_gl_enum_utils",
      "$angle_root/src/tests:angle_test_expectations",
      "$angle_root/third_party/rapidjson",
      "${invoker.test_utils}",
    ]
    public_configs += [
      ":angle_maybe_has_histograms",
      "$angle_root:libANGLE_config",
      ":angle_standalone_benchmark_config",
    ]
  }
}

angle_perftests_common("angle_perftests_shared") {
  test_utils = ":angle_common_test_utils_shared"
}

angle_perftests_common("angle_perftests_static") {
  test_utils = ":angle_common_test_utils_static"
}

if (is_win || is_linux || is_chromeos || is_android || is_apple) {
  import("angle_perftests.gni")

  # This test suite is for perf tests that use ANGLE's internals in some direct
  # way.
  angle_test("angle_white_box_perftests") {
    include_dirs = [ "." ]
    sources =
        angle_white_box_perf_tests_sources + [ "angle_perftests_main.cpp" ]

    if (angle_enable_d3d11) {
      sources += [ "perf_tests/IndexDataManagerTest.cpp" ]
    }

    deps = [
      ":angle_perftests_static",
      "$angle_root:angle_static",
    ]

    if (angle_use_wayland) {
      deps += [
        "$wayland_gn_dir:wayland_client",
        "$wayland_gn_dir:wayland_egl",
        "$wayland_protocols_gn_dir:xdg_shell_protocol",
      ]
    }

    data = [
      "$angle_root/scripts/process_angle_perf_results.py",
      "$angle_root/src/tests/py_utils/android_helper.py",
      "$angle_root/src/tests/py_utils/angle_metrics.py",
      "$angle_root/src/tests/py_utils/angle_path_util.py",
      "$angle_root/src/tests/run_perf_tests.py",
    ]
    data_deps = [ "//testing:run_perf_test" ]

    if (angle_enable_vulkan) {
      sources += angle_white_box_perf_tests_vulkan_sources
      deps += [
        "$angle_glslang_dir:glslang_lib_sources",
        "$angle_root/src/common/vulkan:angle_vulkan_entry_points",
      ]
    }

    # These tests depend on vulkan_command_buffer_utils, which is
    # not yet compatible with mac and vulkan display/headless backend.
    if (angle_enable_vulkan && !angle_use_vulkan_display && !is_apple) {
      sources += angle_white_box_perf_tests_vulkan_command_buffer_sources
    }
  }
}

config("angle_enable_renderdoc") {
  if (angle_enable_renderdoc) {
    defines = [ "ANGLE_TEST_ENABLE_RENDERDOC_CAPTURE" ]
  }
}

if (build_angle_perftests) {
  import("angle_perftests.gni")

  # This test suite is designed to run against a generic GL implementation.
  angle_test("angle_perftests") {
    include_dirs = [ "." ]
    sources = angle_perf_tests_sources + [ "angle_perftests_main.cpp" ]

    deps = [
      ":angle_perftests_shared",
      "$angle_spirv_tools_dir:spvtools_val",
    ]

    data = [
      "$angle_root/scripts/process_angle_perf_results.py",
      "$angle_root/src/tests/py_utils/android_helper.py",
      "$angle_root/src/tests/py_utils/angle_metrics.py",
      "$angle_root/src/tests/py_utils/angle_path_util.py",
      "$angle_root/src/tests/run_perf_tests.py",
    ]

    data_deps = [
      "${angle_root}:angle",
      "//testing:run_perf_test",
    ]

    if (angle_build_mesa) {
      data_deps += [ "$angle_root/third_party/mesa" ]
    }

    if (is_win || is_linux || is_chromeos) {
      data_deps += [ "${angle_root}/third_party/glmark2:glmark2_angle" ]
    }
    if (is_win && target_cpu != "arm64") {
      data_deps += [ "${angle_root}/third_party/glmark2:glmark2_wgl" ]
    }
    if ((is_linux || is_chromeos) && angle_use_x11) {
      data_deps += [ "${angle_root}/third_party/glmark2:glmark2_glx" ]
    }
  }
}

if (is_ios) {
  bundle_data("angle_trace_tests_bundle_data") {
    testonly = true
    sources = [ "perf_tests/angle_trace_tests_expectations.txt" ]
    outputs = [ "{{bundle_resources_dir}}/" +
                "{{source_root_relative_dir}}/{{source_file_part}}" ]
  }
}

if (build_angle_trace_tests) {
  angle_test("angle_trace_tests") {
    # http://anglebug.com/42264541: Traces with long shaders are hitting string literal
    # limit in MSVC, so only compile them when using clang
    assert(is_clang, "angle trace tests require clang")

    if (is_ios) {
      # shared libraries are hidden inside ios_framework_bundle, but we include
      # headers from them
      check_includes = false
    }

    sources = [
      "angle_trace_tests_main.cpp",
      "perf_tests/TracePerfTest.cpp",
      "perf_tests/TracePerfTest.h",
      "perf_tests/TracePerfTestCL.cpp",
    ]

    deps = [
      ":angle_perftests_shared",
      ":wrap_restricted_trace_gold_tests",
      ":wrap_restricted_trace_perf",
      "$angle_root:angle_compression",
      "$angle_root/util:angle_frame_capture_test_utils",
      "$angle_root/util:angle_png_utils",
      "restricted_traces:gen_trace_list_json",
    ]

    # If this flag is set, we want to build the trace libraries independent of
    # the APK, i.e. not packaged. We're doing this for size reasons - the APK is
    # too large if you include all the traces.
    if (restricted_traces_outside_of_apk) {
      defines = [ "ANGLE_TRACE_EXTERNAL_BINARIES" ]
      deps += [ "$angle_root/util:angle_trace_loader" ]
    } else {
      deps += [
        "$angle_root/util:angle_trace_interpreter",
        "restricted_traces:angle_restricted_traces",
      ]
    }

    data = [ "$angle_root/src/tests/py_utils/android_helper.py" ]

    if (is_ios) {
      deps += [ ":angle_trace_tests_bundle_data" ]
    } else {
      data += [
        "$angle_root/src/tests/perf_tests/angle_trace_tests_expectations.txt",
      ]
    }

    if (is_android) {
      android_test_runner_script =
          "$angle_root/src/tests/angle_android_test_runner.py"
      data += [ "$android_test_runner_script" ]
    }

    data_deps = [ "${angle_root}:angle" ]

    if (is_clang) {
      # Allows us to edit traces and remove chunks of code without compile
      # warnings.
      cflags_cc = [ "-Wno-unused-const-variable" ]
    }
  }

  group("angle_trace_perf_tests") {
    testonly = true

    data = [
      "$angle_root/scripts/process_angle_perf_results.py",
      "$angle_root/src/tests/py_utils/angle_metrics.py",
      "$angle_root/src/tests/py_utils/angle_path_util.py",
      "$angle_root/src/tests/restricted_traces/restricted_trace_perf.py",
      "$angle_root/src/tests/run_perf_tests.py",
    ]

    data_deps = [
      ":angle_trace_tests",
      "//testing:run_perf_test",
    ]

    if (restricted_traces_outside_of_apk) {
      deps = [ "restricted_traces:angle_restricted_traces__unpacked_libs" ]
    }
  }

  group("angle_trace_interpreter_tests") {
    testonly = true
    data = [
      "restricted_traces/gen_restricted_traces.py",
      "restricted_traces/retrace_restricted_traces.py",
    ]
    data_deps = [ ":angle_trace_perf_tests" ]
  }

  group("angle_capture_tests") {
    testonly = true
    data = [
      "capture_tests/capture_tests.py",
      "capture_tests/expected",
    ]
    if (is_android) {
      data += [ "$angle_root/src/tests/angle_android_test_runner.py" ]
    }
    data_deps = [ ":angle_end2end_tests" ]
  }

  action("wrap_restricted_trace_perf") {
    script = "//scripts/angle_test_wrapper.py"

    outputs = [ "$root_build_dir/restricted_trace_perf" ]
    args = [
      rebase_path(outputs[0], root_build_dir),
      "src/tests/restricted_traces/restricted_trace_perf.py",
    ]
  }

  action("wrap_restricted_trace_gold_tests") {
    script = "//scripts/angle_test_wrapper.py"

    outputs = [ "$root_build_dir/restricted_trace_gold_tests" ]
    args = [
      rebase_path(outputs[0], root_build_dir),
      "src/tests/restricted_traces/restricted_trace_gold_tests.py",
    ]
  }
}

###-----------------------------------------------------
### ES 1 conformance tests
###-----------------------------------------------------

if (build_angle_gles1_conform_tests) {
  gles1_conform_root = "$angle_root/third_party/gles1_conform"

  config("angle_gles1_conform_support") {
    include_dirs = [
      "$gles1_conform_root",
      "$gles1_conform_root/conform/conform",
      "$gles1_conform_root/conform/conformshell",
      "$gles1_conform_root/ctk",
      "$gles1_conform_root/fixed",
      "$gles1_conform_root/platform",
    ]

    defines = [
      "COMMON",
      "CONFORM_ALTERNATE_MAIN",

      # NULLWS defines is only used in covegl/native.h, remove here. if needed
      # please add it in angle_test("angle_gles1_covegl_no_gtest") defines.
      # #"NULLWS",
    ]

    # This is used by the tests to typedef uint32_t. For some reason only needed
    # on mac.
    if (is_apple) {
      defines += [ "__linux" ]
    }

    cflags = []
    if (is_clang) {
      # Remove when crbug.com/428099 is resolved.
      cflags += [
        "-Wno-implicit-function-declaration",
        "-Wno-implicit-int-float-conversion",
        "-Wno-int-to-pointer-cast",
        "-Wno-self-assign",
        "-Wno-sign-compare",
        "-Wno-unreachable-code-break",
        "-Wno-unused-const-variable",
        "-Wno-unused-result",
        "-Wno-unused-variable",

        # Upstream tests do null pointer arithmetic, so disable those warnings.
        "-Wno-null-pointer-arithmetic",
      ]
    } else {
      cflags += [ "/wd4101" ]  # unreferenced local variable
    }
  }

  # This source set is a bit special so we don't use angle_source_set.
  angle_gles1_conform_common_source = [
    "$gles1_conform_root/ctk/ctk.h",
    "$gles1_conform_root/ctk/ctkn.c",
    "$gles1_conform_root/ctk/glext.c",
    "$gles1_conform_root/fixed/fixed.c",
    "$gles1_conform_root/fixed/float64.c",
    "$gles1_conform_root/fixed/int32.c",
    "$gles1_conform_root/fixed/int64.c",
    "$gles1_conform_root/platform/gl_fixed_point.h",
    "$gles1_conform_root/platform/gl_single_precision.h",
    "$gles1_conform_root/platform/math_fixed.h",
    "$gles1_conform_root/platform/math_float.h",
    "$gles1_conform_root/platform/platform.h",
    "$gles1_conform_root/platform/platform_gl.h",
    "$gles1_conform_root/platform/platform_random.h",
    "$gles1_conform_root/platform/platform_stdlib.h",
    "$gles1_conform_root/platform/platform_types.h",
    "$gles1_conform_root/platform/printf_fixed.h",
    "$gles1_conform_root/platform/printf_float.h",
    "$gles1_conform_root/platform/random.c",
    "$gles1_conform_root/platform/stdlib_ansi.h",
  ]

  source_set("angle_gles1_conformance_no_gtest") {
    configs += [
      ":angle_gles1_conform_support",
      "$angle_root:internal_config",
    ]

    public_configs = [
      "$angle_root/util:angle_util_config",
      "$angle_root:gl_prototypes",
    ]

    if (is_clang) {
      cflags_c = [
        "-Wno-implicit-fallthrough",
        "-Wno-shadow",
      ]
    }

    testonly = true

    public_deps = [
      "$angle_root:angle_static",
      "$angle_root/util:angle_util_static",
    ]

    sources = [
      "$gles1_conform_root/conform/conform/apfunc.c",
      "$gles1_conform_root/conform/conform/appl.c",
      "$gles1_conform_root/conform/conform/bclear.c",
      "$gles1_conform_root/conform/conform/bcolor.c",
      "$gles1_conform_root/conform/conform/bcorner.c",
      "$gles1_conform_root/conform/conform/blend.c",
      "$gles1_conform_root/conform/conform/bufobj.c",
      "$gles1_conform_root/conform/conform/clip.c",
      "$gles1_conform_root/conform/conform/colramp.c",
      "$gles1_conform_root/conform/conform/copytex.c",
      "$gles1_conform_root/conform/conform/dither.c",
      "$gles1_conform_root/conform/conform/divzero.c",
      "$gles1_conform_root/conform/conform/drawtex.c",
      "$gles1_conform_root/conform/conform/fogexp.c",
      "$gles1_conform_root/conform/conform/foglin.c",
      "$gles1_conform_root/conform/conform/gets.c",
      "$gles1_conform_root/conform/conform/l_ac.c",
      "$gles1_conform_root/conform/conform/l_al.c",
      "$gles1_conform_root/conform/conform/l_am.c",
      "$gles1_conform_root/conform/conform/l_ap.c",
      "$gles1_conform_root/conform/conform/l_as.c",
      "$gles1_conform_root/conform/conform/l_dl.c",
      "$gles1_conform_root/conform/conform/l_dm.c",
      "$gles1_conform_root/conform/conform/l_dmn.c",
      "$gles1_conform_root/conform/conform/l_dmp.c",
      "$gles1_conform_root/conform/conform/l_em.c",
      "$gles1_conform_root/conform/conform/l_se.c",
      "$gles1_conform_root/conform/conform/l_sed.c",
      "$gles1_conform_root/conform/conform/l_sen.c",
      "$gles1_conform_root/conform/conform/l_sep.c",
      "$gles1_conform_root/conform/conform/l_sl.c",
      "$gles1_conform_root/conform/conform/l_sm.c",
      "$gles1_conform_root/conform/conform/l_sn.c",
      "$gles1_conform_root/conform/conform/l_sp.c",
      "$gles1_conform_root/conform/conform/lineaa.c",
      "$gles1_conform_root/conform/conform/linehv.c",
      "$gles1_conform_root/conform/conform/linerast.c",
      "$gles1_conform_root/conform/conform/logicop.c",
      "$gles1_conform_root/conform/conform/mask.c",
      "$gles1_conform_root/conform/conform/mget.c",
      "$gles1_conform_root/conform/conform/mipgen.c",
      "$gles1_conform_root/conform/conform/miplevels.c",
      "$gles1_conform_root/conform/conform/miplin.c",
      "$gles1_conform_root/conform/conform/mipsel.c",
      "$gles1_conform_root/conform/conform/mpalette.c",
      "$gles1_conform_root/conform/conform/mquery.c",
      "$gles1_conform_root/conform/conform/mstack.c",
      "$gles1_conform_root/conform/conform/multitex.c",
      "$gles1_conform_root/conform/conform/mustpass.c",
      "$gles1_conform_root/conform/conform/packpix.c",
      "$gles1_conform_root/conform/conform/pntaa.c",
      "$gles1_conform_root/conform/conform/pntrast.c",
      "$gles1_conform_root/conform/conform/pntsprt.c",
      "$gles1_conform_root/conform/conform/pntszary.c",
      "$gles1_conform_root/conform/conform/polycull.c",
      "$gles1_conform_root/conform/conform/readfmt.c",
      "$gles1_conform_root/conform/conform/rescalen.c",
      "$gles1_conform_root/conform/conform/scissor.c",
      "$gles1_conform_root/conform/conform/spclear.c",
      "$gles1_conform_root/conform/conform/spcorner.c",
      "$gles1_conform_root/conform/conform/spfunc.c",
      "$gles1_conform_root/conform/conform/spop.c",
      "$gles1_conform_root/conform/conform/tests.c",
      "$gles1_conform_root/conform/conform/texcombine.c",
      "$gles1_conform_root/conform/conform/texdecal.c",
      "$gles1_conform_root/conform/conform/texedge.c",
      "$gles1_conform_root/conform/conform/texpalet.c",
      "$gles1_conform_root/conform/conform/trirast.c",
      "$gles1_conform_root/conform/conform/tritile.c",
      "$gles1_conform_root/conform/conform/userclip.c",
      "$gles1_conform_root/conform/conform/vorder.c",
      "$gles1_conform_root/conform/conform/vpclamp.c",
      "$gles1_conform_root/conform/conform/xform.c",
      "$gles1_conform_root/conform/conform/xformmix.c",
      "$gles1_conform_root/conform/conform/xformn.c",
      "$gles1_conform_root/conform/conform/xformvp.c",
      "$gles1_conform_root/conform/conform/xformw.c",
      "$gles1_conform_root/conform/conform/zbclear.c",
      "$gles1_conform_root/conform/conform/zbfunc.c",
      "$gles1_conform_root/conform/conformshell/conform.h",
      "$gles1_conform_root/conform/conformshell/driver.c",
      "$gles1_conform_root/conform/conformshell/driver.h",
      "$gles1_conform_root/conform/conformshell/path.c",
      "$gles1_conform_root/conform/conformshell/path.h",
      "$gles1_conform_root/conform/conformshell/pathdata.c",
      "$gles1_conform_root/conform/conformshell/pathdata.h",
      "$gles1_conform_root/conform/conformshell/paths.c",
      "$gles1_conform_root/conform/conformshell/shell.c",
      "$gles1_conform_root/conform/conformshell/util.c",
      "$gles1_conform_root/conform/conformshell/util.h",
      "$gles1_conform_root/conform/conformshell/utilg.c",
      "$gles1_conform_root/conform/conformshell/utilg.h",
      "$gles1_conform_root/conform/conformshell/utilm.c",
      "$gles1_conform_root/conform/conformshell/utilm.h",
      "$gles1_conform_root/conform/conformshell/utilp.c",
      "$gles1_conform_root/conform/conformshell/utilp.h",
      "$gles1_conform_root/conform/conformshell/utilru.c",
      "$gles1_conform_root/conform/conformshell/utilru.h",
      "$gles1_conform_root/conform/conformshell/utils.c",
      "$gles1_conform_root/conform/conformshell/utils.h",
      "$gles1_conform_root/conform/conformshell/utilt.c",
      "$gles1_conform_root/conform/conformshell/utilt.h",
    ]

    sources += angle_gles1_conform_common_source
  }

  angle_test("angle_gles1_conformance_tests") {
    deps = [
      ":angle_common_test_utils_static",
      ":angle_gles1_conformance_no_gtest",
    ]

    include_dirs = [ "." ]

    sources = [
      "angle_generic_tests_main.cpp",
      "gles1_conformance_tests/ConformanceTests.cpp",
      "test_utils/ANGLETest.cpp",
      "test_utils/ANGLETest.h",
    ]

    configs += [
      ":angle_gles1_conform_support",
      "${angle_root}:libANGLE_config",
      "${angle_root}:angle_backend_config",
    ]
  }

  if (!is_win && !is_apple) {
    source_set("angle_gles1_covgl_no_gtest") {
      configs += [
        ":angle_gles1_conform_support",
        "$angle_root:internal_config",
      ]

      public_configs = [
        "$angle_root/util:angle_util_config",
        "$angle_root:gl_prototypes",
      ]

      testonly = true

      public_deps = [
        "$angle_root:angle_static",
        "$angle_root/util:angle_util_static",
      ]

      sources = [
        "$gles1_conform_root/conform/covgl/a.c",
        "$gles1_conform_root/conform/covgl/b.c",
        "$gles1_conform_root/conform/covgl/c.c",
        "$gles1_conform_root/conform/covgl/d.c",
        "$gles1_conform_root/conform/covgl/data.c",
        "$gles1_conform_root/conform/covgl/e.c",
        "$gles1_conform_root/conform/covgl/enum.c",
        "$gles1_conform_root/conform/covgl/f.c",
        "$gles1_conform_root/conform/covgl/g.c",
        "$gles1_conform_root/conform/covgl/h.c",
        "$gles1_conform_root/conform/covgl/i.c",
        "$gles1_conform_root/conform/covgl/l.c",
        "$gles1_conform_root/conform/covgl/m.c",
        "$gles1_conform_root/conform/covgl/n.c",
        "$gles1_conform_root/conform/covgl/o.c",
        "$gles1_conform_root/conform/covgl/p.c",
        "$gles1_conform_root/conform/covgl/q.c",
        "$gles1_conform_root/conform/covgl/r.c",
        "$gles1_conform_root/conform/covgl/s.c",
        "$gles1_conform_root/conform/covgl/shell.h",
        "$gles1_conform_root/conform/covgl/t.c",
        "$gles1_conform_root/conform/covgl/v.c",
        "$gles1_conform_root/conform/covgl/w.c",
      ]

      sources += angle_gles1_conform_common_source

      if (is_clang) {
        cflags_c = [ "-Wno-shadow" ]
      }
      defines = [ "ProbeEnum=ProbeEnumANGLE" ]
    }

    angle_test("angle_gles1_covgl_tests") {
      deps = [
        ":angle_common_test_utils_static",
        ":angle_gles1_covgl_no_gtest",
      ]

      include_dirs = [ "." ]

      sources = [
        "$gles1_conform_root/conform/covgl/shell.c",
        "angle_generic_tests_main.cpp",
        "gles1_conformance_tests/CovglTests.cpp",
        "test_utils/ANGLETest.cpp",
        "test_utils/ANGLETest.h",
      ]

      if (is_clang) {
        cflags_c = [ "-Wno-shadow" ]
      }

      configs += [
        ":angle_gles1_conform_support",
        "${angle_root}:libANGLE_config",
        "${angle_root}:angle_backend_config",
      ]
    }
  }

  source_set("angle_gles1_primtest_no_gtest") {
    configs += [
      ":angle_gles1_conform_support",
      "$angle_root:internal_config",
    ]

    public_configs = [
      "$angle_root/util:angle_util_config",
      "$angle_root:gl_prototypes",
    ]

    testonly = true

    public_deps = [
      "$angle_root:angle_static",
      "$angle_root/util:angle_util_static",
    ]

    sources = [
      "$gles1_conform_root/conform/primtest/alias.c",
      "$gles1_conform_root/conform/primtest/alpha.c",
      "$gles1_conform_root/conform/primtest/blend.c",
      "$gles1_conform_root/conform/primtest/depth.c",
      "$gles1_conform_root/conform/primtest/dither.c",
      "$gles1_conform_root/conform/primtest/driver.c",
      "$gles1_conform_root/conform/primtest/driver.h",
      "$gles1_conform_root/conform/primtest/fog.c",
      "$gles1_conform_root/conform/primtest/hint.c",
      "$gles1_conform_root/conform/primtest/light.c",
      "$gles1_conform_root/conform/primtest/logic.c",
      "$gles1_conform_root/conform/primtest/prim.c",
      "$gles1_conform_root/conform/primtest/scissor.c",
      "$gles1_conform_root/conform/primtest/shade.c",
      "$gles1_conform_root/conform/primtest/shell.c",
      "$gles1_conform_root/conform/primtest/shell.h",
      "$gles1_conform_root/conform/primtest/stencil.c",
      "$gles1_conform_root/conform/primtest/texture.c",
      "$gles1_conform_root/conform/primtest/tproto.h",
    ]

    sources += angle_gles1_conform_common_source

    if (is_clang) {
      cflags_c = [ "-Wno-shadow" ]
    }
  }

  angle_test("angle_gles1_primtest_tests") {
    deps = [
      ":angle_common_test_utils_static",
      ":angle_gles1_primtest_no_gtest",
    ]

    include_dirs = [ "$gles1_conform_root/conform" ]

    sources = [
      "angle_generic_tests_main.cpp",
      "gles1_conformance_tests/PrimtestTests.cpp",
      "test_utils/ANGLETest.cpp",
      "test_utils/ANGLETest.h",
    ]

    configs += [
      ":angle_gles1_conform_support",
      "${angle_root}:angle_backend_config",
    ]
  }

  source_set("angle_gles1_covegl_no_gtest_source") {
    configs += [
      ":angle_gles1_conform_support",
      "$angle_root:internal_config",
    ]

    public_configs = [
      "$angle_root/util:angle_util_config",
      "$angle_root:gl_prototypes",
    ]

    testonly = true

    public_deps = [
      "$angle_root:angle_static",
      "$angle_root/util:angle_util_static",
    ]

    sources = [
      "$gles1_conform_root/conform/covegl/enum.c",
      "$gles1_conform_root/conform/covegl/native.h",
      "$gles1_conform_root/conform/covegl/test.c",
    ]

    sources += angle_gles1_conform_common_source

    if (is_clang) {
      cflags_c = [ "-Wno-shadow" ]
    }

    if (!is_win && !is_linux && !is_chromeos) {
      defines = [ "NULLWS" ]
    }
  }

  angle_test("angle_gles1_covegl_no_gtest") {
    deps = [ ":angle_gles1_covegl_no_gtest_source" ]

    include_dirs = [ "$gles1_conform_root" ]

    sources = [ "$gles1_conform_root/conform/covegl/shell.c" ]

    if (is_win) {
      sources += [ "$gles1_conform_root/conform/covegl/native_w32.c" ]
    } else if (is_linux || is_chromeos) {
      sources += [ "$gles1_conform_root/conform/covegl/native.c" ]
    } else {
      sources += [ "$gles1_conform_root/conform/covegl/native_nws.c" ]
      defines += [ "NULLWS" ]
    }

    configs += [ "${angle_root}:angle_backend_config" ]

    defines += [ "COMMON" ]

    if (is_clang) {
      cflags_c = [ "-Wno-shadow" ]
    }

    if (is_win) {
      if (is_clang) {
        cflags = [ "-Wno-incompatible-pointer-types" ]
      } else {
        cflags = [ "/wd4133" ]  # 'function': incompatible types
      }

      suppressed_configs += [
        "//build/config/win:lean_and_mean",
        "//build/config/win:nominmax",
        "//build/config/win:unicode",
      ]
    }
  }
}

###-----------------------------------------------------
### dEQP tests
###-----------------------------------------------------

if (build_angle_deqp_tests && !is_fuchsia) {
  import("deqp_support/deqp.gni")
  import("deqp_support/deqp_data_autogen.gni")

  config("angle_deqp_support") {
    include_dirs = deqp_include_dirs
    if (is_win && !is_clang) {
      include_dirs += [ "$deqp_path/framework/platform/win32" ]
      cflags = [
        "/EHsc",  # dEQP requires exceptions
        "/wd4091",  # typedef ignored when no variable is declared
        "/wd4100",
        "/wd4101",  # unreferenced local variable
        "/wd4125",  # decimal digit terminates octal escape sequence
        "/wd4127",  # conditional expression constant
        "/wd4244",  # possible loss of data
        "/wd4245",  # argument signed/unsigned mismatch
        "/wd4297",  # function assumed not to throw an exception but does
        "/wd4302",  # truncation
        "/wd4311",  # pointer truncation
        "/wd4389",  # signed/unsigned mismatch
        "/wd4510",  # default constructor could not be generated
        "/wd4512",
        "/wd4610",  # cannot be instantiated
        "/wd4611",  # setjmp interaction non-portable
        "/wd4701",  # potentially uninit used
        "/wd4702",  # unreachable code
        "/wd4706",  # assignment within conditional expression
        "/wd4834",  # discarding return value of function with 'nodiscard'
                    # attribute
        "/wd4838",  # conversion requires a narrowing conversion
        "/wd4996",  # deprecated
      ]
    }

    defines = [
      "DEQP_SUPPORT_GLES31=1",
      "DEQP_SUPPORT_GLES3=1",
      "DEQP_SUPPORT_GLES2=1",
      "DEQP_SUPPORT_EGL=1",
      "DEQP_TARGET_NAME=\"angle\"",
      "DEQP_GLES31_RUNTIME_LOAD=1",
      "DEQP_GLES3_RUNTIME_LOAD=1",
      "DEQP_GLES2_RUNTIME_LOAD=1",
      "QP_SUPPORT_PNG=1",
      "_HAS_EXCEPTIONS=1",
      "_MBCS",
      "ANGLE_DEQP_DATA_DIR=\"gen/vk_gl_cts_data/data\"",
    ]

    if (is_linux) {
      if (angle_use_x11) {
        defines += [ "DEQP_SUPPORT_X11=1" ]
      } else if (angle_use_wayland) {
        defines += [ "DEQP_SUPPORT_WAYLAND=1" ]
      }
    }

    if (is_android) {
      include_dirs += [ "$deqp_path/framework/platform/android" ]

      _android_api = android_ndk_api_level

      defines += [ "DE_ANDROID_API=" + "${_android_api}" ]
    }

    if (is_clang) {
      # TODO(jmadill): Remove this once we fix dEQP.
      cflags_c = [ "-Wno-unused-local-typedef" ]
      cflags_cc = [
        "-Wno-sizeof-array-div",  # https://gitlab.khronos.org/Tracker/vk-gl-cts/issues/2127
        "-Wno-string-conversion",  # implicit conversion turns string literal
                                   # into bool
        "-Wno-unused-function",
        "-Wno-unused-local-typedef",
        "-Wno-unused-result",  # ignoring return value of function declared with
                               # 'nodiscard' attribute
      ]
      if (!is_win) {
        # Not supported by clang-cl
        cflags_cc += [
          "-fwrapv",  # Treat signed integer overflow as two's complement
                      # https://gitlab.khronos.org/Tracker/vk-gl-cts/-/issues/37
                      # https://android.googlesource.com/platform/external/deqp/+/ae6c306e39080de59a8535cf1797b27951dcaa6c%5E%21/
        ]
      }
    }

    # Ask the system headers to expose all the regular function otherwise
    # dEQP doesn't compile and produces warnings about implicitly defined
    # functions.
    if (is_linux || is_chromeos) {
      # This has to be GNU_SOURCE as on Linux dEQP uses syscall()
      defines += [ "_GNU_SOURCE" ]
    }
    if (is_android) {
      # _XOPEN_SOURCE=600 is what is used in deqp/src/Android.mk
      defines += [ "_XOPEN_SOURCE=600" ]
    } else if (is_apple) {
      # Work-around for https://github.com/llvm/llvm-project/issues/117630
      defines += [ "_XOPEN_SOURCE=700" ]
    }
  }

  deqp_undefine_configs = [
    "//build/config/compiler:chromium_code",
    "//build/config/compiler:no_exceptions",
    "//build/config/compiler:no_rtti",
    "${angle_root}:constructor_and_destructor_warnings",
    "${angle_root}:extra_warnings",
  ]

  if (is_win) {
    deqp_undefine_configs += [
      "//build/config/win:lean_and_mean",
      "//build/config/win:nominmax",
      "//build/config/win:unicode",
    ]
  }

  set_defaults("angle_deqp_source_set") {
    public_configs = []
    configs = angle_common_configs
    cflags = []
  }

  template("angle_deqp_source_set") {
    angle_source_set(target_name) {
      testonly = true
      forward_variables_from(invoker, "*")
      suppressed_configs += deqp_undefine_configs

      if (is_clang) {
        cflags += [
          # Suppress a spurious header warning. http://crbug.com/995046
          "-Wno-nonportable-include-path",
        ]
      }
    }
  }

  config("angle_deqp_framework_debase_config") {
    include_dirs = [ "$deqp_path/framework/delibs/debase" ]
  }

  angle_deqp_source_set("angle_deqp_framework_debase") {
    public_configs += [ ":angle_deqp_framework_debase_config" ]
    sources = deqp_framework_debase_sources
  }

  config("angle_deqp_framework_decpp_config") {
    include_dirs = [ "$deqp_path/framework/delibs/decpp" ]
  }

  angle_deqp_source_set("angle_deqp_framework_decpp") {
    public_configs += [
      ":angle_deqp_support",
      ":angle_deqp_framework_decpp_config",
      "//build/config/compiler:exceptions",
      "//build/config/compiler:no_chromium_code",
    ]
    if (is_clang) {
      cflags_cc = [
        # Supresses self assign warnings in SharedPtr_selfTest
        # Can be removed if dEQP or clang are fixed
        "-Wno-self-assign",
      ]
    }

    public_deps = [
      ":angle_deqp_framework_debase",
      ":angle_deqp_framework_delibs",
    ]
    sources = deqp_framework_decpp_sources
  }

  config("angle_deqp_framework_xexml_config") {
    include_dirs = [ "$deqp_path/framework/xexml" ]
  }

  angle_deqp_source_set("angle_deqp_framework_xexml") {
    public_configs += [
      ":angle_deqp_support",
      ":angle_deqp_framework_decpp_config",
      ":angle_deqp_framework_delibs_config",
      "//build/config/compiler:exceptions",
      "//build/config/compiler:no_chromium_code",
    ]

    public_deps = [
      ":angle_deqp_framework_debase",
      ":angle_deqp_framework_decpp",
      ":angle_deqp_framework_delibs",
    ]
    sources = deqp_framework_xexml_sources
  }

  config("angle_deqp_libtester_config") {
    defines = [ "ANGLE_DEQP_LIBTESTER_IMPLEMENTATION" ]

    if (is_clang) {
      # TODO(jmadill): Remove this once we fix dEQP.
      cflags_cc = [
        "-Wno-delete-non-virtual-dtor",
        "-Wno-deprecated",

        # Supresses self assign warning in setLumSat
        # Can be removed if dEQP or clang are fixed
        "-Wno-self-assign",
      ]
    }
  }

  config("angle_deqp_framework_delibs_config") {
    include_dirs = [
      "$deqp_path/framework/delibs/debase",
      "$deqp_path/framework/delibs/depool",
      "$deqp_path/framework/delibs/dethread",
      "$deqp_path/framework/delibs/deutil",
      "$deqp_path/framework/delibs/destream",
    ]

    # https://github.com/KhronosGroup/VK-GL-CTS/commit/9f306457b48b3f8258ca44462003ef39b80a7515
    if (is_clang) {
      if (target_cpu == "arm") {
        defines = [ "DE_FENV_ACCESS_ON=" ]
      } else {
        defines = [ "DE_FENV_ACCESS_ON=_Pragma(\"STDC FENV_ACCESS ON\")" ]
      }
    } else if (is_win) {
      defines = [ "DE_FENV_ACCESS_ON=__pragma(fenv_access (on))" ]
    }
  }

  angle_deqp_source_set("angle_deqp_framework_delibs") {
    sources = deqp_framework_delibs_sources

    if (is_win) {
      sources += deqp_framework_delibs_sources_win
    }
    if (is_linux || is_chromeos || is_android || is_apple) {
      sources += deqp_framework_delibs_sources_unix
    }

    public_configs = [
      ":angle_deqp_framework_delibs_config",
      ":angle_deqp_support",
    ]

    public_deps = [ ":angle_deqp_framework_debase" ]
  }

  config("angle_deqp_framework_common_public_config") {
    include_dirs = [
      "$deqp_path/framework/common",
      "$deqp_path/framework/randomshaders",
      "$deqp_path/framework/referencerenderer",
    ]
  }

  config("angle_deqp_framework_common_private_config") {
    cflags_cc = [
      # Usage of deprecated std::float_denorm_style.
      # https://github.com/KhronosGroup/VK-GL-CTS/blob/84f86d999680e3d8a416b578bfc6e86ce8910853/framework/common/tcuFloatFormat.cpp#L275C32-L279
      "-Wno-deprecated-declarations",
    ]
  }

  angle_deqp_source_set("angle_deqp_framework_common") {
    sources = deqp_framework_common_sources
    if (is_win) {
      sources += deqp_framework_common_win_sources
    } else {
      sources += deqp_framework_common_linux_sources
    }

    public_configs = [ ":angle_deqp_framework_common_public_config" ]
    configs += [ ":angle_deqp_framework_common_private_config" ]
    public_deps = [
      ":angle_deqp_framework_decpp",
      ":angle_deqp_framework_qphelper",
      ":angle_deqp_framework_xexml",
    ]
    deps = [ "${angle_jsoncpp_dir}:jsoncpp" ]
  }

  config("angle_deqp_framework_opengl_config") {
    include_dirs = [
      "$deqp_path/framework/egl/wrapper",
      "$deqp_path/framework/opengl",
      "$deqp_path/framework/opengl/simplereference",
      "$deqp_path/framework/opengl/wrapper",
    ]
  }

  angle_deqp_source_set("angle_deqp_framework_opengl") {
    sources = deqp_framework_opengl_sources
    public_configs = [ ":angle_deqp_framework_opengl_config" ]
    public_deps = [ ":angle_deqp_framework_common" ]
  }

  config("angle_deqp_framework_egl_config") {
    include_dirs = [
      "$deqp_path/framework/egl",
      "$deqp_path/framework/egl/wrapper",
    ]
  }

  angle_deqp_source_set("angle_deqp_framework_egl") {
    sources = deqp_framework_egl_sources
    public_configs = [ ":angle_deqp_framework_egl_config" ]
    public_deps = [ ":angle_deqp_framework_opengl" ]
  }

  config("angle_deqp_framework_qphelper_config") {
    include_dirs = [ "$deqp_path/framework/qphelper" ]
  }

  angle_deqp_source_set("angle_deqp_framework_qphelper") {
    sources = deqp_framework_qphelper_sources
    public_deps = [
      ":angle_deqp_framework_delibs",
      "${angle_libpng_dir}:libpng",
    ]
    public_configs = [ ":angle_deqp_framework_qphelper_config" ]
  }

  config("angle_deqp_glshared_config") {
    include_dirs = [ "$deqp_path/modules/glshared" ]
  }

  angle_deqp_source_set("angle_deqp_glshared") {
    sources = deqp_glshared_sources
    public_deps = [ ":angle_deqp_framework_opengl" ]
    public_configs = [ ":angle_deqp_glshared_config" ]
  }

  angle_deqp_source_set("angle_deqp_framework_platform") {
    if (is_ios) {
      # shared libraries are hidden inside ios_framework_bundle, but we include
      # headers from them
      check_includes = false
    }
    sources = deqp_framework_platform_sources
    libs = []
    public_deps = []
    if (is_win) {
      sources += [
        "$deqp_path/framework/platform/win32/tcuWGL.cpp",
        "$deqp_path/framework/platform/win32/tcuWGLContextFactory.cpp",
        "$deqp_path/framework/platform/win32/tcuWin32EGLNativeDisplayFactory.cpp",
        "$deqp_path/framework/platform/win32/tcuWin32Window.cpp",
      ]
    }
    if (is_linux) {
      sources += [
        "$deqp_path/framework/platform/lnx/tcuLnx.cpp",
        "$deqp_path/framework/platform/lnx/tcuLnx.hpp",
        "$deqp_path/framework/platform/lnx/tcuLnxEglPlatform.cpp",
        "$deqp_path/framework/platform/lnx/tcuLnxEglPlatform.hpp",
      ]
      if (angle_use_x11) {
        sources += [
          "$deqp_path/framework/platform/lnx/X11/tcuLnxX11.cpp",
          "$deqp_path/framework/platform/lnx/X11/tcuLnxX11.hpp",
          "$deqp_path/framework/platform/lnx/X11/tcuLnxX11EglDisplayFactory.cpp",
          "$deqp_path/framework/platform/lnx/X11/tcuLnxX11EglDisplayFactory.hpp",
        ]
      } else if (angle_use_wayland) {
        sources += [
          "$angle_root/src/tests/deqp_support/wayland/xdg-shell.h",
          "$deqp_path/framework/platform/lnx/wayland/tcuLnxWayland.cpp",
          "$deqp_path/framework/platform/lnx/wayland/tcuLnxWayland.hpp",
          "$deqp_path/framework/platform/lnx/wayland/tcuLnxWaylandEglDisplayFactory.cpp",
          "$deqp_path/framework/platform/lnx/wayland/tcuLnxWaylandEglDisplayFactory.hpp",
        ]
        public_deps += [
          "$wayland_gn_dir:wayland_client",
          "$wayland_gn_dir:wayland_egl",
          "$wayland_protocols_gn_dir:xdg_shell_protocol",
        ]
      }
    }
    public_deps += [
      ":angle_deqp_framework_common",
      ":angle_deqp_framework_egl",
    ]
  }

  angle_deqp_source_set("angle_deqp_libtester") {
    if (is_ios) {
      # shared libraries are hidden inside ios_framework_bundle, but we include
      # headers from them
      check_includes = false
    }
    public_deps = [
      ":angle_deqp_framework_platform",
      ":angle_deqp_glshared",
      "$angle_root:angle_common",
      "$angle_root/util:angle_util",
    ]

    data_deps = [ "${angle_root}:angle" ]

    configs += [ "${angle_root}:library_name_config" ]
    public_configs += [
      ":angle_deqp_libtester_config",
      "${angle_root}:libANGLE_config",
    ]
    sources = deqp_libtester_sources
    if (is_android) {
      libs = [ "log" ]
    }
  }

  set_defaults("angle_deqp_gtest") {
    deps = []
    sources = []
    data = []
    data_deps = []
  }

  template("angle_deqp_gtest") {
    _api = target_name

    config_name = "angle_deqp_${_api}_config"

    config(config_name) {
      defines = invoker.defines
    }

    shared_library_name = "angle_deqp_lib${_api}"

    angle_shared_library(shared_library_name) {
      forward_variables_from(invoker,
                             [
                               "sources",
                               "deps",
                               "data",
                               "data_deps",
                             ])

      testonly = true

      deps += [
        ":angle_deqp_libtester",
        "$angle_root/util:angle_test_utils",
        "$angle_root/util:angle_util",
      ]

      suppressed_configs += deqp_undefine_configs
      public_configs += [ ":$config_name" ]

      sources += [
        "deqp_support/angle_deqp_libtester.h",
        "deqp_support/angle_deqp_libtester_main.cpp",
        "deqp_support/tcuANGLEPlatform.cpp",
        "deqp_support/tcuANGLEPlatform.h",
      ]

      if ((is_mac || is_ios) && !is_component_build) {
        ldflags = [
          "-install_name",
          "@rpath/lib${shared_library_name}.dylib",
        ]
      }
    }

    angle_test("angle_deqp_${_api}_tests") {
      deps = [
        ":${shared_library_name}",
        "$angle_root:angle_common",
        "$angle_root/util:angle_util",
      ]

      # Must be included outside of the source set for the define
      sources = [
        "angle_deqp_tests_main.cpp",
        "deqp_support/angle_deqp_gtest.cpp",
      ]

      expectations_file = "deqp_${_api}_test_expectations.txt"
      if (defined(invoker.expectations_file)) {
        expectations_file = invoker.expectations_file
      }
      data = [
        "deqp_support/${expectations_file}",
        "${invoker.mustpass_dir}/${invoker.mustpass_name}",
      ]
    }
  }

  _android_mustpass = "$deqp_path/android/cts/main"
  _aosp_egl_mustpass = "$deqp_path/external/openglcts/data/gl_cts/data/mustpass/egl/aosp_mustpass/main"
  _aosp_gles_mustpass = "$deqp_path/external/openglcts/data/gl_cts/data/mustpass/gles/aosp_mustpass/main"
  _khronos_gl_mustpass = "$deqp_path/external/openglcts/data/gl_cts/data/mustpass/gl/khronos_mustpass/main"
  _khronos_gles_mustpass = "$deqp_path/external/openglcts/data/gl_cts/data/mustpass/gles/khronos_mustpass/main"
  _khronos_gles_noctx_mustpass = "$deqp_path/external/openglcts/data/gl_cts/data/mustpass/gles/khronos_mustpass_noctx/main"
  _khronos_gles_single_mustpass = "$deqp_path/external/openglcts/data/gl_cts/data/mustpass/gles/khronos_mustpass_single/main"

  angle_deqp_source_set("angle_deqp_gles2_common") {
    sources = deqp_gles2_sources
    public_deps = [
      ":angle_deqp_framework_egl",
      ":angle_deqp_glshared",
    ]
  }

  angle_deqp_source_set("angle_deqp_gles3_common") {
    sources = deqp_gles3_sources
    public_deps = [
      ":angle_deqp_framework_egl",
      ":angle_deqp_glshared",
    ]
  }

  angle_deqp_source_set("angle_deqp_gles31_common") {
    sources = deqp_gles31_sources
    public_deps = [
      ":angle_deqp_framework_egl",
      ":angle_deqp_glshared",
    ]
  }

  template("angle_deqp_core_gtest") {
    _api = target_name
    forward_variables_from(invoker, [ "mustpass_suffix" ])
    if (mustpass_suffix != "main") {
      target_name = "${_api}_${mustpass_suffix}"
      target_name = string_replace(target_name, "-", "_")
    }

    angle_deqp_gtest(target_name) {
      forward_variables_from(invoker, "*")

      mustpass_name = "${_api}-${mustpass_suffix}.txt"

      deps += angle_deqp_data_copy_targets

      data = []
      if (_api == "gles2") {
        data = angle_deqp_data_gles2
      } else if (_api == "gles3") {
        data = angle_deqp_data_gles3
      } else if (_api == "gles31") {
        data = angle_deqp_data_gles31
      } else {
        # Make sure we include something so that angle_deqp_libtester_main.cpp
        # can find something.
        data = [ "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/misc.test" ]
      }
    }
  }

  angle_deqp_core_gtest("gles2") {
    defines = [ "ANGLE_DEQP_GLES2_TESTS" ]
    deps = [ ":angle_deqp_gles2_common" ]
    mustpass_dir = _aosp_gles_mustpass
    mustpass_suffix = "main"
  }

  angle_deqp_core_gtest("gles3") {
    defines = [ "ANGLE_DEQP_GLES3_TESTS" ]
    deps = [ ":angle_deqp_gles3_common" ]
    mustpass_dir = _aosp_gles_mustpass
    mustpass_suffix = "main"
  }

  angle_deqp_core_gtest("gles3") {
    defines = [ "ANGLE_DEQP_GLES3_MULTISAMPLE_TESTS" ]
    deps = [ ":angle_deqp_gles3_common" ]
    mustpass_dir = _aosp_gles_mustpass
    mustpass_suffix = "multisample"
  }

  angle_deqp_core_gtest("gles31") {
    defines = [ "ANGLE_DEQP_GLES31_TESTS" ]
    deps = [ ":angle_deqp_gles31_common" ]
    mustpass_dir = _aosp_gles_mustpass
    mustpass_suffix = "main"
  }

  angle_deqp_core_gtest("gles31") {
    defines = [ "ANGLE_DEQP_GLES31_MULTISAMPLE_TESTS" ]
    deps = [ ":angle_deqp_gles31_common" ]
    mustpass_dir = _aosp_gles_mustpass
    mustpass_suffix = "multisample"
  }

  angle_deqp_core_gtest("egl") {
    defines = [ "ANGLE_DEQP_EGL_TESTS" ]
    sources = deqp_egl_sources
    mustpass_dir = _aosp_egl_mustpass
    mustpass_suffix = "main"
  }

  if (is_android) {
    angle_deqp_core_gtest("gles3") {
      defines = [ "ANGLE_DEQP_GLES3_565_NO_DEPTH_NO_STENCIL_TESTS" ]
      deps = [ ":angle_deqp_gles3_common" ]
      mustpass_dir = _aosp_gles_mustpass
      mustpass_suffix = "565-no-depth-no-stencil"
    }

    angle_deqp_core_gtest("gles31") {
      defines = [ "ANGLE_DEQP_GLES31_565_NO_DEPTH_NO_STENCIL_TESTS" ]
      deps = [ ":angle_deqp_gles31_common" ]
      mustpass_dir = _aosp_gles_mustpass
      mustpass_suffix = "565-no-depth-no-stencil"
    }
  }

  # The CTS also includes a set of "KHR" tests that are separate from the main
  # body of dEQP tests.

  config("angle_deqp_khr_common_config") {
    include_dirs = [
      "$deqp_path/external/openglcts/modules/common",
      "$deqp_path/external/openglcts/modules/common/meshShader",
      "$deqp_path/external/openglcts/modules/common/subgroups",
      "$deqp_path/external/openglcts/modules/gl",
      "$deqp_path/external/openglcts/modules/gles2",
      "$deqp_path/external/openglcts/modules/gles3",
      "$deqp_path/external/openglcts/modules/gles31",
      "$deqp_path/external/openglcts/modules/gles32",
      "$deqp_path/external/openglcts/modules/glesext",
    ]
    if (is_clang) {
      cflags = [ "-Wno-header-hygiene" ]  # using namespace directive in global
                                          # context in header
    }
  }

  angle_deqp_source_set("angle_deqp_khr_common") {
    sources = deqp_khr_common_sources + deqp_khr_test_module_headers +
              deqp_khr_gl_sources + deqp_khr_gles2_sources +
              deqp_khr_gles3_sources + deqp_khr_gles31_sources +
              deqp_khr_gles32_sources + deqp_khr_glesext_sources +
              [ "deqp_support/glcTestPackageEntry_override.cpp" ]
    public_deps = [
      ":angle_deqp_framework_platform",
      ":angle_deqp_glshared",
      "${angle_glslang_dir}:glslang_lib_sources",
      "${angle_spirv_tools_dir}:spvtools_val",
    ]
    public_configs = [ ":angle_deqp_khr_common_config" ]

    # This is a bit of a hack so one test can capture memory limits.
    include_dirs = [ "$deqp_path/external/vulkancts/framework/vulkan" ]
  }

  template("angle_deqp_khr_gtest") {
    angle_deqp_gtest(target_name) {
      forward_variables_from(invoker, "*")
      deps = [ ":angle_deqp_khr_common" ]
      deps += angle_deqp_data_copy_targets
      if (api == "gles2") {
        # Make sure we include something so that angle_deqp_libtester_main.cpp
        # can find something.
        data = [ "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/misc.test" ]
        mustpass_dir = _khronos_gles_mustpass
      } else if (api == "gles3") {
        data = angle_deqp_external_openglcts_data_gl_cts_data_gles3
        mustpass_dir = _khronos_gles_mustpass
      } else if (api == "gles31") {
        data = angle_deqp_external_openglcts_data_gl_cts_data_gles31
        mustpass_dir = _khronos_gles_mustpass
      } else if (api == "gles32") {
        data = angle_deqp_external_openglcts_data_gl_cts_data_gles32
        mustpass_dir = _khronos_gles_mustpass
      } else {
        assert(false)
      }
    }
  }

  angle_deqp_khr_gtest("khr_gles2") {
    defines = [ "ANGLE_DEQP_KHR_GLES2_TESTS" ]
    mustpass_name = "gles2-khr-main.txt"
    api = "gles2"
  }

  angle_deqp_khr_gtest("khr_gles3") {
    defines = [ "ANGLE_DEQP_KHR_GLES3_TESTS" ]
    mustpass_name = "gles3-khr-main.txt"
    api = "gles3"
  }

  angle_deqp_khr_gtest("khr_gles31") {
    defines = [ "ANGLE_DEQP_KHR_GLES31_TESTS" ]
    mustpass_name = "gles31-khr-main.txt"
    api = "gles31"
  }

  angle_deqp_khr_gtest("khr_gles32") {
    defines = [ "ANGLE_DEQP_KHR_GLES32_TESTS" ]
    mustpass_name = "gles32-khr-main.txt"
    api = "gles32"
  }

  template("angle_deqp_khr_noctx_gtest") {
    angle_deqp_gtest(target_name) {
      forward_variables_from(invoker, "*")
      deps = [ ":angle_deqp_khr_common" ]
      deps += angle_deqp_data_copy_targets
      if (api == "gles2") {
        data = [ "$root_gen_dir/vk_gl_cts_data/data/gles2/shaders/misc.test" ]
        mustpass_dir = _khronos_gles_noctx_mustpass
      } else if (api == "gles32") {
        data = angle_deqp_external_openglcts_data_gl_cts_data_gles32
        mustpass_dir = _khronos_gles_noctx_mustpass
      } else {
        assert(false)
      }
    }
  }

  angle_deqp_khr_noctx_gtest("khr_noctx_gles2") {
    defines = [ "ANGLE_DEQP_KHR_NOCTX_GLES2_TESTS" ]
    mustpass_name = "gles2-khr-noctx-main.txt"
    api = "gles2"
  }

  angle_deqp_khr_noctx_gtest("khr_noctx_gles32") {
    defines = [ "ANGLE_DEQP_KHR_NOCTX_GLES32_TESTS" ]
    mustpass_name = "gles32-khr-noctx-main.txt"
    api = "gles32"
  }

  template("angle_deqp_khr_single_gtest") {
    angle_deqp_gtest(target_name) {
      forward_variables_from(invoker, "*")
      deps = [ ":angle_deqp_khr_common" ]
      deps += angle_deqp_data_copy_targets
      if (api == "gles32") {
        data = angle_deqp_external_openglcts_data_gl_cts_data_gles32
        mustpass_dir = _khronos_gles_single_mustpass
      } else {
        assert(false)
      }
    }
  }

  angle_deqp_khr_single_gtest("khr_single_gles32") {
    defines = [ "ANGLE_DEQP_KHR_SINGLE_GLES32_TESTS" ]
    mustpass_name = "gles32-khr-single.txt"
    api = "gles32"
  }

  angle_deqp_khr_gtest("khr_glesext") {
    defines = [ "ANGLE_DEQP_KHR_GLESEXT_TESTS" ]
    mustpass_name = "gles32-khr-glesext.txt"
    api = "gles32"
  }

  template("angle_deqp_rotate_gtest") {
    split_target = string_split(target_name, "_")
    _api = split_target[0]
    _rotate = split_target[1]

    angle_deqp_gtest(target_name) {
      forward_variables_from(invoker, "*")

      if (_rotate == "rotate90") {
        mustpass_suffix = "rotate-landscape"
      } else if (_rotate == "rotate180") {
        mustpass_suffix = "rotate-reverse-portrait"
      } else if (_rotate == "rotate270") {
        mustpass_suffix = "rotate-reverse-landscape"
      } else {
        assert(false)
      }

      mustpass_name = "${_api}-${mustpass_suffix}.txt"

      deps += angle_deqp_data_copy_targets

      data = []
      if (_api == "gles3") {
        data = angle_deqp_data_gles3
      } else if (_api == "gles31") {
        data = angle_deqp_data_gles31
      } else {
        assert(false)
      }
    }
  }

  angle_deqp_rotate_gtest("gles3_rotate90") {
    defines = [ "ANGLE_DEQP_GLES3_ROTATE90_TESTS" ]
    deps = [ ":angle_deqp_gles3_common" ]
    mustpass_dir = _aosp_gles_mustpass
    expectations_file = "deqp_gles3_rotate_test_expectations.txt"
  }

  angle_deqp_rotate_gtest("gles3_rotate180") {
    defines = [ "ANGLE_DEQP_GLES3_ROTATE180_TESTS" ]
    deps = [ ":angle_deqp_gles3_common" ]
    mustpass_dir = _aosp_gles_mustpass
    expectations_file = "deqp_gles3_rotate_test_expectations.txt"
  }

  angle_deqp_rotate_gtest("gles3_rotate270") {
    defines = [ "ANGLE_DEQP_GLES3_ROTATE270_TESTS" ]
    deps = [ ":angle_deqp_gles3_common" ]
    mustpass_dir = _aosp_gles_mustpass
    expectations_file = "deqp_gles3_rotate_test_expectations.txt"
  }

  angle_deqp_rotate_gtest("gles31_rotate90") {
    defines = [ "ANGLE_DEQP_GLES31_ROTATE90_TESTS" ]
    deps = [ ":angle_deqp_gles31_common" ]
    mustpass_dir = _aosp_gles_mustpass
    expectations_file = "deqp_gles31_rotate_test_expectations.txt"
  }

  angle_deqp_rotate_gtest("gles31_rotate180") {
    defines = [ "ANGLE_DEQP_GLES31_ROTATE180_TESTS" ]
    deps = [ ":angle_deqp_gles31_common" ]
    mustpass_dir = _aosp_gles_mustpass
    expectations_file = "deqp_gles31_rotate_test_expectations.txt"
  }

  angle_deqp_rotate_gtest("gles31_rotate270") {
    defines = [ "ANGLE_DEQP_GLES31_ROTATE270_TESTS" ]
    deps = [ ":angle_deqp_gles31_common" ]
    mustpass_dir = _aosp_gles_mustpass
    expectations_file = "deqp_gles31_rotate_test_expectations.txt"
  }
}

group("angle_tests") {
  testonly = true
  deps = [
    ":angle_end2end_tests",
    ":angle_system_info_test",
    ":angle_unittests",
  ]
  if (angle_enable_cl_testing) {
    deps += [ ":angle_openclcts" ]
  }
  if (build_angle_perftests) {
    deps += [ ":angle_perftests" ]
  }
  if (build_angle_trace_tests) {
    deps += [ ":angle_trace_perf_tests" ]
    deps += [ "capture_tests:angle_capture_tests_multi_frame_trace" ]
    deps += [ "capture_tests:angle_capture_tests_active_textures_trace" ]
    deps += [ "capture_tests:angle_capture_tests_client_wait_sync_trace" ]
    if (angle_enable_cl) {
      deps += [ "capture_tests:angle_capture_tests_multi_frame_cl_trace" ]
    }
  }
  if (is_clang && angle_has_frame_capture) {
    deps += [ "capture_replay_tests" ]
  }
  if (!is_fuchsia) {
    deps += [
      ":angle_white_box_perftests",
      ":angle_white_box_tests",
    ]
  }
  if (build_angle_deqp_tests && !is_fuchsia) {
    deps += [
      ":angle_deqp_egl_tests",
      ":angle_deqp_gles2_tests",
      ":angle_deqp_gles31_multisample_tests",
      ":angle_deqp_gles31_rotate180_tests",
      ":angle_deqp_gles31_rotate270_tests",
      ":angle_deqp_gles31_rotate90_tests",
      ":angle_deqp_gles31_tests",
      ":angle_deqp_gles3_multisample_tests",
      ":angle_deqp_gles3_rotate180_tests",
      ":angle_deqp_gles3_rotate270_tests",
      ":angle_deqp_gles3_rotate90_tests",
      ":angle_deqp_gles3_tests",
      ":angle_deqp_khr_gles2_tests",
      ":angle_deqp_khr_gles31_tests",
      ":angle_deqp_khr_gles32_tests",
      ":angle_deqp_khr_gles3_tests",
      ":angle_deqp_khr_glesext_tests",
      ":angle_deqp_khr_noctx_gles2_tests",
      ":angle_deqp_khr_noctx_gles32_tests",
      ":angle_deqp_khr_single_gles32_tests",
    ]

    if (is_android) {
      deps += [
        ":angle_deqp_gles31_565_no_depth_no_stencil_tests",
        ":angle_deqp_gles3_565_no_depth_no_stencil_tests",
      ]
    }
  }
  if (build_angle_gles1_conform_tests) {
    deps += [
      ":angle_gles1_conformance_tests",
      ":angle_gles1_covegl_no_gtest",
      ":angle_gles1_primtest_tests",
    ]
    if (!is_win && !is_apple) {
      deps += [ ":angle_gles1_covgl_tests" ]
    }
  }
}
