Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(29)

Unified Diff: chrome/browser/storage_monitor/removable_device_notifications_window_win_unittest.cc

Issue 12382005: Rename RemovableDeviceNotifications=>StorageMonitor (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/storage_monitor/removable_device_notifications_window_win_unittest.cc
diff --git a/chrome/browser/storage_monitor/removable_device_notifications_window_win_unittest.cc b/chrome/browser/storage_monitor/removable_device_notifications_window_win_unittest.cc
deleted file mode 100644
index 5f40a80a68fbf56e7232950ace58e9439dd4b52e..0000000000000000000000000000000000000000
--- a/chrome/browser/storage_monitor/removable_device_notifications_window_win_unittest.cc
+++ /dev/null
@@ -1,523 +0,0 @@
-// Copyright (c) 2012 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.
-
-#include <windows.h>
-#include <dbt.h>
-
-#include <string>
-#include <vector>
-
-#include "base/memory/ref_counted.h"
-#include "base/memory/scoped_ptr.h"
-#include "base/message_loop.h"
-#include "base/synchronization/waitable_event.h"
-#include "base/utf_string_conversions.h"
-#include "chrome/browser/storage_monitor/media_storage_util.h"
-#include "chrome/browser/storage_monitor/mock_removable_storage_observer.h"
-#include "chrome/browser/storage_monitor/portable_device_watcher_win.h"
-#include "chrome/browser/storage_monitor/removable_device_constants.h"
-#include "chrome/browser/storage_monitor/removable_device_notifications_window_win.h"
-#include "chrome/browser/storage_monitor/test_portable_device_watcher_win.h"
-#include "chrome/browser/storage_monitor/test_removable_device_notifications_window_win.h"
-#include "chrome/browser/storage_monitor/test_volume_mount_watcher_win.h"
-#include "chrome/browser/storage_monitor/volume_mount_watcher_win.h"
-#include "content/public/test/test_browser_thread.h"
-#include "testing/gtest/include/gtest/gtest.h"
-
-namespace chrome {
-namespace test {
-
-using content::BrowserThread;
-
-typedef std::vector<int> DeviceIndices;
-
-// RemovableDeviceNotificationsWindowWinTest -----------------------------------
-
-class RemovableDeviceNotificationsWindowWinTest : public testing::Test {
- public:
- RemovableDeviceNotificationsWindowWinTest();
- virtual ~RemovableDeviceNotificationsWindowWinTest();
-
- protected:
- // testing::Test:
- virtual void SetUp() OVERRIDE;
- virtual void TearDown() OVERRIDE;
-
- void PreAttachDevices();
-
- // Runs all the pending tasks on UI thread, FILE thread and blocking thread.
- void RunUntilIdle();
-
- void DoMassStorageDeviceAttachedTest(const DeviceIndices& device_indices);
- void DoMassStorageDevicesDetachedTest(const DeviceIndices& device_indices);
-
- // Injects a device attach or detach change (depending on the value of
- // |test_attach|) and tests that the appropriate handler is called.
- void DoMTPDeviceTest(const string16& pnp_device_id, bool test_attach);
-
- // Gets the MTP details of the storage specified by the |storage_device_id|.
- // On success, returns true and fills in |pnp_device_id| and
- // |storage_object_id|.
- bool GetMTPStorageInfo(const std::string& storage_device_id,
- string16* pnp_device_id,
- string16* storage_object_id);
-
- scoped_ptr<TestRemovableDeviceNotificationsWindowWin> window_;
-
- // Weak pointer; owned by the device notifications class.
- TestVolumeMountWatcherWin* volume_mount_watcher_;
-
- MockRemovableStorageObserver observer_;
-
- private:
- MessageLoopForUI message_loop_;
- content::TestBrowserThread ui_thread_;
- content::TestBrowserThread file_thread_;
-};
-
-RemovableDeviceNotificationsWindowWinTest::
- RemovableDeviceNotificationsWindowWinTest()
- : ui_thread_(BrowserThread::UI, &message_loop_),
- file_thread_(BrowserThread::FILE, &message_loop_) {
-}
-
-RemovableDeviceNotificationsWindowWinTest::
- ~RemovableDeviceNotificationsWindowWinTest() {
-}
-
-void RemovableDeviceNotificationsWindowWinTest::SetUp() {
- ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI));
- volume_mount_watcher_ = new TestVolumeMountWatcherWin;
- window_.reset(new TestRemovableDeviceNotificationsWindowWin(
- volume_mount_watcher_, new TestPortableDeviceWatcherWin));
- window_->Init();
- RunUntilIdle();
- window_->AddObserver(&observer_);
-}
-
-void RemovableDeviceNotificationsWindowWinTest::TearDown() {
- RunUntilIdle();
- window_->RemoveObserver(&observer_);
-}
-
-void RemovableDeviceNotificationsWindowWinTest::PreAttachDevices() {
- window_.reset();
- volume_mount_watcher_ = new TestVolumeMountWatcherWin;
- volume_mount_watcher_->SetAttachedDevicesFake();
-
- int expect_attach_calls = 0;
- std::vector<base::FilePath> initial_devices =
- volume_mount_watcher_->GetAttachedDevices();
- for (std::vector<base::FilePath>::const_iterator it = initial_devices.begin();
- it != initial_devices.end(); ++it) {
- std::string unique_id;
- string16 device_name;
- bool removable;
- ASSERT_TRUE(volume_mount_watcher_->GetRawDeviceInfo(
- *it, NULL, &unique_id, &device_name, &removable, NULL));
- if (removable)
- expect_attach_calls++;
- }
-
- window_.reset(new TestRemovableDeviceNotificationsWindowWin(
- volume_mount_watcher_, new TestPortableDeviceWatcherWin));
- window_->AddObserver(&observer_);
- window_->Init();
-
- EXPECT_EQ(0u, volume_mount_watcher_->devices_checked().size());
-
- // This dance is because attachment bounces through a couple of
- // closures, which need to be executed to finish the process.
- RunUntilIdle();
- volume_mount_watcher_->FlushWorkerPoolForTesting();
- RunUntilIdle();
-
- std::vector<base::FilePath> checked_devices =
- volume_mount_watcher_->devices_checked();
- sort(checked_devices.begin(), checked_devices.end());
- EXPECT_EQ(initial_devices, checked_devices);
- EXPECT_EQ(expect_attach_calls, observer_.attach_calls());
- EXPECT_EQ(0, observer_.detach_calls());
-}
-
-void RemovableDeviceNotificationsWindowWinTest::RunUntilIdle() {
- volume_mount_watcher_->FlushWorkerPoolForTesting();
- message_loop_.RunUntilIdle();
-}
-
-void RemovableDeviceNotificationsWindowWinTest::
- DoMassStorageDeviceAttachedTest(const DeviceIndices& device_indices) {
- DEV_BROADCAST_VOLUME volume_broadcast;
- volume_broadcast.dbcv_size = sizeof(volume_broadcast);
- volume_broadcast.dbcv_devicetype = DBT_DEVTYP_VOLUME;
- volume_broadcast.dbcv_unitmask = 0x0;
- volume_broadcast.dbcv_flags = 0x0;
-
- int expect_attach_calls = 0;
- for (DeviceIndices::const_iterator it = device_indices.begin();
- it != device_indices.end(); ++it) {
- volume_broadcast.dbcv_unitmask |= 0x1 << *it;
- bool removable;
- ASSERT_TRUE(volume_mount_watcher_->GetDeviceInfo(
- VolumeMountWatcherWin::DriveNumberToFilePath(*it),
- NULL, NULL, NULL, &removable, NULL));
- if (removable)
- expect_attach_calls++;
- }
- window_->InjectDeviceChange(DBT_DEVICEARRIVAL,
- reinterpret_cast<DWORD>(&volume_broadcast));
-
- RunUntilIdle();
- volume_mount_watcher_->FlushWorkerPoolForTesting();
- RunUntilIdle();
-
- EXPECT_EQ(expect_attach_calls, observer_.attach_calls());
- EXPECT_EQ(0, observer_.detach_calls());
-}
-
-void RemovableDeviceNotificationsWindowWinTest::
- DoMassStorageDevicesDetachedTest(const DeviceIndices& device_indices) {
- DEV_BROADCAST_VOLUME volume_broadcast;
- volume_broadcast.dbcv_size = sizeof(volume_broadcast);
- volume_broadcast.dbcv_devicetype = DBT_DEVTYP_VOLUME;
- volume_broadcast.dbcv_unitmask = 0x0;
- volume_broadcast.dbcv_flags = 0x0;
-
- int pre_attach_calls = observer_.attach_calls();
- int expect_detach_calls = 0;
- for (DeviceIndices::const_iterator it = device_indices.begin();
- it != device_indices.end(); ++it) {
- volume_broadcast.dbcv_unitmask |= 0x1 << *it;
- bool removable;
- ASSERT_TRUE(volume_mount_watcher_->GetRawDeviceInfo(
- VolumeMountWatcherWin::DriveNumberToFilePath(*it), NULL, NULL,
- NULL, &removable, NULL));
- if (removable)
- expect_detach_calls++;
- }
- window_->InjectDeviceChange(DBT_DEVICEREMOVECOMPLETE,
- reinterpret_cast<DWORD>(&volume_broadcast));
- RunUntilIdle();
- EXPECT_EQ(pre_attach_calls, observer_.attach_calls());
- EXPECT_EQ(expect_detach_calls, observer_.detach_calls());
-}
-
-void RemovableDeviceNotificationsWindowWinTest::DoMTPDeviceTest(
- const string16& pnp_device_id, bool test_attach) {
- 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 size = sizeof(DEV_BROADCAST_DEVICEINTERFACE) + device_id_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);
-
- int expect_attach_calls = observer_.attach_calls();
- int expect_detach_calls = observer_.detach_calls();
- PortableDeviceWatcherWin::StorageObjectIDs storage_object_ids =
- TestPortableDeviceWatcherWin::GetMTPStorageObjectIds(pnp_device_id);
- for (PortableDeviceWatcherWin::StorageObjectIDs::const_iterator it =
- storage_object_ids.begin(); it != storage_object_ids.end(); ++it) {
- std::string unique_id;
- string16 name;
- string16 location;
- TestPortableDeviceWatcherWin::GetMTPStorageDetails(pnp_device_id, *it,
- &location, &unique_id,
- &name);
- if (test_attach && !name.empty() && !unique_id.empty())
- expect_attach_calls++;
- else if (!name.empty() && !unique_id.empty())
- expect_detach_calls++;
- }
-
- window_->InjectDeviceChange(
- test_attach ? DBT_DEVICEARRIVAL : DBT_DEVICEREMOVECOMPLETE,
- reinterpret_cast<DWORD>(dev_interface_broadcast.get()));
-
- RunUntilIdle();
- EXPECT_EQ(expect_attach_calls, observer_.attach_calls());
- EXPECT_EQ(expect_detach_calls, observer_.detach_calls());
-}
-
-bool RemovableDeviceNotificationsWindowWinTest::GetMTPStorageInfo(
- const std::string& storage_device_id,
- string16* pnp_device_id,
- string16* storage_object_id) {
- return window_->GetMTPStorageInfoFromDeviceId(storage_device_id,
- pnp_device_id,
- storage_object_id);
-}
-
-TEST_F(RemovableDeviceNotificationsWindowWinTest, RandomMessage) {
- window_->InjectDeviceChange(DBT_DEVICEQUERYREMOVE, NULL);
- RunUntilIdle();
-}
-
-TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesAttached) {
- DeviceIndices device_indices;
- device_indices.push_back(1); // B
- device_indices.push_back(5); // F
- device_indices.push_back(7); // H
- device_indices.push_back(13); // N
- DoMassStorageDeviceAttachedTest(device_indices);
-
- string16 location;
- std::string unique_id;
- string16 name;
- bool removable;
- EXPECT_TRUE(window_->volume_mount_watcher()->GetDeviceInfo(
- base::FilePath(ASCIIToUTF16("F:\\")),
- &location, &unique_id, &name, &removable, NULL));
- EXPECT_EQ(ASCIIToUTF16("F:\\"), location);
- EXPECT_EQ("\\\\?\\Volume{F0000000-0000-0000-0000-000000000000}\\", unique_id);
- EXPECT_EQ(ASCIIToUTF16("F:\\ Drive"), name);
-
- StorageMonitor::StorageInfo info;
- EXPECT_FALSE(window_->GetStorageInfoForPath(
- base::FilePath(ASCIIToUTF16("G:\\")), &info));
- EXPECT_TRUE(window_->GetStorageInfoForPath(
- base::FilePath(ASCIIToUTF16("F:\\")), &info));
- StorageMonitor::StorageInfo info1;
- EXPECT_TRUE(window_->GetStorageInfoForPath(
- base::FilePath(ASCIIToUTF16("F:\\subdir")), &info1));
- StorageMonitor::StorageInfo info2;
- EXPECT_TRUE(window_->GetStorageInfoForPath(
- base::FilePath(ASCIIToUTF16("F:\\subdir\\sub")), &info2));
- EXPECT_EQ(ASCIIToUTF16("F:\\ Drive"), info.name);
- EXPECT_EQ(ASCIIToUTF16("F:\\ Drive"), info1.name);
- EXPECT_EQ(ASCIIToUTF16("F:\\ Drive"), info2.name);
-}
-
-TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesAttachedHighBoundary) {
- DeviceIndices device_indices;
- device_indices.push_back(25);
-
- DoMassStorageDeviceAttachedTest(device_indices);
-}
-
-TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesAttachedLowBoundary) {
- DeviceIndices device_indices;
- device_indices.push_back(0);
-
- DoMassStorageDeviceAttachedTest(device_indices);
-}
-
-TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesAttachedAdjacentBits) {
- DeviceIndices device_indices;
- device_indices.push_back(0);
- device_indices.push_back(1);
- device_indices.push_back(2);
- device_indices.push_back(3);
-
- DoMassStorageDeviceAttachedTest(device_indices);
-}
-
-TEST_F(RemovableDeviceNotificationsWindowWinTest, DevicesDetached) {
- PreAttachDevices();
-
- DeviceIndices device_indices;
- device_indices.push_back(1);
- device_indices.push_back(5);
- device_indices.push_back(7);
- device_indices.push_back(13);
-
- DoMassStorageDevicesDetachedTest(device_indices);
-}
-
-TEST_F(RemovableDeviceNotificationsWindowWinTest,
- DevicesDetachedHighBoundary) {
- PreAttachDevices();
-
- DeviceIndices device_indices;
- device_indices.push_back(25);
-
- DoMassStorageDevicesDetachedTest(device_indices);
-}
-
-TEST_F(RemovableDeviceNotificationsWindowWinTest,
- DevicesDetachedLowBoundary) {
- PreAttachDevices();
-
- DeviceIndices device_indices;
- device_indices.push_back(0);
-
- DoMassStorageDevicesDetachedTest(device_indices);
-}
-
-TEST_F(RemovableDeviceNotificationsWindowWinTest,
- DevicesDetachedAdjacentBits) {
- PreAttachDevices();
-
- DeviceIndices device_indices;
- device_indices.push_back(0);
- device_indices.push_back(1);
- device_indices.push_back(2);
- device_indices.push_back(3);
-
- DoMassStorageDevicesDetachedTest(device_indices);
-}
-
-TEST_F(RemovableDeviceNotificationsWindowWinTest,
- DuplicateAttachCheckSuppressed) {
- volume_mount_watcher_->BlockDeviceCheckForTesting();
- base::FilePath kAttachedDevicePath =
- VolumeMountWatcherWin::DriveNumberToFilePath(8); // I:
-
- DEV_BROADCAST_VOLUME volume_broadcast;
- volume_broadcast.dbcv_size = sizeof(volume_broadcast);
- volume_broadcast.dbcv_devicetype = DBT_DEVTYP_VOLUME;
- volume_broadcast.dbcv_flags = 0x0;
- volume_broadcast.dbcv_unitmask = 0x100; // I: drive
- window_->InjectDeviceChange(DBT_DEVICEARRIVAL,
- reinterpret_cast<DWORD>(&volume_broadcast));
-
- EXPECT_EQ(0u, volume_mount_watcher_->devices_checked().size());
-
- // Re-attach the same volume. We haven't released the mock device check
- // event, so there'll be pending calls in the UI thread to finish the
- // device check notification, blocking the duplicate device injection.
- window_->InjectDeviceChange(DBT_DEVICEARRIVAL,
- reinterpret_cast<DWORD>(&volume_broadcast));
-
- EXPECT_EQ(0u, volume_mount_watcher_->devices_checked().size());
- volume_mount_watcher_->ReleaseDeviceCheck();
- RunUntilIdle();
- volume_mount_watcher_->ReleaseDeviceCheck();
-
- // Now let all attach notifications finish running. We'll only get one
- // finish-attach call.
- volume_mount_watcher_->FlushWorkerPoolForTesting();
- RunUntilIdle();
-
- std::vector<base::FilePath> checked_devices =
- volume_mount_watcher_->devices_checked();
- ASSERT_EQ(1u, checked_devices.size());
- EXPECT_EQ(kAttachedDevicePath, checked_devices[0]);
-
- // We'll receive a duplicate check now that the first check has fully cleared.
- window_->InjectDeviceChange(DBT_DEVICEARRIVAL,
- reinterpret_cast<DWORD>(&volume_broadcast));
- volume_mount_watcher_->FlushWorkerPoolForTesting();
- volume_mount_watcher_->ReleaseDeviceCheck();
- RunUntilIdle();
-
- checked_devices = volume_mount_watcher_->devices_checked();
- ASSERT_EQ(2u, checked_devices.size());
- EXPECT_EQ(kAttachedDevicePath, checked_devices[0]);
- EXPECT_EQ(kAttachedDevicePath, checked_devices[1]);
-}
-
-TEST_F(RemovableDeviceNotificationsWindowWinTest, DeviceInfoForPath) {
- PreAttachDevices();
-
- // An invalid path.
- EXPECT_FALSE(window_->GetStorageInfoForPath(base::FilePath(L"COM1:\\"),
- NULL));
-
- // An unconnected removable device.
- EXPECT_FALSE(window_->GetStorageInfoForPath(base::FilePath(L"E:\\"), NULL));
-
- // A connected removable device.
- base::FilePath removable_device(L"F:\\");
- StorageMonitor::StorageInfo device_info;
- EXPECT_TRUE(window_->GetStorageInfoForPath(removable_device, &device_info));
-
- std::string unique_id;
- string16 device_name;
- string16 location;
- bool removable;
- uint64 total_size_in_bytes;
- ASSERT_TRUE(volume_mount_watcher_->GetDeviceInfo(
- removable_device, &location, &unique_id, &device_name, &removable,
- &total_size_in_bytes));
- EXPECT_TRUE(removable);
- std::string device_id = MediaStorageUtil::MakeDeviceId(
- MediaStorageUtil::REMOVABLE_MASS_STORAGE_NO_DCIM, unique_id);
- EXPECT_EQ(device_id, device_info.device_id);
- EXPECT_EQ(device_name, device_info.name);
- EXPECT_EQ(removable_device.value(), device_info.location);
- EXPECT_EQ(1000000, total_size_in_bytes);
-
- // A fixed device.
- base::FilePath fixed_device(L"N:\\");
- EXPECT_TRUE(window_->GetStorageInfoForPath(fixed_device, &device_info));
-
- ASSERT_TRUE(volume_mount_watcher_->GetDeviceInfo(
- fixed_device, &location, &unique_id, &device_name, &removable, NULL));
- EXPECT_FALSE(removable);
- device_id = MediaStorageUtil::MakeDeviceId(
- MediaStorageUtil::FIXED_MASS_STORAGE, unique_id);
- EXPECT_EQ(device_id, device_info.device_id);
- EXPECT_EQ(device_name, device_info.name);
- EXPECT_EQ(fixed_device.value(), device_info.location);
-}
-
-// Test to verify basic MTP storage attach and detach notifications.
-TEST_F(RemovableDeviceNotificationsWindowWinTest, MTPDeviceBasicAttachDetach) {
- DoMTPDeviceTest(TestPortableDeviceWatcherWin::kMTPDeviceWithValidInfo, true);
- DoMTPDeviceTest(TestPortableDeviceWatcherWin::kMTPDeviceWithValidInfo, false);
-}
-
-// 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) {
- DoMTPDeviceTest(TestPortableDeviceWatcherWin::kMTPDeviceWithInvalidInfo,
- true);
- DoMTPDeviceTest(TestPortableDeviceWatcherWin::kMTPDeviceWithInvalidInfo,
- false);
-}
-
-// Attach a device with two data partitions. Verify that attach/detach
-// notifications are sent out for each removable storage.
-TEST_F(RemovableDeviceNotificationsWindowWinTest,
- MTPDeviceWithMultipleStorageObjects) {
- DoMTPDeviceTest(TestPortableDeviceWatcherWin::kMTPDeviceWithMultipleStorages,
- true);
- DoMTPDeviceTest(TestPortableDeviceWatcherWin::kMTPDeviceWithMultipleStorages,
- false);
-}
-
-TEST_F(RemovableDeviceNotificationsWindowWinTest, DriveNumberToFilePath) {
- EXPECT_EQ(L"A:\\", VolumeMountWatcherWin::DriveNumberToFilePath(0).value());
- EXPECT_EQ(L"Y:\\", VolumeMountWatcherWin::DriveNumberToFilePath(24).value());
- EXPECT_EQ(L"", VolumeMountWatcherWin::DriveNumberToFilePath(-1).value());
- EXPECT_EQ(L"", VolumeMountWatcherWin::DriveNumberToFilePath(199).value());
-}
-
-// Given a MTP storage persistent id, GetMTPStorageInfo() should fetch the
-// device interface path and local storage object identifier.
-TEST_F(RemovableDeviceNotificationsWindowWinTest,
- GetMTPStorageInfoFromDeviceId) {
- DoMTPDeviceTest(TestPortableDeviceWatcherWin::kMTPDeviceWithValidInfo, true);
- PortableDeviceWatcherWin::StorageObjects storage_objects =
- TestPortableDeviceWatcherWin::GetDeviceStorageObjects(
- TestPortableDeviceWatcherWin::kMTPDeviceWithValidInfo);
- for (PortableDeviceWatcherWin::StorageObjects::const_iterator it =
- storage_objects.begin();
- it != storage_objects.end(); ++it) {
- string16 pnp_device_id;
- string16 storage_object_id;
- ASSERT_TRUE(GetMTPStorageInfo(it->object_persistent_id, &pnp_device_id,
- &storage_object_id));
- EXPECT_EQ(string16(TestPortableDeviceWatcherWin::kMTPDeviceWithValidInfo),
- pnp_device_id);
- EXPECT_EQ(it->object_persistent_id,
- TestPortableDeviceWatcherWin::GetMTPStorageUniqueId(
- pnp_device_id, storage_object_id));
- }
- DoMTPDeviceTest(TestPortableDeviceWatcherWin::kMTPDeviceWithValidInfo, false);
-}
-
-} // namespace test
-} // namespace chrome

Powered by Google App Engine
This is Rietveld 408576698