# 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",
                               "enable_multidex",
                               "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" ]
    }

    _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) {
      apk_target = ":$apk_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) {
      apk_target = ":$apk_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",
      ]
    }

    # TODO(GYP): Delete this after we've converted everything to GN.
    # The _run targets exist only for compatibility w/ GYP.
    group("${target_name}_apk_run") {
      testonly = true
      deps = [
        ":$main_target_name",
      ]
    }
  } else if (is_ios) {
    import("//build/config/ios/rules.gni")

    _test_target = target_name
    _resources_bundle_data = target_name + "_resources_bundle_data"

    bundle_data(_resources_bundle_data) {
      visibility = [
        ":${_test_target}",
        ":${_test_target}_generate_executable",
      ]
      sources = [
        "//testing/gtest_ios/Default.png",
      ]
      outputs = [
        "{{bundle_resources_dir}}/{{source_file_part}}",
      ]
    }

    app(_test_target) {
      # 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
      extra_substitutions = [ "BUNDLE_ID_TEST_NAME=$app_name" ]

      # See above call.
      set_sources_assignment_filter([])

      forward_variables_from(invoker, "*")

      if (!defined(deps)) {
        deps = []
      }
      deps += [
        ":$_resources_bundle_data",

        # 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 {
    main_target_name = target_name

    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",
      ]
    }

    # TODO(GYP): Delete this after we've converted everything to GN.
    # The _run targets exist only for compatibility with GYP.
    group("${target_name}_run") {
      testonly = true
      deps = [
        ":$main_target_name",
      ]
    }
  }
}
