Update To 11.40.268.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / chromeos / file_manager / volume_manager_unittest.cc
index 53748e6..5013130 100644 (file)
@@ -9,13 +9,18 @@
 
 #include "base/basictypes.h"
 #include "base/prefs/pref_service.h"
+#include "base/strings/utf_string_conversions.h"
 #include "chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h"
 #include "chrome/browser/chromeos/file_manager/volume_manager_observer.h"
+#include "chrome/browser/chromeos/file_system_provider/fake_provided_file_system.h"
+#include "chrome/browser/chromeos/file_system_provider/service.h"
 #include "chrome/common/pref_names.h"
 #include "chrome/test/base/testing_profile.h"
 #include "chromeos/dbus/fake_power_manager_client.h"
 #include "chromeos/disks/disk_mount_manager.h"
+#include "components/storage_monitor/storage_info.h"
 #include "content/public/test/test_browser_thread_bundle.h"
+#include "extensions/browser/extension_registry.h"
 #include "testing/gtest/include/gtest/gtest.h"
 
 namespace file_manager {
@@ -45,9 +50,6 @@ class LoggingObserver : public VolumeManagerObserver {
     // Available on VOLUME_MOUNTED and VOLUME_UNMOUNTED.
     chromeos::MountError mount_error;
 
-    // Available on VOLUME_MOUNTED.
-    bool is_remounting;
-
     // Available on FORMAT_STARTED and FORMAT_COMPLETED.
     bool success;
   };
@@ -59,7 +61,7 @@ class LoggingObserver : public VolumeManagerObserver {
 
   // VolumeManagerObserver overrides.
   virtual void OnDiskAdded(const chromeos::disks::DiskMountManager::Disk& disk,
-                           bool mounting) OVERRIDE {
+                           bool mounting) override {
     Event event;
     event.type = Event::DISK_ADDED;
     event.device_path = disk.device_path();  // Keep only device_path.
@@ -68,21 +70,21 @@ class LoggingObserver : public VolumeManagerObserver {
   }
 
   virtual void OnDiskRemoved(
-      const chromeos::disks::DiskMountManager::Disk& disk) OVERRIDE {
+      const chromeos::disks::DiskMountManager::Disk& disk) override {
     Event event;
     event.type = Event::DISK_REMOVED;
     event.device_path = disk.device_path();  // Keep only device_path.
     events_.push_back(event);
   }
 
-  virtual void OnDeviceAdded(const std::string& device_path) OVERRIDE {
+  virtual void OnDeviceAdded(const std::string& device_path) override {
     Event event;
     event.type = Event::DEVICE_ADDED;
     event.device_path = device_path;
     events_.push_back(event);
   }
 
-  virtual void OnDeviceRemoved(const std::string& device_path) OVERRIDE {
+  virtual void OnDeviceRemoved(const std::string& device_path) override {
     Event event;
     event.type = Event::DEVICE_REMOVED;
     event.device_path = device_path;
@@ -90,18 +92,16 @@ class LoggingObserver : public VolumeManagerObserver {
   }
 
   virtual void OnVolumeMounted(chromeos::MountError error_code,
-                               const VolumeInfo& volume_info,
-                               bool is_remounting) OVERRIDE {
+                               const VolumeInfo& volume_info) override {
     Event event;
     event.type = Event::VOLUME_MOUNTED;
     event.device_path = volume_info.source_path.AsUTF8Unsafe();
     event.mount_error = error_code;
-    event.is_remounting = is_remounting;
     events_.push_back(event);
   }
 
   virtual void OnVolumeUnmounted(chromeos::MountError error_code,
-                                 const VolumeInfo& volume_info) OVERRIDE {
+                                 const VolumeInfo& volume_info) override {
     Event event;
     event.type = Event::VOLUME_UNMOUNTED;
     event.device_path = volume_info.source_path.AsUTF8Unsafe();
@@ -110,7 +110,7 @@ class LoggingObserver : public VolumeManagerObserver {
   }
 
   virtual void OnFormatStarted(
-      const std::string& device_path, bool success) OVERRIDE {
+      const std::string& device_path, bool success) override {
     Event event;
     event.type = Event::FORMAT_STARTED;
     event.device_path = device_path;
@@ -119,7 +119,7 @@ class LoggingObserver : public VolumeManagerObserver {
   }
 
   virtual void OnFormatCompleted(
-      const std::string& device_path, bool success) OVERRIDE {
+      const std::string& device_path, bool success) override {
     Event event;
     event.type = Event::FORMAT_COMPLETED;
     event.device_path = device_path;
@@ -137,108 +137,139 @@ class LoggingObserver : public VolumeManagerObserver {
 
 class VolumeManagerTest : public testing::Test {
  protected:
-  VolumeManagerTest() {
-  }
-  virtual ~VolumeManagerTest() {
-  }
+  // Helper class that contains per-profile objects.
+  class ProfileEnvironment {
+   public:
+    ProfileEnvironment(chromeos::PowerManagerClient* power_manager_client,
+                       chromeos::disks::DiskMountManager* disk_manager)
+        : profile_(new TestingProfile),
+          extension_registry_(
+              new extensions::ExtensionRegistry(profile_.get())),
+          file_system_provider_service_(
+              new chromeos::file_system_provider::Service(
+                  profile_.get(),
+                  extension_registry_.get())),
+          volume_manager_(
+              new VolumeManager(profile_.get(),
+                                NULL,  // DriveIntegrationService
+                                power_manager_client,
+                                disk_manager,
+                                file_system_provider_service_.get())) {
+      file_system_provider_service_->SetFileSystemFactoryForTesting(base::Bind(
+          &chromeos::file_system_provider::FakeProvidedFileSystem::Create));
+    }
+
+    Profile* profile() const { return profile_.get(); }
+    VolumeManager* volume_manager() const { return volume_manager_.get(); }
+
+   private:
+    scoped_ptr<TestingProfile> profile_;
+    scoped_ptr<extensions::ExtensionRegistry> extension_registry_;
+    scoped_ptr<chromeos::file_system_provider::Service>
+        file_system_provider_service_;
+    scoped_ptr<VolumeManager> volume_manager_;
+  };
 
-  virtual void SetUp() OVERRIDE {
+  virtual void SetUp() override {
     power_manager_client_.reset(new chromeos::FakePowerManagerClient);
     disk_mount_manager_.reset(new FakeDiskMountManager);
-    profile_.reset(new TestingProfile);
-    volume_manager_.reset(new VolumeManager(profile_.get(),
-                                            NULL,  // DriveIntegrationService
-                                            power_manager_client_.get(),
-                                            disk_mount_manager_.get()));
+    main_profile_.reset(new ProfileEnvironment(power_manager_client_.get(),
+                                               disk_mount_manager_.get()));
+  }
+
+  Profile* profile() const { return main_profile_->profile(); }
+  VolumeManager* volume_manager() const {
+    return main_profile_->volume_manager();
   }
 
   content::TestBrowserThreadBundle thread_bundle_;
   scoped_ptr<chromeos::FakePowerManagerClient> power_manager_client_;
   scoped_ptr<FakeDiskMountManager> disk_mount_manager_;
-  scoped_ptr<TestingProfile> profile_;
-  scoped_ptr<VolumeManager> volume_manager_;
+  scoped_ptr<ProfileEnvironment> main_profile_;
 };
 
 TEST_F(VolumeManagerTest, OnDriveFileSystemMountAndUnmount) {
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
+  volume_manager()->AddObserver(&observer);
 
-  volume_manager_->OnFileSystemMounted();
+  volume_manager()->OnFileSystemMounted();
 
   ASSERT_EQ(1U, observer.events().size());
   LoggingObserver::Event event = observer.events()[0];
   EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, event.type);
-  EXPECT_EQ(drive::util::GetDriveMountPointPath(profile_.get()).AsUTF8Unsafe(),
+  EXPECT_EQ(drive::util::GetDriveMountPointPath(profile()).AsUTF8Unsafe(),
             event.device_path);
   EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
-  EXPECT_FALSE(event.is_remounting);
 
-  volume_manager_->OnFileSystemBeingUnmounted();
+  volume_manager()->OnFileSystemBeingUnmounted();
 
   ASSERT_EQ(2U, observer.events().size());
   event = observer.events()[1];
   EXPECT_EQ(LoggingObserver::Event::VOLUME_UNMOUNTED, event.type);
-  EXPECT_EQ(drive::util::GetDriveMountPointPath(profile_.get()).AsUTF8Unsafe(),
+  EXPECT_EQ(drive::util::GetDriveMountPointPath(profile()).AsUTF8Unsafe(),
             event.device_path);
   EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
 
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnDriveFileSystemUnmountWithoutMount) {
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
-  volume_manager_->OnFileSystemBeingUnmounted();
+  volume_manager()->AddObserver(&observer);
+  volume_manager()->OnFileSystemBeingUnmounted();
 
   // Unmount event for non-mounted volume is not reported.
   ASSERT_EQ(0U, observer.events().size());
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnDiskEvent_Hidden) {
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
+  volume_manager()->AddObserver(&observer);
 
   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(
+  volume_manager()->OnDiskEvent(
       chromeos::disks::DiskMountManager::DISK_ADDED, &kDisk);
   EXPECT_EQ(0U, observer.events().size());
 
-  volume_manager_->OnDiskEvent(
+  volume_manager()->OnDiskEvent(
       chromeos::disks::DiskMountManager::DISK_REMOVED, &kDisk);
   EXPECT_EQ(0U, observer.events().size());
 
-  volume_manager_->OnDiskEvent(
+  volume_manager()->OnDiskEvent(
       chromeos::disks::DiskMountManager::DISK_CHANGED, &kDisk);
   EXPECT_EQ(0U, observer.events().size());
 
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnDiskEvent_Added) {
   // Enable external storage.
-  profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
+  profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
 
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
+  volume_manager()->AddObserver(&observer);
 
   const chromeos::disks::DiskMountManager::Disk kEmptyDevicePathDisk(
       "",  // empty device path.
       "", "", "", "", "", "", "", "", "", "", "",
-      chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false);
-  volume_manager_->OnDiskEvent(
+      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);
-  volume_manager_->OnDiskEvent(
+      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 LoggingObserver::Event& event = observer.events()[0];
@@ -254,24 +285,24 @@ TEST_F(VolumeManagerTest, OnDiskEvent_Added) {
   EXPECT_EQ("", mount_request.mount_label);
   EXPECT_EQ(chromeos::MOUNT_TYPE_DEVICE, mount_request.type);
 
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnDiskEvent_AddedNonMounting) {
   // Enable external storage.
-  profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
+  profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
 
   // Device which is already mounted.
   {
     LoggingObserver observer;
-    volume_manager_->AddObserver(&observer);
+    volume_manager()->AddObserver(&observer);
 
     const bool kHasMedia = true;
     const chromeos::disks::DiskMountManager::Disk kMountedMediaDisk(
         "device1", "mounted", "", "", "", "", "", "", "", "", "", "",
         chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false,
-        kHasMedia, false, false);
-    volume_manager_->OnDiskEvent(
+        kHasMedia, false, false, false);
+    volume_manager()->OnDiskEvent(
         chromeos::disks::DiskMountManager::DISK_ADDED, &kMountedMediaDisk);
     ASSERT_EQ(1U, observer.events().size());
     const LoggingObserver::Event& event = observer.events()[0];
@@ -281,20 +312,20 @@ TEST_F(VolumeManagerTest, OnDiskEvent_AddedNonMounting) {
 
     ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
 
-    volume_manager_->RemoveObserver(&observer);
+    volume_manager()->RemoveObserver(&observer);
   }
 
   // Device without media.
   {
     LoggingObserver observer;
-    volume_manager_->AddObserver(&observer);
+    volume_manager()->AddObserver(&observer);
 
     const bool kWithoutMedia = false;
     const chromeos::disks::DiskMountManager::Disk kNoMediaDisk(
         "device1", "", "", "", "", "", "", "", "", "", "", "",
         chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false,
-        kWithoutMedia, false, false);
-    volume_manager_->OnDiskEvent(
+        kWithoutMedia, false, false, false);
+    volume_manager()->OnDiskEvent(
         chromeos::disks::DiskMountManager::DISK_ADDED, &kNoMediaDisk);
     ASSERT_EQ(1U, observer.events().size());
     const LoggingObserver::Event& event = observer.events()[0];
@@ -304,22 +335,22 @@ TEST_F(VolumeManagerTest, OnDiskEvent_AddedNonMounting) {
 
     ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
 
-    volume_manager_->RemoveObserver(&observer);
+    volume_manager()->RemoveObserver(&observer);
   }
 
   // External storage is disabled.
   {
-    profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, true);
+    profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, true);
 
     LoggingObserver observer;
-    volume_manager_->AddObserver(&observer);
+    volume_manager()->AddObserver(&observer);
 
     const bool kHasMedia = true;
     const chromeos::disks::DiskMountManager::Disk kMediaDisk(
         "device1", "", "", "", "", "", "", "", "", "", "", "",
         chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false,
-        kHasMedia, false, false);
-    volume_manager_->OnDiskEvent(
+        kHasMedia, false, false, false);
+    volume_manager()->OnDiskEvent(
         chromeos::disks::DiskMountManager::DISK_ADDED, &kMediaDisk);
     ASSERT_EQ(1U, observer.events().size());
     const LoggingObserver::Event& event = observer.events()[0];
@@ -329,18 +360,19 @@ TEST_F(VolumeManagerTest, OnDiskEvent_AddedNonMounting) {
 
     ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
 
-    volume_manager_->RemoveObserver(&observer);
+    volume_manager()->RemoveObserver(&observer);
   }
 }
 
 TEST_F(VolumeManagerTest, OnDiskEvent_Removed) {
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
+  volume_manager()->AddObserver(&observer);
 
   const chromeos::disks::DiskMountManager::Disk kMountedDisk(
       "device1", "mount_path", "", "", "", "", "", "", "", "", "", "",
-      chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false);
-  volume_manager_->OnDiskEvent(
+      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());
@@ -354,17 +386,18 @@ TEST_F(VolumeManagerTest, OnDiskEvent_Removed) {
   EXPECT_EQ("mount_path", unmount_request.mount_path);
   EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_LAZY, unmount_request.options);
 
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnDiskEvent_RemovedNotMounted) {
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
+  volume_manager()->AddObserver(&observer);
 
   const chromeos::disks::DiskMountManager::Disk kNotMountedDisk(
       "device1", "", "", "", "", "", "", "", "", "", "", "",
-      chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false);
-  volume_manager_->OnDiskEvent(
+      chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false,
+      false);
+  volume_manager()->OnDiskEvent(
       chromeos::disks::DiskMountManager::DISK_REMOVED, &kNotMountedDisk);
 
   ASSERT_EQ(1U, observer.events().size());
@@ -374,32 +407,33 @@ TEST_F(VolumeManagerTest, OnDiskEvent_RemovedNotMounted) {
 
   ASSERT_EQ(0U, disk_mount_manager_->unmount_requests().size());
 
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnDiskEvent_Changed) {
-  // Changed event is just ignored.
+  // Changed event should cause mounting (if possible).
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
+  volume_manager()->AddObserver(&observer);
 
   const chromeos::disks::DiskMountManager::Disk kDisk(
       "device1", "", "", "", "", "", "", "", "", "", "", "",
-      chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false);
-  volume_manager_->OnDiskEvent(
+      chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, true, false, false,
+      false);
+  volume_manager()->OnDiskEvent(
       chromeos::disks::DiskMountManager::DISK_CHANGED, &kDisk);
 
-  EXPECT_EQ(0U, observer.events().size());
-  EXPECT_EQ(0U, disk_mount_manager_->mount_requests().size());
+  EXPECT_EQ(1U, observer.events().size());
+  EXPECT_EQ(1U, disk_mount_manager_->mount_requests().size());
   EXPECT_EQ(0U, disk_mount_manager_->unmount_requests().size());
 
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnDeviceEvent_Added) {
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
+  volume_manager()->AddObserver(&observer);
 
-  volume_manager_->OnDeviceEvent(
+  volume_manager()->OnDeviceEvent(
       chromeos::disks::DiskMountManager::DEVICE_ADDED, "device1");
 
   ASSERT_EQ(1U, observer.events().size());
@@ -407,14 +441,14 @@ TEST_F(VolumeManagerTest, OnDeviceEvent_Added) {
   EXPECT_EQ(LoggingObserver::Event::DEVICE_ADDED, event.type);
   EXPECT_EQ("device1", event.device_path);
 
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnDeviceEvent_Removed) {
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
+  volume_manager()->AddObserver(&observer);
 
-  volume_manager_->OnDeviceEvent(
+  volume_manager()->OnDeviceEvent(
       chromeos::disks::DiskMountManager::DEVICE_REMOVED, "device1");
 
   ASSERT_EQ(1U, observer.events().size());
@@ -422,25 +456,25 @@ TEST_F(VolumeManagerTest, OnDeviceEvent_Removed) {
   EXPECT_EQ(LoggingObserver::Event::DEVICE_REMOVED, event.type);
   EXPECT_EQ("device1", event.device_path);
 
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnDeviceEvent_Scanned) {
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
+  volume_manager()->AddObserver(&observer);
 
-  volume_manager_->OnDeviceEvent(
+  volume_manager()->OnDeviceEvent(
       chromeos::disks::DiskMountManager::DEVICE_SCANNED, "device1");
 
   // SCANNED event is just ignored.
   EXPECT_EQ(0U, observer.events().size());
 
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnMountEvent_MountingAndUnmounting) {
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
+  volume_manager()->AddObserver(&observer);
 
   const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint(
       "device1",
@@ -448,7 +482,7 @@ TEST_F(VolumeManagerTest, OnMountEvent_MountingAndUnmounting) {
       chromeos::MOUNT_TYPE_DEVICE,
       chromeos::disks::MOUNT_CONDITION_NONE);
 
-  volume_manager_->OnMountEvent(chromeos::disks::DiskMountManager::MOUNTING,
+  volume_manager()->OnMountEvent(chromeos::disks::DiskMountManager::MOUNTING,
                                 chromeos::MOUNT_ERROR_NONE,
                                 kMountPoint);
 
@@ -457,9 +491,8 @@ TEST_F(VolumeManagerTest, OnMountEvent_MountingAndUnmounting) {
   EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, event.type);
   EXPECT_EQ("device1", event.device_path);
   EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
-  EXPECT_FALSE(event.is_remounting);
 
-  volume_manager_->OnMountEvent(chromeos::disks::DiskMountManager::UNMOUNTING,
+  volume_manager()->OnMountEvent(chromeos::disks::DiskMountManager::UNMOUNTING,
                                 chromeos::MOUNT_ERROR_NONE,
                                 kMountPoint);
 
@@ -469,7 +502,7 @@ TEST_F(VolumeManagerTest, OnMountEvent_MountingAndUnmounting) {
   EXPECT_EQ("device1", event.device_path);
   EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
 
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnMountEvent_Remounting) {
@@ -477,55 +510,56 @@ 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);
 
-  // Emulate system suspend and then resume.
-  {
-    power_manager_client_->SendSuspendImminent();
-    power_manager::SuspendState state;
-    state.set_type(power_manager::SuspendState_Type_SUSPEND_TO_MEMORY);
-    state.set_wall_time(0);
-    power_manager_client_->SendSuspendStateChanged(state);
-    state.set_type(power_manager::SuspendState_Type_RESUME);
-    power_manager_client_->SendSuspendStateChanged(state);
-
-    // 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);
-  }
-
-  LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
-
   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);
+  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.
+    volume_manager()->OnMountEvent(
+        chromeos::disks::DiskMountManager::UNMOUNTING,
+        chromeos::MOUNT_ERROR_NONE,
+        kMountPoint);
+
+    // Observe what happened for the mount event.
+    volume_manager()->AddObserver(&observer);
+
+    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];
   EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, event.type);
   EXPECT_EQ("device1", event.device_path);
   EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
-  EXPECT_TRUE(event.is_remounting);
 
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnMountEvent_UnmountingWithoutMounting) {
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
+  volume_manager()->AddObserver(&observer);
 
   const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint(
       "device1",
@@ -533,21 +567,21 @@ TEST_F(VolumeManagerTest, OnMountEvent_UnmountingWithoutMounting) {
       chromeos::MOUNT_TYPE_DEVICE,
       chromeos::disks::MOUNT_CONDITION_NONE);
 
-  volume_manager_->OnMountEvent(chromeos::disks::DiskMountManager::UNMOUNTING,
+  volume_manager()->OnMountEvent(chromeos::disks::DiskMountManager::UNMOUNTING,
                                 chromeos::MOUNT_ERROR_NONE,
                                 kMountPoint);
 
   // Unmount event for a disk not mounted in this manager is not reported.
   ASSERT_EQ(0U, observer.events().size());
 
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnFormatEvent_Started) {
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
+  volume_manager()->AddObserver(&observer);
 
-  volume_manager_->OnFormatEvent(
+  volume_manager()->OnFormatEvent(
       chromeos::disks::DiskMountManager::FORMAT_STARTED,
       chromeos::FORMAT_ERROR_NONE,
       "device1");
@@ -558,14 +592,14 @@ TEST_F(VolumeManagerTest, OnFormatEvent_Started) {
   EXPECT_EQ("device1", event.device_path);
   EXPECT_TRUE(event.success);
 
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnFormatEvent_StartFailed) {
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
+  volume_manager()->AddObserver(&observer);
 
-  volume_manager_->OnFormatEvent(
+  volume_manager()->OnFormatEvent(
       chromeos::disks::DiskMountManager::FORMAT_STARTED,
       chromeos::FORMAT_ERROR_UNKNOWN,
       "device1");
@@ -576,14 +610,14 @@ TEST_F(VolumeManagerTest, OnFormatEvent_StartFailed) {
   EXPECT_EQ("device1", event.device_path);
   EXPECT_FALSE(event.success);
 
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnFormatEvent_Completed) {
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
+  volume_manager()->AddObserver(&observer);
 
-  volume_manager_->OnFormatEvent(
+  volume_manager()->OnFormatEvent(
       chromeos::disks::DiskMountManager::FORMAT_COMPLETED,
       chromeos::FORMAT_ERROR_NONE,
       "device1");
@@ -603,14 +637,14 @@ TEST_F(VolumeManagerTest, OnFormatEvent_Completed) {
   EXPECT_EQ("", mount_request.mount_label);
   EXPECT_EQ(chromeos::MOUNT_TYPE_DEVICE, mount_request.type);
 
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnFormatEvent_CompletedFailed) {
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
+  volume_manager()->AddObserver(&observer);
 
-  volume_manager_->OnFormatEvent(
+  volume_manager()->OnFormatEvent(
       chromeos::disks::DiskMountManager::FORMAT_COMPLETED,
       chromeos::FORMAT_ERROR_UNKNOWN,
       "device1");
@@ -623,7 +657,7 @@ TEST_F(VolumeManagerTest, OnFormatEvent_CompletedFailed) {
 
   EXPECT_EQ(0U, disk_mount_manager_->mount_requests().size());
 
-  volume_manager_->RemoveObserver(&observer);
+  volume_manager()->RemoveObserver(&observer);
 }
 
 TEST_F(VolumeManagerTest, OnExternalStorageDisabledChanged) {
@@ -638,16 +672,16 @@ TEST_F(VolumeManagerTest, OnExternalStorageDisabledChanged) {
   ASSERT_EQ(0U, disk_mount_manager_->unmount_requests().size());
 
   // Emulate to set kExternalStorageDisabled to false.
-  profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
-  volume_manager_->OnExternalStorageDisabledChanged();
+  profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
+  volume_manager()->OnExternalStorageDisabledChanged();
 
   // Expect no effects.
   EXPECT_EQ(2U, disk_mount_manager_->mount_points().size());
   EXPECT_EQ(0U, disk_mount_manager_->unmount_requests().size());
 
   // Emulate to set kExternalStorageDisabled to true.
-  profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, true);
-  volume_manager_->OnExternalStorageDisabledChanged();
+  profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, true);
+  volume_manager()->OnExternalStorageDisabledChanged();
 
   // The all mount points should be unmounted.
   EXPECT_EQ(0U, disk_mount_manager_->mount_points().size());
@@ -662,20 +696,68 @@ TEST_F(VolumeManagerTest, OnExternalStorageDisabledChanged) {
   EXPECT_EQ("mount2", unmount_request2.mount_path);
 }
 
+TEST_F(VolumeManagerTest, ExternalStorageDisabledPolicyMultiProfile) {
+  ProfileEnvironment secondary(power_manager_client_.get(),
+                               disk_mount_manager_.get());
+  volume_manager()->Initialize();
+  secondary.volume_manager()->Initialize();
+
+  // Simulates the case that the main profile has kExternalStorageDisabled set
+  // as false, and the secondary profile has the config set to true.
+  profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
+  secondary.profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled,
+                                              true);
+
+  LoggingObserver main_observer, secondary_observer;
+  volume_manager()->AddObserver(&main_observer);
+  secondary.volume_manager()->AddObserver(&secondary_observer);
+
+  // Add 1 disk.
+  const chromeos::disks::DiskMountManager::Disk kMediaDisk(
+      "device1", "", "", "", "", "", "", "", "", "", "", "",
+      chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, true, false, false,
+      false);
+  volume_manager()->OnDiskEvent(
+      chromeos::disks::DiskMountManager::DISK_ADDED, &kMediaDisk);
+  secondary.volume_manager()->OnDiskEvent(
+      chromeos::disks::DiskMountManager::DISK_ADDED, &kMediaDisk);
+
+  // The profile with external storage enabled should have mounted the volume.
+  bool has_volume_mounted = false;
+  for (size_t i = 0; i < main_observer.events().size(); ++i) {
+    if (main_observer.events()[i].type ==
+        LoggingObserver::Event::VOLUME_MOUNTED)
+      has_volume_mounted = true;
+  }
+  EXPECT_TRUE(has_volume_mounted);
+
+  // The other profiles with external storage disabled should have not.
+  has_volume_mounted = false;
+  for (size_t i = 0; i < secondary_observer.events().size(); ++i) {
+    if (secondary_observer.events()[i].type ==
+        LoggingObserver::Event::VOLUME_MOUNTED)
+      has_volume_mounted = true;
+  }
+  EXPECT_FALSE(has_volume_mounted);
+
+  volume_manager()->RemoveObserver(&main_observer);
+  secondary.volume_manager()->RemoveObserver(&secondary_observer);
+}
+
 TEST_F(VolumeManagerTest, GetVolumeInfoList) {
-  volume_manager_->Initialize();  // Adds "Downloads"
-  std::vector<VolumeInfo> info_list = volume_manager_->GetVolumeInfoList();
+  volume_manager()->Initialize();  // Adds "Downloads"
+  std::vector<VolumeInfo> info_list = volume_manager()->GetVolumeInfoList();
   ASSERT_EQ(1u, info_list.size());
   EXPECT_EQ("downloads:Downloads", info_list[0].volume_id);
   EXPECT_EQ(VOLUME_TYPE_DOWNLOADS_DIRECTORY, info_list[0].type);
 }
 
 TEST_F(VolumeManagerTest, FindVolumeInfoById) {
-  volume_manager_->Initialize();  // Adds "Downloads"
+  volume_manager()->Initialize();  // Adds "Downloads"
   VolumeInfo volume_info;
-  ASSERT_FALSE(volume_manager_->FindVolumeInfoById(
+  ASSERT_FALSE(volume_manager()->FindVolumeInfoById(
       "nonexistent", &volume_info));
-  ASSERT_TRUE(volume_manager_->FindVolumeInfoById(
+  ASSERT_TRUE(volume_manager()->FindVolumeInfoById(
       "downloads:Downloads", &volume_info));
   EXPECT_EQ("downloads:Downloads", volume_info.volume_id);
   EXPECT_EQ(VOLUME_TYPE_DOWNLOADS_DIRECTORY, volume_info.type);
@@ -683,10 +765,10 @@ TEST_F(VolumeManagerTest, FindVolumeInfoById) {
 
 TEST_F(VolumeManagerTest, ArchiveSourceFiltering) {
   LoggingObserver observer;
-  volume_manager_->AddObserver(&observer);
+  volume_manager()->AddObserver(&observer);
 
   // Mount a USB stick.
-  volume_manager_->OnMountEvent(
+  volume_manager()->OnMountEvent(
       chromeos::disks::DiskMountManager::MOUNTING,
       chromeos::MOUNT_ERROR_NONE,
       chromeos::disks::DiskMountManager::MountPointInfo(
@@ -696,7 +778,7 @@ TEST_F(VolumeManagerTest, ArchiveSourceFiltering) {
           chromeos::disks::MOUNT_CONDITION_NONE));
 
   // Mount a zip archive in the stick.
-  volume_manager_->OnMountEvent(
+  volume_manager()->OnMountEvent(
       chromeos::disks::DiskMountManager::MOUNTING,
       chromeos::MOUNT_ERROR_NONE,
       chromeos::disks::DiskMountManager::MountPointInfo(
@@ -705,12 +787,12 @@ TEST_F(VolumeManagerTest, ArchiveSourceFiltering) {
           chromeos::MOUNT_TYPE_ARCHIVE,
           chromeos::disks::MOUNT_CONDITION_NONE));
   VolumeInfo volume_info;
-  ASSERT_TRUE(volume_manager_->FindVolumeInfoById("archive:1", &volume_info));
+  ASSERT_TRUE(volume_manager()->FindVolumeInfoById("archive:1", &volume_info));
   EXPECT_EQ("/archive/1", volume_info.mount_path.AsUTF8Unsafe());
   EXPECT_EQ(2u, observer.events().size());
 
   // Mount a zip archive in the previous zip archive.
-  volume_manager_->OnMountEvent(
+  volume_manager()->OnMountEvent(
       chromeos::disks::DiskMountManager::MOUNTING,
       chromeos::MOUNT_ERROR_NONE,
       chromeos::disks::DiskMountManager::MountPointInfo(
@@ -718,13 +800,13 @@ TEST_F(VolumeManagerTest, ArchiveSourceFiltering) {
           "/archive/2",
           chromeos::MOUNT_TYPE_ARCHIVE,
           chromeos::disks::MOUNT_CONDITION_NONE));
-  ASSERT_TRUE(volume_manager_->FindVolumeInfoById("archive:2", &volume_info));
+  ASSERT_TRUE(volume_manager()->FindVolumeInfoById("archive:2", &volume_info));
   EXPECT_EQ("/archive/2", volume_info.mount_path.AsUTF8Unsafe());
   EXPECT_EQ(3u, observer.events().size());
 
   // A zip file is mounted from other profile. It must be ignored in the current
   // VolumeManager.
-  volume_manager_->OnMountEvent(
+  volume_manager()->OnMountEvent(
       chromeos::disks::DiskMountManager::MOUNTING,
       chromeos::MOUNT_ERROR_NONE,
       chromeos::disks::DiskMountManager::MountPointInfo(
@@ -732,8 +814,52 @@ TEST_F(VolumeManagerTest, ArchiveSourceFiltering) {
           "/archive/3",
           chromeos::MOUNT_TYPE_ARCHIVE,
           chromeos::disks::MOUNT_CONDITION_NONE));
-  EXPECT_FALSE(volume_manager_->FindVolumeInfoById("archive:3", &volume_info));
+  EXPECT_FALSE(volume_manager()->FindVolumeInfoById("archive:3", &volume_info));
   EXPECT_EQ(3u, observer.events().size());
 }
 
+TEST_F(VolumeManagerTest, MTPPlugAndUnplug) {
+  LoggingObserver observer;
+  volume_manager()->AddObserver(&observer);
+
+  storage_monitor::StorageInfo info(
+      storage_monitor::StorageInfo::MakeDeviceId(
+          storage_monitor::StorageInfo::MTP_OR_PTP, "dummy-device-id"),
+      FILE_PATH_LITERAL("/dummy/device/location"),
+      base::UTF8ToUTF16("label"),
+      base::UTF8ToUTF16("vendor"),
+      base::UTF8ToUTF16("model"),
+      12345 /* size */);
+
+  storage_monitor::StorageInfo non_mtp_info(
+      storage_monitor::StorageInfo::MakeDeviceId(
+          storage_monitor::StorageInfo::IPHOTO, "dummy-device-id2"),
+      FILE_PATH_LITERAL("/dummy/device/location2"),
+      base::UTF8ToUTF16("label2"),
+      base::UTF8ToUTF16("vendor2"),
+      base::UTF8ToUTF16("model2"),
+      12345 /* size */);
+
+  // Attach
+  volume_manager()->OnRemovableStorageAttached(info);
+  ASSERT_EQ(1u, observer.events().size());
+  EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, observer.events()[0].type);
+
+  VolumeInfo volume_info;
+  ASSERT_TRUE(volume_manager()->FindVolumeInfoById("mtp:model", &volume_info));
+  EXPECT_EQ(VOLUME_TYPE_MTP, volume_info.type);
+
+  // Non MTP events from storage monitor are ignored.
+  volume_manager()->OnRemovableStorageAttached(non_mtp_info);
+  EXPECT_EQ(1u, observer.events().size());
+
+  // Detach
+  volume_manager()->OnRemovableStorageDetached(info);
+  ASSERT_EQ(2u, observer.events().size());
+  EXPECT_EQ(LoggingObserver::Event::VOLUME_UNMOUNTED,
+            observer.events()[1].type);
+
+  EXPECT_FALSE(volume_manager()->FindVolumeInfoById("mtp:model", &volume_info));
+}
+
 }  // namespace file_manager