# 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")

mojo_edk_source_set("test_support") {
  testonly = true
  sources = [
    "multiprocess_test_helper.cc",
    "multiprocess_test_helper.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.

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