# Copyright 2015 The Crashpad Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import("../build/crashpad_buildconfig.gni")
import("net/tls.gni")

if (crashpad_is_in_chromium) {
  import("//build/config/sanitizers/sanitizers.gni")
}

if (crashpad_is_mac || crashpad_is_ios) {
  if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
    import("//build/config/sysroot.gni")
  } else {
    import("//third_party/mini_chromium/mini_chromium/build/sysroot.gni")
  }

  action_foreach("mig") {
    script = "mach/mig.py"
    inputs = [
      "mach/mig_fix.py",
      "mach/mig_gen.py",
    ]

    if (crashpad_is_mac) {
      sources = [
        "$sysroot/usr/include/mach/exc.defs",
        "$sysroot/usr/include/mach/mach_exc.defs",
        "$sysroot/usr/include/mach/notify.defs",
        "mach/child_port.defs",
      ]
    } else if (crashpad_is_ios) {
      sources = [
        # The iOS SDK doesn’t have any .defs files. Get them directly from xnu.
        "../third_party/xnu/osfmk/mach/exc.defs",
        "../third_party/xnu/osfmk/mach/mach_exc.defs",
      ]
    }

    outputs = [
      "$target_gen_dir/mach/{{source_name_part}}User.c",
      "$target_gen_dir/mach/{{source_name_part}}Server.c",
      "$target_gen_dir/mach/{{source_name_part}}.h",
      "$target_gen_dir/mach/{{source_name_part}}Server.h",
    ]

    args = [ "{{source}}" ]
    args += rebase_path(outputs, root_build_dir)
    if (crashpad_is_in_chromium) {
      if (!use_system_xcode) {
        import("//build/config/clang/clang.gni")
        import("//build/config/mac/mac_sdk.gni")
        clang_path =
            rebase_path("$clang_base_path/bin/", root_build_dir) + "clang"
        mig_path = "$mac_bin_path" + "mig"
        migcom_path = "$mac_bin_path" + "../libexec/migcom"

        args += [
          "--clang-path",
          clang_path,
          "--mig-path",
          mig_path,
          "--migcom-path",
          migcom_path,
        ]
      }
    }
    if (sysroot != "") {
      if (crashpad_is_in_chromium) {
        # Chromium often brings along its own SDK and wants to keep paths
        # relative…
        args += [
          "--sdk",
          rebase_path(sysroot, root_build_dir),
        ]
      } else {
        # …but that’s not an option in the standalone Crashpad build, where the
        # SDK is installed on the system and is absolute. (But use rebase_path
        # just to be sure.)
        args += [
          "--sdk",
          rebase_path(sysroot, ""),
        ]
      }
    }
    args += [
      "--include",
      rebase_path("..", root_build_dir),
      "--include",
      rebase_path("../compat/mac", root_build_dir),
    ]
    if (crashpad_is_ios) {
      args += [
        "--include",
        rebase_path("../compat/ios", root_build_dir),
      ]
    }
    if (current_cpu == "x86") {
      args += [
        "--arch",
        "i386",
      ]
    } else if (current_cpu == "x64") {
      args += [
        "--arch",
        "x86_64",
      ]
    } else if (current_cpu == "arm") {
      args += [
        "--arch",
        "armv7",
      ]
    } else if (current_cpu == "arm64") {
      args += [
        "--arch",
        "arm64",
      ]
    }
  }

  static_library("mig_output") {
    deps = [ ":mig" ]
    sources = get_target_outputs(":mig")
    if (crashpad_is_in_chromium) {
      # mig output contains unreachable code, which irks -Wunreachable-code.
      configs -= [ "//build/config/compiler:chromium_code" ]
      configs += [ "//build/config/compiler:no_chromium_code" ]
    }
    public_configs = [ "..:crashpad_config" ]
  }
}

