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

import("//build/config/features.gni")

static_library("storage_monitor") {
  sources = [
    "image_capture_device.h",
    "image_capture_device.mm",
    "image_capture_device_manager.h",
    "image_capture_device_manager.mm",
    "media_storage_util.cc",
    "media_storage_util.h",
    "mtab_watcher_linux.cc",
    "mtab_watcher_linux.h",
    "portable_device_watcher_win.cc",
    "portable_device_watcher_win.h",
    "removable_device_constants.cc",
    "removable_device_constants.h",
    "removable_storage_observer.h",
    "storage_info.cc",
    "storage_info.h",
    "storage_monitor.cc",
    "storage_monitor.h",
    "storage_monitor_chromeos.cc",
    "storage_monitor_chromeos.h",
    "storage_monitor_linux.cc",
    "storage_monitor_linux.h",
    "storage_monitor_mac.h",
    "storage_monitor_mac.mm",
    "storage_monitor_win.cc",
    "storage_monitor_win.h",
    "transient_device_ids.cc",
    "transient_device_ids.h",
    "udev_util_linux.cc",
    "udev_util_linux.h",
    "volume_mount_watcher_win.cc",
    "volume_mount_watcher_win.h",
  ]

  deps = [
    "//base",
    "//content/public/browser",
    "//ui/base",
  ]

  if (is_mac) {
    libs = [
      "DiskArbitration.framework",
      "Foundation.framework",
      "ImageCaptureCore.framework",
    ]
  }

  if (is_chromeos && use_dbus) {
    deps += [
      "//device/media_transfer_protocol",
      "//device/media_transfer_protocol:mtp_file_entry_proto",
      "//device/media_transfer_protocol:mtp_storage_info_proto",
    ]
    sources += [
      "media_transfer_protocol_device_observer_chromeos.cc",
      "media_transfer_protocol_device_observer_chromeos.h",
    ]
  }

  if (use_udev) {
    deps += [ "//device/udev_linux" ]
  } else if (is_linux) {
    # These were already removed for non-Linux.
    sources -= [
      "storage_monitor_linux.cc",
      "storage_monitor_linux.h",
      "udev_util_linux.cc",
      "udev_util_linux.h",
    ]
  }

  if (is_chromeos) {
    sources -= [
      "mtab_watcher_linux.cc",
      "mtab_watcher_linux.h",
      "storage_monitor_linux.cc",
      "storage_monitor_linux.h",
    ]
    deps += [ "//chromeos" ]
  }
}

static_library("test_support") {
  testonly = true
  sources = [
    "mock_removable_storage_observer.cc",
    "mock_removable_storage_observer.h",
    "test_media_transfer_protocol_manager_chromeos.cc",
    "test_media_transfer_protocol_manager_chromeos.h",
    "test_portable_device_watcher_win.cc",
    "test_portable_device_watcher_win.h",
    "test_storage_monitor.cc",
    "test_storage_monitor.h",
    "test_storage_monitor_win.cc",
    "test_storage_monitor_win.h",
    "test_volume_mount_watcher_win.cc",
    "test_volume_mount_watcher_win.h",
  ]

  public_deps = [
    ":storage_monitor",
    "//base",
    "//content/public/browser",
  ]

  if (is_chromeos && use_dbus) {
    deps = [
      "//device/media_transfer_protocol",
      "//device/media_transfer_protocol:mtp_file_entry_proto",
      "//device/media_transfer_protocol:mtp_storage_info_proto",
    ]
  }

  if (is_win) {
    deps = [
      "//testing/gtest",
    ]
  }
}

source_set("unit_tests") {
  testonly = true
  sources = [
    "image_capture_device_manager_unittest.mm",
    "media_storage_util_unittest.cc",
    "media_transfer_protocol_device_observer_chromeos_unittest.cc",
    "storage_info_unittest.cc",
    "storage_monitor_mac_unittest.mm",
    "storage_monitor_unittest.cc",
    "storage_monitor_win_unittest.cc",
  ]

  deps = [
    ":test_support",
    "//content/test:test_support",
    "//testing/gtest",
  ]

  if (use_dbus) {
    if (is_chromeos) {
      deps += [
        "//device/media_transfer_protocol",
        "//device/media_transfer_protocol:mtp_file_entry_proto",
        "//device/media_transfer_protocol:mtp_storage_info_proto",
        "//testing/gmock",
      ]
      sources += [ "storage_monitor_chromeos_unittest.cc" ]
    } else if (is_linux) {
      sources += [ "storage_monitor_linux_unittest.cc" ]
    }
  }
  if (is_chromeos) {
    deps += [ "//chromeos:test_support" ]
  }
}
