# 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.

if (is_android) {
  import("//build/config/android/config.gni")
  import("//build/config/android/rules.gni")
}

config("system_config") {
  defines = [
    # Ensures that dependent projects import the core functions on Windows.
    "MOJO_USE_SYSTEM_IMPL",
  ]
}

component("system") {
  output_name = "mojo_system_impl"

  sources = [
    "channel.cc",
    "channel.h",
    "channel_endpoint.cc",
    "channel_endpoint.h",
    "channel_endpoint_client.h",
    "channel_endpoint_id.cc",
    "channel_endpoint_id.h",
    "channel_info.cc",
    "channel_info.h",
    "channel_manager.cc",
    "channel_manager.h",
    "configuration.cc",
    "configuration.h",
    "core.cc",
    "core.h",
    "data_pipe.cc",
    "data_pipe.h",
    "data_pipe_consumer_dispatcher.cc",
    "data_pipe_consumer_dispatcher.h",
    "data_pipe_producer_dispatcher.cc",
    "data_pipe_producer_dispatcher.h",
    "dispatcher.cc",
    "dispatcher.h",
    "handle_signals_state.h",
    "handle_table.cc",
    "handle_table.h",
    "local_data_pipe.cc",
    "local_data_pipe.h",
    "local_message_pipe_endpoint.cc",
    "local_message_pipe_endpoint.h",
    "mapping_table.cc",
    "mapping_table.h",
    "memory.cc",
    "memory.h",
    "message_in_transit.cc",
    "message_in_transit.h",
    "message_in_transit_queue.cc",
    "message_in_transit_queue.h",
    "message_pipe.cc",
    "message_pipe.h",
    "message_pipe_dispatcher.cc",
    "message_pipe_dispatcher.h",
    "message_pipe_endpoint.cc",
    "message_pipe_endpoint.h",
    "options_validation.h",
    "platform_handle_dispatcher.cc",
    "platform_handle_dispatcher.h",
    "proxy_message_pipe_endpoint.cc",
    "proxy_message_pipe_endpoint.h",
    "raw_channel.cc",
    "raw_channel.h",
    "raw_channel_posix.cc",
    "raw_channel_win.cc",
    "shared_buffer_dispatcher.cc",
    "shared_buffer_dispatcher.h",
    "simple_dispatcher.cc",
    "simple_dispatcher.h",
    "transport_data.cc",
    "transport_data.h",
    "waiter.cc",
    "waiter.h",
    "waiter_list.cc",
    "waiter_list.h",
  ]

  defines = [
    "MOJO_SYSTEM_IMPL_IMPLEMENTATION",
    "MOJO_SYSTEM_IMPLEMENTATION",
  ]

  all_dependent_configs = [ ":system_config" ]

  public_deps = [
    "//mojo/edk/embedder",
    "//mojo/edk/embedder:platform",
    "//mojo/public/c/system",
  ]

  deps = [
    "//base",
    "//base/third_party/dynamic_annotations",
  ]

  allow_circular_includes_from = [ "//mojo/edk/embedder" ]
}

# GYP version: mojo/edk/mojo_edk.gyp:mojo_system_unittests
test("mojo_system_unittests") {
  sources = [
    "../test/multiprocess_test_helper_unittest.cc",
    "channel_endpoint_id_unittest.cc",
    "channel_manager_unittest.cc",
    "channel_unittest.cc",
    "core_test_base.cc",
    "core_test_base.h",
    "core_unittest.cc",
    "data_pipe_unittest.cc",
    "dispatcher_unittest.cc",
    "local_data_pipe_unittest.cc",
    "memory_unittest.cc",
    "message_pipe_dispatcher_unittest.cc",
    "message_pipe_test_utils.cc",
    "message_pipe_test_utils.h",
    "message_pipe_unittest.cc",
    "multiprocess_message_pipe_unittest.cc",
    "options_validation_unittest.cc",
    "platform_handle_dispatcher_unittest.cc",
    "raw_channel_unittest.cc",
    "remote_message_pipe_unittest.cc",
    "run_all_unittests.cc",
    "shared_buffer_dispatcher_unittest.cc",
    "simple_dispatcher_unittest.cc",
    # TODO(vtl): Factor test_utils.* into their own source set.
    "test_utils.cc",
    "test_utils.h",
    "waiter_list_unittest.cc",
    "waiter_test_utils.cc",
    "waiter_test_utils.h",
    "waiter_unittest.cc",
  ]

  deps = [
    ":system",
    "//base",
    "//base/test:test_support",
    "//mojo/edk/embedder:embedder_unittests",
    "//mojo/edk/test:test_support",
    "//testing/gtest",
  ]

  if (is_android) {
    deps += [
      "//testing/android:native_test_native_code",
    ]
  }

  allow_circular_includes_from = [ "//mojo/edk/embedder:embedder_unittests" ]
}

# GYP version: mojo/edk/mojo_edk.gyp:mojo_message_pipe_perftests
test("mojo_message_pipe_perftests") {
  sources = [
    "message_pipe_perftest.cc",
    "message_pipe_test_utils.h",
    "message_pipe_test_utils.cc",
    "test_utils.cc",
    "test_utils.h",
  ]

  deps = [
    ":system",
    "//base",
    "//base/test:test_support",
    "//base/test:test_support_perf",
    "//mojo/edk/test:test_support",
    "//testing/gtest",
  ]
}

if (is_android) {
  unittest_apk("mojo_system_unittests_apk") {
    deps = [
      ":mojo_system_unittests",
    ]
    unittests_dep = ":mojo_system_unittests"
  }
}
