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

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",
    "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",
    "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.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",
    "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:platform",
    "../../public/c/system",
  ]

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

  allow_circular_includes_from = [ "../embedder" ]
}

mojo_edk_source_set("test_utils") {
  testonly = true

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

  deps = [
    "//base",
    "//base/test:test_support",
  ]
}

# GYP version: mojo/edk/mojo_edk.gyp:mojo_system_unittests
test("mojo_system_unittests") {
  sources = [
    "../test/multiprocess_test_helper_unittest.cc",
    "awakable_list_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",
    "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",
  ]

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

  allow_circular_includes_from = [ "../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",
  ]

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

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