# 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
# ==============================================================================

template("_gen_isolate") {
  testonly = true
  _runtime_deps_file = "$target_gen_dir/$target_name.runtime_deps"
  group("${target_name}__write_deps") {
    forward_variables_from(invoker,
                           [
                             "data",
                             "data_deps",
                             "deps",
                             "public_deps",
                           ])
    write_runtime_deps = _runtime_deps_file
  }

  action(target_name) {
    script = "//testing/generate_isolate.py"
    inputs = [
      _runtime_deps_file,
    ]
    outputs = [
      invoker.output,
    ]
    args = [
      "--output-directory=.",
      "--out-file",
      rebase_path(invoker.output, root_build_dir),
      "--runtime-deps-file",
      rebase_path(_runtime_deps_file, root_build_dir),
    ]
    if (is_android) {
      args += [ "--apply-android-filters" ]
    }
    if (defined(invoker.apply_device_filters) && invoker.apply_device_filters) {
      args += [ "--apply-device-filters" ]
    }
    _assert_no_odd_data =
        defined(invoker.assert_no_odd_data) && invoker.assert_no_odd_data
    if (_assert_no_odd_data) {
      args += [ "--assert-no-odd-data" ]
    }
    if (defined(invoker.command)) {
      _isolate_dir = get_path_info(invoker.output, "dir")
      args += [
        "--command",
        rebase_path(invoker.command, _isolate_dir),
      ]
    }
    deps = [
      ":${invoker.target_name}__write_deps",
    ]
  }
}

