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

import("//build/config/chrome_build.gni")
import("//build/config/ui.gni")
import("//testing/test.gni")

if (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.gni")
}

# Convenience meta-target for all of Blimp's production & test code.
group("blimp") {
  # In spite of the name, this really just means that non-test targets
  # cannot depend on this one, and that it can depend on test targets,
  # which fits how we intend to use it.
  testonly = true

  deps = [
    ":blimp_tests",
    "//blimp/client",
    "//blimp/common",
  ]

  if (is_android) {
    deps += [
      "//blimp/client:blimp_apk",
      "//blimp/client:blimp_apk_incremental",
    ]
  }

  if (is_linux) {
    deps += [
      ":client_engine_integration",
      "//blimp/engine",
      "//blimp/engine:blimp_engine_bundle",
    ]

    if (is_official_build) {
      deps += [ "//blimp/engine:blimp_symbols" ]
    }
  }

  if (is_linux && !is_chromeos && use_x11) {
    deps += [ "//blimp/client:blimp_shell" ]
  }
}

# Builds all Blimp test code (unit tests, APKs).
group("blimp_tests") {
  testonly = true

  deps = [
    ":blimp_unittests",
  ]

  if (is_android) {
    deps += [ "//blimp/client:blimp_test_apk" ]
  }

  if (is_linux) {
    deps += [ ":blimp_browsertests" ]
  }
}

test("blimp_unittests") {
  deps = [
    "//blimp/client:app_unit_tests",
    "//blimp/client/core:unit_tests",
    "//blimp/common:unit_tests",
    "//blimp/net:unit_tests",
    "//blimp/test:run_all_unittests",
  ]

  if (is_linux) {
    deps += [ "//blimp/engine:unit_tests" ]
  }

  if (is_android) {
    deps += [ ":blimp_unittests_java_deps" ]
  }
}

if (is_android) {
  # This is the list of targets that the tests need to depend on in order to add
  # the java classes for their native counterparts to the test apk.
  # We could directly include them in the test target, but in order to
  # keep the visibility of the //blimp/client/core:core_java target restricted,
  # we make it visible to this group (which is testonly) and depend on this
  # group instead.
  # We could not add ":blimp_unittests" to the visibility list of
  # //blimp/client/core:core_java, since the targets that actually need to
  # depend on it are generated by the test template (see testing/test.gni). So
  # it was better to add this indirection and expose it to this testonly target,
  # which can be used in this file only.
  java_group("blimp_unittests_java_deps") {
    testonly = true
    visibility = [ ":*" ]

    deps = [
      "//base:base_java",
      "//blimp/client/core:core_java",
      "//net/android:net_java",
      "//ui/android:ui_java",
    ]
  }
}

if (is_linux) {
  test("blimp_browsertests") {
    deps = [
      "//blimp/engine:browser_tests",
      "//tools/xdisplaycheck",
    ]
    data = [
      "test/data/",
    ]
  }

  _blimp_engine_env_tests_runtime_deps =
      "$root_gen_dir/blimp-tests.runtime_deps"
  _rebased_blimp_engine_env_tests_runtime_deps =
      rebase_path(_blimp_engine_env_tests_runtime_deps, root_out_dir)

  # This group contains Blimp Engine tests and tests of the various components
  # the Blimp Engine depends on.  The idea is that if this group of tests pass
  # on a given system there is a high probability the Engine will also work on
  # that platform.
  group("blimp_engine_env_tests_group") {
    testonly = true

    # Additional environment test targets should be added here.
    # Executable targets and those executable targets' transitive
    # dependencies are not considered unless that executable is listed in
    # "data_deps". Otherwise, GN assumes that the executable (and
    # everything it requires) is a build-time dependency only.
    data_deps = [
      ":blimp_browsertests",
      ":blimp_unittests",
      "//base:base_unittests",
      "//breakpad:generate_test_dump",
      "//content/test:content_unittests",
      "//ipc:ipc_tests",
      "//net:net_unittests",
      "//sandbox/linux:sandbox_linux_unittests",
    ]

    write_runtime_deps = _blimp_engine_env_tests_runtime_deps
  }

  _blimp_engine_env_tests_manifest = "$root_gen_dir/blimp-tests-manifest.txt"
  _rebased_blimp_engine_env_tests_manifest =
      rebase_path(_blimp_engine_env_tests_manifest, root_out_dir)
  _rebased_blimp_engine_env_tests_blacklist =
      rebase_path("//blimp/tools/tests-manifest-blacklist.txt")

  action("generate_blimp_engine_env_tests_manifest") {
    testonly = true
    script = "//blimp/tools/generate-target-manifest.py"
    args = [
      "--blacklist",
      _rebased_blimp_engine_env_tests_blacklist,
      "--runtime-deps-file",
      _rebased_blimp_engine_env_tests_runtime_deps,
      "--output",
      _rebased_blimp_engine_env_tests_manifest,
    ]
    inputs = [
      _rebased_blimp_engine_env_tests_blacklist,
      _blimp_engine_env_tests_runtime_deps,
    ]
    outputs = [
      _blimp_engine_env_tests_manifest,
    ]

    # By specifying a dependency (not a data_dependency) on :blimp_tests_group,
    # we can be sure that everything is built before the action is
    # complete (though not necessarily before we generate the manifest
    # itself).
    deps = [
      ":blimp_engine_env_tests_group",
    ]
  }

  # Builds and bundles the tests into a tarball that can be used to build a
  # Docker image.
  action("blimp_engine_env_tests_bundle") {
    testonly = true
    script = "//blimp/tools/create-bundle.py"

    # These form the arguments to the script.
    _rebased_out_dir = rebase_path(root_out_dir)
    _rebased_dockerfile = rebase_path("//blimp/engine/testing/Dockerfile")
    _rebased_dockerfile_base = rebase_path("//blimp/tools/Dockerfile.base")
    _bundle = "$root_out_dir/blimp_engine_env_tests_bundle.tar.gz"

    # Depending on this ensures that both the manifest is generated
    # and everything listed in the manifest has been built.
    deps = [
      ":generate_blimp_engine_env_tests_manifest",
    ]

    sources = [
      _blimp_engine_env_tests_manifest,
      _rebased_dockerfile,
      _rebased_dockerfile_base,
    ]
    outputs = [
      _bundle,
    ]
    args = [
      "--build-dir",
      _rebased_out_dir,
      "--filelist",
      _rebased_dockerfile,
      _rebased_dockerfile_base,
      "--manifest",
      _rebased_blimp_engine_env_tests_manifest,
      "--output",
      rebase_path(_bundle),
      "--tar-contents-rooted-in",
      rebase_path("//"),
    ]
  }

  # Wraps and Builds the Blimp client and engine integration script and
  # ends up in root_out_dir/bin.
  action("client_engine_integration") {
    _wrapped_script = "//blimp/tools/client_engine_integration.py"

    _script_basename = get_path_info(_wrapped_script, "name")
    _output_path = "${root_out_dir}/bin/${_script_basename}"

    script = "//build/android/gyp/create_tool_wrapper.py"
    inputs = [
      _wrapped_script,
    ]
    outputs = [
      _output_path,
    ]

    args = [
      "--output",
      rebase_path(_output_path, root_build_dir),
      "--target",
      rebase_path(_wrapped_script, root_build_dir),
      "--output-directory",
      rebase_path(root_out_dir, root_build_dir),
      "--flag-name=--output-linux-directory",
    ]
  }
}
