VOLUME_UNMOUNTED,
FORMAT_STARTED,
FORMAT_COMPLETED,
+ HARD_UNPLUGGED,
} type;
// Available on DEVICE_ADDED, DEVICE_REMOVED, VOLUME_MOUNTED,
// Available on DISK_ADDED.
bool mounting;
- // Available on DEVICE_REMOVED;
- bool hard_unplugged;
-
// Available on VOLUME_MOUNTED and VOLUME_UNMOUNTED.
chromeos::MountError mount_error;
events_.push_back(event);
}
- virtual void OnDeviceRemoved(const std::string& device_path,
- bool hard_unplugged) OVERRIDE {
+ virtual void OnDeviceRemoved(const std::string& device_path) OVERRIDE {
Event event;
event.type = Event::DEVICE_REMOVED;
event.device_path = device_path;
- event.hard_unplugged = hard_unplugged;
events_.push_back(event);
}
events_.push_back(event);
}
+ virtual void OnHardUnplugged(const std::string& device_path) OVERRIDE {
+ Event event;
+ event.type = Event::HARD_UNPLUGGED;
+ event.device_path = device_path;
+ events_.push_back(event);
+ }
+
virtual void OnFormatStarted(
const std::string& device_path, bool success) OVERRIDE {
Event event;
const bool kIsHidden = true;
const chromeos::disks::DiskMountManager::Disk kDisk(
"device1", "", "", "", "", "", "", "", "", "", "", "",
- chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, kIsHidden);
+ chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false,
+ kIsHidden);
volume_manager()->OnDiskEvent(
chromeos::disks::DiskMountManager::DISK_ADDED, &kDisk);
const chromeos::disks::DiskMountManager::Disk kEmptyDevicePathDisk(
"", // empty device path.
"", "", "", "", "", "", "", "", "", "", "",
- chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false);
+ chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false,
+ false);
volume_manager()->OnDiskEvent(
chromeos::disks::DiskMountManager::DISK_ADDED, &kEmptyDevicePathDisk);
EXPECT_EQ(0U, observer.events().size());
const bool kHasMedia = true;
const chromeos::disks::DiskMountManager::Disk kMediaDisk(
"device1", "", "", "", "", "", "", "", "", "", "", "",
- chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, kHasMedia, false, false);
+ chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, kHasMedia, false, false,
+ false);
volume_manager()->OnDiskEvent(
chromeos::disks::DiskMountManager::DISK_ADDED, &kMediaDisk);
ASSERT_EQ(1U, observer.events().size());
const chromeos::disks::DiskMountManager::Disk kMountedMediaDisk(
"device1", "mounted", "", "", "", "", "", "", "", "", "", "",
chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false,
- kHasMedia, false, false);
+ kHasMedia, false, false, false);
volume_manager()->OnDiskEvent(
chromeos::disks::DiskMountManager::DISK_ADDED, &kMountedMediaDisk);
ASSERT_EQ(1U, observer.events().size());
const chromeos::disks::DiskMountManager::Disk kNoMediaDisk(
"device1", "", "", "", "", "", "", "", "", "", "", "",
chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false,
- kWithoutMedia, false, false);
+ kWithoutMedia, false, false, false);
volume_manager()->OnDiskEvent(
chromeos::disks::DiskMountManager::DISK_ADDED, &kNoMediaDisk);
ASSERT_EQ(1U, observer.events().size());
const chromeos::disks::DiskMountManager::Disk kMediaDisk(
"device1", "", "", "", "", "", "", "", "", "", "", "",
chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false,
- kHasMedia, false, false);
+ kHasMedia, false, false, false);
volume_manager()->OnDiskEvent(
chromeos::disks::DiskMountManager::DISK_ADDED, &kMediaDisk);
ASSERT_EQ(1U, observer.events().size());
const chromeos::disks::DiskMountManager::Disk kMountedDisk(
"device1", "mount_path", "", "", "", "", "", "", "", "", "", "",
- chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false);
+ chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false,
+ false);
volume_manager()->OnDiskEvent(
chromeos::disks::DiskMountManager::DISK_REMOVED, &kMountedDisk);
- ASSERT_EQ(1U, observer.events().size());
+ ASSERT_EQ(2U, observer.events().size());
const LoggingObserver::Event& event = observer.events()[0];
EXPECT_EQ(LoggingObserver::Event::DISK_REMOVED, event.type);
EXPECT_EQ("device1", event.device_path);
+ // Since the Disk has non-empty mount_path, it's regarded as hard unplugging.
+ EXPECT_EQ(LoggingObserver::Event::HARD_UNPLUGGED,
+ observer.events()[1].type);
+
ASSERT_EQ(1U, disk_mount_manager_->unmount_requests().size());
const FakeDiskMountManager::UnmountRequest& unmount_request =
disk_mount_manager_->unmount_requests()[0];
const chromeos::disks::DiskMountManager::Disk kNotMountedDisk(
"device1", "", "", "", "", "", "", "", "", "", "", "",
- chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false);
+ chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false,
+ false);
volume_manager()->OnDiskEvent(
chromeos::disks::DiskMountManager::DISK_REMOVED, &kNotMountedDisk);
const chromeos::disks::DiskMountManager::Disk kDisk(
"device1", "", "", "", "", "", "", "", "", "", "", "",
- chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, true, false, false);
+ chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, true, false, false,
+ false);
volume_manager()->OnDiskEvent(
chromeos::disks::DiskMountManager::DISK_CHANGED, &kDisk);
new chromeos::disks::DiskMountManager::Disk(
"device1", "", "", "", "", "", "", "", "", "", "uuid1", "",
chromeos::DEVICE_TYPE_UNKNOWN, 0,
- false, false, false, false, false));
+ false, false, false, false, false, false));
disk_mount_manager_->AddDiskForTest(disk.release());
disk_mount_manager_->MountPath(
"device1", "", "", chromeos::MOUNT_TYPE_DEVICE);
+ const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint(
+ "device1",
+ "mount1",
+ chromeos::MOUNT_TYPE_DEVICE,
+ chromeos::disks::MOUNT_CONDITION_NONE);
+
+ volume_manager()->OnMountEvent(
+ chromeos::disks::DiskMountManager::MOUNTING,
+ chromeos::MOUNT_ERROR_NONE,
+ kMountPoint);
+
+ LoggingObserver observer;
+
// Emulate system suspend and then resume.
{
power_manager_client_->SendSuspendImminent();
power_manager_client_->SendSuspendDone();
// After resume, the device is unmounted and then mounted.
- disk_mount_manager_->UnmountPath(
- "device1", chromeos::UNMOUNT_OPTIONS_NONE,
- chromeos::disks::DiskMountManager::UnmountPathCallback());
- disk_mount_manager_->MountPath(
- "device1", "", "", chromeos::MOUNT_TYPE_DEVICE);
- }
+ volume_manager()->OnMountEvent(
+ chromeos::disks::DiskMountManager::UNMOUNTING,
+ chromeos::MOUNT_ERROR_NONE,
+ kMountPoint);
- LoggingObserver observer;
- volume_manager()->AddObserver(&observer);
-
- const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint(
- "device1",
- "mount1",
- chromeos::MOUNT_TYPE_DEVICE,
- chromeos::disks::MOUNT_CONDITION_NONE);
+ // Observe what happened for the mount event.
+ volume_manager()->AddObserver(&observer);
- volume_manager()->OnMountEvent(chromeos::disks::DiskMountManager::MOUNTING,
- chromeos::MOUNT_ERROR_NONE,
- kMountPoint);
+ volume_manager()->OnMountEvent(
+ chromeos::disks::DiskMountManager::MOUNTING,
+ chromeos::MOUNT_ERROR_NONE,
+ kMountPoint);
+ }
ASSERT_EQ(1U, observer.events().size());
const LoggingObserver::Event& event = observer.events()[0];
// Add 1 disk.
const chromeos::disks::DiskMountManager::Disk kMediaDisk(
"device1", "", "", "", "", "", "", "", "", "", "", "",
- chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, true, false, false);
+ chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, true, false, false,
+ false);
volume_manager()->OnDiskEvent(
chromeos::disks::DiskMountManager::DISK_ADDED, &kMediaDisk);
secondary.volume_manager()->OnDiskEvent(
}
TEST_F(VolumeManagerTest, HardUnplugged) {
+ volume_manager()->Initialize();
LoggingObserver observer;
volume_manager()->AddObserver(&observer);
- volume_manager()->OnDeviceEvent(
- chromeos::disks::DiskMountManager::DEVICE_REMOVED, "device1");
// Disk that has a mount path is removed.
- chromeos::disks::DiskMountManager::Disk disk("device1",
- "/mount/path",
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- "",
- "uuid1",
- "device1",
- chromeos::DEVICE_TYPE_UNKNOWN,
- 0,
- false,
- false,
- false,
- false,
- false);
+ chromeos::disks::DiskMountManager::Disk mounted_disk(
+ "device1",
+ "/mount/path",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "uuid1",
+ "device1",
+ chromeos::DEVICE_TYPE_UNKNOWN,
+ 0,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false);
+
+ chromeos::disks::DiskMountManager::Disk unmounted_disk(
+ "device2",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "uuid2",
+ "device2",
+ chromeos::DEVICE_TYPE_UNKNOWN,
+ 0,
+ false,
+ false,
+ false,
+ false,
+ false,
+ false);
+
+ // Do not publish the hard_unplugged event for a disk that is already
+ // unmounted.
disk_mount_manager_->InvokeDiskEventForTest(
- chromeos::disks::DiskMountManager::DISK_REMOVED, &disk);
-
- volume_manager()->OnDeviceEvent(
- chromeos::disks::DiskMountManager::DEVICE_REMOVED, "device1");
+ chromeos::disks::DiskMountManager::DISK_REMOVED, &unmounted_disk);
+ // Publish the hard_unplugged event for a disk that is currently mounted.
+ disk_mount_manager_->InvokeDiskEventForTest(
+ chromeos::disks::DiskMountManager::DISK_REMOVED, &mounted_disk);
+ // Do not publish the hard_unplugged event twice for the same disk.
+ disk_mount_manager_->InvokeDiskEventForTest(
+ chromeos::disks::DiskMountManager::DISK_REMOVED, &mounted_disk);
- EXPECT_EQ(2u, observer.events().size());
- EXPECT_EQ(LoggingObserver::Event::DEVICE_REMOVED, observer.events()[0].type);
- EXPECT_EQ(LoggingObserver::Event::DEVICE_REMOVED, observer.events()[1].type);
- EXPECT_FALSE(observer.events()[0].hard_unplugged);
- EXPECT_TRUE(observer.events()[1].hard_unplugged);
+ EXPECT_EQ(4u, observer.events().size());
+ EXPECT_EQ(LoggingObserver::Event::DISK_REMOVED, observer.events()[0].type);
+ EXPECT_EQ(LoggingObserver::Event::DISK_REMOVED, observer.events()[1].type);
+ EXPECT_EQ(LoggingObserver::Event::HARD_UNPLUGGED, observer.events()[2].type);
+ EXPECT_EQ(LoggingObserver::Event::DISK_REMOVED, observer.events()[3].type);
}
TEST_F(VolumeManagerTest, MTPPlugAndUnplug) {