# Copyright 2017 The Crashpad Authors
#
# 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("build/test.gni")
import("util/net/tls.gni")

config("crashpad_config") {
  include_dirs = [
    ".",
    root_gen_dir,
  ]
}

if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
  test("crashpad_tests") {
    deps = [
      "client:client_test",
      "minidump:minidump_test",
      "snapshot:snapshot_test",
      "test:googlemock_main",
      "test:test_test",
      "util:util_test",
    ]
    if (!crashpad_is_ios && !crashpad_is_fuchsia) {
      deps += [ "handler:handler_test" ]
    }
    if (crashpad_is_in_fuchsia) {
      # TODO(fuchsia:46559): Fix the leaks and remove this.
      deps += [ "//build/config/sanitizers:suppress-lsan.DO-NOT-USE-THIS" ]
      # TODO(fxbug.dev/108368): Remove this once the underlying issue is addressed.
      exclude_toolchain_tags = [ "hwasan" ]
    }
    if (crashpad_is_android) {
      use_raw_android_executable = true

      copy("crashpad_test_data") {
        testonly = true
        sources = [
          "test/test_paths_test_data_root.txt",
          "util/net/testdata/ascii_http_body.txt",
          "util/net/testdata/binary_http_body.dat",
        ]

        outputs = [ "$root_out_dir/crashpad_test_data/{{source}}" ]
      }

      deps += [ ":crashpad_test_data" ]

      extra_dist_files = [
        "$root_out_dir/crashpad_handler",
        "$root_out_dir/crashpad_test_test_multiprocess_exec_test_child",
        "$root_out_dir/crashpad_test_data",
      ]
    }
  }

  if (crashpad_is_in_fuchsia) {
    import("//build/components.gni")
    fuchsia_test_component("crashpad-test-component") {
      manifest = "test/fuchsia_crashpad_tests.cml"
      deps = [
        ":crashpad-test-resources",
        ":crashpad_tests",
        "snapshot:crashpad_snapshot_test_both_dt_hash_styles",
        "snapshot:crashpad_snapshot_test_module",
        "snapshot:crashpad_snapshot_test_module_large",
        "snapshot:crashpad_snapshot_test_module_small",
        "test:crashpad_test_test_multiprocess_exec_test_child",
        "util:http_transport_test_server",
      ]
    }

    fuchsia_test_package("crashpad-test") {
      test_components = [ ":crashpad-test-component" ]

      deps = [
        "//src/connectivity/network/dns:component",
        "//src/connectivity/network/netstack:component",
      ]

      test_specs = {
        log_settings = {
          max_severity = "FATAL"
        }
      }
    }

    _resource_files = [
      "test/test_paths_test_data_root.txt",
      "util/net/testdata/ascii_http_body.txt",
      "util/net/testdata/binary_http_body.dat",
    ]
    if (crashpad_use_boringssl_for_http_transport_socket) {
      _resource_files += [
        "util/net/testdata/crashpad_util_test_cert.pem",
        "util/net/testdata/crashpad_util_test_key.pem",
      ]
    }

    _resources = []
    foreach(resource_file, _resource_files) {
      _resource_file_target = string_replace(resource_file, "/", "_")
      resource("${_resource_file_target}") {
        sources = [ "${resource_file}" ]
        outputs = [ "data/${resource_file}" ]
      }
      _resources += [ ":${_resource_file_target}" ]
    }

    group("crashpad-test-resources") {
      deps = _resources
    }

    group("tests") {
      testonly = true

      deps = [ ":crashpad-test" ]
    }
  }
} else if (crashpad_is_standalone || crashpad_is_external) {
  test("crashpad_client_test") {
    deps = [
      "client:client_test",
      "test:googlemock_main",
    ]
  }

  test("crashpad_handler_test") {
    deps = [
      "handler:handler_test",
      "test:googletest_main",
    ]
    if (crashpad_is_ios || crashpad_is_fuchsia) {
      deps -= [ "handler:handler_test" ]
    }
  }

  test("crashpad_minidump_test") {
    deps = [
      "minidump:minidump_test",
      "test:googletest_main",
    ]
  }

  test("crashpad_snapshot_test") {
    deps = [
      "snapshot:snapshot_test",
      "test:googlemock_main",
    ]
  }

  test("crashpad_test_test") {
    deps = [
      "test:googlemock_main",
      "test:test_test",
    ]
  }

  test("crashpad_util_test") {
    deps = [
      "test:googlemock_main",
      "util:util_test",
    ]
  }
}

if (crashpad_is_ios) {
  group("ios_xcuitests") {
    testonly = true
    deps = [ "test/ios:all_tests" ]
  }
}
