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

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_ios) {
    sources -= [
      "errors.cc",
      "errors.h",
      "file.cc",
      "file.h",
      "filesystem.cc",
      "filesystem.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) {
    sources += [
      "mac/dyld.cc",
      "mac/dyld.h",
      "mac/exception_swallower.cc",
      "mac/exception_swallower.h",
      "mac/mach_errors.cc",
      "mac/mach_errors.h",
      "mac/mach_multiprocess.cc",
      "mac/mach_multiprocess.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/gtest:gtest",
    "../third_party/mini_chromium:base",
    "../util",
  ]

  if (crashpad_is_ios) {
    deps -= [
      "../compat",
      "../util",
    ]
  }

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

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

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

if (!crashpad_is_in_starboard) {
  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",
    ]

    if (crashpad_is_ios) {
      sources -= [
        "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_win) {
      sources += [
        "win/win_child_process_test.cc",
        "win/win_multiprocess_test.cc",
      ]
    }

    deps = [
      ":test",
      "../compat",
      "../third_party/gtest:gmock",
      "../third_party/gtest:gtest",
      "../third_party/mini_chromium:base",
      "../util",
    ]

    data_deps = [ ":crashpad_test_test_multiprocess_exec_test_child" ]

    if (crashpad_is_ios) {
      deps -= [
        "../compat",
        "../util",
      ]

      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("gmock_main") {
  testonly = true
  sources = [ "gtest_main.cc" ]
  configs += [ "../build:crashpad_is_in_chromium" ]
  defines = [ "CRASHPAD_TEST_LAUNCHER_GMOCK" ]
  deps = [
    ":test",
    "../third_party/gtest:gmock",
    "../third_party/gtest:gtest",
    "../third_party/mini_chromium:base",
    "../third_party/mini_chromium:base_test_support",
  ]
  if (crashpad_is_ios) {
    deps += [ "ios:google_test_setup" ]
  }
}

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