1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "chrome/browser/chromeos/file_manager/volume_manager.h"
6 
7 #include <stddef.h>
8 
9 #include <memory>
10 #include <set>
11 #include <string>
12 #include <utility>
13 #include <vector>
14 
15 #include "base/bind.h"
16 #include "base/macros.h"
17 #include "base/memory/weak_ptr.h"
18 #include "base/stl_util.h"
19 #include "base/strings/utf_string_conversions.h"
20 #include "chrome/browser/chromeos/drive/file_system_util.h"
21 #include "chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h"
22 #include "chrome/browser/chromeos/file_manager/volume_manager_observer.h"
23 #include "chrome/browser/chromeos/file_system_provider/fake_extension_provider.h"
24 #include "chrome/browser/chromeos/file_system_provider/service.h"
25 #include "chrome/browser/chromeos/profiles/profile_helper.h"
26 #include "chrome/browser/chromeos/scoped_set_running_on_chromeos_for_testing.h"
27 #include "chrome/common/pref_names.h"
28 #include "chrome/test/base/testing_profile.h"
29 #include "chromeos/constants/chromeos_features.h"
30 #include "chromeos/dbus/power/fake_power_manager_client.h"
31 #include "chromeos/dbus/power_manager/suspend.pb.h"
32 #include "chromeos/disks/disk.h"
33 #include "chromeos/disks/disk_mount_manager.h"
34 #include "components/prefs/pref_service.h"
35 #include "components/storage_monitor/storage_info.h"
36 #include "components/user_manager/user.h"
37 #include "content/public/test/browser_task_environment.h"
38 #include "extensions/browser/extension_registry.h"
39 #include "services/device/public/mojom/mtp_storage_info.mojom.h"
40 #include "testing/gtest/include/gtest/gtest.h"
41 
42 using chromeos::disks::Disk;
43 using chromeos::disks::DiskMountManager;
44 
45 namespace file_manager {
46 namespace {
47 const char kLsbRelease[] =
48     "CHROMEOS_RELEASE_NAME=Chrome OS\n"
49     "CHROMEOS_RELEASE_VERSION=1.2.3.4\n";
50 
51 class LoggingObserver : public VolumeManagerObserver {
52  public:
53   struct Event {
54     enum EventType {
55       DISK_ADDED,
56       DISK_REMOVED,
57       DEVICE_ADDED,
58       DEVICE_REMOVED,
59       VOLUME_MOUNTED,
60       VOLUME_UNMOUNTED,
61       FORMAT_STARTED,
62       FORMAT_COMPLETED,
63       PARTITION_STARTED,
64       PARTITION_COMPLETED,
65       RENAME_STARTED,
66       RENAME_COMPLETED
67     } type;
68 
69     // Available on DEVICE_ADDED, DEVICE_REMOVED, VOLUME_MOUNTED,
70     // VOLUME_UNMOUNTED, FORMAT_STARTED, FORMAT_COMPLETED. PARTITION_STARTED,
71     // PARTITION_COMPLETED.
72     std::string device_path;
73 
74     // Available on FORMAT_STARTED, FORMAT_COMPLETED, RENAME_STARTED and
75     // RENAME_COMPLETED, PARTITION_STARTED, PARTITION_COMPLETED.
76     std::string device_label;
77 
78     // Available on DISK_ADDED.
79     bool mounting;
80 
81     // Available on VOLUME_MOUNTED and VOLUME_UNMOUNTED.
82     chromeos::MountError mount_error;
83 
84     // Available on FORMAT_STARTED and FORMAT_COMPLETED, PARTITION_STARTED,
85     // PARTITION_COMPLETED.
86     bool success;
87   };
88 
89   LoggingObserver() = default;
90   ~LoggingObserver() override = default;
91 
events() const92   const std::vector<Event>& events() const { return events_; }
93 
94   // VolumeManagerObserver overrides.
OnDiskAdded(const Disk & disk,bool mounting)95   void OnDiskAdded(const Disk& disk, bool mounting) override {
96     Event event;
97     event.type = Event::DISK_ADDED;
98     event.device_path = disk.device_path();  // Keep only device_path.
99     event.mounting = mounting;
100     events_.push_back(event);
101   }
102 
OnDiskRemoved(const Disk & disk)103   void OnDiskRemoved(const Disk& disk) override {
104     Event event;
105     event.type = Event::DISK_REMOVED;
106     event.device_path = disk.device_path();  // Keep only device_path.
107     events_.push_back(event);
108   }
109 
OnDeviceAdded(const std::string & device_path)110   void OnDeviceAdded(const std::string& device_path) override {
111     Event event;
112     event.type = Event::DEVICE_ADDED;
113     event.device_path = device_path;
114     events_.push_back(event);
115   }
116 
OnDeviceRemoved(const std::string & device_path)117   void OnDeviceRemoved(const std::string& device_path) override {
118     Event event;
119     event.type = Event::DEVICE_REMOVED;
120     event.device_path = device_path;
121     events_.push_back(event);
122   }
123 
OnVolumeMounted(chromeos::MountError error_code,const Volume & volume)124   void OnVolumeMounted(chromeos::MountError error_code,
125                        const Volume& volume) override {
126     Event event;
127     event.type = Event::VOLUME_MOUNTED;
128     event.device_path = volume.source_path().AsUTF8Unsafe();
129     event.mount_error = error_code;
130     events_.push_back(event);
131   }
132 
OnVolumeUnmounted(chromeos::MountError error_code,const Volume & volume)133   void OnVolumeUnmounted(chromeos::MountError error_code,
134                          const Volume& volume) override {
135     Event event;
136     event.type = Event::VOLUME_UNMOUNTED;
137     event.device_path = volume.source_path().AsUTF8Unsafe();
138     event.mount_error = error_code;
139     events_.push_back(event);
140   }
141 
OnFormatStarted(const std::string & device_path,const std::string & device_label,bool success)142   void OnFormatStarted(const std::string& device_path,
143                        const std::string& device_label,
144                        bool success) override {
145     Event event;
146     event.type = Event::FORMAT_STARTED;
147     event.device_path = device_path;
148     event.device_label = device_label;
149     event.success = success;
150     events_.push_back(event);
151   }
152 
OnFormatCompleted(const std::string & device_path,const std::string & device_label,bool success)153   void OnFormatCompleted(const std::string& device_path,
154                          const std::string& device_label,
155                          bool success) override {
156     Event event;
157     event.type = Event::FORMAT_COMPLETED;
158     event.device_path = device_path;
159     event.device_label = device_label;
160     event.success = success;
161     events_.push_back(event);
162   }
163 
OnPartitionStarted(const std::string & device_path,const std::string & device_label,bool success)164   void OnPartitionStarted(const std::string& device_path,
165                           const std::string& device_label,
166                           bool success) override {
167     Event event;
168     event.type = Event::PARTITION_STARTED;
169     event.device_path = device_path;
170     event.device_label = device_label;
171     event.success = success;
172     events_.push_back(event);
173   }
174 
OnPartitionCompleted(const std::string & device_path,const std::string & device_label,bool success)175   void OnPartitionCompleted(const std::string& device_path,
176                             const std::string& device_label,
177                             bool success) override {
178     Event event;
179     event.type = Event::PARTITION_COMPLETED;
180     event.device_path = device_path;
181     event.device_label = device_label;
182     event.success = success;
183     events_.push_back(event);
184   }
185 
OnRenameStarted(const std::string & device_path,const std::string & device_label,bool success)186   void OnRenameStarted(const std::string& device_path,
187                        const std::string& device_label,
188                        bool success) override {
189     Event event;
190     event.type = Event::RENAME_STARTED;
191     event.device_path = device_path;
192     event.device_label = device_label;
193     event.success = success;
194     events_.push_back(event);
195   }
196 
OnRenameCompleted(const std::string & device_path,const std::string & device_label,bool success)197   void OnRenameCompleted(const std::string& device_path,
198                          const std::string& device_label,
199                          bool success) override {
200     Event event;
201     event.type = Event::RENAME_COMPLETED;
202     event.device_path = device_path;
203     event.device_label = device_label;
204     event.success = success;
205     events_.push_back(event);
206   }
207 
208  private:
209   std::vector<Event> events_;
210 
211   DISALLOW_COPY_AND_ASSIGN(LoggingObserver);
212 };
213 
214 class FakeUser : public user_manager::User {
215  public:
FakeUser(const AccountId & account_id)216   explicit FakeUser(const AccountId& account_id) : User(account_id) {}
217 
GetType() const218   user_manager::UserType GetType() const override {
219     return user_manager::USER_TYPE_REGULAR;
220   }
221 };
222 
223 }  // namespace
224 
225 class VolumeManagerTest : public testing::Test {
226  protected:
227   // Helper class that contains per-profile objects.
228   class ProfileEnvironment {
229    public:
ProfileEnvironment(chromeos::PowerManagerClient * power_manager_client,DiskMountManager * disk_manager)230     ProfileEnvironment(chromeos::PowerManagerClient* power_manager_client,
231                        DiskMountManager* disk_manager)
232         : profile_(std::make_unique<TestingProfile>()),
233           extension_registry_(
234               std::make_unique<extensions::ExtensionRegistry>(profile_.get())),
235           file_system_provider_service_(
236               std::make_unique<chromeos::file_system_provider::Service>(
237                   profile_.get(),
238                   extension_registry_.get())),
239           drive_integration_service_(
240               std::make_unique<drive::DriveIntegrationService>(
241                   profile_.get(),
242                   std::string(),
243                   base::FilePath())),
244           volume_manager_(std::make_unique<VolumeManager>(
245               profile_.get(),
246               drive_integration_service_.get(),  // DriveIntegrationService
247               power_manager_client,
248               disk_manager,
249               file_system_provider_service_.get(),
250               base::BindRepeating(&ProfileEnvironment::GetFakeMtpStorageInfo,
251                                   base::Unretained(this)))),
252           account_id_(
253               AccountId::FromUserEmailGaiaId(profile_->GetProfileUserName(),
254                                              "id")),
255           user_(account_id_) {
256       chromeos::ProfileHelper::Get()->SetProfileToUserMappingForTesting(&user_);
257       chromeos::ProfileHelper::Get()->SetUserToProfileMappingForTesting(
258           &user_, profile_.get());
259     }
260 
~ProfileEnvironment()261     ~ProfileEnvironment() {
262       // In production, KeyedServices have Shutdown() called before destruction.
263       volume_manager_->Shutdown();
264       drive_integration_service_->Shutdown();
265     }
266 
profile() const267     Profile* profile() const { return profile_.get(); }
volume_manager() const268     VolumeManager* volume_manager() const { return volume_manager_.get(); }
269 
270    private:
GetFakeMtpStorageInfo(const std::string & storage_name,device::mojom::MtpManager::GetStorageInfoCallback callback)271     void GetFakeMtpStorageInfo(
272         const std::string& storage_name,
273         device::mojom::MtpManager::GetStorageInfoCallback callback) {
274       std::move(callback).Run(device::mojom::MtpStorageInfo::New());
275     }
276 
277     std::unique_ptr<TestingProfile> profile_;
278     std::unique_ptr<extensions::ExtensionRegistry> extension_registry_;
279     std::unique_ptr<chromeos::file_system_provider::Service>
280         file_system_provider_service_;
281     std::unique_ptr<drive::DriveIntegrationService> drive_integration_service_;
282     std::unique_ptr<VolumeManager> volume_manager_;
283     AccountId account_id_;
284     FakeUser user_;
285   };
286 
SetUp()287   void SetUp() override {
288     chromeos::PowerManagerClient::InitializeFake();
289     disk_mount_manager_ = std::make_unique<FakeDiskMountManager>();
290     main_profile_ = std::make_unique<ProfileEnvironment>(
291         chromeos::PowerManagerClient::Get(), disk_mount_manager_.get());
292   }
293 
TearDown()294   void TearDown() override {
295     main_profile_.reset();
296     disk_mount_manager_.reset();
297     chromeos::PowerManagerClient::Shutdown();
298     task_environment_.RunUntilIdle();
299   }
300 
profile() const301   Profile* profile() const { return main_profile_->profile(); }
volume_manager() const302   VolumeManager* volume_manager() const {
303     return main_profile_->volume_manager();
304   }
305 
306   content::BrowserTaskEnvironment task_environment_;
307   std::unique_ptr<FakeDiskMountManager> disk_mount_manager_;
308   std::unique_ptr<ProfileEnvironment> main_profile_;
309 };
310 
TEST_F(VolumeManagerTest,OnDriveFileSystemMountAndUnmount)311 TEST_F(VolumeManagerTest, OnDriveFileSystemMountAndUnmount) {
312   LoggingObserver observer;
313   volume_manager()->AddObserver(&observer);
314 
315   volume_manager()->OnFileSystemMounted();
316 
317   ASSERT_EQ(1U, observer.events().size());
318   LoggingObserver::Event event = observer.events()[0];
319   EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, event.type);
320   EXPECT_EQ(drive::DriveIntegrationServiceFactory::GetForProfile(profile())
321                 ->GetMountPointPath()
322                 .AsUTF8Unsafe(),
323             event.device_path);
324   EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
325 
326   volume_manager()->OnFileSystemBeingUnmounted();
327 
328   ASSERT_EQ(2U, observer.events().size());
329   event = observer.events()[1];
330   EXPECT_EQ(LoggingObserver::Event::VOLUME_UNMOUNTED, event.type);
331   EXPECT_EQ(drive::DriveIntegrationServiceFactory::GetForProfile(profile())
332                 ->GetMountPointPath()
333                 .AsUTF8Unsafe(),
334             event.device_path);
335   EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
336 
337   volume_manager()->RemoveObserver(&observer);
338 }
339 
TEST_F(VolumeManagerTest,OnDriveFileSystemUnmountWithoutMount)340 TEST_F(VolumeManagerTest, OnDriveFileSystemUnmountWithoutMount) {
341   LoggingObserver observer;
342   volume_manager()->AddObserver(&observer);
343   volume_manager()->OnFileSystemBeingUnmounted();
344 
345   // Unmount event for non-mounted volume is not reported.
346   ASSERT_EQ(0U, observer.events().size());
347   volume_manager()->RemoveObserver(&observer);
348 }
TEST_F(VolumeManagerTest,OnBootDeviceDiskEvent)349 TEST_F(VolumeManagerTest, OnBootDeviceDiskEvent) {
350   LoggingObserver observer;
351   volume_manager()->AddObserver(&observer);
352 
353   std::unique_ptr<const Disk> disk =
354       Disk::Builder().SetDevicePath("device1").SetOnBootDevice(true).Build();
355 
356   volume_manager()->OnBootDeviceDiskEvent(DiskMountManager::DISK_ADDED, *disk);
357   EXPECT_EQ(0U, observer.events().size());
358 
359   volume_manager()->OnBootDeviceDiskEvent(DiskMountManager::DISK_REMOVED,
360                                           *disk);
361   EXPECT_EQ(0U, observer.events().size());
362 
363   volume_manager()->OnBootDeviceDiskEvent(DiskMountManager::DISK_CHANGED,
364                                           *disk);
365   EXPECT_EQ(0U, observer.events().size());
366 
367   volume_manager()->RemoveObserver(&observer);
368 }
369 
TEST_F(VolumeManagerTest,OnAutoMountableDiskEvent_Hidden)370 TEST_F(VolumeManagerTest, OnAutoMountableDiskEvent_Hidden) {
371   LoggingObserver observer;
372   volume_manager()->AddObserver(&observer);
373 
374   std::unique_ptr<const Disk> disk =
375       Disk::Builder().SetDevicePath("device1").SetIsHidden(true).Build();
376 
377   volume_manager()->OnAutoMountableDiskEvent(DiskMountManager::DISK_ADDED,
378                                              *disk);
379   EXPECT_EQ(0U, observer.events().size());
380 
381   volume_manager()->OnAutoMountableDiskEvent(DiskMountManager::DISK_REMOVED,
382                                              *disk);
383   EXPECT_EQ(0U, observer.events().size());
384 
385   volume_manager()->OnAutoMountableDiskEvent(DiskMountManager::DISK_CHANGED,
386                                              *disk);
387   EXPECT_EQ(0U, observer.events().size());
388 
389   volume_manager()->RemoveObserver(&observer);
390 }
391 
TEST_F(VolumeManagerTest,OnAutoMountableDiskEvent_Added)392 TEST_F(VolumeManagerTest, OnAutoMountableDiskEvent_Added) {
393   // Enable external storage.
394   profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
395 
396   LoggingObserver observer;
397   volume_manager()->AddObserver(&observer);
398 
399   std::unique_ptr<const Disk> empty_device_path_disk = Disk::Builder().Build();
400   volume_manager()->OnAutoMountableDiskEvent(DiskMountManager::DISK_ADDED,
401                                              *empty_device_path_disk);
402   EXPECT_EQ(0U, observer.events().size());
403 
404   std::unique_ptr<const Disk> media_disk =
405       Disk::Builder().SetDevicePath("device1").SetHasMedia(true).Build();
406   volume_manager()->OnAutoMountableDiskEvent(DiskMountManager::DISK_ADDED,
407                                              *media_disk);
408   ASSERT_EQ(1U, observer.events().size());
409   const LoggingObserver::Event& event = observer.events()[0];
410   EXPECT_EQ(LoggingObserver::Event::DISK_ADDED, event.type);
411   EXPECT_EQ("device1", event.device_path);
412   EXPECT_TRUE(event.mounting);
413 
414   ASSERT_EQ(1U, disk_mount_manager_->mount_requests().size());
415   const FakeDiskMountManager::MountRequest& mount_request =
416       disk_mount_manager_->mount_requests()[0];
417   EXPECT_EQ("device1", mount_request.source_path);
418   EXPECT_EQ("", mount_request.source_format);
419   EXPECT_EQ("", mount_request.mount_label);
420   EXPECT_EQ(chromeos::MOUNT_TYPE_DEVICE, mount_request.type);
421 
422   volume_manager()->RemoveObserver(&observer);
423 }
424 
TEST_F(VolumeManagerTest,OnAutoMountableDiskEvent_AddedNonMounting)425 TEST_F(VolumeManagerTest, OnAutoMountableDiskEvent_AddedNonMounting) {
426   // Enable external storage.
427   profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
428 
429   // Device which is already mounted.
430   {
431     LoggingObserver observer;
432     volume_manager()->AddObserver(&observer);
433 
434     std::unique_ptr<const Disk> mounted_media_disk =
435         Disk::Builder()
436             .SetDevicePath("device1")
437             .SetMountPath("mounted")
438             .SetHasMedia(true)
439             .Build();
440     volume_manager()->OnAutoMountableDiskEvent(DiskMountManager::DISK_ADDED,
441                                                *mounted_media_disk);
442     ASSERT_EQ(1U, observer.events().size());
443     const LoggingObserver::Event& event = observer.events()[0];
444     EXPECT_EQ(LoggingObserver::Event::DISK_ADDED, event.type);
445     EXPECT_EQ("device1", event.device_path);
446     EXPECT_FALSE(event.mounting);
447 
448     ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
449 
450     volume_manager()->RemoveObserver(&observer);
451   }
452 
453   // Device without media.
454   {
455     LoggingObserver observer;
456     volume_manager()->AddObserver(&observer);
457 
458     std::unique_ptr<const Disk> no_media_disk =
459         Disk::Builder().SetDevicePath("device1").Build();
460     volume_manager()->OnAutoMountableDiskEvent(DiskMountManager::DISK_ADDED,
461                                                *no_media_disk);
462     ASSERT_EQ(1U, observer.events().size());
463     const LoggingObserver::Event& event = observer.events()[0];
464     EXPECT_EQ(LoggingObserver::Event::DISK_ADDED, event.type);
465     EXPECT_EQ("device1", event.device_path);
466     EXPECT_FALSE(event.mounting);
467 
468     ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
469 
470     volume_manager()->RemoveObserver(&observer);
471   }
472 
473   // External storage is disabled.
474   {
475     profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, true);
476 
477     LoggingObserver observer;
478     volume_manager()->AddObserver(&observer);
479 
480     std::unique_ptr<const Disk> media_disk =
481         Disk::Builder().SetDevicePath("device1").SetHasMedia(true).Build();
482     volume_manager()->OnAutoMountableDiskEvent(DiskMountManager::DISK_ADDED,
483                                                *media_disk);
484     ASSERT_EQ(1U, observer.events().size());
485     const LoggingObserver::Event& event = observer.events()[0];
486     EXPECT_EQ(LoggingObserver::Event::DISK_ADDED, event.type);
487     EXPECT_EQ("device1", event.device_path);
488     EXPECT_FALSE(event.mounting);
489 
490     ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
491 
492     volume_manager()->RemoveObserver(&observer);
493   }
494 }
495 
TEST_F(VolumeManagerTest,OnDiskAutoMountableEvent_Removed)496 TEST_F(VolumeManagerTest, OnDiskAutoMountableEvent_Removed) {
497   LoggingObserver observer;
498   volume_manager()->AddObserver(&observer);
499 
500   std::unique_ptr<const Disk> mounted_disk = Disk::Builder()
501                                                  .SetDevicePath("device1")
502                                                  .SetMountPath("mount_path")
503                                                  .Build();
504   volume_manager()->OnAutoMountableDiskEvent(DiskMountManager::DISK_REMOVED,
505                                              *mounted_disk);
506 
507   ASSERT_EQ(1U, observer.events().size());
508   const LoggingObserver::Event& event = observer.events()[0];
509   EXPECT_EQ(LoggingObserver::Event::DISK_REMOVED, event.type);
510   EXPECT_EQ("device1", event.device_path);
511 
512   ASSERT_EQ(1U, disk_mount_manager_->unmount_requests().size());
513   EXPECT_EQ("mount_path", disk_mount_manager_->unmount_requests()[0]);
514 
515   volume_manager()->RemoveObserver(&observer);
516 }
517 
TEST_F(VolumeManagerTest,OnAutoMountableDiskEvent_RemovedNotMounted)518 TEST_F(VolumeManagerTest, OnAutoMountableDiskEvent_RemovedNotMounted) {
519   LoggingObserver observer;
520   volume_manager()->AddObserver(&observer);
521 
522   std::unique_ptr<const Disk> not_mounted_disk =
523       Disk::Builder().SetDevicePath("device1").Build();
524   volume_manager()->OnAutoMountableDiskEvent(DiskMountManager::DISK_REMOVED,
525                                              *not_mounted_disk);
526 
527   ASSERT_EQ(1U, observer.events().size());
528   const LoggingObserver::Event& event = observer.events()[0];
529   EXPECT_EQ(LoggingObserver::Event::DISK_REMOVED, event.type);
530   EXPECT_EQ("device1", event.device_path);
531 
532   ASSERT_EQ(0U, disk_mount_manager_->unmount_requests().size());
533 
534   volume_manager()->RemoveObserver(&observer);
535 }
536 
TEST_F(VolumeManagerTest,OnAutoMountableDiskEvent_Changed)537 TEST_F(VolumeManagerTest, OnAutoMountableDiskEvent_Changed) {
538   // Changed event should cause mounting (if possible).
539   LoggingObserver observer;
540   volume_manager()->AddObserver(&observer);
541 
542   std::unique_ptr<const Disk> disk =
543       Disk::Builder().SetDevicePath("device1").SetHasMedia(true).Build();
544   volume_manager()->OnAutoMountableDiskEvent(DiskMountManager::DISK_CHANGED,
545                                              *disk);
546 
547   EXPECT_EQ(1U, observer.events().size());
548   EXPECT_EQ(1U, disk_mount_manager_->mount_requests().size());
549   EXPECT_EQ(0U, disk_mount_manager_->unmount_requests().size());
550   // Read-write mode by default.
551   EXPECT_EQ(chromeos::MOUNT_ACCESS_MODE_READ_WRITE,
552             disk_mount_manager_->mount_requests()[0].access_mode);
553 
554   volume_manager()->RemoveObserver(&observer);
555 }
556 
TEST_F(VolumeManagerTest,OnAutoMountableDiskEvent_ChangedInReadonly)557 TEST_F(VolumeManagerTest, OnAutoMountableDiskEvent_ChangedInReadonly) {
558   profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageReadOnly, true);
559 
560   // Changed event should cause mounting (if possible).
561   LoggingObserver observer;
562   volume_manager()->AddObserver(&observer);
563 
564   std::unique_ptr<const Disk> disk =
565       Disk::Builder().SetDevicePath("device1").SetHasMedia(true).Build();
566   volume_manager()->OnAutoMountableDiskEvent(DiskMountManager::DISK_CHANGED,
567                                              *disk);
568 
569   EXPECT_EQ(1U, observer.events().size());
570   EXPECT_EQ(1U, disk_mount_manager_->mount_requests().size());
571   EXPECT_EQ(0U, disk_mount_manager_->unmount_requests().size());
572   // Shoule mount a disk in read-only mode.
573   EXPECT_EQ(chromeos::MOUNT_ACCESS_MODE_READ_ONLY,
574             disk_mount_manager_->mount_requests()[0].access_mode);
575 
576   volume_manager()->RemoveObserver(&observer);
577 }
578 
TEST_F(VolumeManagerTest,OnDeviceEvent_Added)579 TEST_F(VolumeManagerTest, OnDeviceEvent_Added) {
580   LoggingObserver observer;
581   volume_manager()->AddObserver(&observer);
582 
583   volume_manager()->OnDeviceEvent(DiskMountManager::DEVICE_ADDED, "device1");
584 
585   ASSERT_EQ(1U, observer.events().size());
586   const LoggingObserver::Event& event = observer.events()[0];
587   EXPECT_EQ(LoggingObserver::Event::DEVICE_ADDED, event.type);
588   EXPECT_EQ("device1", event.device_path);
589 
590   volume_manager()->RemoveObserver(&observer);
591 }
592 
TEST_F(VolumeManagerTest,OnDeviceEvent_Removed)593 TEST_F(VolumeManagerTest, OnDeviceEvent_Removed) {
594   LoggingObserver observer;
595   volume_manager()->AddObserver(&observer);
596 
597   volume_manager()->OnDeviceEvent(DiskMountManager::DEVICE_REMOVED, "device1");
598 
599   ASSERT_EQ(1U, observer.events().size());
600   const LoggingObserver::Event& event = observer.events()[0];
601   EXPECT_EQ(LoggingObserver::Event::DEVICE_REMOVED, event.type);
602   EXPECT_EQ("device1", event.device_path);
603 
604   volume_manager()->RemoveObserver(&observer);
605 }
606 
TEST_F(VolumeManagerTest,OnDeviceEvent_Scanned)607 TEST_F(VolumeManagerTest, OnDeviceEvent_Scanned) {
608   LoggingObserver observer;
609   volume_manager()->AddObserver(&observer);
610 
611   volume_manager()->OnDeviceEvent(DiskMountManager::DEVICE_SCANNED, "device1");
612 
613   // SCANNED event is just ignored.
614   EXPECT_EQ(0U, observer.events().size());
615 
616   volume_manager()->RemoveObserver(&observer);
617 }
618 
TEST_F(VolumeManagerTest,OnMountEvent_MountingAndUnmounting)619 TEST_F(VolumeManagerTest, OnMountEvent_MountingAndUnmounting) {
620   LoggingObserver observer;
621   volume_manager()->AddObserver(&observer);
622 
623   const DiskMountManager::MountPointInfo kMountPoint(
624       "device1", "mount1", chromeos::MOUNT_TYPE_DEVICE,
625       chromeos::disks::MOUNT_CONDITION_NONE);
626 
627   volume_manager()->OnMountEvent(DiskMountManager::MOUNTING,
628                                  chromeos::MOUNT_ERROR_NONE, kMountPoint);
629 
630   ASSERT_EQ(1U, observer.events().size());
631   LoggingObserver::Event event = observer.events()[0];
632   EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, event.type);
633   EXPECT_EQ("device1", event.device_path);
634   EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
635 
636   volume_manager()->OnMountEvent(DiskMountManager::UNMOUNTING,
637                                  chromeos::MOUNT_ERROR_NONE, kMountPoint);
638 
639   ASSERT_EQ(2U, observer.events().size());
640   event = observer.events()[1];
641   EXPECT_EQ(LoggingObserver::Event::VOLUME_UNMOUNTED, event.type);
642   EXPECT_EQ("device1", event.device_path);
643   EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
644 
645   volume_manager()->RemoveObserver(&observer);
646 }
647 
TEST_F(VolumeManagerTest,OnMountEvent_Remounting)648 TEST_F(VolumeManagerTest, OnMountEvent_Remounting) {
649   std::unique_ptr<Disk> disk = Disk::Builder()
650                                    .SetDevicePath("device1")
651                                    .SetFileSystemUUID("uuid1")
652                                    .Build();
653   disk_mount_manager_->AddDiskForTest(std::move(disk));
654   disk_mount_manager_->MountPath("device1", "", "", {},
655                                  chromeos::MOUNT_TYPE_DEVICE,
656                                  chromeos::MOUNT_ACCESS_MODE_READ_WRITE);
657 
658   const DiskMountManager::MountPointInfo kMountPoint(
659       "device1", "mount1", chromeos::MOUNT_TYPE_DEVICE,
660       chromeos::disks::MOUNT_CONDITION_NONE);
661 
662   volume_manager()->OnMountEvent(DiskMountManager::MOUNTING,
663                                  chromeos::MOUNT_ERROR_NONE, kMountPoint);
664 
665   LoggingObserver observer;
666 
667   // Emulate system suspend and then resume.
668   {
669     chromeos::FakePowerManagerClient::Get()->SendSuspendImminent(
670         power_manager::SuspendImminent_Reason_OTHER);
671     chromeos::FakePowerManagerClient::Get()->SendSuspendDone();
672 
673     // After resume, the device is unmounted and then mounted.
674     volume_manager()->OnMountEvent(DiskMountManager::UNMOUNTING,
675                                    chromeos::MOUNT_ERROR_NONE, kMountPoint);
676 
677     // Observe what happened for the mount event.
678     volume_manager()->AddObserver(&observer);
679 
680     volume_manager()->OnMountEvent(DiskMountManager::MOUNTING,
681                                    chromeos::MOUNT_ERROR_NONE, kMountPoint);
682   }
683 
684   ASSERT_EQ(1U, observer.events().size());
685   const LoggingObserver::Event& event = observer.events()[0];
686   EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, event.type);
687   EXPECT_EQ("device1", event.device_path);
688   EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
689 
690   volume_manager()->RemoveObserver(&observer);
691 }
692 
TEST_F(VolumeManagerTest,OnMountEvent_UnmountingWithoutMounting)693 TEST_F(VolumeManagerTest, OnMountEvent_UnmountingWithoutMounting) {
694   LoggingObserver observer;
695   volume_manager()->AddObserver(&observer);
696 
697   const DiskMountManager::MountPointInfo kMountPoint(
698       "device1", "mount1", chromeos::MOUNT_TYPE_DEVICE,
699       chromeos::disks::MOUNT_CONDITION_NONE);
700 
701   volume_manager()->OnMountEvent(DiskMountManager::UNMOUNTING,
702                                  chromeos::MOUNT_ERROR_NONE, kMountPoint);
703 
704   // Unmount event for a disk not mounted in this manager is not reported.
705   ASSERT_EQ(0U, observer.events().size());
706 
707   volume_manager()->RemoveObserver(&observer);
708 }
709 
TEST_F(VolumeManagerTest,OnFormatEvent_Started)710 TEST_F(VolumeManagerTest, OnFormatEvent_Started) {
711   LoggingObserver observer;
712   volume_manager()->AddObserver(&observer);
713 
714   volume_manager()->OnFormatEvent(DiskMountManager::FORMAT_STARTED,
715                                   chromeos::FORMAT_ERROR_NONE, "device1",
716                                   "label1");
717 
718   ASSERT_EQ(1U, observer.events().size());
719   const LoggingObserver::Event& event = observer.events()[0];
720   EXPECT_EQ(LoggingObserver::Event::FORMAT_STARTED, event.type);
721   EXPECT_EQ("device1", event.device_path);
722   EXPECT_EQ("label1", event.device_label);
723   EXPECT_TRUE(event.success);
724 
725   volume_manager()->RemoveObserver(&observer);
726 }
727 
TEST_F(VolumeManagerTest,OnFormatEvent_StartFailed)728 TEST_F(VolumeManagerTest, OnFormatEvent_StartFailed) {
729   LoggingObserver observer;
730   volume_manager()->AddObserver(&observer);
731 
732   volume_manager()->OnFormatEvent(DiskMountManager::FORMAT_STARTED,
733                                   chromeos::FORMAT_ERROR_UNKNOWN, "device1",
734                                   "label1");
735 
736   ASSERT_EQ(1U, observer.events().size());
737   const LoggingObserver::Event& event = observer.events()[0];
738   EXPECT_EQ(LoggingObserver::Event::FORMAT_STARTED, event.type);
739   EXPECT_EQ("device1", event.device_path);
740   EXPECT_EQ("label1", event.device_label);
741   EXPECT_FALSE(event.success);
742 
743   volume_manager()->RemoveObserver(&observer);
744 }
745 
TEST_F(VolumeManagerTest,OnFormatEvent_Completed)746 TEST_F(VolumeManagerTest, OnFormatEvent_Completed) {
747   LoggingObserver observer;
748   volume_manager()->AddObserver(&observer);
749 
750   volume_manager()->OnFormatEvent(DiskMountManager::FORMAT_COMPLETED,
751                                   chromeos::FORMAT_ERROR_NONE, "device1",
752                                   "label1");
753 
754   ASSERT_EQ(1U, observer.events().size());
755   const LoggingObserver::Event& event = observer.events()[0];
756   EXPECT_EQ(LoggingObserver::Event::FORMAT_COMPLETED, event.type);
757   EXPECT_EQ("device1", event.device_path);
758   EXPECT_EQ("label1", event.device_label);
759   EXPECT_TRUE(event.success);
760 
761   // When "format" is done, VolumeManager requests to mount it.
762   ASSERT_EQ(1U, disk_mount_manager_->mount_requests().size());
763   const FakeDiskMountManager::MountRequest& mount_request =
764       disk_mount_manager_->mount_requests()[0];
765   EXPECT_EQ("device1", mount_request.source_path);
766   EXPECT_EQ("", mount_request.source_format);
767   EXPECT_EQ("", mount_request.mount_label);
768   EXPECT_EQ(chromeos::MOUNT_TYPE_DEVICE, mount_request.type);
769 
770   volume_manager()->RemoveObserver(&observer);
771 }
772 
TEST_F(VolumeManagerTest,OnFormatEvent_CompletedFailed)773 TEST_F(VolumeManagerTest, OnFormatEvent_CompletedFailed) {
774   LoggingObserver observer;
775   volume_manager()->AddObserver(&observer);
776 
777   volume_manager()->OnFormatEvent(DiskMountManager::FORMAT_COMPLETED,
778                                   chromeos::FORMAT_ERROR_UNKNOWN, "device1",
779                                   "label1");
780 
781   ASSERT_EQ(1U, observer.events().size());
782   const LoggingObserver::Event& event = observer.events()[0];
783   EXPECT_EQ(LoggingObserver::Event::FORMAT_COMPLETED, event.type);
784   EXPECT_EQ("device1", event.device_path);
785   EXPECT_EQ("label1", event.device_label);
786   EXPECT_FALSE(event.success);
787 
788   // When "format" is done, VolumeManager requests to mount it.
789   ASSERT_EQ(1U, disk_mount_manager_->mount_requests().size());
790   const FakeDiskMountManager::MountRequest& mount_request =
791       disk_mount_manager_->mount_requests()[0];
792   EXPECT_EQ("device1", mount_request.source_path);
793   EXPECT_EQ("", mount_request.source_format);
794   EXPECT_EQ("", mount_request.mount_label);
795   EXPECT_EQ(chromeos::MOUNT_TYPE_DEVICE, mount_request.type);
796 
797   volume_manager()->RemoveObserver(&observer);
798 }
799 
TEST_F(VolumeManagerTest,OnPartitionEvent_Started)800 TEST_F(VolumeManagerTest, OnPartitionEvent_Started) {
801   LoggingObserver observer;
802   volume_manager()->AddObserver(&observer);
803 
804   volume_manager()->OnPartitionEvent(DiskMountManager::PARTITION_STARTED,
805                                      chromeos::PARTITION_ERROR_NONE, "device1",
806                                      "label1");
807 
808   ASSERT_EQ(1U, observer.events().size());
809   const LoggingObserver::Event& event = observer.events()[0];
810   EXPECT_EQ(LoggingObserver::Event::PARTITION_STARTED, event.type);
811   EXPECT_EQ("device1", event.device_path);
812   EXPECT_EQ("label1", event.device_label);
813   EXPECT_TRUE(event.success);
814 
815   volume_manager()->RemoveObserver(&observer);
816 }
817 
TEST_F(VolumeManagerTest,OnPartitionEvent_StartFailed)818 TEST_F(VolumeManagerTest, OnPartitionEvent_StartFailed) {
819   LoggingObserver observer;
820   volume_manager()->AddObserver(&observer);
821 
822   volume_manager()->OnPartitionEvent(DiskMountManager::PARTITION_STARTED,
823                                      chromeos::PARTITION_ERROR_UNKNOWN,
824                                      "device1", "label1");
825 
826   ASSERT_EQ(1U, observer.events().size());
827   const LoggingObserver::Event& event = observer.events()[0];
828   EXPECT_EQ(LoggingObserver::Event::PARTITION_STARTED, event.type);
829   EXPECT_EQ("device1", event.device_path);
830   EXPECT_EQ("label1", event.device_label);
831   EXPECT_FALSE(event.success);
832 
833   volume_manager()->RemoveObserver(&observer);
834 }
835 
TEST_F(VolumeManagerTest,OnPartitionEvent_Completed)836 TEST_F(VolumeManagerTest, OnPartitionEvent_Completed) {
837   LoggingObserver observer;
838   volume_manager()->AddObserver(&observer);
839 
840   volume_manager()->OnPartitionEvent(DiskMountManager::PARTITION_COMPLETED,
841                                      chromeos::PARTITION_ERROR_NONE, "device1",
842                                      "label1");
843 
844   ASSERT_EQ(1U, observer.events().size());
845   const LoggingObserver::Event& event = observer.events()[0];
846   EXPECT_EQ(LoggingObserver::Event::PARTITION_COMPLETED, event.type);
847   EXPECT_EQ("device1", event.device_path);
848   EXPECT_EQ("label1", event.device_label);
849   EXPECT_TRUE(event.success);
850 
851   volume_manager()->RemoveObserver(&observer);
852 }
853 
TEST_F(VolumeManagerTest,OnPartitionEvent_CompletedFailed)854 TEST_F(VolumeManagerTest, OnPartitionEvent_CompletedFailed) {
855   LoggingObserver observer;
856   volume_manager()->AddObserver(&observer);
857 
858   volume_manager()->OnPartitionEvent(DiskMountManager::PARTITION_COMPLETED,
859                                      chromeos::PARTITION_ERROR_UNKNOWN,
860                                      "device1", "label1");
861 
862   ASSERT_EQ(1U, observer.events().size());
863   const LoggingObserver::Event& event = observer.events()[0];
864   EXPECT_EQ(LoggingObserver::Event::PARTITION_COMPLETED, event.type);
865   EXPECT_EQ("device1", event.device_path);
866   EXPECT_EQ("label1", event.device_label);
867   EXPECT_FALSE(event.success);
868 
869   // When "partitioning" fails, VolumeManager requests to mount it for retry.
870   ASSERT_EQ(1U, disk_mount_manager_->mount_requests().size());
871   const FakeDiskMountManager::MountRequest& mount_request =
872       disk_mount_manager_->mount_requests()[0];
873   EXPECT_EQ("device1", mount_request.source_path);
874   EXPECT_EQ("", mount_request.source_format);
875   EXPECT_EQ("", mount_request.mount_label);
876   EXPECT_EQ(chromeos::MOUNT_TYPE_DEVICE, mount_request.type);
877 
878   volume_manager()->RemoveObserver(&observer);
879 }
880 
TEST_F(VolumeManagerTest,OnExternalStorageDisabledChanged)881 TEST_F(VolumeManagerTest, OnExternalStorageDisabledChanged) {
882   // Here create four mount points.
883   disk_mount_manager_->MountPath("mount1", "", "", {},
884                                  chromeos::MOUNT_TYPE_DEVICE,
885                                  chromeos::MOUNT_ACCESS_MODE_READ_WRITE);
886   disk_mount_manager_->MountPath("mount2", "", "", {},
887                                  chromeos::MOUNT_TYPE_DEVICE,
888                                  chromeos::MOUNT_ACCESS_MODE_READ_ONLY);
889   disk_mount_manager_->MountPath("mount3", "", "", {},
890                                  chromeos::MOUNT_TYPE_NETWORK_STORAGE,
891                                  chromeos::MOUNT_ACCESS_MODE_READ_ONLY);
892   disk_mount_manager_->MountPath("failed_unmount", "", "", {},
893                                  chromeos::MOUNT_TYPE_DEVICE,
894                                  chromeos::MOUNT_ACCESS_MODE_READ_WRITE);
895   disk_mount_manager_->FailUnmountRequest("failed_unmount",
896                                           chromeos::MOUNT_ERROR_UNKNOWN);
897 
898   // Initially, there are four mount points.
899   ASSERT_EQ(4U, disk_mount_manager_->mount_points().size());
900   ASSERT_EQ(0U, disk_mount_manager_->unmount_requests().size());
901 
902   // Emulate to set kExternalStorageDisabled to false.
903   profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
904   volume_manager()->OnExternalStorageDisabledChanged();
905 
906   // Expect no effects.
907   EXPECT_EQ(4U, disk_mount_manager_->mount_points().size());
908   EXPECT_EQ(0U, disk_mount_manager_->unmount_requests().size());
909 
910   // Emulate to set kExternalStorageDisabled to true.
911   profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, true);
912   volume_manager()->OnExternalStorageDisabledChanged();
913 
914   // Wait until all unmount request finishes, so that callback chain to unmount
915   // all the mount points will be invoked.
916   disk_mount_manager_->FinishAllUnmountPathRequests();
917 
918   // The external media mount points should be unmounted. Other mount point
919   // types should remain. The failing unmount should also remain.
920   EXPECT_EQ(2U, disk_mount_manager_->mount_points().size());
921 
922   std::set<std::string> expected_unmount_requests = {
923       "mount1",
924       "mount2",
925       "failed_unmount",
926   };
927   for (const auto& request : disk_mount_manager_->unmount_requests()) {
928     EXPECT_TRUE(base::Contains(expected_unmount_requests, request));
929     expected_unmount_requests.erase(request);
930   }
931   EXPECT_TRUE(expected_unmount_requests.empty());
932 }
933 
TEST_F(VolumeManagerTest,ExternalStorageDisabledPolicyMultiProfile)934 TEST_F(VolumeManagerTest, ExternalStorageDisabledPolicyMultiProfile) {
935   ProfileEnvironment secondary(chromeos::PowerManagerClient::Get(),
936                                disk_mount_manager_.get());
937   volume_manager()->Initialize();
938   secondary.volume_manager()->Initialize();
939 
940   // Simulates the case that the main profile has kExternalStorageDisabled set
941   // as false, and the secondary profile has the config set to true.
942   profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
943   secondary.profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled,
944                                               true);
945 
946   LoggingObserver main_observer, secondary_observer;
947   volume_manager()->AddObserver(&main_observer);
948   secondary.volume_manager()->AddObserver(&secondary_observer);
949 
950   // Add 1 disk.
951   std::unique_ptr<const Disk> media_disk =
952       Disk::Builder().SetDevicePath("device1").SetHasMedia(true).Build();
953   volume_manager()->OnAutoMountableDiskEvent(DiskMountManager::DISK_ADDED,
954                                              *media_disk);
955   secondary.volume_manager()->OnAutoMountableDiskEvent(
956       DiskMountManager::DISK_ADDED, *media_disk);
957 
958   // The profile with external storage enabled should have mounted the volume.
959   bool has_volume_mounted = false;
960   for (size_t i = 0; i < main_observer.events().size(); ++i) {
961     if (main_observer.events()[i].type ==
962         LoggingObserver::Event::VOLUME_MOUNTED)
963       has_volume_mounted = true;
964   }
965   EXPECT_TRUE(has_volume_mounted);
966 
967   // The other profiles with external storage disabled should have not.
968   has_volume_mounted = false;
969   for (size_t i = 0; i < secondary_observer.events().size(); ++i) {
970     if (secondary_observer.events()[i].type ==
971         LoggingObserver::Event::VOLUME_MOUNTED)
972       has_volume_mounted = true;
973   }
974   EXPECT_FALSE(has_volume_mounted);
975 
976   volume_manager()->RemoveObserver(&main_observer);
977   secondary.volume_manager()->RemoveObserver(&secondary_observer);
978 }
979 
TEST_F(VolumeManagerTest,OnExternalStorageReadOnlyChanged)980 TEST_F(VolumeManagerTest, OnExternalStorageReadOnlyChanged) {
981   // Emulate updates of kExternalStorageReadOnly (change to true, then false).
982   profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageReadOnly, true);
983   volume_manager()->OnExternalStorageReadOnlyChanged();
984   profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageReadOnly, false);
985   volume_manager()->OnExternalStorageReadOnlyChanged();
986 
987   // Verify that remount of removable disks is triggered for each update.
988   ASSERT_EQ(2U, disk_mount_manager_->remount_all_requests().size());
989   const FakeDiskMountManager::RemountAllRequest& remount_request1 =
990       disk_mount_manager_->remount_all_requests()[0];
991   EXPECT_EQ(chromeos::MOUNT_ACCESS_MODE_READ_ONLY,
992             remount_request1.access_mode);
993   const FakeDiskMountManager::RemountAllRequest& remount_request2 =
994       disk_mount_manager_->remount_all_requests()[1];
995   EXPECT_EQ(chromeos::MOUNT_ACCESS_MODE_READ_WRITE,
996             remount_request2.access_mode);
997 }
998 
TEST_F(VolumeManagerTest,GetVolumeList)999 TEST_F(VolumeManagerTest, GetVolumeList) {
1000   volume_manager()->Initialize();  // Adds "Downloads"
1001   std::vector<base::WeakPtr<Volume>> volume_list =
1002       volume_manager()->GetVolumeList();
1003   ASSERT_EQ(1u, volume_list.size());
1004   EXPECT_EQ("downloads:MyFiles", volume_list[0]->volume_id());
1005   EXPECT_EQ(VOLUME_TYPE_DOWNLOADS_DIRECTORY, volume_list[0]->type());
1006 }
1007 
TEST_F(VolumeManagerTest,VolumeManagerInitializeMyFilesVolume)1008 TEST_F(VolumeManagerTest, VolumeManagerInitializeMyFilesVolume) {
1009   // Emulate running inside ChromeOS.
1010   chromeos::ScopedSetRunningOnChromeOSForTesting fake_release(kLsbRelease,
1011                                                               base::Time());
1012   volume_manager()->Initialize();  // Adds "Downloads"
1013   std::vector<base::WeakPtr<Volume>> volume_list =
1014       volume_manager()->GetVolumeList();
1015   ASSERT_EQ(1u, volume_list.size());
1016   auto volume = volume_list[0];
1017   EXPECT_EQ("downloads:MyFiles", volume->volume_id());
1018   EXPECT_EQ(VOLUME_TYPE_DOWNLOADS_DIRECTORY, volume->type());
1019 }
1020 
TEST_F(VolumeManagerTest,FindVolumeById)1021 TEST_F(VolumeManagerTest, FindVolumeById) {
1022   volume_manager()->Initialize();  // Adds "Downloads"
1023   base::WeakPtr<Volume> bad_volume =
1024       volume_manager()->FindVolumeById("nonexistent");
1025   ASSERT_FALSE(bad_volume.get());
1026   base::WeakPtr<Volume> good_volume =
1027       volume_manager()->FindVolumeById("downloads:MyFiles");
1028   ASSERT_TRUE(good_volume.get());
1029   EXPECT_EQ("downloads:MyFiles", good_volume->volume_id());
1030   EXPECT_EQ(VOLUME_TYPE_DOWNLOADS_DIRECTORY, good_volume->type());
1031 }
1032 
TEST_F(VolumeManagerTest,ArchiveSourceFiltering)1033 TEST_F(VolumeManagerTest, ArchiveSourceFiltering) {
1034   LoggingObserver observer;
1035   volume_manager()->AddObserver(&observer);
1036 
1037   // Mount a USB stick.
1038   volume_manager()->OnMountEvent(
1039       DiskMountManager::MOUNTING, chromeos::MOUNT_ERROR_NONE,
1040       DiskMountManager::MountPointInfo("/removable/usb", "/removable/usb",
1041                                        chromeos::MOUNT_TYPE_DEVICE,
1042                                        chromeos::disks::MOUNT_CONDITION_NONE));
1043 
1044   // Mount a zip archive in the stick.
1045   volume_manager()->OnMountEvent(
1046       DiskMountManager::MOUNTING, chromeos::MOUNT_ERROR_NONE,
1047       DiskMountManager::MountPointInfo("/removable/usb/1.zip", "/archive/1",
1048                                        chromeos::MOUNT_TYPE_ARCHIVE,
1049                                        chromeos::disks::MOUNT_CONDITION_NONE));
1050   base::WeakPtr<Volume> volume = volume_manager()->FindVolumeById("archive:1");
1051   ASSERT_TRUE(volume.get());
1052   EXPECT_EQ("/archive/1", volume->mount_path().AsUTF8Unsafe());
1053   EXPECT_EQ(2u, observer.events().size());
1054 
1055   // Mount a zip archive in the previous zip archive.
1056   volume_manager()->OnMountEvent(
1057       DiskMountManager::MOUNTING, chromeos::MOUNT_ERROR_NONE,
1058       DiskMountManager::MountPointInfo("/archive/1/2.zip", "/archive/2",
1059                                        chromeos::MOUNT_TYPE_ARCHIVE,
1060                                        chromeos::disks::MOUNT_CONDITION_NONE));
1061   base::WeakPtr<Volume> second_volume =
1062       volume_manager()->FindVolumeById("archive:2");
1063   ASSERT_TRUE(second_volume.get());
1064   EXPECT_EQ("/archive/2", second_volume->mount_path().AsUTF8Unsafe());
1065   EXPECT_EQ(3u, observer.events().size());
1066 
1067   // A zip file is mounted from other profile. It must be ignored in the current
1068   // VolumeManager.
1069   volume_manager()->OnMountEvent(
1070       DiskMountManager::MOUNTING, chromeos::MOUNT_ERROR_NONE,
1071       DiskMountManager::MountPointInfo(
1072           "/other/profile/drive/folder/3.zip", "/archive/3",
1073           chromeos::MOUNT_TYPE_ARCHIVE, chromeos::disks::MOUNT_CONDITION_NONE));
1074   base::WeakPtr<Volume> third_volume =
1075       volume_manager()->FindVolumeById("archive:3");
1076   ASSERT_FALSE(third_volume.get());
1077   EXPECT_EQ(3u, observer.events().size());
1078 }
1079 
TEST_F(VolumeManagerTest,MTPPlugAndUnplug)1080 TEST_F(VolumeManagerTest, MTPPlugAndUnplug) {
1081   LoggingObserver observer;
1082   volume_manager()->AddObserver(&observer);
1083 
1084   storage_monitor::StorageInfo info(
1085       storage_monitor::StorageInfo::MakeDeviceId(
1086           storage_monitor::StorageInfo::MTP_OR_PTP, "dummy-device-id"),
1087       FILE_PATH_LITERAL("/dummy/device/location"), base::UTF8ToUTF16("label"),
1088       base::UTF8ToUTF16("vendor"), base::UTF8ToUTF16("model"),
1089       12345 /* size */);
1090 
1091   storage_monitor::StorageInfo non_mtp_info(
1092       storage_monitor::StorageInfo::MakeDeviceId(
1093           storage_monitor::StorageInfo::FIXED_MASS_STORAGE, "dummy-device-id2"),
1094       FILE_PATH_LITERAL("/dummy/device/location2"), base::UTF8ToUTF16("label2"),
1095       base::UTF8ToUTF16("vendor2"), base::UTF8ToUTF16("model2"),
1096       12345 /* size */);
1097 
1098   // Attach
1099   volume_manager()->OnRemovableStorageAttached(info);
1100   ASSERT_EQ(1u, observer.events().size());
1101   EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, observer.events()[0].type);
1102 
1103   base::WeakPtr<Volume> volume = volume_manager()->FindVolumeById("mtp:model");
1104   EXPECT_EQ(VOLUME_TYPE_MTP, volume->type());
1105 
1106   // Non MTP events from storage monitor are ignored.
1107   volume_manager()->OnRemovableStorageAttached(non_mtp_info);
1108   EXPECT_EQ(1u, observer.events().size());
1109 
1110   // Detach
1111   volume_manager()->OnRemovableStorageDetached(info);
1112   ASSERT_EQ(2u, observer.events().size());
1113   EXPECT_EQ(LoggingObserver::Event::VOLUME_UNMOUNTED,
1114             observer.events()[1].type);
1115 
1116   EXPECT_FALSE(volume.get());
1117 }
1118 
TEST_F(VolumeManagerTest,OnRenameEvent_Started)1119 TEST_F(VolumeManagerTest, OnRenameEvent_Started) {
1120   LoggingObserver observer;
1121   volume_manager()->AddObserver(&observer);
1122 
1123   volume_manager()->OnRenameEvent(DiskMountManager::RENAME_STARTED,
1124                                   chromeos::RENAME_ERROR_NONE, "device1",
1125                                   "label1");
1126 
1127   ASSERT_EQ(1U, observer.events().size());
1128   const LoggingObserver::Event& event = observer.events()[0];
1129   EXPECT_EQ(LoggingObserver::Event::RENAME_STARTED, event.type);
1130   EXPECT_EQ("device1", event.device_path);
1131   EXPECT_EQ("label1", event.device_label);
1132   EXPECT_TRUE(event.success);
1133 
1134   volume_manager()->RemoveObserver(&observer);
1135 }
1136 
TEST_F(VolumeManagerTest,OnRenameEvent_StartFailed)1137 TEST_F(VolumeManagerTest, OnRenameEvent_StartFailed) {
1138   LoggingObserver observer;
1139   volume_manager()->AddObserver(&observer);
1140 
1141   volume_manager()->OnRenameEvent(DiskMountManager::RENAME_STARTED,
1142                                   chromeos::RENAME_ERROR_UNKNOWN, "device1",
1143                                   "label1");
1144 
1145   ASSERT_EQ(1U, observer.events().size());
1146   const LoggingObserver::Event& event = observer.events()[0];
1147   EXPECT_EQ(LoggingObserver::Event::RENAME_STARTED, event.type);
1148   EXPECT_EQ("device1", event.device_path);
1149   EXPECT_EQ("label1", event.device_label);
1150   EXPECT_FALSE(event.success);
1151 
1152   volume_manager()->RemoveObserver(&observer);
1153 }
1154 
TEST_F(VolumeManagerTest,OnRenameEvent_Completed)1155 TEST_F(VolumeManagerTest, OnRenameEvent_Completed) {
1156   LoggingObserver observer;
1157   volume_manager()->AddObserver(&observer);
1158 
1159   volume_manager()->OnRenameEvent(DiskMountManager::RENAME_COMPLETED,
1160                                   chromeos::RENAME_ERROR_NONE, "device1",
1161                                   "label1");
1162 
1163   ASSERT_EQ(1U, observer.events().size());
1164   const LoggingObserver::Event& event = observer.events()[0];
1165   EXPECT_EQ(LoggingObserver::Event::RENAME_COMPLETED, event.type);
1166   EXPECT_EQ("device1", event.device_path);
1167   EXPECT_EQ("label1", event.device_label);
1168   EXPECT_TRUE(event.success);
1169 
1170   // When "rename" is successfully done, VolumeManager requests to mount it.
1171   ASSERT_EQ(1U, disk_mount_manager_->mount_requests().size());
1172   const FakeDiskMountManager::MountRequest& mount_request =
1173       disk_mount_manager_->mount_requests()[0];
1174   EXPECT_EQ("device1", mount_request.source_path);
1175   EXPECT_EQ("", mount_request.source_format);
1176   EXPECT_EQ(chromeos::MOUNT_TYPE_DEVICE, mount_request.type);
1177 
1178   volume_manager()->RemoveObserver(&observer);
1179 }
1180 
TEST_F(VolumeManagerTest,OnRenameEvent_CompletedFailed)1181 TEST_F(VolumeManagerTest, OnRenameEvent_CompletedFailed) {
1182   LoggingObserver observer;
1183   volume_manager()->AddObserver(&observer);
1184 
1185   volume_manager()->OnRenameEvent(DiskMountManager::RENAME_COMPLETED,
1186                                   chromeos::RENAME_ERROR_UNKNOWN, "device1",
1187                                   "label1");
1188 
1189   ASSERT_EQ(1U, observer.events().size());
1190   const LoggingObserver::Event& event = observer.events()[0];
1191   EXPECT_EQ(LoggingObserver::Event::RENAME_COMPLETED, event.type);
1192   EXPECT_EQ("device1", event.device_path);
1193   EXPECT_EQ("label1", event.device_label);
1194   EXPECT_FALSE(event.success);
1195 
1196   EXPECT_EQ(1U, disk_mount_manager_->mount_requests().size());
1197 
1198   volume_manager()->RemoveObserver(&observer);
1199 }
1200 
1201 }  // namespace file_manager
1202