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

# Library of basic things not provided by the C/C++ standard libraries. (These
# are mostly platform independent. Note: This must not depend on
# //mojo/edk/platform. TODO(vtl): Maybe the things that aren't really platform
# independent should be moved to //mojo/edk/platform.)
mojo_edk_source_set("util") {
  sources = [
    "command_line.cc",
    "command_line.h",
    "cond_var.cc",
    "cond_var.h",
    "gtest_prod_utils.h",
    "logging_internal.cc",
    "logging_internal.h",
    "make_unique.h",
    "mutex.cc",
    "mutex.h",
    "ref_counted.h",
    "ref_counted_internal.h",
    "ref_ptr.h",
    "ref_ptr_internal.h",
    "scoped_file.h",
    "string_number_conversions.cc",
    "string_number_conversions.h",
    "string_printf.cc",
    "string_printf.h",
    "thread_annotations.h",
    "thread_checker.h",
    "waitable_event.cc",
    "waitable_event.h",
    "weak_ptr.h",
    "weak_ptr_internal.cc",
    "weak_ptr_internal.h",
  ]

  mojo_sdk_public_deps = [ "mojo/public/cpp/system" ]
}

# Unit tests for :util. For testing purposes, allow dependence on
# //mojo/edk/platform; however, using //mojo/edk/platform requires choosing an
# implementation to get a test binary, which is done below in
# :mojo_edk_util_unittests.
mojo_edk_source_set("unittests") {
  testonly = true

  sources = [
    "command_line_unittest.cc",
    "cond_var_unittest.cc",
    "mutex_unittest.cc",
    "ref_counted_unittest.cc",
    "string_number_conversions_unittest.cc",
    "string_printf_unittest.cc",
    "thread_annotations_unittest.cc",
    "thread_checker_unittest.cc",
    "waitable_event_unittest.cc",
    "weak_ptr_unittest.cc",
  ]

  deps = [
    ":util",
    "//testing/gtest",
  ]

  mojo_sdk_deps = [ "mojo/public/cpp/system" ]

  mojo_edk_deps = [
    "mojo/edk/platform",
    "mojo/edk/platform:test_platform",
    "mojo/edk/system/test",
  ]
}

# Test binary for :util, using //mojo/edk/base_edk. TODO(vtl): Maybe this target
# should be in //mojo/edk/base_edk/BUILD.gn instead.
mojo_edk_unittests("mojo_edk_util_unittests") {
  deps = [
    ":unittests",
  ]

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

mojo_edk_source_set("perftests") {
  testonly = true
  mojo_edk_visibility = [ "mojo/edk/system:mojo_edk_system_perftests" ]

  sources = [
    "ref_counted_perftest.cc",
  ]

  deps = [
    ":util",
    "//testing/gtest",
  ]

  mojo_edk_deps = [
    "mojo/edk/platform:test_platform",
    "mojo/edk/system/test",
    "mojo/edk/system/test:perf",
  ]
}
