# 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/public/cpp/bindings/tests:versioning_apptests",
    "//mojo/public/platform/native:tests",
    "//mojo/services/files/c:apptests",
    "//mojo/services/files/cpp:files_impl_apptests",
    "//mojo/services/gfx/composition/cpp:apptests",
    "//mojo/services/gfx/images/cpp:image_pipe_apptest",
    "//mojo/services/gfx/images/cpp:image_pipe_apptest",
    "//mojo/services/log/cpp:log_client_apptests",
    "//mojo/tools:message_generator",
    "//mojo/ui:apptests",
    "//mojo/ui/associates:apptests",
  ]

  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_c_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_c_bindings_unittests") {
  deps = [
    "//mojo/edk/test:run_all_unittests",
    "//mojo/public/c/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",
  ]
}
