# 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("//testing/test.gni")
import("//tools/v8_context_snapshot/v8_context_snapshot.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.
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/content:tests",
    "//services/identity:tests",
    "//services/metrics/public/cpp:tests",
    "//services/network:tests",
    "//services/network/public/cpp:tests",
    "//services/test:run_all_unittests",
  ]

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

  if (use_aura) {
    deps += [
      "//services/ws:tests",
      "//services/ws/ime:tests",
      "//services/ws/input_devices:tests",
      "//services/ws/public/cpp/tests",
      "//services/ws/public/mojom:tests",
    ]
  }

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

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

    # Some tests need to initialize V8.
    if (use_v8_context_snapshot) {
      deps += [ "//tools/v8_context_snapshot:v8_context_snapshot_assets" ]
    } else {
      deps += [ "//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_ios) {
  test("services_perftests") {
    deps = [
      "//services/test:run_all_unittests",
      "//services/viz/public/cpp/compositing:perftests",
    ]
  }
}

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",
      "device/geolocation/android/junit/src/org/chromium/device/geolocation/LocationProviderTest.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/geolocation:geolocation_java",
      "//services/device/nfc/android:java",
      "//services/device/public/java:geolocation_java_test_support",
      "//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_deps: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:base_java",
      "//mojo/public/java:bindings_java",
      "//mojo/public/mojom/base:base_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/",
    ]
  }
}
