# Copyright 2013 The Flutter 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("//flutter/common/config.gni")
import("//flutter/shell/config.gni")
import("testing.gni")

config("dynamic_symbols") {
  if (is_clang && is_linux) {
    ldflags = [ "-rdynamic" ]
  }
}

source_set("testing_lib") {
  testonly = true

  sources = [
    "assertions.h",
    "debugger_detection.cc",
    "debugger_detection.h",
    "display_list_testing.cc",
    "display_list_testing.h",
    "logger_listener.cc",
    "logger_listener.h",
    "mock_canvas.cc",
    "mock_canvas.h",
    "post_task_sync.cc",
    "post_task_sync.h",
    "stream_capture.cc",
    "stream_capture.h",
    "test_args.cc",
    "test_args.h",
    "test_timeout_listener.cc",
    "test_timeout_listener.h",
    "testing.cc",
    "testing.h",
    "thread_test.cc",
    "thread_test.h",
  ]

  public_deps = [
    "//flutter/display_list",
    "//flutter/fml",
    "//flutter/third_party/googletest:gmock",
    "//flutter/third_party/googletest:gtest",
  ]
  public_configs = [ "//flutter:config" ]
}

source_set("testing") {
  testonly = true

  sources = [ "run_all_unittests.cc" ]

  if (enable_unittests && is_linux) {
    # So that we can call gtk_init in main().
    configs += [ "//flutter/shell/platform/linux/config:gtk" ]
  }

  public_deps = [ ":testing_lib" ]
  public_configs = [ ":dynamic_symbols" ]
}

source_set("dart") {
  testonly = true

  sources = [
    "dart_isolate_runner.cc",
    "dart_isolate_runner.h",
    "elf_loader.cc",
    "elf_loader.h",
    "test_dart_native_resolver.cc",
    "test_dart_native_resolver.h",
  ]

  public_deps = [
    ":testing_lib",
    "$dart_src/runtime/bin:elf_loader",
    "//flutter/common",
    "//flutter/runtime",
    "//flutter/runtime:libdart",
    "//flutter/skia",
    "//flutter/third_party/tonic",
  ]
}

source_set("skia") {
  testonly = true

  sources = [
    "assertions_skia.cc",
    "assertions_skia.h",
    "canvas_test.h",
  ]

  public_deps = [
    ":testing_lib",
    "//flutter/skia",
  ]
}

dart_snapshot_kernel("vmservice_kernel") {
  dart_main = "//flutter/shell/vmservice/empty.dart"
  dart_kernel = "$target_gen_dir/assets/vmservice_kernel.bin"
}

dart_snapshot_aot("vmservice_snapshot") {
  dart_kernel = "$target_gen_dir/assets/vmservice_kernel.bin"
  dart_elf_filename = "libvmservice_snapshot.so"
  deps = [ ":vmservice_kernel" ]
}

source_set("fixture_test") {
  testonly = true

  sources = [
    "dart_fixture.cc",
    "dart_fixture.h",
    "fixture_test.cc",
    "fixture_test.h",
  ]

  public_deps = [
    ":dart",
    "//flutter/common",
    "//flutter/runtime",
  ]

  if (flutter_runtime_mode == "profile") {
    public_deps += [ ":vmservice_snapshot" ]
  }
}

if (is_mac || is_ios) {
  source_set("autoreleasepool_test") {
    testonly = true

    sources = [ "autoreleasepool_test.h" ]

    deps = [
      "//flutter/fml",
      "//flutter/third_party/googletest:gtest",
    ]
  }
}

if (enable_unittests && shell_enable_vulkan) {
  source_set("vulkan") {
    testonly = true

    sources = [
      "test_vulkan_context.cc",
      "test_vulkan_context.h",
      "test_vulkan_image.cc",
      "test_vulkan_image.h",
      "test_vulkan_surface.cc",
      "test_vulkan_surface.h",
    ]

    defines = [ "TEST_VULKAN_PROCS" ]

    deps = [
      ":skia",
      "//flutter/flutter_vma:flutter_skia_vma",
      "//flutter/fml",
      "//flutter/shell/common",
      "//flutter/vulkan",
      "//flutter/vulkan/procs",
    ]

    if (!is_fuchsia) {
      deps += [ "//flutter/third_party/swiftshader" ]
      configs += [ "//flutter/third_party/swiftshader:swiftshader_config" ]
    }
  }
}

if (enable_unittests) {
  test_fixtures("testing_fixtures") {
    fixtures = []
  }

  # The //flutter/testing library provides utility methods to other test targets.
  # This test target tests the testing utilities.
  executable("testing_unittests") {
    testonly = true

    sources = [ "mock_canvas_unittests.cc" ]

    deps = [
      ":skia",
      ":testing",
      ":testing_fixtures",
      "//flutter/runtime:libdart",
    ]

    if (shell_enable_metal) {
      sources += [ "test_metal_surface_unittests.cc" ]

      deps += [ ":metal" ]
    }

    if (shell_enable_vulkan) {
      deps += [ "//flutter/vulkan" ]
    }
  }
}

# All targets on all platforms should be able to use the Metal utilities. On
# platforms where Metal is not available, the tests must be skipped or
# implemented to use another available client rendering API. This is usually
# either OpenGL which is portably implemented via SwiftShader or the software
# backend. This way, all tests compile on all platforms but the Metal backend
# is exercised on platforms where Metal itself is available.
#
# On iOS, this is enabled to allow for Metal tests to run within a test app
if (is_mac || is_ios) {
  source_set("metal") {
    if (shell_enable_metal) {
      sources = [
        "test_metal_context.h",
        "test_metal_context.mm",
        "test_metal_surface.cc",
        "test_metal_surface.h",
        "test_metal_surface_impl.h",
        "test_metal_surface_impl.mm",
      ]
      deps = [
        ":skia",
        "//flutter/fml",
      ]

      # Skia's Vulkan support is enabled for all platforms (except iOS), and so parts of
      # Skia's graphics context reference Vulkan symbols.
      if (shell_enable_vulkan) {
        deps += [ "//flutter/vulkan" ]
      }
    }

    testonly = true
  }
}

# We only use SwiftShader on unittests
use_swiftshader = enable_unittests && shell_enable_gl
if (use_swiftshader) {
  source_set("opengl") {
    testonly = true

    sources = [
      "test_gl_surface.cc",
      "test_gl_surface.h",
    ]

    deps = [
      ":skia",
      "//flutter/fml",
    ]

    configs -= [ "//build/config/clang:extra_warnings" ]
    configs += [
      "//flutter/third_party/angle:gl_prototypes",
      "//flutter/third_party/swiftshader:swiftshader_config",
    ]
    deps += [
      "//flutter/third_party/angle:libEGL_static",
      "//flutter/third_party/angle:libGLESv2_static",
      "//flutter/third_party/swiftshader",
    ]
  }
}
