chromium/services/device/usb/BUILD.gn

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

import("//build/config/chromeos/ui_mode.gni")
import("//build/config/features.gni")
import("//testing/libfuzzer/fuzzer_test.gni")

assert(use_blink)

if (is_android) {
  import("//build/config/android/rules.gni")
  import("//third_party/jni_zero/jni_zero.gni")
}

static_library("usb") {
  # Only targets under //services/device folder can depend on it.
  visibility = [
    ":*",
    "//services/device:*",
    "//services/device/usb/mojo:*",
  ]

  sources = [
    "usb_descriptors.cc",
    "usb_descriptors.h",
    "usb_device.cc",
    "usb_device.h",
    "usb_device_handle.cc",
    "usb_device_handle.h",
    "usb_service.cc",
    "usb_service.h",
    "webusb_descriptors.cc",
    "webusb_descriptors.h",
  ]

  configs += [ "//build/config/compiler:wexit_time_destructors" ]

  deps = [
    "//build:chromeos_buildflags",
    "//components/device_event_log",
    "//device/base",
    "//services/device:utility",
    "//services/device/public/cpp/usb",
    "//services/device/public/mojom:usb",
  ]

  public_deps = [
    "//base",
    "//url",
  ]

  if (is_android) {
    sources += [
      "usb_configuration_android.cc",
      "usb_configuration_android.h",
      "usb_device_android.cc",
      "usb_device_android.h",
      "usb_device_handle_android.cc",
      "usb_device_handle_android.h",
      "usb_endpoint_android.cc",
      "usb_endpoint_android.h",
      "usb_interface_android.cc",
      "usb_interface_android.h",
      "usb_service_android.cc",
      "usb_service_android.h",
    ]

    deps += [ ":jni_headers" ]
  }

  if (is_win) {
    sources += [
      "scoped_winusb_handle.cc",
      "scoped_winusb_handle.h",
      "usb_device_handle_win.cc",
      "usb_device_handle_win.h",
      "usb_device_win.cc",
      "usb_device_win.h",
      "usb_service_win.cc",
      "usb_service_win.h",
    ]

    libs = [
      "advapi32.lib",
      "ole32.lib",
      "setupapi.lib",
      "winusb.lib",
    ]

    deps += [ "//third_party/re2" ]
  }

  if (is_mac) {
    # These sources and deps are required for libusb.
    # TODO(crbug.com/40136337) Remove these sources.
    sources += [
      "scoped_libusb_device_handle.cc",
      "scoped_libusb_device_handle.h",
      "scoped_libusb_device_ref.cc",
      "scoped_libusb_device_ref.h",
      "usb_context.cc",
      "usb_context.h",
      "usb_device_handle_impl.cc",
      "usb_device_handle_impl.h",
      "usb_device_impl.cc",
      "usb_device_impl.h",
      "usb_error.cc",
      "usb_error.h",
      "usb_service_impl.cc",
      "usb_service_impl.h",
    ]

    deps += [ "//third_party/libusb" ]
  }

  if (is_linux || is_chromeos) {
    sources += [
      "usb_device_linux.cc",
      "usb_device_linux.h",
    ]
    deps += [
      "//components/crash/core/common:crash_key",
      "//services/device/public/cpp:device_features",
    ]
  }

  if (use_udev) {
    if (is_linux || is_chromeos) {
      sources += [
        "usb_service_linux.cc",
        "usb_service_linux.h",
      ]
    }
    deps += [ "//device/udev_linux" ]
  }

  if (is_android || is_chromeos || is_linux) {
    sources += [
      "usb_device_handle_usbfs.cc",
      "usb_device_handle_usbfs.h",
    ]
  }

  if (is_chromeos) {
    deps += [
      "//chromeos/dbus/permission_broker",
      "//dbus",
    ]
  }
}

static_library("test_support") {
  testonly = true

  sources = [
    "fake_usb_device_handle.cc",
    "fake_usb_device_handle.h",
    "mock_usb_device.cc",
    "mock_usb_device.h",
    "mock_usb_device_handle.cc",
    "mock_usb_device_handle.h",
    "mock_usb_service.cc",
    "mock_usb_service.h",
  ]

  deps = [
    ":usb",
    "//base",
    "//testing/gtest",
  ]

  public_deps = [ "//testing/gmock" ]
}

fuzzer_test("webusb_descriptors_fuzzer") {
  sources = [ "webusb_descriptors_fuzzer.cc" ]
  deps = [
    ":test_support",
    ":usb",
    "//base",
    "//base:i18n",
  ]
  seed_corpus = "fuzz_corpus"
  libfuzzer_options = [ "max_len=2048" ]
}

fuzzer_test("usb_descriptors_fuzzer") {
  sources = [ "usb_descriptors_fuzzer.cc" ]
  deps = [
    ":usb",
    "//mojo/public/cpp/bindings",
    "//services/device/public/mojom:usb",
    "//services/device/usb/mojo",
  ]
  seed_corpus = "fuzz_corpus"
  libfuzzer_options = [ "max_len=2048" ]
}

fuzzer_test("usb_string_read_fuzzer") {
  sources = [ "usb_string_read_fuzzer.cc" ]
  deps = [
    ":test_support",
    ":usb",
    "//base",
  ]
  seed_corpus = "fuzz_corpus"
  libfuzzer_options = [ "max_len=2048" ]
}

if (is_android) {
  java_sources_needing_jni = [
    "android/java/src/org/chromium/device/usb/ChromeUsbConfiguration.java",
    "android/java/src/org/chromium/device/usb/ChromeUsbConnection.java",
    "android/java/src/org/chromium/device/usb/ChromeUsbDevice.java",
    "android/java/src/org/chromium/device/usb/ChromeUsbEndpoint.java",
    "android/java/src/org/chromium/device/usb/ChromeUsbInterface.java",
    "android/java/src/org/chromium/device/usb/ChromeUsbService.java",
  ]

  generate_jni("jni_headers") {
    sources = java_sources_needing_jni
  }

  android_library("java") {
    srcjar_deps = [ ":jni_headers" ]
    sources = java_sources_needing_jni
    deps = [
      "//base:base_java",
      "//build/android:build_java",
      "//third_party/androidx:androidx_annotation_annotation_java",
      "//third_party/jni_zero:jni_zero_java",
    ]
  }
}