Index: chrome/browser/system_monitor/removable_device_notifications_window_win_unittest.cc |
diff --git a/chrome/browser/system_monitor/removable_device_notifications_window_win_unittest.cc b/chrome/browser/system_monitor/removable_device_notifications_window_win_unittest.cc |
index 1417b1b28a4705d8ba1947abd50efec6eb918a69..02d3e00b0ed45a76e7cd4acb6b168dad5f703804 100644 |
--- a/chrome/browser/system_monitor/removable_device_notifications_window_win_unittest.cc |
+++ b/chrome/browser/system_monitor/removable_device_notifications_window_win_unittest.cc |
@@ -15,7 +15,9 @@ |
#include "base/scoped_temp_dir.h" |
#include "base/system_monitor/system_monitor.h" |
#include "base/test/mock_devices_changed_observer.h" |
+#include "base/threading/sequenced_worker_pool.h" |
#include "chrome/browser/system_monitor/media_storage_util.h" |
+#include "chrome/browser/system_monitor/removable_device_constants.h" |
#include "chrome/browser/system_monitor/volume_mount_watcher_win.h" |
#include "content/public/test/test_browser_thread.h" |
#include "testing/gmock/include/gmock/gmock.h" |
@@ -26,9 +28,29 @@ namespace { |
using content::BrowserThread; |
using chrome::RemovableDeviceNotificationsWindowWin; |
+// Mtp device interface path constants. |
+const char16 kMtpDeviceWithInvalidInfo[] = |
+ L"\\?\usb#vid_00&pid_00#0&2&1#{0000-0000-0000-0000-0000})"; |
+const char16 kMtpDeviceWithValidInfo[] = |
+ L"\\?\usb#vid_ff&pid_000f#32&2&1#{abcd-1234-ffde-1112-9172})"; |
+const char16 kMtpDeviceWithMultipleStorage[] = |
+ L"\\?\usb#vid_ff&pid_18#32&2&1#{ab33-1de4-f22e-1882-9724})"; |
+ |
+// Sample mtp device storage information. |
+const char16 kMtpDeviceFriendlyName[] = L"Camera V1.1"; |
+const char16 kStorageLabelA[] = L"Camera V1.1 (s10001)"; |
+const char16 kStorageLabelB[] = L"Camera V1.1 (s20001)"; |
+const char16 kStorageObjectIdA[] = L"s10001"; |
+const char16 kStorageObjectIdB[] = L"s20001"; |
+const char kStorageUniqueIdA[] = |
+ "mtp:StorageSerial:SID-{s10001, D, 12378}:123123"; |
+const char kStorageUniqueIdB[] = |
+ "mtp:StorageSerial:SID-{s20001, S, 2238}:123123"; |
+ |
// Inputs of 'A:\' - 'Z:\' are valid. 'N:\' is not removable. |
-bool GetDeviceDetails(const FilePath& device_path, string16* device_location, |
- std::string* unique_id, string16* name, bool* removable) { |
+bool GetMassStorageDeviceDetails(const FilePath& device_path, |
+ string16* device_location, std::string* unique_id, string16* name, |
+ bool* removable) { |
Peter Kasting
2012/10/19 21:31:12
Nit: One arg per line, indented even (several plac
kmadhusu
2012/10/23 23:44:17
Done.
|
if (device_path.value().length() != 3 || device_path.value()[0] < L'A' || |
device_path.value()[0] > L'Z') { |
return false; |
@@ -65,10 +87,118 @@ std::vector<FilePath> GetTestAttachedDevices() { |
return result; |
} |
+// Returns the persistent storage unique id of the device specified by the |
+// |pnp_device_id|. |storage_object_id| specifies the temporary object |
+// identifier that uniquely identifies the object on the device. |
+std::string GetMtpStorageUniqueId(const string16& pnp_device_id, |
+ const string16& storage_object_id) { |
+ if (pnp_device_id == string16(kMtpDeviceWithInvalidInfo)) |
Peter Kasting
2012/10/19 21:31:12
Nit: No need for explicit string16 construction (m
kmadhusu
2012/10/23 23:44:17
Done.
|
+ return std::string(); |
+ |
+ if (storage_object_id == string16(kStorageObjectIdA)) |
+ return kStorageUniqueIdA; |
+ |
+ if (storage_object_id == string16(kStorageObjectIdB)) |
+ return kStorageUniqueIdB; |
+ return std::string(); |
Peter Kasting
2012/10/19 21:31:12
Nit: Or just:
return (storage_object_id == kSto
kmadhusu
2012/10/23 23:44:17
Done.
|
+} |
+ |
+// Returns the storage name of the device specified by |pnp_device_id|. |
+// |storage_object_id| specifies the temporary object identifier that |
+// uniquely identifies the object on the device. |
+string16 GetMtpStorageName(const string16& pnp_device_id, |
+ const string16& storage_object_id) { |
+ if (pnp_device_id == string16(kMtpDeviceWithInvalidInfo)) |
+ return string16(); |
+ |
+ if (storage_object_id == string16(kStorageObjectIdA)) |
+ return string16(kStorageLabelA); |
+ |
+ if (storage_object_id == string16(kStorageObjectIdB)) |
+ return string16(kStorageLabelB); |
+ return string16(); |
+} |
+ |
+// Returns a list of storage object identifiers of the device given a |
+// |pnp_device_id|. |
+std::vector<string16> GetMtpStorageObjectId(const string16& pnp_device_id) { |
Peter Kasting
2012/10/19 21:31:12
Nit: GetMtpStorageObjectIds?
kmadhusu
2012/10/23 23:44:17
Done.
|
+ if (pnp_device_id == string16(kMtpDeviceWithInvalidInfo)) |
+ return std::vector<string16>(); |
+ |
+ std::vector<string16> storage_object_ids; |
+ storage_object_ids.push_back(string16(kStorageObjectIdA)); |
+ |
+ if (pnp_device_id == string16(kMtpDeviceWithMultipleStorage)) |
+ storage_object_ids.push_back(string16(kStorageObjectIdB)); |
+ return storage_object_ids; |
+} |
+ |
+// Gets the mtp device storage details given a |pnp_device_id| and |
+// |storage_object_id|. On success, returns true and fills in |
+// |device_location|, |unique_id| and |name|. |
+bool GetMtpStorageDetails( |
Peter Kasting
2012/10/19 21:31:12
This method can't fail, so return void.
kmadhusu
2012/10/23 23:44:17
Done.
|
+ const string16& pnp_device_id, const string16& storage_object_id, |
+ string16* device_location, std::string* unique_id, string16* name) { |
+ if (device_location) |
+ *device_location = pnp_device_id; |
+ |
+ if (unique_id) |
+ *unique_id = GetMtpStorageUniqueId(pnp_device_id, storage_object_id); |
+ |
+ if (name) |
+ *name = GetMtpStorageName(pnp_device_id, storage_object_id); |
+ return true; |
+} |
+ |
} // namespace |
namespace chrome { |
+// Wrapper class for testing PortableDeviceWatcherWin. |
+class TestPortableDeviceWatcherWin : public PortableDeviceWatcherWin { |
+ public: |
+ TestPortableDeviceWatcherWin() { |
+ } |
Peter Kasting
2012/10/19 21:31:12
Nit: Do not define functions inline in class decla
kmadhusu
2012/10/23 23:44:17
Done.
|
+ |
+ private: |
+ // Avoids code deleting the object while there are references to it. |
+ // Aside from the base::RefCountedThreadSafe friend class, any attempts to |
+ // call this dtor will result in a compile-time error. |
+ virtual ~TestPortableDeviceWatcherWin() { |
+ } |
+ |
+ // Override PortableDeviceWatcherWin::InitOnBlockingThread. |
Peter Kasting
2012/10/19 21:31:12
Nit: Don't comment individual function overrides t
kmadhusu
2012/10/23 23:44:17
Done.
|
+ void InitOnBlockingThread() OVERRIDE { |
+ } |
+ |
+ // Override PortableDeviceWatcherWin::GetDeviceName. |
+ virtual string16 GetDeviceName(const string16& pnp_device_id) OVERRIDE { |
+ if (pnp_device_id == string16(kMtpDeviceWithInvalidInfo)) |
+ return string16(); |
+ return string16(kMtpDeviceFriendlyName); |
+ } |
+ |
+ // Override PortableDeviceWatcherWin::GetStorages. |
+ virtual bool GetStorages(const string16& pnp_device_id, |
+ std::vector<DeviceStorageInfo>* storages) OVERRIDE { |
+ if (pnp_device_id == string16(kMtpDeviceWithInvalidInfo)) |
+ return false; |
+ |
+ std::vector<string16> storage_object_ids = |
+ GetMtpStorageObjectId(pnp_device_id); |
+ for (size_t index = 0; index < storage_object_ids.size(); ++index) { |
+ DeviceStorageInfo storage; |
+ storage.unique_id = GetMtpStorageUniqueId(pnp_device_id, |
+ storage_object_ids[index]); |
+ storage.storage_object_id = storage_object_ids[index]; |
+ storages->push_back(storage); |
+ } |
+ return true; |
+ } |
+ |
+ DISALLOW_COPY_AND_ASSIGN(TestPortableDeviceWatcherWin); |
+}; |
+ |
// Wrapper class for testing VolumeMountWatcherWin. |
class TestVolumeMountWatcherWin : public VolumeMountWatcherWin { |
public: |
@@ -79,8 +209,8 @@ class TestVolumeMountWatcherWin : public VolumeMountWatcherWin { |
virtual bool GetDeviceInfo(const FilePath& device_path, |
string16* device_location, std::string* unique_id, string16* name, |
bool* removable) OVERRIDE { |
- return GetDeviceDetails(device_path, device_location, unique_id, name, |
- removable); |
+ return GetMassStorageDeviceDetails(device_path, device_location, unique_id, |
+ name, removable); |
} |
// Override VolumeMountWatcherWin::GetAttachedDevices(). |
@@ -108,8 +238,10 @@ class TestRemovableDeviceNotificationsWindowWin |
: public RemovableDeviceNotificationsWindowWin { |
public: |
explicit TestRemovableDeviceNotificationsWindowWin( |
- TestVolumeMountWatcherWin* volume_mount_watcher) |
- : RemovableDeviceNotificationsWindowWin(volume_mount_watcher), |
+ TestVolumeMountWatcherWin* volume_mount_watcher, |
+ TestPortableDeviceWatcherWin* portable_device_watcher) |
+ : RemovableDeviceNotificationsWindowWin( |
+ volume_mount_watcher, portable_device_watcher), |
volume_mount_watcher_(volume_mount_watcher) { |
DCHECK(volume_mount_watcher_); |
} |
@@ -146,15 +278,16 @@ class RemovableDeviceNotificationsWindowWinTest : public testing::Test { |
virtual void SetUp() OVERRIDE { |
ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
volume_mount_watcher_ = new TestVolumeMountWatcherWin; |
+ portable_device_watcher_ = new TestPortableDeviceWatcherWin; |
window_.reset(new TestRemovableDeviceNotificationsWindowWin( |
- volume_mount_watcher_.get())); |
+ volume_mount_watcher_.get(), portable_device_watcher_.get())); |
window_->InitWithTestData(); |
- message_loop_.RunAllPending(); |
+ RunAllPending(); |
system_monitor_.AddDevicesChangedObserver(&observer_); |
} |
virtual void TearDown() { |
- message_loop_.RunAllPending(); |
+ RunAllPending(); |
system_monitor_.RemoveDevicesChangedObserver(&observer_); |
} |
@@ -162,8 +295,8 @@ class RemovableDeviceNotificationsWindowWinTest : public testing::Test { |
std::string unique_id; |
string16 device_name; |
bool removable; |
- ASSERT_TRUE(GetDeviceDetails(drive, NULL, &unique_id, &device_name, |
- &removable)); |
+ ASSERT_TRUE(GetMassStorageDeviceDetails(drive, NULL, &unique_id, |
+ &device_name, &removable)); |
if (removable) { |
MediaStorageUtil::Type type = |
MediaStorageUtil::REMOVABLE_MASS_STORAGE_NO_DCIM; |
@@ -183,13 +316,22 @@ class RemovableDeviceNotificationsWindowWinTest : public testing::Test { |
AddAttachExpectation(initial_devices[i]); |
} |
window_.reset(new TestRemovableDeviceNotificationsWindowWin( |
- volume_mount_watcher_.get())); |
+ volume_mount_watcher_.get(), portable_device_watcher_.get())); |
window_->InitWithTestDataAndAttachedDevices(); |
+ RunAllPending(); |
+ } |
+ |
+ // Runs all the pending tasks on UI thread and blocking thread. |
+ void RunAllPending() { |
+ message_loop_.RunAllPending(); |
+ content::BrowserThread::GetBlockingPool()->FlushForTesting(); |
message_loop_.RunAllPending(); |
} |
- void DoDevicesAttachedTest(const std::vector<int>& device_indices); |
- void DoDevicesDetachedTest(const std::vector<int>& device_indices); |
+ void DoMassStorageDeviceAttachedTest(const std::vector<int>& device_indices); |
+ void DoMassStorageDevicesDetachedTest(const std::vector<int>& device_indices); |
+ void DoMtpDeviceAttachedTest(const string16& pnp_device_id); |
+ void DoMtpDeviceDetachedTest(const string16& pnp_device_id); |
MessageLoopForUI message_loop_; |
content::TestBrowserThread ui_thread_; |
@@ -199,9 +341,11 @@ class RemovableDeviceNotificationsWindowWinTest : public testing::Test { |
base::MockDevicesChangedObserver observer_; |
scoped_ptr<TestRemovableDeviceNotificationsWindowWin> window_; |
scoped_refptr<TestVolumeMountWatcherWin> volume_mount_watcher_; |
+ scoped_refptr<TestPortableDeviceWatcherWin> portable_device_watcher_; |
}; |
-void RemovableDeviceNotificationsWindowWinTest::DoDevicesAttachedTest( |
+void RemovableDeviceNotificationsWindowWinTest:: |
+DoMassStorageDeviceAttachedTest( |
const std::vector<int>& device_indices) { |
DEV_BROADCAST_VOLUME volume_broadcast; |
volume_broadcast.dbcv_size = sizeof(volume_broadcast); |
@@ -219,10 +363,11 @@ void RemovableDeviceNotificationsWindowWinTest::DoDevicesAttachedTest( |
} |
window_->InjectDeviceChange(DBT_DEVICEARRIVAL, |
reinterpret_cast<DWORD>(&volume_broadcast)); |
- message_loop_.RunAllPending(); |
+ RunAllPending(); |
} |
-void RemovableDeviceNotificationsWindowWinTest::DoDevicesDetachedTest( |
+void RemovableDeviceNotificationsWindowWinTest:: |
+DoMassStorageDevicesDetachedTest( |
const std::vector<int>& device_indices) { |
DEV_BROADCAST_VOLUME volume_broadcast; |
volume_broadcast.dbcv_size = sizeof(volume_broadcast); |
@@ -237,8 +382,8 @@ void RemovableDeviceNotificationsWindowWinTest::DoDevicesDetachedTest( |
volume_broadcast.dbcv_unitmask |= 0x1 << *it; |
std::string unique_id; |
bool removable; |
- ASSERT_TRUE(GetDeviceDetails(DriveNumberToFilePath(*it), NULL, &unique_id, |
- NULL, &removable)); |
+ ASSERT_TRUE(GetMassStorageDeviceDetails(DriveNumberToFilePath(*it), NULL, |
+ &unique_id, NULL, &removable)); |
if (removable) { |
MediaStorageUtil::Type type = |
MediaStorageUtil::REMOVABLE_MASS_STORAGE_NO_DCIM; |
@@ -249,12 +394,94 @@ void RemovableDeviceNotificationsWindowWinTest::DoDevicesDetachedTest( |
} |
window_->InjectDeviceChange(DBT_DEVICEREMOVECOMPLETE, |
reinterpret_cast<DWORD>(&volume_broadcast)); |
- message_loop_.RunAllPending(); |
+ RunAllPending(); |
+} |
+ |
+void RemovableDeviceNotificationsWindowWinTest::DoMtpDeviceAttachedTest( |
+ const string16& pnp_device_id) { |
+ GUID guidDevInterface = GUID_NULL; |
+ HRESULT hr = CLSIDFromString(kWPDDevInterfaceGUID, &guidDevInterface); |
+ if (FAILED(hr)) |
+ return; |
+ |
+ size_t device_id_size = pnp_device_id.size() * sizeof(char16); |
+ size_t dbcc_name_size = device_id_size + sizeof(char16); |
Peter Kasting
2012/10/19 21:31:12
Nit: Inline into next statement (2 places)
kmadhusu
2012/10/23 23:44:17
I would like to leave this as it is. To me, this i
Peter Kasting
2012/10/24 00:06:32
Actually, now that I look closer, this statement i
|
+ size_t size = sizeof(DEV_BROADCAST_DEVICEINTERFACE) + dbcc_name_size; |
+ scoped_ptr_malloc<DEV_BROADCAST_DEVICEINTERFACE> dev_interface_broadcast( |
Peter Kasting
2012/10/19 21:31:12
Ugh, why are you using scoped_ptr_malloc<> and Zer
kmadhusu
2012/10/23 23:44:17
By default, DEV_BROADCAST_DEVICEINTERFACE dbcc_nam
Peter Kasting
2012/10/24 00:06:32
Yeah, you're fine. I didn't really realize this s
|
+ static_cast<DEV_BROADCAST_DEVICEINTERFACE*>(malloc(size))); |
+ DCHECK(dev_interface_broadcast.get()); |
+ ZeroMemory(dev_interface_broadcast.get(), size); |
+ dev_interface_broadcast->dbcc_size = size; |
+ dev_interface_broadcast->dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; |
+ dev_interface_broadcast->dbcc_classguid = guidDevInterface; |
+ memcpy(dev_interface_broadcast->dbcc_name, pnp_device_id.data(), |
+ device_id_size); |
+ { |
+ testing::InSequence sequence; |
+ std::vector<string16> storages = GetMtpStorageObjectId(pnp_device_id); |
+ for (size_t index = 0; index < storages.size(); ++index) { |
+ std::string unique_id; |
+ string16 name; |
+ string16 location; |
+ ASSERT_TRUE(GetMtpStorageDetails(pnp_device_id, storages[index], |
+ &location, &unique_id, &name)); |
+ int cardinality = 1; |
+ if (name.empty() || unique_id.empty()) |
+ cardinality = 0; |
+ EXPECT_CALL(observer_, OnRemovableStorageAttached(unique_id, name, |
+ location)) |
+ .Times(cardinality); |
+ } |
+ } |
+ window_->InjectDeviceChange( |
+ DBT_DEVICEARRIVAL, |
+ reinterpret_cast<DWORD>(dev_interface_broadcast.get())); |
+ RunAllPending(); |
+} |
+ |
+void RemovableDeviceNotificationsWindowWinTest::DoMtpDeviceDetachedTest( |
+ const string16& pnp_device_id) { |
+ GUID guidDevInterface = GUID_NULL; |
+ HRESULT hr = CLSIDFromString(kWPDDevInterfaceGUID, &guidDevInterface); |
+ if (FAILED(hr)) |
+ return; |
+ |
+ size_t device_id_size = pnp_device_id.size() * sizeof(char16); |
+ size_t dbcc_name_size = device_id_size + sizeof(char16); |
+ size_t size = sizeof(DEV_BROADCAST_DEVICEINTERFACE) + dbcc_name_size; |
+ scoped_ptr_malloc<DEV_BROADCAST_DEVICEINTERFACE> dev_interface_broadcast( |
+ static_cast<DEV_BROADCAST_DEVICEINTERFACE*>(malloc(size))); |
+ DCHECK(dev_interface_broadcast.get()); |
+ ZeroMemory(dev_interface_broadcast.get(), size); |
+ dev_interface_broadcast->dbcc_size = size; |
+ dev_interface_broadcast->dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE; |
+ dev_interface_broadcast->dbcc_classguid = guidDevInterface; |
+ memcpy(dev_interface_broadcast->dbcc_name, pnp_device_id.data(), |
+ device_id_size); |
+ { |
+ testing::InSequence sequence; |
+ std::vector<string16> storages = GetMtpStorageObjectId(pnp_device_id); |
+ for (size_t index = 0; index < storages.size(); ++index) { |
+ std::string unique_id; |
+ string16 name; |
+ ASSERT_TRUE(GetMtpStorageDetails(pnp_device_id, storages[index], NULL, |
+ &unique_id, &name)); |
+ int cardinality = 1; |
+ if (name.empty() || unique_id.empty()) |
+ cardinality = 0; |
+ EXPECT_CALL(observer_, OnRemovableStorageDetached(unique_id)) |
+ .Times(cardinality); |
+ } |
+ } |
+ window_->InjectDeviceChange( |
+ DBT_DEVICEREMOVECOMPLETE, |
+ reinterpret_cast<DWORD>(dev_interface_broadcast.get())); |
+ RunAllPending(); |
} |
TEST_F(RemovableDeviceNotificationsWindowWinTest, RandomMessage) { |
window_->InjectDeviceChange(DBT_DEVICEQUERYREMOVE, NULL); |
- message_loop_.RunAllPending(); |
+ RunAllPending(); |
} |
TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesAttached) { |
@@ -264,21 +491,21 @@ TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesAttached) { |
device_indices.push_back(7); |
device_indices.push_back(13); |
- DoDevicesAttachedTest(device_indices); |
+ DoMassStorageDeviceAttachedTest(device_indices); |
} |
TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesAttachedHighBoundary) { |
std::vector<int> device_indices; |
device_indices.push_back(25); |
- DoDevicesAttachedTest(device_indices); |
+ DoMassStorageDeviceAttachedTest(device_indices); |
} |
TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesAttachedLowBoundary) { |
std::vector<int> device_indices; |
device_indices.push_back(0); |
- DoDevicesAttachedTest(device_indices); |
+ DoMassStorageDeviceAttachedTest(device_indices); |
} |
TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesAttachedAdjacentBits) { |
@@ -288,7 +515,7 @@ TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesAttachedAdjacentBits) { |
device_indices.push_back(2); |
device_indices.push_back(3); |
- DoDevicesAttachedTest(device_indices); |
+ DoMassStorageDeviceAttachedTest(device_indices); |
} |
TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesDetached) { |
@@ -300,7 +527,7 @@ TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesDetached) { |
device_indices.push_back(7); |
device_indices.push_back(13); |
- DoDevicesDetachedTest(device_indices); |
+ DoMassStorageDevicesDetachedTest(device_indices); |
} |
TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesDetachedHighBoundary) { |
@@ -309,7 +536,7 @@ TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesDetachedHighBoundary) { |
std::vector<int> device_indices; |
device_indices.push_back(25); |
- DoDevicesDetachedTest(device_indices); |
+ DoMassStorageDevicesDetachedTest(device_indices); |
} |
TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesDetachedLowBoundary) { |
@@ -318,7 +545,7 @@ TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesDetachedLowBoundary) { |
std::vector<int> device_indices; |
device_indices.push_back(0); |
- DoDevicesDetachedTest(device_indices); |
+ DoMassStorageDevicesDetachedTest(device_indices); |
} |
TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesDetachedAdjacentBits) { |
@@ -330,7 +557,7 @@ TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesDetachedAdjacentBits) { |
device_indices.push_back(2); |
device_indices.push_back(3); |
- DoDevicesDetachedTest(device_indices); |
+ DoMassStorageDevicesDetachedTest(device_indices); |
} |
TEST_F(RemovableDeviceNotificationsWindowWinTest, DeviceInfoFoPath) { |
@@ -350,8 +577,8 @@ TEST_F(RemovableDeviceNotificationsWindowWinTest, DeviceInfoFoPath) { |
std::string unique_id; |
string16 device_name; |
bool removable; |
- ASSERT_TRUE(GetDeviceDetails(removable_device, NULL, &unique_id, &device_name, |
- &removable)); |
+ ASSERT_TRUE(GetMassStorageDeviceDetails(removable_device, NULL, &unique_id, |
+ &device_name, &removable)); |
EXPECT_TRUE(removable); |
std::string device_id = MediaStorageUtil::MakeDeviceId( |
MediaStorageUtil::REMOVABLE_MASS_STORAGE_NO_DCIM, unique_id); |
@@ -363,8 +590,8 @@ TEST_F(RemovableDeviceNotificationsWindowWinTest, DeviceInfoFoPath) { |
FilePath fixed_device(L"N:\\"); |
EXPECT_TRUE(window_->GetDeviceInfoForPath(fixed_device, &device_info)); |
- ASSERT_TRUE(GetDeviceDetails(fixed_device, NULL, &unique_id, &device_name, |
- &removable)); |
+ ASSERT_TRUE(GetMassStorageDeviceDetails(fixed_device, NULL, &unique_id, |
+ &device_name, &removable)); |
EXPECT_FALSE(removable); |
device_id = MediaStorageUtil::MakeDeviceId( |
MediaStorageUtil::FIXED_MASS_STORAGE, unique_id); |
@@ -373,4 +600,35 @@ TEST_F(RemovableDeviceNotificationsWindowWinTest, DeviceInfoFoPath) { |
EXPECT_EQ(fixed_device.value(), device_info.location); |
} |
+// Test to verify basic mtp storage attach and detach notifications. |
+TEST_F(RemovableDeviceNotificationsWindowWinTest, MtpDeviceBasicAttachDetach) { |
+ // Attach a mtp device. |
+ DoMtpDeviceAttachedTest(kMtpDeviceWithValidInfo); |
+ |
+ // Detach the attached device. |
+ DoMtpDeviceDetachedTest(kMtpDeviceWithValidInfo); |
+} |
+ |
+// When a mtp storage device with invalid storage label and id is |
+// attached/detached, there should not be any device attach/detach |
+// notifications. |
+TEST_F(RemovableDeviceNotificationsWindowWinTest, MtpDeviceWithInvalidInfo) { |
+ // Attach the mtp storage with invalid storage info. |
+ DoMtpDeviceAttachedTest(kMtpDeviceWithInvalidInfo); |
+ |
+ // Detach the attached storage. |
+ DoMtpDeviceDetachedTest(kMtpDeviceWithInvalidInfo); |
+} |
+ |
+// Attach a device with two data storages. Verify that attach/detach |
+// notifications are sent out for each removable storage. |
+TEST_F(RemovableDeviceNotificationsWindowWinTest, |
+ MtpDeviceWithMultipleStorages) { |
+ // Attach the mtp device with multiple storage. |
+ DoMtpDeviceAttachedTest(kMtpDeviceWithMultipleStorage); |
+ |
+ // Detach the attached device. |
+ DoMtpDeviceDetachedTest(kMtpDeviceWithMultipleStorage); |
+} |
+ |
} // namespace chrome |