# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//build/config/ui.gni")
import("//services/catalog/public/tools/catalog.gni")
import("//services/service_manager/public/tools/test/service_test.gni")
import("//testing/test.gni")

# One Big Target for services to register their unit test sources. This exists
# to avoid having to maintain a separate test binary for every service.
#
# To add tests for a new service, please define a "tests" source_set in the
# service subdirectory and add it as a dependency here. If your unit tests
# use the ServiceTest framework, you must also include corresponding catalog
# entries in the "services_unittests_catalog" target below.
service_test("services_unittests") {
  # If your service does not run on iOS, its tests should go in the !iOS
  # section below. If you are unsure, contact blundell@chromium.org.
  deps = [
    "//services/identity:tests",
    "//services/metrics/public/cpp:tests",
    "//services/network:tests",
    "//services/network/public/cpp:tests",
  ]

  data_deps = [
    "//testing/buildbot/filters:services_unittests_filters",
  ]

  if (!is_ios) {
    deps += [
      "//services/audio:tests",
      "//services/data_decoder:tests",
      "//services/device:tests",
      "//services/preferences:tests",
      "//services/proxy_resolver:tests",
      "//services/resource_coordinator:tests",
      "//services/shape_detection:tests",
      "//services/viz",
      "//services/viz/privileged/interfaces:unit_tests",
      "//services/viz/public/cpp/compositing:tests",
    ]
  }

  if (use_aura) {
    deps += [
      "//services/ui/clipboard:tests",
      "//services/ui/ime:tests",
      "//services/ui/input_devices:tests",
      "//services/ui/public/cpp/tests",
      "//services/ui/public/interfaces:tests",
    ]

    if (is_linux && !is_chromeos) {
      deps += [ "//services/ui/demo:tests" ]
    }

    if (use_ozone || (!is_chromeos && !is_mac && !is_ios)) {
      deps += [ "//services/ui/ws:tests" ]
    }
  }

  if (is_android) {
    deps += [
      "//services/data_decoder/public/cpp/android:safe_json_java",
      "//services/device:java",

      # Some tests make network requests.
      "//net/android:net_java",

      # Some tests need to initialize V8.
      "//v8:v8_external_startup_data_assets",
    ]
  }

  if (!is_android && !is_ios) {
    # NOTE: We do not currently support standalone service binaries on Android
    # or iOS, so any tests which use the ServiceTest framework to connect to
    # standalone services must be added here.
    deps += [ "//services/video_capture:tests" ]
  }

  if (is_chromeos) {
    deps += [ "//services/ui/display:tests" ]
  }

  test_runner = "//services/test:run_all_service_tests"

  catalog = ":services_unittests_catalog"
}

catalog("services_unittests_catalog") {
  testonly = true

  # The division between "all platforms" and "!iOS" here needs to match that
  # for the main deps list in the services_unittests target above.
  catalog_deps = [
    "//services/identity:tests_catalog",
    "//services/network:tests_catalog",
  ]

  if (!is_ios) {
    catalog_deps += [
      "//services/audio:tests_catalog",
      "//services/device:tests_catalog",
      "//services/preferences:tests_catalog",
      "//services/resource_coordinator:tests_catalog",
      "//services/video_capture:tests_catalog",
      "//services/viz:tests_catalog",
    ]
  }

  if (use_aura) {
    catalog_deps += [
      "//services/ui/clipboard:tests_catalog",
      "//services/ui/ime:tests_catalog",
    ]

    if (is_linux && !is_chromeos) {
      catalog_deps += [ "//services/ui/demo:tests_catalog" ]
    }

    if (use_ozone || (!is_chromeos && !is_ios)) {
      catalog_deps += [ "//services/ui/ws:tests_catalog" ]
    }
  }
}

if (is_android) {
  junit_binary("service_junit_tests") {
    java_files = [
      "device/generic_sensor/android/junit/src/org/chromium/device/sensors/PlatformSensorAndProviderTest.java",
      "device/nfc/android/junit/src/org/chromium/device/nfc/NFCTest.java",
      "shape_detection/android/junit/src/org/chromium/shape_detection/BitmapUtilsTest.java",
    ]
    deps = [
      "$google_play_services_package:google_play_services_base_java",
      "$google_play_services_package:google_play_services_basement_java",
      "$google_play_services_package:google_play_services_vision_common_java",
      "$google_play_services_package:google_play_services_vision_java",
      "//base:base_java",
      "//base:base_java_test_support",
      "//base:base_junit_test_support",
      "//mojo/public/java:bindings_java",
      "//mojo/public/java:system_java",
      "//services/device/generic_sensor:java",
      "//services/device/nfc/android:java",
      "//services/device/public/java:nfc_java",
      "//services/device/public/mojom:generic_sensor_java",
      "//services/device/public/mojom:mojom_java",
      "//services/shape_detection:shape_detection_java",
      "//skia/public/interfaces:interfaces_java",
      "//third_party/android_tools:android_support_annotations_java",
    ]
  }

  android_library("service_javatests") {
    testonly = true
    java_files = [
      "shape_detection/android/javatests/src/org/chromium/shape_detection/BarcodeDetectionImplTest.java",
      "shape_detection/android/javatests/src/org/chromium/shape_detection/FaceDetectionImplTest.java",
      "shape_detection/android/javatests/src/org/chromium/shape_detection/TestUtils.java",
      "shape_detection/android/javatests/src/org/chromium/shape_detection/TextDetectionImplTest.java",
    ]
    deps = [
      "$google_play_services_package:google_play_services_base_java",
      "$google_play_services_package:google_play_services_basement_java",
      "$google_play_services_package:google_play_services_vision_common_java",
      "$google_play_services_package:google_play_services_vision_java",
      "//base:base_java",
      "//base:base_java_test_support",
      "//mojo/public/java:bindings_java",
      "//services/shape_detection:shape_detection_java",
      "//services/shape_detection/public/mojom:mojom_java",
      "//skia/public/interfaces:interfaces_java",
      "//third_party/android_support_test_runner:runner_java",
      "//third_party/junit",
      "//ui/gfx/geometry/mojo:mojo_java",
    ]
    data = [
      "test/data/",
    ]
  }
}