static_library("util") {
  sources = [
    "file/delimited_file_reader.cc",
    "file/delimited_file_reader.h",
    "file/directory_reader.h",
    "file/file_io.cc",
    "file/file_io.h",
    "file/file_reader.cc",
    "file/file_reader.h",
    "file/file_seeker.cc",
    "file/file_seeker.h",
    "file/file_writer.cc",
    "file/file_writer.h",
    "file/filesystem.h",
    "file/output_stream_file_writer.cc",
    "file/output_stream_file_writer.h",
    "file/scoped_remove_file.cc",
    "file/scoped_remove_file.h",
    "file/string_file.cc",
    "file/string_file.h",
    "misc/address_sanitizer.h",
    "misc/address_types.h",
    "misc/arraysize.h",
    "misc/as_underlying_type.h",
    "misc/capture_context.h",
    "misc/clock.h",
    "misc/elf_note_types.h",
    "misc/from_pointer_cast.h",
    "misc/implicit_cast.h",
    "misc/initialization_state.h",
    "misc/initialization_state_dcheck.cc",
    "misc/initialization_state_dcheck.h",
    "misc/lexing.cc",
    "misc/lexing.h",
    "misc/memory_sanitizer.h",
    "misc/metrics.cc",
    "misc/metrics.h",
    "misc/paths.h",
    "misc/pdb_structures.cc",
    "misc/pdb_structures.h",
    "misc/random_string.cc",
    "misc/random_string.h",
    "misc/range_set.cc",
    "misc/range_set.h",
    "misc/reinterpret_bytes.cc",
    "misc/reinterpret_bytes.h",
    "misc/scoped_forbid_return.cc",
    "misc/scoped_forbid_return.h",
    "misc/symbolic_constants_common.h",
    "misc/time.cc",
    "misc/time.h",
    "misc/tri_state.h",
    "misc/uuid.cc",
    "misc/uuid.h",
    "misc/zlib.cc",
    "misc/zlib.h",
    "net/http_body.cc",
    "net/http_body.h",
    "net/http_body_gzip.cc",
    "net/http_body_gzip.h",
    "net/http_headers.h",
    "net/http_multipart_builder.cc",
    "net/http_multipart_builder.h",
    "net/http_transport.cc",
    "net/http_transport.h",
    "net/url.cc",
    "net/url.h",
    "numeric/checked_address_range.cc",
    "numeric/checked_address_range.h",
    "numeric/checked_range.h",
    "numeric/checked_vm_address_range.h",
    "numeric/in_range_cast.h",
    "numeric/int128.h",
    "numeric/safe_assignment.h",
    "process/process_id.h",
    "process/process_memory.cc",
    "process/process_memory.h",
    "process/process_memory_native.h",
    "process/process_memory_range.cc",
    "process/process_memory_range.h",
    "stdlib/aligned_allocator.cc",
    "stdlib/aligned_allocator.h",
    "stdlib/map_insert.h",
    "stdlib/objc.h",
    "stdlib/string_number_conversion.cc",
    "stdlib/string_number_conversion.h",
    "stdlib/strlcpy.cc",
    "stdlib/strlcpy.h",
    "stdlib/strnlen.cc",
    "stdlib/strnlen.h",
    "stdlib/thread_safe_vector.h",
    "stream/base94_output_stream.cc",
    "stream/base94_output_stream.h",
    "stream/file_encoder.cc",
    "stream/file_encoder.h",
    "stream/file_output_stream.cc",
    "stream/file_output_stream.h",
    "stream/log_output_stream.cc",
    "stream/log_output_stream.h",
    "stream/output_stream_interface.h",
    "stream/zlib_output_stream.cc",
    "stream/zlib_output_stream.h",
    "string/split_string.cc",
    "string/split_string.h",
    "synchronization/semaphore.h",
    "thread/stoppable.h",
    "thread/thread.cc",
    "thread/thread.h",
    "thread/thread_log_messages.cc",
    "thread/thread_log_messages.h",
    "thread/worker_thread.cc",
    "thread/worker_thread.h",
  ]

  defines = [ "ZLIB_CONST" ]

  if (crashpad_is_posix || crashpad_is_fuchsia) {
    sources += [
      "file/directory_reader_posix.cc",
      "file/file_io_posix.cc",
      "file/filesystem_posix.cc",
      "misc/clock_posix.cc",
      "posix/close_stdio.cc",
      "posix/close_stdio.h",
      "posix/scoped_dir.cc",
      "posix/scoped_dir.h",
      "posix/scoped_mmap.cc",
      "posix/scoped_mmap.h",
      "posix/signals.cc",
      "posix/signals.h",
      "synchronization/semaphore_posix.cc",
      "thread/thread_posix.cc",
    ]

    if (!crashpad_is_fuchsia) {
      sources += [
        "posix/close_multiple.cc",
        "posix/close_multiple.h",
        "posix/double_fork_and_exec.cc",
        "posix/double_fork_and_exec.h",
        "posix/drop_privileges.cc",
        "posix/drop_privileges.h",
        "posix/process_info.h",

        # These map signals to and from strings. While Fuchsia defines some of
        # the common SIGx defines, signals are never raised on Fuchsia, so
        # there's need to include this mapping code.
        "posix/symbolic_constants_posix.cc",
        "posix/symbolic_constants_posix.h",
      ]
    }
  }

  if (crashpad_is_mac || crashpad_is_ios) {
    sources += [
      "mac/xattr.cc",
      "mac/xattr.h",
      "mach/composite_mach_message_server.cc",
      "mach/composite_mach_message_server.h",
      "mach/exc_client_variants.cc",
      "mach/exc_client_variants.h",
      "mach/exc_server_variants.cc",
      "mach/exc_server_variants.h",
      "mach/exception_behaviors.cc",
      "mach/exception_behaviors.h",
      "mach/exception_ports.cc",
      "mach/exception_ports.h",
      "mach/mach_extensions.cc",
      "mach/mach_extensions.h",
      "mach/mach_message.cc",
      "mach/mach_message.h",
      "mach/mach_message_server.cc",
      "mach/mach_message_server.h",
      "mach/symbolic_constants_mach.cc",
      "mach/symbolic_constants_mach.h",
      "misc/capture_context_mac.S",
      "misc/clock_mac.cc",
      "misc/paths_mac.cc",
      "synchronization/semaphore_mac.cc",
    ]
  }

  if (crashpad_is_mac) {
    sources += [
      "mac/checked_mach_address_range.h",
      "mac/launchd.h",
      "mac/launchd.mm",
      "mac/mac_util.cc",
      "mac/mac_util.h",
      "mac/service_management.cc",
      "mac/service_management.h",
      "mach/bootstrap.cc",
      "mach/bootstrap.h",
      "mach/child_port_handshake.cc",
      "mach/child_port_handshake.h",
      "mach/child_port_server.cc",
      "mach/child_port_server.h",
      "mach/child_port_types.h",
      "mach/exception_types.cc",
      "mach/exception_types.h",
      "mach/notify_server.cc",
      "mach/notify_server.h",
      "mach/scoped_task_suspend.cc",
      "mach/scoped_task_suspend.h",
      "mach/task_for_pid.cc",
      "mach/task_for_pid.h",
      "net/http_transport_mac.mm",
      "posix/process_info_mac.cc",
      "process/process_memory_mac.cc",
      "process/process_memory_mac.h",
    ]
  }

  if (crashpad_is_ios) {
    sources += [
      "ios/exception_processor.h",
      "ios/exception_processor.mm",
      "ios/ios_system_data_collector.h",
      "ios/ios_system_data_collector.mm",
    ]
  }

  deps = []

  if (!crashpad_is_in_starboard && !crashpad_is_in_native_target_build &&
      (crashpad_is_linux || crashpad_is_fuchsia || crashpad_is_android)) {
    sources += [ "net/http_transport_socket.cc" ]
    if (crashpad_use_boringssl_for_http_transport_socket) {
      defines += [ "CRASHPAD_USE_BORINGSSL" ]

      if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
        deps += [ "//third_party/boringssl" ]
      } else {
        libs = [
          "crypto",
          "ssl",
        ]
      }
    }
  }

  if (crashpad_is_android) {
    sources += [
      "linux/initial_signal_dispositions.cc",
      "linux/initial_signal_dispositions.h",
    ]
  }

  if (crashpad_is_linux || crashpad_is_android) {
    sources += [
      "linux/address_types.h",
      "linux/auxiliary_vector.cc",
      "linux/auxiliary_vector.h",
      "linux/checked_linux_address_range.h",
      "linux/direct_ptrace_connection.cc",
      "linux/direct_ptrace_connection.h",
      "linux/exception_handler_client.cc",
      "linux/exception_handler_client.h",
      "linux/exception_handler_protocol.cc",
      "linux/exception_handler_protocol.h",
      "linux/exception_information.h",
      "linux/memory_map.cc",
      "linux/memory_map.h",
      "linux/proc_stat_reader.cc",
      "linux/proc_stat_reader.h",
      "linux/proc_task_reader.cc",
      "linux/proc_task_reader.h",
      "linux/ptrace_broker.cc",
      "linux/ptrace_broker.h",
      "linux/ptrace_client.cc",
      "linux/ptrace_client.h",
      "linux/ptrace_connection.h",
      "linux/ptracer.cc",
      "linux/ptracer.h",
      "linux/scoped_pr_set_dumpable.cc",
      "linux/scoped_pr_set_dumpable.h",
      "linux/scoped_pr_set_ptracer.cc",
      "linux/scoped_pr_set_ptracer.h",
      "linux/scoped_ptrace_attach.cc",
      "linux/scoped_ptrace_attach.h",
      "linux/socket.cc",
      "linux/socket.h",
      "linux/thread_info.cc",
      "linux/thread_info.h",
      "linux/traits.h",
      "misc/capture_context_linux.S",
      "misc/paths_linux.cc",
      "misc/time_linux.cc",
      "posix/process_info_linux.cc",
      "process/process_memory_linux.cc",
      "process/process_memory_linux.h",
      "process/process_memory_sanitized.cc",
      "process/process_memory_sanitized.h",
    ]
  }

  if (crashpad_is_win) {
    sources += [
      "file/directory_reader_win.cc",
      "file/file_io_win.cc",
      "file/filesystem_win.cc",
      "misc/clock_win.cc",
      "misc/paths_win.cc",
      "misc/time_win.cc",
      "net/http_transport_win.cc",
      "process/process_memory_win.cc",
      "process/process_memory_win.h",
      "synchronization/semaphore_win.cc",
      "thread/thread_win.cc",
      "win/address_types.h",
      "win/checked_win_address_range.h",
      "win/command_line.cc",
      "win/command_line.h",
      "win/context_wrappers.h",
      "win/critical_section_with_debug_info.cc",
      "win/critical_section_with_debug_info.h",
      "win/exception_handler_server.cc",
      "win/exception_handler_server.h",
      "win/get_function.cc",
      "win/get_function.h",
      "win/get_module_information.cc",
      "win/get_module_information.h",
      "win/handle.cc",
      "win/handle.h",
      "win/initial_client_data.cc",
      "win/initial_client_data.h",
      "win/loader_lock.cc",
      "win/loader_lock.h",
      "win/module_version.cc",
      "win/module_version.h",
      "win/nt_internals.cc",
      "win/nt_internals.h",
      "win/ntstatus_logging.cc",
      "win/ntstatus_logging.h",
      "win/process_info.cc",
      "win/process_info.h",
      "win/process_structs.h",
      "win/registration_protocol_win.cc",
      "win/registration_protocol_win.h",
      "win/safe_terminate_process.h",
      "win/scoped_handle.cc",
      "win/scoped_handle.h",
      "win/scoped_local_alloc.cc",
      "win/scoped_local_alloc.h",
      "win/scoped_process_suspend.cc",
      "win/scoped_process_suspend.h",
      "win/scoped_set_event.cc",
      "win/scoped_set_event.h",
      "win/session_end_watcher.cc",
      "win/session_end_watcher.h",
      "win/termination_codes.h",
      "win/xp_compat.h",
    ]

    # There's no ml.exe yet in cross builds, so provide broken-but-not-asm
    # versions of the functions defined in .asm files.
    #
    # CaptureContext() in capture_context_broken.cc just calls CHECK(false).
    # SafeTerminateProcess() in safe_terminate_process.cc just calls regular
    # TerminateProcess() without the protection against broken third-party
    # patching of TerminateProcess().
    #
    # TODO(thakis): Use the .asm file in cross builds somehow,
    # https://crbug.com/762167.
    if (host_os == "win") {
      if (current_cpu != "arm64") {
        sources += [
          "misc/capture_context_win.asm",
          "win/safe_terminate_process.asm",
        ]
      } else {
        # Most Crashpad builds use Microsoft's armasm64.exe macro assembler for
        # .asm source files. When building in Chromium, clang-cl is used as the
        # assembler instead. Since the two assemblers recognize different
        # assembly dialects, the same .asm file can't be used for each. As a
        # workaround, use a prebuilt .obj file when the Microsoft-dialect
        # assembler isn't available.
        if (crashpad_is_in_chromium) {
          sources += [ "misc/capture_context_win_arm64.obj" ]
        } else {
          sources += [ "misc/capture_context_win_arm64.asm" ]
        }
      }
    } else {
      sources += [
        "misc/capture_context_broken.cc",
        "win/safe_terminate_process_broken.cc",
      ]
    }
  }

  if (crashpad_is_fuchsia) {
    sources += [
      "fuchsia/koid_utilities.cc",
      "fuchsia/koid_utilities.h",
      "fuchsia/scoped_task_suspend.cc",
      "fuchsia/scoped_task_suspend.h",
      "misc/capture_context_fuchsia.S",
      "misc/paths_fuchsia.cc",
      "process/process_memory_fuchsia.cc",
      "process/process_memory_fuchsia.h",
    ]
  }

  public_configs = [ "..:crashpad_config" ]

  # Include generated files starting with "util".
  if (crashpad_is_in_fuchsia) {
    include_dirs = [ "$root_gen_dir/third_party/crashpad" ]
  } else {
    include_dirs = [ "$root_gen_dir/third_party/crashpad/crashpad" ]
  }

  public_deps = [
    "../compat",
    "../third_party/zlib",
  ]

  deps += [ "../third_party/mini_chromium:base" ]

  if (crashpad_is_mac || crashpad_is_ios) {
    include_dirs += [ "$root_build_dir/gen" ]
    deps += [ ":mig_output" ]
  }

  if (crashpad_is_mac) {
    libs = [
      "bsm",
      "CoreFoundation.framework",
      "Foundation.framework",
      "IOKit.framework",
    ]
    deps += [ "../third_party/apple_cf:apple_cf" ]
  }

  if (crashpad_is_win) {
    libs = [
      "user32.lib",

      # TODO(jperaza): version.lib is needed for Windows 7 compatibility.
      # mincore.lib may be linked against instead when targeting Windows 8+.
      "version.lib",

      "winhttp.lib",
    ]

    cflags = [ "/wd4201" ]  # nonstandard extension used: nameless struct/union.

    if (current_cpu == "x86") {
      asmflags = [ "/safeseh" ]
    }
  }

  if (crashpad_is_fuchsia) {
    public_deps += [ "../third_party/fuchsia" ]
  }

  if (crashpad_is_android || crashpad_is_linux) {
    deps += [ "../third_party/lss" ]
  }

  if (crashpad_is_in_starboard) {
    public_deps += [ "//starboard:starboard_headers_only" ]
    configs += [ ":crashpad_starboard_config" ]
    configs -= [ "//build/config/compiler:default_include_dirs" ]
  }

  configs += [ "..:disable_ubsan" ]
}

