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

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 = [
    "async_waiter.cc",
    "async_waiter.h",
    "awakable.h",
    "awakable_list.cc",
    "awakable_list.h",
    "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",
    "connection_manager.cc",
    "connection_manager.h",
    "core.cc",
    "core.h",
    "data_pipe.cc",
    "data_pipe.h",
    "data_pipe_consumer_dispatcher.cc",
    "data_pipe_consumer_dispatcher.h",
    "data_pipe_impl.cc",
    "data_pipe_impl.h",
    "data_pipe_producer_dispatcher.cc",
    "data_pipe_producer_dispatcher.h",
    "dispatcher.cc",
    "dispatcher.h",
    "endpoint_relayer.cc",
    "endpoint_relayer.h",
    "handle_signals_state.h",
    "handle_table.cc",
    "handle_table.h",
    "incoming_endpoint.cc",
    "incoming_endpoint.h",
    "local_data_pipe_impl.cc",
    "local_data_pipe_impl.h",
    "local_message_pipe_endpoint.cc",
    "local_message_pipe_endpoint.h",
    "mapping_table.cc",
    "mapping_table.h",
    "master_connection_manager.cc",
    "master_connection_manager.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",
    "remote_consumer_data_pipe_impl.cc",
    "remote_consumer_data_pipe_impl.h",
    "remote_data_pipe_ack.h",
    "remote_producer_data_pipe_impl.cc",
    "remote_producer_data_pipe_impl.h",
    "shared_buffer_dispatcher.cc",
    "shared_buffer_dispatcher.h",
    "simple_dispatcher.cc",
    "simple_dispatcher.h",
    "slave_connection_manager.cc",
    "slave_connection_manager.h",
    "transport_data.cc",
    "transport_data.h",
    "unique_identifier.cc",
    "unique_identifier.h",
    "waiter.cc",
    "waiter.h",
  ]

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

  all_dependent_configs = [ ":system_config" ]

  public_deps = [
    "../embedder",
    "../embedder:delegates",
    "../embedder:platform",
    "../../public/c/system",
  ]

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

  allow_circular_includes_from = [ "../embedder" ]
}

group("tests") {
  testonly = true
  deps = [
    ":mojo_system_unittests",
    ":mojo_message_pipe_perftests",
  ]
}

mojo_edk_source_set("test_utils") {
  testonly = true

  sources = [
    "test_utils.cc",
    "test_utils.h",
  ]

  deps = [
    "//base",
    "//base/test:test_support",
    "../../public/c/system",
  ]
}

test("mojo_system_unittests") {
  sources = [
    "../test/multiprocess_test_helper_unittest.cc",
    "awakable_list_unittest.cc",
    "channel_endpoint_id_unittest.cc",
    "channel_endpoint_unittest.cc",
    "channel_manager_unittest.cc",
    "channel_test_base.cc",
    "channel_test_base.h",
    "channel_unittest.cc",
    "connection_manager_unittest.cc",
    "core_test_base.cc",
    "core_test_base.h",
    "core_unittest.cc",
    "data_pipe_impl_unittest.cc",
    "data_pipe_unittest.cc",
    "dispatcher_unittest.cc",
    "endpoint_relayer_unittest.cc",
    "memory_unittest.cc",
    "message_in_transit_queue_unittest.cc",
    "message_in_transit_test_utils.cc",
    "message_in_transit_test_utils.h",
    "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_data_pipe_impl_unittest.cc",
    "remote_message_pipe_unittest.cc",
    "run_all_unittests.cc",
    "shared_buffer_dispatcher_unittest.cc",
    "simple_dispatcher_unittest.cc",
    "test_channel_endpoint_client.cc",
    "test_channel_endpoint_client.h",
    "unique_identifier_unittest.cc",
    "waiter_test_utils.cc",
    "waiter_test_utils.h",
    "waiter_unittest.cc",
  ]

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

  allow_circular_includes_from = [ "../embedder:embedder_unittests" ]
}

test("mojo_message_pipe_perftests") {
  sources = [
    "message_pipe_perftest.cc",
    "message_pipe_test_utils.cc",
    "message_pipe_test_utils.h",
  ]

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