# Define a test as an executable (or apk on Android) with the "testonly" flag
# set.
# Variable:
#   use_raw_android_executable: Use executable() rather than android_apk().
#   use_native_activity: Test implements ANativeActivity_onCreate().
template("test") {
  if (is_android) {
    import("//build/config/android/config.gni")
    import("//build/config/android/rules.gni")

    _use_raw_android_executable = defined(invoker.use_raw_android_executable) &&
                                  invoker.use_raw_android_executable

    # output_name is used to allow targets with the same name but in different
    # packages to still produce unique runner scripts.
    _output_name = invoker.target_name
    if (defined(invoker.output_name)) {
      _output_name = invoker.output_name
    }

    _test_runner_target = "${_output_name}__test_runner_script"
    _wrapper_script_vars = [ "shard_timeout" ]
    _gen_isolate_vars = [
      "allow_odd_runtime_deps",
      "ignore_all_data_deps",
    ]
    _generate_device_isolate =
        !defined(invoker.ignore_all_data_deps) || !invoker.ignore_all_data_deps

    if (_generate_device_isolate) {
      _allow_odd_runtime_deps = defined(invoker.allow_odd_runtime_deps) &&
                                invoker.allow_odd_runtime_deps

      # The device isolate is needed at runtime, so it cannot go in
      # target_gen_dir, as builder/tester configurations do not include it.
      _target_dir_name = get_label_info(":$target_name", "dir")
      _device_isolate_path = "$root_out_dir/gen.runtime/$_target_dir_name/$target_name.device.isolate"
      _gen_isolate_target_name = "${target_name}__isolate"
      _gen_isolate(_gen_isolate_target_name) {
        forward_variables_from(invoker,
                               [
                                 "data",
                                 "data_deps",
                                 "deps",
                                 "public_deps",
                               ])
        assert_no_odd_data = !_allow_odd_runtime_deps
        output = _device_isolate_path
        apply_device_filters = true
      }
    }

    if (_use_raw_android_executable) {
      _exec_target = "${target_name}__exec"
      _dist_target = "${target_name}__dist"
      _exec_output =
          "$target_out_dir/${invoker.target_name}/${invoker.target_name}"

      executable(_exec_target) {
        # Configs will always be defined since we set_defaults in BUILDCONFIG.gn.
        configs = []
        data_deps = []
        forward_variables_from(
            invoker,
            "*",
            _wrapper_script_vars + _gen_isolate_vars + [ "extra_dist_files" ])
        testonly = true

        # Thanks to the set_defaults() for test(), configs are initialized with
        # the default shared_library configs rather than executable configs.
        configs -= [
          "//build/config:shared_library_config",
          "//build/config/android:hide_native_jni_exports",
        ]
        configs += [ "//build/config:executable_config" ]

        # Don't output to the root or else conflict with the group() below.
        output_name = rebase_path(_exec_output, root_out_dir)
        if (is_component_build || is_asan) {
          data_deps += [ "//build/android:cpplib_stripped" ]
        }
      }

      create_native_executable_dist(_dist_target) {
        testonly = true
        dist_dir = "$root_out_dir/$target_name"
        binary = _exec_output
        deps = [
          ":$_exec_target",
        ]
        if (defined(invoker.extra_dist_files)) {
          extra_files = invoker.extra_dist_files
        }
      }
    } else {
      _library_target = "_${target_name}__library"
      _apk_target = "${target_name}_apk"
      _apk_specific_vars = [
        "android_manifest",
        "enable_multidex",
        "proguard_configs",
        "proguard_enabled",
        "use_default_launcher",
        "write_asset_list",
        "use_native_activity",
      ]
      shared_library(_library_target) {
        # Configs will always be defined since we set_defaults in BUILDCONFIG.gn.
        configs = []  # Prevent list overwriting warning.
        configs = invoker.configs
        testonly = true

        deps = []
        forward_variables_from(invoker,
                               "*",
                               _apk_specific_vars + _wrapper_script_vars +
                                   _gen_isolate_vars + [ "visibility" ])

        if (!defined(invoker.use_default_launcher) ||
            invoker.use_default_launcher) {
          deps += [ "//testing/android/native_test:native_test_native_code" ]
        }
      }
      unittest_apk(_apk_target) {
        forward_variables_from(invoker, _apk_specific_vars + [ "deps" ])
        unittests_dep = ":$_library_target"
        apk_name = invoker.target_name
        if (defined(invoker.output_name)) {
          apk_name = invoker.output_name
          unittests_binary = "lib${apk_name}.so"
          install_script_name = "install_${invoker.output_name}"
        }
        deps += [ ":$_library_target" ]

        # TODO(agrieve): Remove this data_dep once bots don't build the _apk
        #     target (post-GYP).
        # It's a bit backwards for the apk to depend on the runner script, since
        # the apk is conceptually a runtime_dep of the script. However, it is
        # currently necessary because the bots build this _apk target directly
        # rather than the group() below.
        data_deps = [
          ":$_test_runner_target",
        ]
      }

      # Incremental test targets work only for .apks.
      _incremental_test_runner_target =
          "${_output_name}_incremental__test_runner_script"
      test_runner_script(_incremental_test_runner_target) {
        forward_variables_from(invoker, _wrapper_script_vars)
        if (_generate_device_isolate) {
          isolate_file = _device_isolate_path
          deps = [
            ":$_gen_isolate_target_name",
          ]
        }
        apk_target = ":$_apk_target"
        test_name = "${_output_name}_incremental"
        test_type = "gtest"
        test_suite = _output_name
        incremental_install = true
      }
      group("${target_name}_incremental") {
        testonly = true
        datadeps = [
          ":$_incremental_test_runner_target",
        ]
        deps = [
          ":${_apk_target}_incremental",
        ]
      }
    }

    _test_runner_target = "${_output_name}__test_runner_script"
    test_runner_script(_test_runner_target) {
      forward_variables_from(invoker, _wrapper_script_vars)
      if (_generate_device_isolate) {
        isolate_file = _device_isolate_path
        deps = [
          ":$_gen_isolate_target_name",
        ]
      }

      if (_use_raw_android_executable) {
        executable_dist_dir = "$root_out_dir/$_dist_target"
      } else {
        apk_target = ":$_apk_target"
      }
      test_name = _output_name
      test_type = "gtest"
      test_suite = _output_name
    }

    group(target_name) {
      testonly = true
      deps = [
        ":$_test_runner_target",
      ]
      if (_use_raw_android_executable) {
        deps += [ ":$_dist_target" ]
      } else {
        deps += [ ":$_apk_target" ]
      }
    }

    # TODO(GYP_GONE): 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 = [
        ":${invoker.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}}",
      ]
    }

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

      # TODO(crbug.com/603102): remove this once gyp support is dropped and all
      # application uses the target name as value for BUNDLE_ID_TEST_NAME.
      if (defined(invoker.app_name)) {
        app_name = invoker.app_name
      } else {
        app_name = target_name
      }

      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 {
    executable(target_name) {
      deps = []
      forward_variables_from(invoker, "*")

      testonly = true
      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_GONE): 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 = [
        ":${invoker.target_name}",
      ]
    }

    if (defined(invoker.output_name) && target_name != invoker.output_name) {
      group("${invoker.output_name}_run") {
        testonly = true
        deps = [
          ":${invoker.target_name}",
        ]
      }
    }
  }
}
