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

if (crashpad_is_in_chromium) {
  # Prevent Chromium source assignment filters from being inherited.
  set_sources_assignment_filter([])
}

static_library("test") {
  testonly = true

  sources = [
    "errors.cc",
    "errors.h",
    "file.cc",
    "file.h",
    "filesystem.cc",
    "filesystem.h",
    "gtest_death.h",
    "hex_string.cc",
    "hex_string.h",
    "main_arguments.cc",
    "main_arguments.h",
    "multiprocess.h",
    "multiprocess_exec.cc",
    "multiprocess_exec.h",
    "process_type.cc",
    "process_type.h",
    "scoped_guarded_page.h",
    "scoped_module_handle.cc",
    "scoped_module_handle.h",
    "scoped_temp_dir.cc",
    "scoped_temp_dir.h",
    "test_paths.cc",
    "test_paths.h",
  ]

  if (crashpad_is_posix || crashpad_is_fuchsia) {
    sources += [
      "scoped_guarded_page_posix.cc",
      "scoped_temp_dir_posix.cc",
    ]

    if (!crashpad_is_fuchsia && !crashpad_is_ios) {
      sources += [
        "multiprocess_exec_posix.cc",
        "multiprocess_posix.cc",
      ]
    }
  }

  if (crashpad_is_mac || crashpad_is_ios) {
    sources += [
      "mac/mach_errors.cc",
      "mac/mach_errors.h",
    ]
  }

  if (crashpad_is_mac) {
    sources += [
      "mac/dyld.cc",
      "mac/dyld.h",
      "mac/exception_swallower.cc",
      "mac/exception_swallower.h",
      "mac/mach_multiprocess.cc",
      "mac/mach_multiprocess.h",
    ]
  }

  if (crashpad_is_ios) {
    sources -= [
      "multiprocess.h",
      "multiprocess_exec.cc",
      "multiprocess_exec.h",
    ]
  }

  if (crashpad_is_linux || crashpad_is_android) {
    sources += [
      "linux/fake_ptrace_connection.cc",
      "linux/fake_ptrace_connection.h",
      "linux/get_tls.cc",
      "linux/get_tls.h",
    ]
  }

  if (crashpad_is_win) {
    sources += [
      "multiprocess_exec_win.cc",
      "scoped_guarded_page_win.cc",
      "scoped_temp_dir_win.cc",
      "win/child_launcher.cc",
      "win/child_launcher.h",
      "win/win_child_process.cc",
      "win/win_child_process.h",
      "win/win_multiprocess.cc",
      "win/win_multiprocess.h",
      "win/win_multiprocess_with_temp_dir.cc",
      "win/win_multiprocess_with_temp_dir.h",
    ]
  }

  if (crashpad_is_fuchsia) {
    sources += [ "multiprocess_exec_fuchsia.cc" ]
  }

  public_configs = [ "..:crashpad_config" ]

  configs += [
    "../build:crashpad_is_in_chromium",
    "../build:crashpad_is_in_fuchsia",
  ]

  data = [ "test_paths_test_data_root.txt" ]

  deps = [
    "../compat",
    "../third_party/googletest:googletest",
    "../third_party/mini_chromium:base",
    "../util",
  ]

  if (crashpad_is_mac) {
    libs = [ "bsm" ]
    deps += [
      "../handler",
      "../snapshot",
    ]
  }

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

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

  if (crashpad_is_fuchsia) {
    public_deps = [ "../third_party/fuchsia" ]
    if (crashpad_is_in_fuchsia) {
      deps += [ "//sdk/lib/fdio" ]
    }
  }
}

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

    sources = [ "test_paths_test_data_root.txt" ]

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

source_set("test_test") {
  testonly = true

  sources = [
    "hex_string_test.cc",
    "main_arguments_test.cc",
    "multiprocess_exec_test.cc",
    "scoped_guarded_page_test.cc",
    "scoped_temp_dir_test.cc",
    "test_paths_test.cc",
  ]

  # TODO(crbug.com/812974): Remove !crashpad_is_fuchsia when Fuchsia is no
  # longer treated as a posix platform.
  if (crashpad_is_posix && !crashpad_is_fuchsia && !crashpad_is_ios) {
    sources += [ "multiprocess_posix_test.cc" ]
  }

  if (crashpad_is_mac) {
    sources += [ "mac/mach_multiprocess_test.cc" ]
  }

  if (crashpad_is_ios) {
    sources -= [
      "multiprocess_exec_test.cc",
      "scoped_guarded_page_test.cc",
    ]
  }

  if (crashpad_is_win) {
    sources += [
      "win/win_child_process_test.cc",
      "win/win_multiprocess_test.cc",
    ]
  }

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

  data_deps = [ ":crashpad_test_test_multiprocess_exec_test_child" ]

  if (crashpad_is_ios) {
    data_deps -= [ ":crashpad_test_test_multiprocess_exec_test_child" ]
  }
}

if (!crashpad_is_ios) {
  crashpad_executable("crashpad_test_test_multiprocess_exec_test_child") {
    sources = [ "multiprocess_exec_test_child.cc" ]

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

static_library("googlemock_main") {
  testonly = true
  sources = [ "gtest_main.cc" ]
  configs += [ "../build:crashpad_is_in_chromium" ]
  defines = [ "CRASHPAD_TEST_LAUNCHER_GOOGLEMOCK" ]
  deps = [
    ":test",
    "../third_party/googletest:googlemock",
    "../third_party/googletest:googletest",
    "../third_party/mini_chromium:base",
    "../third_party/mini_chromium:base_test_support",
  ]
  if (crashpad_is_android) {
    deps += [ "../util" ]
  }
  if (crashpad_is_ios) {
    deps += [ "ios:google_test_setup" ]
  }
}

static_library("googletest_main") {
  testonly = true
  sources = [ "gtest_main.cc" ]
  configs += [ "../build:crashpad_is_in_chromium" ]
  defines = [ "CRASHPAD_TEST_LAUNCHER_GOOGLETEST" ]
  deps = [
    ":test",
    "../third_party/googletest:googletest",
    "../third_party/mini_chromium:base",
    "../third_party/mini_chromium:base_test_support",
  ]
  if (crashpad_is_android) {
    deps += [ "../util" ]
  }
  if (crashpad_is_ios) {
    deps += [ "ios:google_test_setup" ]
  }
}
