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

mojo_edk_source_set("test_support") {
  testonly = true
  sources = [
    "multiprocess_test_helper.cc",
    "multiprocess_test_helper.h",
    "scoped_ipc_support.cc",
    "scoped_ipc_support.h",
    "test_utils.h",
    "test_utils_posix.cc",
    "test_utils_win.cc",
  ]

  deps = [
    "//base",
    "//base/test:test_support",
    "//testing/gtest",
  ]

  mojo_edk_deps = [ "mojo/edk/system" ]
}

mojo_edk_source_set("run_all_unittests") {
  testonly = true
  sources = [
    "run_all_unittests.cc",
  ]

  deps = [
    ":test_support_impl",
    "//base",
    "//base/test:test_support",
    "//testing/gtest",
  ]

  mojo_edk_deps = [ "mojo/edk/system" ]

  mojo_sdk_deps = [ "mojo/public/c/test_support" ]
}

mojo_edk_source_set("run_all_perftests") {
  testonly = true
  deps = [
    ":test_support_impl",
    "//base",
    "//base/test:test_support",
  ]

  mojo_edk_deps = [ "mojo/edk/system" ]

  mojo_sdk_deps = [ "mojo/public/c/test_support" ]

  sources = [
    "run_all_perftests.cc",
  ]
}

mojo_edk_source_set("test_support_impl") {
  testonly = true
  deps = [
    "//base",
    "//base/test:test_support",
  ]

  mojo_sdk_deps = [ "mojo/public/c/test_support" ]

  sources = [
    "test_support_impl.cc",
    "test_support_impl.h",
  ]
}

# Public SDK test targets follow. These targets are not defined within the
# public SDK itself as running the unittests requires the EDK.
# TODO(vtl): These don't really belong here. (They should be converted to
# apptests, but even apart from that these targets belong somewhere else.)

group("public_tests") {
  testonly = true
  deps = [
    ":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",
  ]

  if (mojo_use_application_in_sdk) {
    deps += [ ":mojo_public_application_unittests" ]
  }
}

if (mojo_use_application_in_sdk) {
  test("mojo_public_application_unittests") {
    deps = [
      ":run_all_unittests",
      "../../public/cpp/application/tests",
    ]
  }
}

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

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

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

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

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

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