# Copyright 2014 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.

group("services") {
  testonly = true

  deps = [
    ":tests",
    "//services/asset_bundle",
    "//services/authenticating_url_loader_interceptor",
    "//services/authentication",
    "//services/clipboard",
    "//services/dart",
    "//services/debugger",
    "//services/fake_surfaces",
    "//services/gles2:lib",
    "//services/http_server",
    "//services/icu_data",
    "//services/keyboard_native",
    "//services/media",
    "//services/native_support",
    "//services/prediction",
    "//services/test_service:bindings",
    "//services/tracing",
  ]

  if (is_android) {
    deps += [
      "//services/android:java_handler",
      "//services/camera",
      "//services/camera:camera_roll",
      "//services/contacts",
      "//services/location",
      "//services/notifications",
      "//services/sensors",
      "//services/speech_recognizer",
      "//services/sharing:android_sharing",
    ]
    if (defined(go_build_tool) && go_build_tool != "") {
      deps += [ "//services/vanadium/security:principal_service" ]
    }
  }

  if (is_linux && !is_fnl) {
    deps += [ "//services/python" ]
  }

  if (is_android || is_linux) {
    deps += [
      "//services/device_info",
      "//services/files",
      "//services/kiosk_wm",
      "//services/ui",
      "//services/native_viewport",
      "//services/surfaces",
      "//services/url_response_disk_cache",
      "//services/view_manager",
      "//services/window_manager",
    ]
  }

  # TODO(jamesr): We only support building V8 snapshot data on a linux host
  # since it needs a 32 bit toolchain and we don't have one configured for mac
  # hosts.
  # TODO(cstout): javascript/v8 build support for fnl/musl
  if (!is_fnl && host_os == "linux") {
    deps += [ "//services/js" ]
  }
}

group("tests") {
  testonly = true

  deps = [
    "//services/asset_bundle:apptests",
    "//services/authenticating_url_loader_interceptor:apptests",
    "//services/clipboard:apptests",
    "//services/dart/dart_apptests",
    "//services/http_server:apptests",
    "//services/native_support:apptests",
    "//services/prediction:apptests",
  ]

  if (is_linux && !is_fnl) {
    deps += [ "//services/python:python_apptests" ]
  }

  if (is_android) {
    deps += [ "//services/contacts:apptests" ]
    deps += [ "//services/notifications:apptests" ]
  }

  if (is_linux || is_android) {
    deps += [
      "//services/window_manager:window_manager_apptests",
      "//services/window_manager:window_manager_unittests",
    ]
  }

  # TODO(jamesr): We only support building V8 snapshot data on a linux host since it
  # needs a 32 bit toolchain and we don't have one configured for mac hosts.
  # TODO(cstout): javascript/v8 build support for fnl/musl
  if (!is_fnl && host_os == "linux") {
    deps += [ "//services/js:tests" ]
  }

  if (is_android || is_linux) {
    deps += [
      "//services/files:apptests",
      "//services/url_response_disk_cache:tests",
      "//services/view_manager:mojo_view_manager_client_apptests",
      "//services/view_manager:view_manager_service_apptests",
      "//services/view_manager:view_manager_service_unittests",
    ]
  }
}
