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

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

# TODO(fuchsia:46805): Remove this once instances of UB have been cleaned up.
config("disable_ubsan") {
  if (crashpad_is_in_fuchsia) {
    cflags = [ "-fno-sanitize=undefined" ]
  }
  visibility = [
    "snapshot:snapshot",
    "minidump:minidump_test",
    "third_party/googletest:googletest",
    "util:util",
  ]
}

if (crashpad_is_in_chromium || crashpad_is_in_fuchsia) {
  test("crashpad_tests") {
    deps = [
      "client:client_test",
      "minidump:minidump_test",
      "test:googlemock_main",
      "test:test_test",
    ]
    if (!crashpad_is_ios) {
      deps += [ "snapshot:snapshot_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" ]
    }
    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/package.gni")
    package("crashpad_test") {
      testonly = true

      deps = [
        ":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",
      ]

      tests = [
        {
          name = "crashpad_tests"
        },
      ]

      meta = [
        {
          path = "test/fuchsia_crashpad_tests.cmx"
          dest = "crashpad_tests.cmx"
        },
      ]

      binaries = [
        {
          name = "crashpad_test_test_multiprocess_exec_test_child"
          dest = "crashpad_test_test_multiprocess_exec_test_child"
        },
        {
          name = "http_transport_test_server"
          dest = "http_transport_test_server"
        },
      ]

      loadable_modules = [
        {
          name = "crashpad_snapshot_test_both_dt_hash_styles.so"
        },
        {
          name = "crashpad_snapshot_test_module.so"
        },
        {
          name = "crashpad_snapshot_test_module_large.so"
        },
        {
          name = "crashpad_snapshot_test_module_small.so"
        },
      ]

      resources = [
        {
          path = "util/net/testdata/ascii_http_body.txt"
          dest = "util/net/testdata/ascii_http_body.txt"
        },
        {
          path = "util/net/testdata/binary_http_body.dat"
          dest = "util/net/testdata/binary_http_body.dat"
        },
        {
          path = "test/test_paths_test_data_root.txt"
          dest = "test/test_paths_test_data_root.txt"
        },
      ]

      if (crashpad_use_boringssl_for_http_transport_socket) {
        resources += [
          {
            path = "util/net/testdata/crashpad_util_test_cert.pem"
            dest = "util/net/testdata/crashpad_util_test_cert.pem"
          },
          {
            path = "util/net/testdata/crashpad_util_test_key.pem"
            dest = "util/net/testdata/crashpad_util_test_key.pem"
          },
        ]
      }
    }

    package("crashpad_database_util") {
      deps = [ "tools:crashpad_database_util" ]

      binaries = [
        {
          name = "crashpad_database_util"
          shell = true
        },
      ]
    }
  }
} else if (crashpad_is_standalone) {
  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:googletest_main",
    ]
    if (crashpad_is_ios) {
      deps -= [ "snapshot:snapshot_test" ]
    }
  }

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