# 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")
import("//third_party/protobuf/proto_library.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 = [
    "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_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_param_traits.cc",
    "ipc_mojo_param_traits.h",
    "ipc_sender.h",
    "ipc_sync_channel.cc",
    "ipc_sync_channel.h",
    "ipc_sync_message_filter.cc",
    "ipc_sync_message_filter.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",
    ":message_support",
    ":mojom",
    ":native_handle_type_converters",
    ":param_traits",
    "//mojo/public/cpp/bindings",
    "//mojo/public/cpp/system",
  ]

  if (!is_nacl_nonsfi) {
    sources += [ "ipc_message_protobuf_utils.h" ]

    public_deps += [ "//third_party/protobuf:protobuf_lite" ]
  }

  deps = [
    "//base",
  ]

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

component("message_support") {
  sources = [
    "handle_attachment_win.cc",
    "handle_attachment_win.h",
    "handle_win.cc",
    "handle_win.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_support_export.h",
    "ipc_mojo_handle_attachment.cc",
    "ipc_mojo_handle_attachment.h",
    "ipc_mojo_message_helper.cc",
    "ipc_mojo_message_helper.h",
    "ipc_platform_file.cc",
    "ipc_platform_file.h",
    "ipc_platform_file_attachment_posix.cc",
    "ipc_platform_file_attachment_posix.h",
    "ipc_sync_message.cc",
    "ipc_sync_message.h",
    "mach_port_attachment_mac.cc",
    "mach_port_attachment_mac.h",
    "mach_port_mac.cc",
    "mach_port_mac.h",
  ]

  if (is_fuchsia) {
    sources += [
      "handle_attachment_fuchsia.cc",
      "handle_attachment_fuchsia.h",
      "handle_fuchsia.cc",
      "handle_fuchsia.h",
    ]
  }

  defines = [ "IPC_MESSAGE_SUPPORT_IMPL" ]

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

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

source_set("native_handle_type_converters") {
  sources = [
    "native_handle_type_converters.cc",
    "native_handle_type_converters.h",
  ]
  public_deps = [
    ":message_support",
    "//mojo/public/interfaces/bindings:bindings_shared__generator",
  ]
}

mojom_component("mojom") {
  output_prefix = "ipc_mojom"
  macro_prefix = "IPC_MOJOM"
  sources = [
    "ipc.mojom",
  ]
  public_deps = [
    "//mojo/common:read_only_buffer",
  ]

  # Don't generate a variant sources since we depend on generated internal
  # bindings types and we don't generate or build variants of those.
  disable_variants = true
}

mojom("mojom_constants") {
  sources = [
    "constants.mojom",
  ]
}

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

# 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",
    ]
  }

  proto_library("test_proto") {
    sources = [
      "test_proto.proto",
    ]
  }

  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_proto",
      ":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" ]
    }

    if (is_fuchsia) {
      sources -= [
        # No AF_UNIX domain sockets on Fuchsia.
        "sync_socket_unittest.cc",
      ]
    }

    if (!is_nacl_nonsfi) {
      sources += [ "ipc_message_protobuf_utils_unittest.cc" ]
    }
  }

  test("ipc_perftests") {
    sources = [
      "ipc_cpu_perftest.cc",
      "ipc_mojo_perftest.cc",
      "ipc_perftest_messages.cc",
      "ipc_perftest_messages.h",
      "ipc_perftest_util.cc",
      "ipc_perftest_util.h",
      "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",
    ]
  }
}
