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

    if (mojo_use_nacl_nonsfi) {
      deps += [
        "//mojo/nacl/nonsfi:mojo_nacl_nonsfi",
        "//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/embedder/test:dart_unittests",
    "//mojo/edk:tests",
    "//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/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",
  ]
}
