| 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..faace311826a4126127bce6c13449dba89fbd64c 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[] = "110 KB d1";
|
| +const char kDevice1Size[] = "110 KB";
|
| const char kDevice2Name[] = "d2";
|
| +const char kDevice2NameWithSizeInfo[] = "19.8 GB d2";
|
| +const char kEmptyDeviceLabel[] = "";
|
| const char kMountPointA[] = "mnt_a";
|
| const char kMountPointB[] = "mnt_b";
|
| +const char kProductName[] = "Z101";
|
| +const char kSDCardDeviceName[] = "8.6 MB SD Card";
|
| +const char kVendorName[] = "CompanyA";
|
| +const char kDeviceNameWithManufacturerDetails[] = "110 KB {CompanyA, Z101}";
|
| +
|
| +uint64 kDevice1SizeInBytes = 113048;
|
| +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) {
|
| - }
|
| - 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
|
|
|