Chromium Code Reviews| Index: chrome/browser/system_monitor/removable_device_notifications_chromeos_unittest.cc |
| diff --git a/chrome/browser/system_monitor/removable_device_notifications_chromeos_unittest.cc b/chrome/browser/system_monitor/removable_device_notifications_chromeos_unittest.cc |
| index 753854c3cbbf43e561a97fd8cb44e0dc0c39596a..524114efbaf99f8e0ba37ecc5a50b02bb614c600 100644 |
| --- a/chrome/browser/system_monitor/removable_device_notifications_chromeos_unittest.cc |
| +++ b/chrome/browser/system_monitor/removable_device_notifications_chromeos_unittest.cc |
| @@ -31,9 +31,21 @@ using testing::_; |
| const char kDevice1[] = "/dev/d1"; |
| const char kDevice2[] = "/dev/disk/d2"; |
| const char kDevice1Name[] = "d1"; |
| +const char kDevice1NameWithSizeInfo[] = "2KB d1"; |
| +const char kDevice1Size[] = "2KB"; |
| const char kDevice2Name[] = "d2"; |
| +const char kDevice2NameWithSizeInfo[] = "19GB d2"; |
| +const char kEmptyDeviceLabel[] = ""; |
| const char kMountPointA[] = "mnt_a"; |
| const char kMountPointB[] = "mnt_b"; |
| +const char kProductName[] = "Z101"; |
| +const char kSDCardDeviceName[] = "8MB SD Card"; |
| +const char kVendorName[] = "CompanyA"; |
| +const char kDeviceNameWithManufacturerDetails[] = "2KB {CompanyA, Z101}"; |
| + |
| +uint64 kDevice1SizeInBytes = 2048; |
| +uint64 kDevice2SizeInBytes = 21231209600; |
| +uint64 kSDCardSizeInBytes = 9000000; |
| std::string GetDCIMDeviceId(const std::string& unique_id) { |
| return chrome::MediaStorageUtil::MakeDeviceId( |
| @@ -41,98 +53,41 @@ std::string GetDCIMDeviceId(const std::string& unique_id) { |
| chrome::kFSUniqueIdPrefix + unique_id); |
| } |
| +// Wrapper class to test RemovableDeviceNotificationsCros. |
| class RemovableDeviceNotificationsCrosTest : public testing::Test { |
| public: |
| - RemovableDeviceNotificationsCrosTest() |
| - : ui_thread_(BrowserThread::UI, &ui_loop_), |
| - file_thread_(BrowserThread::FILE) { |
|
kmadhusu
2012/11/08 03:57:25
Moved the function definitions out of the class de
Lei Zhang
2012/11/09 01:12:18
It would be nice if you can do this in a different
kmadhusu
2012/11/09 21:59:40
Done.
|
| - } |
| - virtual ~RemovableDeviceNotificationsCrosTest() {} |
| + RemovableDeviceNotificationsCrosTest(); |
| + virtual ~RemovableDeviceNotificationsCrosTest(); |
| protected: |
| - virtual void SetUp() { |
| - ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| - ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir()); |
| - file_thread_.Start(); |
| - |
| - mock_devices_changed_observer_.reset(new base::MockDevicesChangedObserver); |
| - system_monitor_.AddDevicesChangedObserver( |
| - mock_devices_changed_observer_.get()); |
| - |
| - disk_mount_manager_mock_ = new disks::MockDiskMountManager(); |
| - DiskMountManager::InitializeForTesting(disk_mount_manager_mock_); |
| - disk_mount_manager_mock_->SetupDefaultReplies(); |
| - |
| - // Initialize the test subject. |
| - notifications_ = new RemovableDeviceNotificationsCros(); |
| - } |
| - |
| - virtual void TearDown() { |
| - notifications_ = NULL; |
| - disk_mount_manager_mock_ = NULL; |
| - DiskMountManager::Shutdown(); |
| - system_monitor_.RemoveDevicesChangedObserver( |
| - mock_devices_changed_observer_.get()); |
| - WaitForFileThread(); |
| - } |
| - |
| - base::MockDevicesChangedObserver& observer() { |
| - return *mock_devices_changed_observer_; |
| - } |
| + // testing::Test: |
| + virtual void SetUp() OVERRIDE; |
| + virtual void TearDown() OVERRIDE; |
| void MountDevice(MountError error_code, |
| const DiskMountManager::MountPointInfo& mount_info, |
| const std::string& unique_id, |
| - const std::string& device_label) { |
| - if (error_code == MOUNT_ERROR_NONE) { |
| - disk_mount_manager_mock_->CreateDiskEntryForMountDevice( |
| - mount_info, unique_id, device_label); |
| - } |
| - notifications_->MountCompleted(disks::DiskMountManager::MOUNTING, |
| - error_code, |
| - mount_info); |
| - WaitForFileThread(); |
| - } |
| - |
| + const std::string& device_label, |
| + const std::string& vendor_name, |
| + const std::string& product_name, |
| + DeviceType device_type, |
| + uint64 device_size_in_bytes); |
| void UnmountDevice(MountError error_code, |
| - const DiskMountManager::MountPointInfo& mount_info) { |
| - notifications_->MountCompleted(disks::DiskMountManager::UNMOUNTING, |
| - error_code, |
| - mount_info); |
| - if (error_code == MOUNT_ERROR_NONE) { |
| - disk_mount_manager_mock_->RemoveDiskEntryForMountDevice( |
| - mount_info); |
| - } |
| - WaitForFileThread(); |
| - } |
| + const DiskMountManager::MountPointInfo& mount_info); |
| + string16 GetDeviceStorageSizeInfo(const std::string& device_location); |
| // Create a directory named |dir| relative to the test directory. |
| // Set |with_dcim_dir| to true if the created directory will have a "DCIM" |
| // subdirectory. |
| // Returns the full path to the created directory on success, or an empty |
| // path on failure. |
| - FilePath CreateMountPoint(const std::string& dir, bool with_dcim_dir) { |
| - FilePath return_path(scoped_temp_dir_.path()); |
| - return_path = return_path.AppendASCII(dir); |
| - FilePath path(return_path); |
| - if (with_dcim_dir) |
| - path = path.AppendASCII("DCIM"); |
| - if (!file_util::CreateDirectory(path)) |
| - return FilePath(); |
| - return return_path; |
| - } |
| + FilePath CreateMountPoint(const std::string& dir, bool with_dcim_dir); |
| - static void PostQuitToUIThread() { |
| - BrowserThread::PostTask(BrowserThread::UI, |
| - FROM_HERE, |
| - MessageLoop::QuitClosure()); |
| - } |
| + static void PostQuitToUIThread(); |
| + static void WaitForFileThread(); |
| - static void WaitForFileThread() { |
| - BrowserThread::PostTask(BrowserThread::FILE, |
| - FROM_HERE, |
| - base::Bind(&PostQuitToUIThread)); |
| - MessageLoop::current()->Run(); |
| + base::MockDevicesChangedObserver& observer() { |
| + return *mock_devices_changed_observer_; |
| } |
| private: |
| @@ -155,6 +110,104 @@ class RemovableDeviceNotificationsCrosTest : public testing::Test { |
| DISALLOW_COPY_AND_ASSIGN(RemovableDeviceNotificationsCrosTest); |
| }; |
| +RemovableDeviceNotificationsCrosTest::RemovableDeviceNotificationsCrosTest() |
| + : ui_thread_(BrowserThread::UI, &ui_loop_), |
| + file_thread_(BrowserThread::FILE) { |
| +} |
| + |
| +RemovableDeviceNotificationsCrosTest::~RemovableDeviceNotificationsCrosTest() { |
| +} |
| + |
| +void RemovableDeviceNotificationsCrosTest::SetUp() { |
| + ASSERT_TRUE(BrowserThread::CurrentlyOn(BrowserThread::UI)); |
| + ASSERT_TRUE(scoped_temp_dir_.CreateUniqueTempDir()); |
| + file_thread_.Start(); |
| + |
| + mock_devices_changed_observer_.reset(new base::MockDevicesChangedObserver); |
| + system_monitor_.AddDevicesChangedObserver( |
| + mock_devices_changed_observer_.get()); |
| + |
| + disk_mount_manager_mock_ = new disks::MockDiskMountManager(); |
| + DiskMountManager::InitializeForTesting(disk_mount_manager_mock_); |
| + disk_mount_manager_mock_->SetupDefaultReplies(); |
| + |
| + // Initialize the test subject. |
| + notifications_ = new RemovableDeviceNotificationsCros(); |
| +} |
| + |
| +void RemovableDeviceNotificationsCrosTest::TearDown() { |
| + notifications_ = NULL; |
| + disk_mount_manager_mock_ = NULL; |
| + DiskMountManager::Shutdown(); |
| + system_monitor_.RemoveDevicesChangedObserver( |
| + mock_devices_changed_observer_.get()); |
| + WaitForFileThread(); |
| +} |
| + |
| +void RemovableDeviceNotificationsCrosTest::MountDevice( |
| + MountError error_code, |
| + const DiskMountManager::MountPointInfo& mount_info, |
| + const std::string& unique_id, |
| + const std::string& device_label, |
| + const std::string& vendor_name, |
| + const std::string& product_name, |
| + DeviceType device_type, |
| + uint64 device_size_in_bytes) { |
| + if (error_code == MOUNT_ERROR_NONE) { |
| + disk_mount_manager_mock_->CreateDiskEntryForMountDevice( |
| + mount_info, unique_id, device_label, vendor_name, product_name, |
| + device_type, device_size_in_bytes); |
| + } |
| + notifications_->MountCompleted(disks::DiskMountManager::MOUNTING, |
| + error_code, |
| + mount_info); |
| + WaitForFileThread(); |
| +} |
| + |
| +void RemovableDeviceNotificationsCrosTest::UnmountDevice( |
| + MountError error_code, |
| + const DiskMountManager::MountPointInfo& mount_info) { |
| + notifications_->MountCompleted(disks::DiskMountManager::UNMOUNTING, |
| + error_code, |
| + mount_info); |
| + if (error_code == MOUNT_ERROR_NONE) { |
| + disk_mount_manager_mock_->RemoveDiskEntryForMountDevice( |
| + mount_info); |
| + } |
| + WaitForFileThread(); |
| +} |
| + |
| +string16 RemovableDeviceNotificationsCrosTest::GetDeviceStorageSizeInfo( |
| + const std::string& device_location) { |
| + return notifications_->GetStorageSizeInfo(device_location); |
| +} |
| + |
| +FilePath RemovableDeviceNotificationsCrosTest::CreateMountPoint( |
| + const std::string& dir, |
| + bool with_dcim_dir) { |
| + FilePath return_path(scoped_temp_dir_.path()); |
| + return_path = return_path.AppendASCII(dir); |
| + FilePath path(return_path); |
| + if (with_dcim_dir) |
| + path = path.AppendASCII("DCIM"); |
| + if (!file_util::CreateDirectory(path)) |
| + return FilePath(); |
| + return return_path; |
| +} |
| + |
| +// static |
| +void RemovableDeviceNotificationsCrosTest::PostQuitToUIThread() { |
| + BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, |
| + MessageLoop::QuitClosure()); |
| +} |
| + |
| +// static |
| +void RemovableDeviceNotificationsCrosTest::WaitForFileThread() { |
| + BrowserThread::PostTask(BrowserThread::FILE, FROM_HERE, |
| + base::Bind(&PostQuitToUIThread)); |
| + MessageLoop::current()->Run(); |
| +} |
| + |
| // Simple test case where we attach and detach a media device. |
| TEST_F(RemovableDeviceNotificationsCrosTest, BasicAttachDetach) { |
| testing::Sequence mock_sequence; |
| @@ -167,10 +220,11 @@ TEST_F(RemovableDeviceNotificationsCrosTest, BasicAttachDetach) { |
| const std::string kUniqueId0 = "FFFF-FFFF"; |
| EXPECT_CALL(observer(), |
| OnRemovableStorageAttached(GetDCIMDeviceId(kUniqueId0), |
| - ASCIIToUTF16(kDevice1Name), |
| + ASCIIToUTF16(kDevice1NameWithSizeInfo), |
| mount_path1.value())) |
| .InSequence(mock_sequence); |
| - MountDevice(MOUNT_ERROR_NONE, mount_info, kUniqueId0, kDevice1Name); |
| + MountDevice(MOUNT_ERROR_NONE, mount_info, kUniqueId0, kDevice1Name, |
| + kVendorName, kProductName, DEVICE_TYPE_USB, kDevice1SizeInBytes); |
| EXPECT_CALL(observer(), |
| OnRemovableStorageDetached(GetDCIMDeviceId(kUniqueId0))) |
| @@ -187,10 +241,11 @@ TEST_F(RemovableDeviceNotificationsCrosTest, BasicAttachDetach) { |
| EXPECT_CALL(observer(), |
| OnRemovableStorageAttached(GetDCIMDeviceId(kUniqueId1), |
| - ASCIIToUTF16(kDevice2Name), |
| + ASCIIToUTF16(kDevice2NameWithSizeInfo), |
| mount_path2.value())) |
| .InSequence(mock_sequence); |
| - MountDevice(MOUNT_ERROR_NONE, mount_info2, kUniqueId1, kDevice2Name); |
| + MountDevice(MOUNT_ERROR_NONE, mount_info2, kUniqueId1, kDevice2Name, |
| + kVendorName, kProductName, DEVICE_TYPE_USB, kDevice2SizeInBytes); |
| EXPECT_CALL(observer(), |
| OnRemovableStorageDetached(GetDCIMDeviceId(kUniqueId1))) |
| @@ -212,9 +267,11 @@ TEST_F(RemovableDeviceNotificationsCrosTest, NoDCIM) { |
| chrome::MediaStorageUtil::REMOVABLE_MASS_STORAGE_NO_DCIM, |
| chrome::kFSUniqueIdPrefix + kUniqueId); |
| EXPECT_CALL(observer(), |
| - OnRemovableStorageAttached(device_id, ASCIIToUTF16(kDevice1Name), |
| + OnRemovableStorageAttached(device_id, |
| + ASCIIToUTF16(kDevice1NameWithSizeInfo), |
| mount_path.value())).Times(1); |
| - MountDevice(MOUNT_ERROR_NONE, mount_info, kUniqueId, kDevice1Name); |
| + MountDevice(MOUNT_ERROR_NONE, mount_info, kUniqueId, kDevice1Name, |
| + kVendorName, kProductName, DEVICE_TYPE_USB, kDevice1SizeInBytes); |
| } |
| // Non device mounts and mount errors are ignored. |
| @@ -230,18 +287,93 @@ TEST_F(RemovableDeviceNotificationsCrosTest, Ignore) { |
| MOUNT_TYPE_DEVICE, |
| disks::MOUNT_CONDITION_NONE); |
| EXPECT_CALL(observer(), OnRemovableStorageAttached(_, _, _)).Times(0); |
| - MountDevice(MOUNT_ERROR_UNKNOWN, mount_info, kUniqueId, kDevice1Name); |
| + MountDevice(MOUNT_ERROR_UNKNOWN, mount_info, kUniqueId, kDevice1Name, |
| + kVendorName, kProductName, DEVICE_TYPE_USB, kDevice1SizeInBytes); |
| // Not a device |
| mount_info.mount_type = MOUNT_TYPE_ARCHIVE; |
| EXPECT_CALL(observer(), OnRemovableStorageAttached(_, _, _)).Times(0); |
| - MountDevice(MOUNT_ERROR_NONE, mount_info, kUniqueId, kDevice1Name); |
| + MountDevice(MOUNT_ERROR_NONE, mount_info, kUniqueId, kDevice1Name, |
| + kVendorName, kProductName, DEVICE_TYPE_USB, kDevice1SizeInBytes); |
| // Unsupported file system. |
| mount_info.mount_type = MOUNT_TYPE_DEVICE; |
| mount_info.mount_condition = disks::MOUNT_CONDITION_UNSUPPORTED_FILESYSTEM; |
| EXPECT_CALL(observer(), OnRemovableStorageAttached(_, _, _)).Times(0); |
| - MountDevice(MOUNT_ERROR_NONE, mount_info, kUniqueId, kDevice1Name); |
| + MountDevice(MOUNT_ERROR_NONE, mount_info, kUniqueId, kDevice1Name, |
| + kVendorName, kProductName, DEVICE_TYPE_USB, kDevice1SizeInBytes); |
| +} |
| + |
| +TEST_F(RemovableDeviceNotificationsCrosTest, SDCardAttachDetach) { |
| + testing::Sequence mock_sequence; |
| + FilePath mount_path1 = CreateMountPoint(kMountPointA, true); |
| + ASSERT_FALSE(mount_path1.empty()); |
| + DiskMountManager::MountPointInfo mount_info(kSDCardDeviceName, |
| + mount_path1.value(), |
| + MOUNT_TYPE_DEVICE, |
| + disks::MOUNT_CONDITION_NONE); |
| + const std::string kUniqueId0 = "FFFF-FFFF"; |
| + EXPECT_CALL(observer(), |
| + OnRemovableStorageAttached(GetDCIMDeviceId(kUniqueId0), |
| + ASCIIToUTF16(kSDCardDeviceName), |
| + mount_path1.value())) |
| + .InSequence(mock_sequence); |
| + MountDevice(MOUNT_ERROR_NONE, mount_info, kUniqueId0, kSDCardDeviceName, |
| + kVendorName, kProductName, DEVICE_TYPE_SD, kSDCardSizeInBytes); |
| + |
| + EXPECT_CALL(observer(), |
| + OnRemovableStorageDetached(GetDCIMDeviceId(kUniqueId0))) |
| + .InSequence(mock_sequence); |
| + UnmountDevice(MOUNT_ERROR_NONE, mount_info); |
| +} |
| + |
| +TEST_F(RemovableDeviceNotificationsCrosTest, AttachDeviceWithEmptyLabel) { |
| + testing::Sequence mock_sequence; |
| + FilePath mount_path1 = CreateMountPoint(kMountPointA, true); |
| + ASSERT_FALSE(mount_path1.empty()); |
| + DiskMountManager::MountPointInfo mount_info(kEmptyDeviceLabel, |
| + mount_path1.value(), |
| + MOUNT_TYPE_DEVICE, |
| + disks::MOUNT_CONDITION_NONE); |
| + const std::string kUniqueId0 = "FFFF-FFFF"; |
| + EXPECT_CALL(observer(), OnRemovableStorageAttached( |
| + GetDCIMDeviceId(kUniqueId0), |
| + ASCIIToUTF16(kDeviceNameWithManufacturerDetails), |
| + mount_path1.value())) |
| + .InSequence(mock_sequence); |
| + MountDevice(MOUNT_ERROR_NONE, mount_info, kUniqueId0, kEmptyDeviceLabel, |
| + kVendorName, kProductName, DEVICE_TYPE_USB, kDevice1SizeInBytes); |
| + |
| + EXPECT_CALL(observer(), |
| + OnRemovableStorageDetached(GetDCIMDeviceId(kUniqueId0))) |
| + .InSequence(mock_sequence); |
| + UnmountDevice(MOUNT_ERROR_NONE, mount_info); |
| +} |
| + |
| +TEST_F(RemovableDeviceNotificationsCrosTest, GetStorageSizeInfo) { |
| + testing::Sequence mock_sequence; |
| + FilePath mount_path1 = CreateMountPoint(kMountPointA, true); |
| + ASSERT_FALSE(mount_path1.empty()); |
| + ASSERT_TRUE(GetDeviceStorageSizeInfo(mount_path1.value()).empty()); |
| + DiskMountManager::MountPointInfo mount_info(kEmptyDeviceLabel, |
| + mount_path1.value(), |
| + MOUNT_TYPE_DEVICE, |
| + disks::MOUNT_CONDITION_NONE); |
| + const std::string kUniqueId0 = "FFFF-FFFF"; |
| + EXPECT_CALL(observer(), OnRemovableStorageAttached( |
| + GetDCIMDeviceId(kUniqueId0), |
| + ASCIIToUTF16(kDeviceNameWithManufacturerDetails), |
| + mount_path1.value())) |
| + .InSequence(mock_sequence); |
| + MountDevice(MOUNT_ERROR_NONE, mount_info, kUniqueId0, kEmptyDeviceLabel, |
| + kVendorName, kProductName, DEVICE_TYPE_USB, kDevice1SizeInBytes); |
| + |
| + EXPECT_EQ(ASCIIToUTF16(kDevice1Size), |
| + GetDeviceStorageSizeInfo(mount_path1.value())); |
| + EXPECT_CALL(observer(), |
| + OnRemovableStorageDetached(GetDCIMDeviceId(kUniqueId0))) |
| + .InSequence(mock_sequence); |
| + UnmountDevice(MOUNT_ERROR_NONE, mount_info); |
| } |
| } // namespace |