# 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/nacl/config.gni")
import("//build/module_args/mojo.gni")
import("//mojo/public/mojo.gni")
import("//testing/test.gni")

declare_args() {
  mojo_use_go = false
}

group("mojo") {
  # Meta-target, don't link into production code.
  testonly = true
  deps = [
    ":system_thunks",
    ":tests",
    "//mojo/common",
    "//mojo/dart",
    "//mojo/public",
    "//mojo/services",
  ]

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

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

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

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

    if (mojo_use_nacl_nonsfi) {
      deps += [
        "//mojo/nacl/nonsfi:mojo_nacl",
        "//mojo/nacl/nonsfi:mojo_nacl_tests_nonsfi",
      ]
    }
  }
}

group("tests") {
  testonly = true
  deps = [
    ":public_tests",
    "//mojo/common:mojo_common_unittests",
    "//mojo/converters:mojo_converters_unittests",
    "//mojo/dart:tests",
    "//mojo/edk:tests",
    "//mojo/file_utils:file_utils_apptests",
    "//mojo/gles2:mgl_unittests",
    "//mojo/gpu:apptests",
    "//mojo/public/cpp/bindings/tests:versioning_apptests",
    "//mojo/services/files/c:apptests",
    "//mojo/services/files/cpp:files_impl_apptests",
    "//mojo/services/log/cpp:log_client_apptests",
    "//mojo/services/view_manager/cpp/tests:mojo_view_manager_lib_unittests",
    "//mojo/tools:message_generator",
  ]

  if (is_linux || is_android) {
    deps += [ "//mojo/converters/surfaces/tests:mojo_surfaces_lib_unittests" ]
  }

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

# This archives the system thunks implementation for exporting to SDK consumers.
static_library("system_thunks") {
  complete_static_lib = true
  deps = [
    "//mojo/public/platform/native:system",
  ]
}

# Public SDK test targets follow. These targets are not defined within the
# public SDK itself since they are built as native executable binaries, needing
# to be linked with the EDK.
# TODO(vtl): They should be converted to "apptests", i.e., run as apps.

group("public_tests") {
  testonly = true
  deps = [
    ":mojo_public_application_unittests",
    ":mojo_public_bindings_perftests",
    ":mojo_public_bindings_unittests",
    ":mojo_public_environment_unittests",
    ":mojo_public_system_perftests",
    ":mojo_public_system_unittests",
    ":mojo_public_utility_unittests",
    ":mojo_system_impl_private_unittests",
  ]
}

test("mojo_public_application_unittests") {
  deps = [
    "//mojo/edk/test:run_all_unittests",
    "//mojo/public/cpp/application/tests",
  ]
}

test("mojo_public_bindings_unittests") {
  deps = [
    "//mojo/edk/test:run_all_unittests",
    "//mojo/public/cpp/bindings/tests",
  ]
}

test("mojo_public_bindings_perftests") {
  deps = [
    "//mojo/edk/test:run_all_perftests",
    "//mojo/public/cpp/bindings/tests:perftests",
  ]
}

test("mojo_public_environment_unittests") {
  deps = [
    "//mojo/edk/test:run_all_unittests",
    "//mojo/public/cpp/environment/tests",
  ]
}

test("mojo_public_system_perftests") {
  deps = [
    "//mojo/edk/test:run_all_perftests",
    "//mojo/public/c/system/tests:perftests",
  ]
}

test("mojo_public_system_unittests") {
  deps = [
    "//mojo/edk/test:run_all_unittests",
    "//mojo/public/cpp/system/tests",
  ]
}

test("mojo_public_utility_unittests") {
  deps = [
    "//mojo/edk/test:run_all_unittests",
    "//mojo/public/cpp/utility/tests",
  ]
}

test("mojo_system_impl_private_unittests") {
  deps = [
    "//mojo/edk/test:run_all_unittests",
    "//mojo/public/platform/native:system_impl_private_tests",
  ]
}
