# Copyright 2014 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/ui.gni")
import("//build/module_args/mojo.gni")
import("//mojo/public/mojo.gni")

# TODO(beng): this meta target should probably move to the root dir's BUILD.gn.
group("mojo") {
  # Meta-target, don't link into production code.
  testonly = true
  declare_args() {
    mojo_use_go = false

    # TODO(ncbray): support ASAN once NaCl's GN build is unforked.
    mojo_use_nacl = is_linux && !is_asan
  }
  deps = [
    ":tests",
    "//benchmarks",
    "//examples",
    "//mojo/common",
    "//mojo/dart/apptest",
    "//mojo/dart/apptest:apptest_pkg",
    "//mojo/dart/mojom",
    "//mojo/dart/mojo_services",
    "//mojo/dart/observatory_test",
    "//mojo/public",
    "//mojo/services",
    "//services",
  ]

  if (is_android) {
    deps += [
      "//mojo/android",
      "//mojo/java",
      "//mojo/tools/android_shortcuts",
      "//mojo/tools:remote_file_reader",
    ]
  }

  if (is_linux && mojo_use_go) {
    deps += [ "//mojo/go" ]
  }

  if (is_linux) {
    deps += [ "//mojo/python" ]
  }

  if (mojo_use_nacl) {
    deps += [
      "//mojo/nacl:mojo_nacl",
      "//mojo/nacl:mojo_nacl_tests",
    ]
  }
}

group("tests") {
  testonly = true
  deps = [
    "//mojo/common:mojo_common_unittests",
    "//mojo/converters/surfaces/tests:mojo_surfaces_lib_unittests",
    "//mojo/edk/system:tests",
    "//mojo/edk/test:public_tests",
    "//mojo/dart/embedder/test:dart_unittests",
    "//mojo/public/cpp/bindings/tests:versioning_apptests",
    "//mojo/services/view_manager/public/cpp/tests:mojo_view_manager_lib_unittests",
    "//mojo/tests:mojo_task_tracker_perftests",
    "//mojo/tools:message_generator",
    "//services/asset_bundle:apptests",
    "//services/clipboard:apptests",
    "//services/dart/dart_apptests",
    "//services/files:apptests",
    "//mojo/gpu:apptests",
    "//mojo/services/files/public/c:apptests",
    "//services/authenticating_url_loader_interceptor:apptests",
    "//services/http_server:apptests",
    "//services/prediction:apptests",
    "//services/reaper:tests",
    "//services/url_response_disk_cache:tests",
    "//services/view_manager:mojo_view_manager_client_apptests",
    "//services/view_manager:view_manager_service_apptests",
    "//services/view_manager:view_manager_service_unittests",
    "//services/window_manager:window_manager_apptests",
    "//services/window_manager:window_manager_unittests",
    "//shell:apptests",
  ]

  if (is_linux) {
    deps += [ "//services/python:python_apptests" ]
  }

  if (is_android) {
    deps += [ "//services/notifications:apptests" ]
  }

  # TODO(jamesr): We only support building V8 snapshot data on a linux host since it
  # needs a 32 bit toolchain and we don't have one configured for mac hosts.
  if (host_os == "linux") {
    deps += [
      "//mojo/edk/js:tests",
      "//services/js:js_apptests",
      "//services/js:js_services_unittests",
    ]
  }

  if (mojo_use_prebuilt_network_service) {
    deps += [ "//mojo/public/tools:copy_network_service_apptests" ]
  }
}
