# Copyright (c) 2012 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("//build/buildflag_header.gni")
import("//build/config/nacl/config.gni")
import("//mojo/public/tools/bindings/mojom.gni")
import("//testing/test.gni")
import("//tools/ipc_fuzzer/ipc_fuzzer.gni")

declare_args() {
  # Enabling debug builds automatically sets enable_ipc_logging to true.
  enable_ipc_logging = is_debug
}

buildflag_header("ipc_features") {
  header = "ipc_features.h"

  flags = [ "IPC_MESSAGE_LOG_ENABLED=$enable_ipc_logging" ]
}

component("ipc") {
  sources = [
    "export_template.h",
    "handle_attachment_win.cc",
    "handle_attachment_win.h",
    "handle_win.cc",
    "handle_win.h",
    "ipc_channel.cc",
    "ipc_channel.h",
    "ipc_channel_common.cc",
    "ipc_channel_factory.cc",
    "ipc_channel_factory.h",
    "ipc_channel_handle.h",
    "ipc_channel_mojo.cc",
    "ipc_channel_mojo.h",
    "ipc_channel_nacl.cc",
    "ipc_channel_nacl.h",
    "ipc_channel_proxy.cc",
    "ipc_channel_proxy.h",
    "ipc_channel_reader.cc",
    "ipc_channel_reader.h",
    "ipc_export.h",
    "ipc_listener.h",
    "ipc_logging.cc",
    "ipc_logging.h",
    "ipc_message.cc",
    "ipc_message.h",
    "ipc_message_attachment.cc",
    "ipc_message_attachment.h",
    "ipc_message_attachment_set.cc",
    "ipc_message_attachment_set.h",
    "ipc_message_macros.h",
    "ipc_message_pipe_reader.cc",
    "ipc_message_pipe_reader.h",
    "ipc_message_start.h",
    "ipc_message_templates.h",
    "ipc_message_templates_impl.h",
    "ipc_message_utils.cc",
    "ipc_message_utils.h",
    "ipc_mojo_bootstrap.cc",
    "ipc_mojo_bootstrap.h",
    "ipc_mojo_handle_attachment.cc",
    "ipc_mojo_handle_attachment.h",
    "ipc_mojo_message_helper.cc",
    "ipc_mojo_message_helper.h",
    "ipc_mojo_param_traits.cc",
    "ipc_mojo_param_traits.h",
    "ipc_platform_file.cc",
    "ipc_platform_file.h",
    "ipc_platform_file_attachment_posix.cc",
    "ipc_platform_file_attachment_posix.h",
    "ipc_sender.h",
    "ipc_sync_channel.cc",
    "ipc_sync_channel.h",
    "ipc_sync_message.cc",
    "ipc_sync_message.h",
    "ipc_sync_message_filter.cc",
    "ipc_sync_message_filter.h",
    "mach_port_attachment_mac.cc",
    "mach_port_attachment_mac.h",
    "mach_port_mac.cc",
    "mach_port_mac.h",
    "message_filter.cc",
    "message_filter.h",
    "message_filter_router.cc",
    "message_filter_router.h",
    "message_router.cc",
    "message_router.h",
    "param_traits_log_macros.h",
    "param_traits_macros.h",
    "param_traits_read_macros.h",
    "param_traits_write_macros.h",
    "struct_constructor_macros.h",
    "struct_destructor_macros.h",
  ]

  if (is_nacl && !is_nacl_nonsfi) {
    sources -= [ "ipc_channel.cc" ]
  } else {
    sources -= [
      "ipc_channel_nacl.cc",
      "ipc_channel_nacl.h",
    ]
  }

  defines = [ "IPC_IMPLEMENTATION" ]

  public_deps = [
    ":ipc_features",
    ":mojom",
    ":param_traits",
    "//mojo/public/cpp/bindings",
    "//mojo/public/cpp/system",
  ]
  deps = [
    "//base",
  ]

  if (is_win || is_mac) {
    # On Windows HandleAttachmentWin needs to generate random IDs.
    # On Mac MachPortAttachmentMac needs to generate random IDs.
    deps += [ "//crypto" ]
  }

  if (enable_ipc_fuzzer) {
    public_configs = [ "//tools/ipc_fuzzer:ipc_fuzzer_config" ]
  }
}

mojom_component("mojom") {
  output_prefix = "ipc_mojom"
  macro_prefix = "IPC_MOJOM"
  sources = [
    "ipc.mojom",
  ]
}

mojom("test_interfaces") {
  testonly = true
  sources = [
    "ipc_test.mojom",
  ]
}

# This is provided as a separate target so other targets can provide param
# traits implementations without necessarily linking to all of IPC.
source_set("param_traits") {
  public = [
    "ipc_param_traits.h",
  ]
}

if (!is_ios) {
  source_set("run_all_unittests") {
    testonly = true

    sources = [
      "run_all_unittests.cc",
    ]

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

  test("ipc_tests") {
    sources = [
      "ipc_channel_mojo_unittest.cc",
      "ipc_channel_proxy_unittest.cc",
      "ipc_channel_reader_unittest.cc",
      "ipc_fuzzing_tests.cc",
      "ipc_message_attachment_set_posix_unittest.cc",
      "ipc_message_unittest.cc",
      "ipc_message_utils_unittest.cc",
      "ipc_mojo_bootstrap_unittest.cc",
      "ipc_sync_channel_unittest.cc",
      "ipc_sync_message_unittest.cc",
      "ipc_sync_message_unittest.h",
      "ipc_test_message_generator.cc",
      "ipc_test_message_generator.h",
      "ipc_test_messages.h",
      "sync_socket_unittest.cc",
    ]

    if (!is_ios) {
      sources += [ "ipc_send_fds_test.cc" ]
    }

    deps = [
      ":ipc",
      ":run_all_unittests",
      ":test_interfaces",
      ":test_support",
      "//base",
      "//base:i18n",
      "//base/test:test_support",
      "//crypto",
      "//mojo/edk/system",
      "//mojo/edk/test:test_support",
      "//testing/gtest",
    ]

    if (is_mac) {
      deps += [ "//sandbox/mac:seatbelt" ]
    }
  }

  test("ipc_perftests") {
    sources = [
      "ipc_mojo_perftest.cc",
      "run_all_perftests.cc",
    ]

    deps = [
      ":ipc",
      ":test_interfaces",
      ":test_support",
      "//base",
      "//base:i18n",
      "//base/test:test_support",
      "//mojo/edk/system",
      "//mojo/edk/test:test_support",
      "//mojo/edk/test:test_support_impl",
      "//testing/gtest",
    ]
  }

  static_library("test_support") {
    testonly = true
    sources = [
      "ipc_security_test_util.cc",
      "ipc_security_test_util.h",
      "ipc_test_base.cc",
      "ipc_test_base.h",
      "ipc_test_channel_listener.cc",
      "ipc_test_channel_listener.h",
      "ipc_test_sink.cc",
      "ipc_test_sink.h",
    ]
    public_deps = [
      ":ipc",
    ]
    deps = [
      "//base",
      "//base/test:test_support",
      "//mojo/edk/test:test_support",
      "//testing/gtest",
    ]
  }
}
