Upstream version 9.38.198.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / file_manager / volume_manager_unittest.cc
index 7dc0488..c859317 100644 (file)
@@ -38,6 +38,7 @@ class LoggingObserver : public VolumeManagerObserver {
       VOLUME_UNMOUNTED,
       FORMAT_STARTED,
       FORMAT_COMPLETED,
+      HARD_UNPLUGGED,
     } type;
 
     // Available on DEVICE_ADDED, DEVICE_REMOVED, VOLUME_MOUNTED,
@@ -47,9 +48,6 @@ class LoggingObserver : public VolumeManagerObserver {
     // Available on DISK_ADDED.
     bool mounting;
 
-    // Available on DEVICE_REMOVED;
-    bool hard_unplugged;
-
     // Available on VOLUME_MOUNTED and VOLUME_UNMOUNTED.
     chromeos::MountError mount_error;
 
@@ -90,12 +88,10 @@ class LoggingObserver : public VolumeManagerObserver {
     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);
   }
 
@@ -119,6 +115,13 @@ class LoggingObserver : public VolumeManagerObserver {
     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;
@@ -241,7 +244,8 @@ TEST_F(VolumeManagerTest, OnDiskEvent_Hidden) {
   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);
@@ -268,7 +272,8 @@ TEST_F(VolumeManagerTest, OnDiskEvent_Added) {
   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());
@@ -276,7 +281,8 @@ TEST_F(VolumeManagerTest, OnDiskEvent_Added) {
   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());
@@ -309,7 +315,7 @@ TEST_F(VolumeManagerTest, OnDiskEvent_AddedNonMounting) {
     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());
@@ -332,7 +338,7 @@ TEST_F(VolumeManagerTest, OnDiskEvent_AddedNonMounting) {
     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());
@@ -357,7 +363,7 @@ TEST_F(VolumeManagerTest, OnDiskEvent_AddedNonMounting) {
     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());
@@ -378,15 +384,20 @@ TEST_F(VolumeManagerTest, OnDiskEvent_Removed) {
 
   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];
@@ -402,7 +413,8 @@ TEST_F(VolumeManagerTest, OnDiskEvent_RemovedNotMounted) {
 
   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);
 
@@ -423,7 +435,8 @@ TEST_F(VolumeManagerTest, OnDiskEvent_Changed) {
 
   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);
 
@@ -516,36 +529,43 @@ TEST_F(VolumeManagerTest, OnMountEvent_Remounting) {
       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];
@@ -715,7 +735,8 @@ TEST_F(VolumeManagerTest, ExternalStorageDisabledPolicyMultiProfile) {
   // 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(
@@ -818,42 +839,71 @@ TEST_F(VolumeManagerTest, ArchiveSourceFiltering) {
 }
 
 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) {