if (!crashpad_is_android && !crashpad_is_ios && !crashpad_is_in_starboard &&
    !crashpad_is_in_native_target_build) {
  crashpad_executable("http_transport_test_server") {
    testonly = true
    sources = [ "net/http_transport_test_server.cc" ]

    deps = [
      ":util",
      "../third_party/cpp-httplib",
      "../third_party/mini_chromium:base",
      "../third_party/zlib",
      "../tools:tool_support",
    ]

    if (crashpad_is_standalone) {
      remove_configs = [ "//third_party/mini_chromium/mini_chromium/build:Wexit_time_destructors" ]
    }

    if (crashpad_is_win) {
      libs = [ "ws2_32.lib" ]
    }

    if (crashpad_use_boringssl_for_http_transport_socket) {
      defines = [ "CRASHPAD_USE_BORINGSSL" ]

      if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
        deps += [ "//third_party/boringssl" ]
      } else {
        libs = [
          "crypto",
          "ssl",
        ]
      }
    }
  }
}

if (!crashpad_is_in_starboard && !crashpad_is_in_native_target_build) {
source_set("util_test") {
  testonly = true

  sources = [
    "file/delimited_file_reader_test.cc",
    "file/directory_reader_test.cc",
    "file/file_io_test.cc",
    "file/file_reader_test.cc",
    "file/filesystem_test.cc",
    "file/string_file_test.cc",
    "misc/arraysize_test.cc",
    "misc/capture_context_test.cc",
    "misc/capture_context_test_util.h",
    "misc/clock_test.cc",
    "misc/from_pointer_cast_test.cc",
    "misc/initialization_state_dcheck_test.cc",
    "misc/initialization_state_test.cc",
    "misc/paths_test.cc",
    "misc/random_string_test.cc",
    "misc/range_set_test.cc",
    "misc/reinterpret_bytes_test.cc",
    "misc/scoped_forbid_return_test.cc",
    "misc/time_test.cc",
    "misc/uuid_test.cc",
    "net/http_body_gzip_test.cc",
    "net/http_body_test.cc",
    "net/http_body_test_util.cc",
    "net/http_body_test_util.h",
    "net/http_multipart_builder_test.cc",
    "net/url_test.cc",
    "numeric/checked_address_range_test.cc",
    "numeric/checked_range_test.cc",
    "numeric/in_range_cast_test.cc",
    "numeric/int128_test.cc",
    "process/process_memory_range_test.cc",
    "process/process_memory_test.cc",
    "stdlib/aligned_allocator_test.cc",
    "stdlib/map_insert_test.cc",
    "stdlib/string_number_conversion_test.cc",
    "stdlib/strlcpy_test.cc",
    "stdlib/strnlen_test.cc",
    "stdlib/thread_safe_vector_test.cc",
    "stream/base94_output_stream_test.cc",
    "stream/file_encoder_test.cc",
    "stream/log_output_stream_test.cc",
    "stream/test_output_stream.cc",
    "stream/test_output_stream.h",
    "stream/zlib_output_stream_test.cc",
    "string/split_string_test.cc",
    "synchronization/semaphore_test.cc",
    "thread/thread_log_messages_test.cc",
    "thread/thread_test.cc",
    "thread/worker_thread_test.cc",
  ]

  if (!crashpad_is_android && !crashpad_is_ios) {
    # Android requires an HTTPTransport implementation.
    sources += [ "net/http_transport_test.cc" ]
  }

  if (crashpad_is_posix || crashpad_is_fuchsia) {
    if (!crashpad_is_fuchsia && !crashpad_is_ios) {
      sources += [
        "posix/process_info_test.cc",
        "posix/signals_test.cc",
        "posix/symbolic_constants_posix_test.cc",
      ]
    }
    sources += [ "posix/scoped_mmap_test.cc" ]
  }

  if (crashpad_is_mac || crashpad_is_ios) {
    sources += [
      "mac/xattr_test.cc",
      "mach/composite_mach_message_server_test.cc",
      "mach/exc_server_variants_test.cc",
      "mach/exception_behaviors_test.cc",
      "mach/mach_extensions_test.cc",
      "mach/mach_message_test.cc",
      "mach/symbolic_constants_mach_test.cc",
      "misc/capture_context_test_util_mac.cc",
    ]
  }

  if (crashpad_is_mac) {
    sources += [
      "mac/launchd_test.mm",
      "mac/mac_util_test.mm",
      "mac/service_management_test.mm",
      "mach/bootstrap_test.cc",
      "mach/child_port_handshake_test.cc",
      "mach/child_port_server_test.cc",
      "mach/exc_client_variants_test.cc",
      "mach/exception_ports_test.cc",
      "mach/exception_types_test.cc",
      "mach/mach_message_server_test.cc",
      "mach/notify_server_test.cc",
      "mach/scoped_task_suspend_test.cc",
      "process/process_memory_mac_test.cc",
    ]
  }

  if (crashpad_is_ios) {
    sources += [ "ios/exception_processor_test.mm" ]

    sources -= [
      "process/process_memory_range_test.cc",
      "process/process_memory_test.cc",
    ]
  }

  if (crashpad_is_linux || crashpad_is_android) {
    sources += [
      "linux/auxiliary_vector_test.cc",
      "linux/memory_map_test.cc",
      "linux/proc_stat_reader_test.cc",
      "linux/proc_task_reader_test.cc",
      "linux/ptrace_broker_test.cc",
      "linux/ptracer_test.cc",
      "linux/scoped_ptrace_attach_test.cc",
      "linux/socket_test.cc",
      "misc/capture_context_test_util_linux.cc",
      "process/process_memory_sanitized_test.cc",
    ]
  }

  if (crashpad_is_fuchsia) {
    sources += [ "misc/capture_context_test_util_fuchsia.cc" ]
  }

  if (crashpad_is_win) {
    sources += [
      "misc/capture_context_test_util_win.cc",
      "win/command_line_test.cc",
      "win/critical_section_with_debug_info_test.cc",
      "win/exception_handler_server_test.cc",
      "win/get_function_test.cc",
      "win/handle_test.cc",
      "win/initial_client_data_test.cc",
      "win/loader_lock_test.cc",
      "win/process_info_test.cc",
      "win/registration_protocol_win_test.cc",
      "win/safe_terminate_process_test.cc",
      "win/scoped_process_suspend_test.cc",
      "win/session_end_watcher_test.cc",
    ]

    if (crashpad_is_in_chromium && is_asan && is_component_build) {
      # TODO(crbug.com/856174): Re-enable these once Windows ASan is fixed.
      sources -= [ "stdlib/string_number_conversion_test.cc" ]
    }
  }

  data = [
    "net/testdata/ascii_http_body.txt",
    "net/testdata/binary_http_body.dat",
    "net/testdata/crashpad_util_test_cert.pem",
    "net/testdata/crashpad_util_test_key.pem",
  ]

  deps = [
    ":util",
    "../client",
    "../compat",
    "../test",
    "../third_party/googletest:googlemock",
    "../third_party/googletest:googletest",
    "../third_party/mini_chromium:base",
    "../third_party/zlib",
  ]

  if (!crashpad_is_android && !crashpad_is_ios) {
    data_deps = [ ":http_transport_test_server" ]

    if (crashpad_use_boringssl_for_http_transport_socket) {
      defines = [ "CRASHPAD_USE_BORINGSSL" ]
    }
  }

  if (crashpad_is_mac) {
    libs = [ "Foundation.framework" ]
  }

  if (crashpad_is_ios) {
    deps += [ ":util_test_bundle_data" ]
  }

  if (crashpad_is_android || crashpad_is_linux) {
    deps += [ "../third_party/lss" ]
  }

  if (crashpad_is_win) {
    libs = [
      "rpcrt4.lib",
      "dbghelp.lib",
    ]
    data_deps += [
      ":crashpad_util_test_loader_lock_test",
      ":crashpad_util_test_process_info_test_child",
      ":crashpad_util_test_safe_terminate_process_test_child",
    ]
  }
}
}

if (crashpad_is_ios) {
  bundle_data("util_test_bundle_data") {
    testonly = true

    sources = [
      "net/testdata/ascii_http_body.txt",
      "net/testdata/binary_http_body.dat",
    ]

    outputs = [ "{{bundle_resources_dir}}/crashpad_test_data/" +
                "{{source_root_relative_dir}}/{{source_file_part}}" ]
  }
}

if (crashpad_is_win) {
  crashpad_executable("crashpad_util_test_process_info_test_child") {
    testonly = true
    sources = [ "win/process_info_test_child.cc" ]
  }

  crashpad_executable("crashpad_util_test_safe_terminate_process_test_child") {
    testonly = true
    sources = [ "win/safe_terminate_process_test_child.cc" ]
  }

  crashpad_loadable_module("crashpad_util_test_loader_lock_test") {
    testonly = true
    sources = [ "win/loader_lock_test_dll.cc" ]
    deps = [ ":util" ]
  }
}

if (crashpad_is_in_starboard) {
  config("crashpad_starboard_config") {
    include_dirs = [ "//third_party/mini_chromium" ]
    cflags = [ "-isystem" + rebase_path("../../..", root_build_dir) ]
  }
}
