# Copyright 2015 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/features.gni")
import("//testing/test.gni")

if (is_android) {
  import("//build/config/android/rules.gni")  # For generate_jni().
}

if (is_mac) {
  import("//build/config/mac/mac_sdk.gni")
}

is_linux_without_udev = is_linux && !use_udev
is_linux_without_dbus = is_linux && !use_dbus

# TODO(GYP): Delete this after we've converted everything to GN.
# The _run targets exist only for compatibility w/ GYP.
group("device_unittests_run") {
  testonly = true
  deps = [
    ":device_unittests",
  ]
}

test("device_unittests") {
  sources = [
    "battery/battery_status_manager_win_unittest.cc",
    "battery/battery_status_service_unittest.cc",
    "bluetooth/bluetooth_adapter_mac_unittest.mm",
    "bluetooth/bluetooth_adapter_unittest.cc",
    "bluetooth/bluetooth_adapter_win_unittest.cc",
    "bluetooth/bluetooth_advertisement_unittest.cc",
    "bluetooth/bluetooth_device_unittest.cc",
    "bluetooth/bluetooth_device_win_unittest.cc",
    "bluetooth/bluetooth_discovery_filter_unittest.cc",
    "bluetooth/bluetooth_gatt_characteristic_unittest.cc",
    "bluetooth/bluetooth_gatt_descriptor_unittest.cc",
    "bluetooth/bluetooth_gatt_service_unittest.cc",
    "bluetooth/bluetooth_low_energy_win_unittest.cc",
    "bluetooth/bluetooth_service_record_win_unittest.cc",
    "bluetooth/bluetooth_task_manager_win_unittest.cc",
    "bluetooth/bluetooth_uuid_unittest.cc",
    "bluetooth/test/bluetooth_test.cc",
    "bluetooth/test/bluetooth_test.h",
    "bluetooth/test/bluetooth_test_android.cc",
    "bluetooth/test/bluetooth_test_android.h",
    "bluetooth/test/bluetooth_test_mac.h",
    "bluetooth/test/bluetooth_test_mac.mm",
    "bluetooth/test/test_bluetooth_adapter_observer.cc",
    "bluetooth/test/test_bluetooth_adapter_observer.h",
    "nfc/nfc_chromeos_unittest.cc",
    "nfc/nfc_ndef_record_unittest.cc",
    "test/run_all_unittests.cc",
  ]

  deps = [
    "//base/test:test_support",
    "//device/battery",
    "//device/battery:mojo_bindings",
    "//device/bluetooth",
    "//device/bluetooth:mocks",
    "//device/nfc",
    "//mojo/common",
    "//mojo/environment:chromium",
    "//mojo/public/cpp/bindings",
    "//net",
    "//testing/gmock",
    "//testing/gtest",
    "//third_party/mojo/src/mojo/edk/system",
    "//url",
  ]

  if (!is_linux_without_dbus && !is_chromeos) {
    sources += [ "battery/battery_status_manager_linux_unittest.cc" ]
  }

  # HID and Serial:
  # Android doesn't compile.
  # Linux, requires udev.
  if (!is_linux_without_udev && !is_android) {
    sources += [
      "hid/hid_connection_unittest.cc",
      "hid/hid_device_filter_unittest.cc",
      "hid/hid_report_descriptor_unittest.cc",
      "hid/input_service_linux_unittest.cc",
      "hid/test_report_descriptors.cc",
      "hid/test_report_descriptors.h",
      "serial/data_sink_unittest.cc",
      "serial/data_source_unittest.cc",
      "serial/serial_connection_unittest.cc",
      "serial/serial_io_handler_posix_unittest.cc",
      "serial/serial_service_unittest.cc",
    ]
    deps += [
      "//device/hid",
      "//device/serial",
      "//device/serial:test_support",
    ]
  }

  if (use_udev) {
    sources += [ "udev_linux/udev_unittest.cc" ]
    deps += [ "//device/udev_linux" ]
  }

  # USB does not compile on iOS.
  if (!is_ios) {
    sources += [
      "devices_app/usb/device_impl_unittest.cc",
      "devices_app/usb/device_manager_impl_unittest.cc",
      "devices_app/usb/fake_permission_provider.cc",
      "devices_app/usb/fake_permission_provider.h",
      "test/test_device_client.cc",
      "test/test_device_client.h",
      "test/usb_test_gadget_impl.cc",
      "usb/usb_descriptors_unittest.cc",
      "usb/usb_device_filter_unittest.cc",
      "usb/usb_device_handle_unittest.cc",
      "usb/usb_ids_unittest.cc",
      "usb/usb_service_unittest.cc",
      "usb/webusb_descriptors_unittest.cc",
    ]
    deps += [
      "//device/core",
      "//device/core:mocks",
      "//device/devices_app:lib",
      "//device/devices_app/usb/public/interfaces",
      "//device/usb",
      "//device/usb:mocks",
    ]
  }

  # UsbContext is a libusb-specific object.
  if (!is_android && !is_ios) {
    sources += [ "usb/usb_context_unittest.cc" ]
    deps += [ "//third_party/libusb" ]
  }

  if (is_android) {
    sources -= [ "battery/battery_status_service_unittest.cc" ]
    deps += [
      ":bluetooth_test_java",
      ":bluetooth_test_jni_headers",
    ]
    deps -= [ "//device/battery" ]
  }

  if (is_chromeos) {
    deps += [
      "//chromeos",
      "//chromeos:test_support",
      "//chromeos:test_support_without_gmock",
    ]
  }

  if ((is_chromeos || is_linux) && use_dbus) {
    configs += [ "//build/config/linux:dbus" ]

    sources += [
      "bluetooth/bluetooth_adapter_profile_bluez_unittest.cc",
      "bluetooth/bluetooth_advertisement_bluez_unittest.cc",
      "bluetooth/bluetooth_audio_sink_bluez_unittest.cc",
      "bluetooth/bluetooth_bluez_unittest.cc",
      "bluetooth/bluetooth_gatt_bluez_unittest.cc",
      "bluetooth/bluetooth_socket_bluez_unittest.cc",
    ]

    deps += [ "//dbus" ]
  }

  if (is_mac) {
    deps += [ "//third_party/ocmock" ]
    ldflags = [ "-ObjC" ]
    libs = [ "IOBluetooth.framework" ]

    # In the OSX 10.10 SDK, CoreBluetooth became a top level framework.
    # Previously, it was nested in IOBluetooth. In order for Chrome to run on
    # OSes older than OSX 10.10, the top level CoreBluetooth framework must be
    # weakly linked.
    if (mac_sdk_version == "10.10") {
      ldflags += [
        "-weak_framework",
        "CoreBluetooth",
      ]
    }
  }
}

if (is_android) {
  bluetooth_java_sources_needing_jni = [ "bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java" ]

  generate_jni("bluetooth_test_jni_headers") {
    sources = bluetooth_java_sources_needing_jni
    jni_package = "bluetooth"
  }

  android_library("bluetooth_test_java") {
    java_files = bluetooth_java_sources_needing_jni
    deps = [
      "//base:base_java",
      "//device/bluetooth:java",
    ]
  }
}
