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

# ==============================================================================
# TEST SETUP
# ==============================================================================

# Define a test as an executable (or apk on Android) with the "testonly" flag
# set.
template("test") {
  if (is_android) {
    import("//build/config/android/config.gni")
    import("//build/config/android/rules.gni")

    main_target_name = target_name
    library_name = "_${target_name}__library"
    apk_name = "${target_name}_apk"

    shared_library(library_name) {
      # Configs will always be defined since we set_defaults for a component
      # in the main config. We want to use those rather than whatever came with
      # the nested shared/static library inside the component.
      configs = []  # Prevent list overwriting warning.
      configs = invoker.configs

      testonly = true

      # Don't use "*" to forward all variables since some (like output_name
      # and isolate_file) apply only to the APK below.
      deps = []
      forward_variables_from(invoker,
                             [
                               "all_dependent_configs",
                               "allow_circular_includes_from",
                               "cflags",
                               "cflags_c",
                               "cflags_cc",
                               "check_includes",
                               "data",
                               "data_deps",
                               "datadeps",
                               "defines",
                               "deps",
                               "include_dirs",
                               "ldflags",
                               "lib_dirs",
                               "libs",
                               "output_extension",
                               "output_name",
                               "public",
                               "public_configs",
                               "public_deps",
                               "sources",
                               "visibility",
                             ])

      if (!defined(invoker.use_default_launcher) ||
          invoker.use_default_launcher) {
        deps += [ "//testing/android/native_test:native_test_native_code" ]
      }
    }

    unittest_apk(apk_name) {
      forward_variables_from(invoker,
                             [
                               "android_manifest",
                               "deps",
                               "use_default_launcher",
                               "write_asset_list",
                             ])
      unittests_dep = ":$library_name"
      apk_name = main_target_name
      if (defined(invoker.output_name)) {
        apk_name = invoker.output_name
        unittests_binary = "lib${apk_name}.so"
      }
      deps += [ ":$library_name" ]
      if (defined(invoker.apk_asset_location)) {
        asset_location = invoker.apk_asset_location
      }
    }

    _test_name = main_target_name
    if (defined(invoker.output_name)) {
      _test_name = invoker.output_name
    }
    test_runner_script_name = "${_test_name}__test_runner_script"
    test_runner_script(test_runner_script_name) {
      test_name = _test_name
      test_type = "gtest"
      test_suite = _test_name
      if (defined(invoker.isolate_file)) {
        isolate_file = invoker.isolate_file
      }
    }
    incremental_test_runner_script_name =
        "${_test_name}_incremental__test_runner_script"
    test_runner_script(incremental_test_runner_script_name) {
      test_name = "${_test_name}_incremental"
      test_type = "gtest"
      test_suite = _test_name
      incremental_install = true
      if (defined(invoker.isolate_file)) {
        isolate_file = invoker.isolate_file
      }
    }

    group(target_name) {
      testonly = true
      datadeps = [
        ":$test_runner_script_name",
      ]
      deps = [
        ":$apk_name",
      ]
    }
    group("${target_name}_incremental") {
      testonly = true
      datadeps = [
        ":$incremental_test_runner_script_name",
      ]
      deps = [
        ":${apk_name}_incremental",
      ]
    }
  } else if (is_ios) {
    if (is_ios) {
      import("//build/config/ios/rules.gni")
    }

    ios_app(target_name) {
      # TODO(GYP): Make this configurable and only provide a default
      # that can be overridden.
      info_plist = "//testing/gtest_ios/unittest-Info.plist"
      app_name = target_name
      entitlements_path = "//testing/gtest_ios"
      code_signing_identity = ""
      testonly = true

      # See above call.
      set_sources_assignment_filter([])

      forward_variables_from(invoker,
                             [
                               "all_dependent_configs",
                               "allow_circular_includes_from",
                               "cflags",
                               "cflags_c",
                               "cflags_cc",
                               "cflags_objc",
                               "cflags_objcc",
                               "check_includes",
                               "configs",
                               "data",
                               "data_deps",
                               "defines",
                               "include_dirs",
                               "ldflags",
                               "libs",
                               "output_extension",
                               "output_name",
                               "public",
                               "public_configs",
                               "public_deps",
                               "sources",
                               "visibility",
                             ])

      if (defined(invoker.deps)) {
        deps = invoker.deps
      } else {
        deps = []
      }
      deps += [
        # All shared libraries must have the sanitizer deps to properly link in
        # asan mode (this target will be empty in other cases).
        "//build/config/sanitizers:deps",
      ]
    }
  } else {
    executable(target_name) {
      forward_variables_from(invoker, "*")

      testonly = true

      if (!defined(invoker.deps)) {
        deps = []
      }
      deps += [
        # All shared libraries must have the sanitizer deps to properly link in
        # asan mode (this target will be empty in other cases).
        "//build/config/sanitizers:deps",

        # Give tests the default manifest on Windows (a no-op elsewhere).
        "//build/win:default_exe_manifest",
      ]
    }
  }
}
