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.
5 #include "chrome/browser/chromeos/file_manager/volume_manager.h"
10 #include "base/basictypes.h"
11 #include "base/prefs/pref_service.h"
12 #include "base/strings/utf_string_conversions.h"
13 #include "chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h"
14 #include "chrome/browser/chromeos/file_manager/volume_manager_observer.h"
15 #include "chrome/browser/chromeos/file_system_provider/fake_provided_file_system.h"
16 #include "chrome/browser/chromeos/file_system_provider/service.h"
17 #include "chrome/common/pref_names.h"
18 #include "chrome/test/base/testing_profile.h"
19 #include "chromeos/dbus/fake_power_manager_client.h"
20 #include "chromeos/disks/disk_mount_manager.h"
21 #include "components/storage_monitor/storage_info.h"
22 #include "content/public/test/test_browser_thread_bundle.h"
23 #include "extensions/browser/extension_registry.h"
24 #include "testing/gtest/include/gtest/gtest.h"
26 namespace file_manager {
29 class LoggingObserver : public VolumeManagerObserver {
44 // Available on DEVICE_ADDED, DEVICE_REMOVED, VOLUME_MOUNTED,
45 // VOLUME_UNMOUNTED, FORMAT_STARTED and FORMAT_COMPLETED.
46 std::string device_path;
48 // Available on DISK_ADDED.
51 // Available on VOLUME_MOUNTED and VOLUME_UNMOUNTED.
52 chromeos::MountError mount_error;
54 // Available on VOLUME_MOUNTED.
57 // Available on FORMAT_STARTED and FORMAT_COMPLETED.
62 virtual ~LoggingObserver() {}
64 const std::vector<Event>& events() const { return events_; }
66 // VolumeManagerObserver overrides.
67 virtual void OnDiskAdded(const chromeos::disks::DiskMountManager::Disk& disk,
68 bool mounting) OVERRIDE {
70 event.type = Event::DISK_ADDED;
71 event.device_path = disk.device_path(); // Keep only device_path.
72 event.mounting = mounting;
73 events_.push_back(event);
76 virtual void OnDiskRemoved(
77 const chromeos::disks::DiskMountManager::Disk& disk) OVERRIDE {
79 event.type = Event::DISK_REMOVED;
80 event.device_path = disk.device_path(); // Keep only device_path.
81 events_.push_back(event);
84 virtual void OnDeviceAdded(const std::string& device_path) OVERRIDE {
86 event.type = Event::DEVICE_ADDED;
87 event.device_path = device_path;
88 events_.push_back(event);
91 virtual void OnDeviceRemoved(const std::string& device_path) OVERRIDE {
93 event.type = Event::DEVICE_REMOVED;
94 event.device_path = device_path;
95 events_.push_back(event);
98 virtual void OnVolumeMounted(chromeos::MountError error_code,
99 const VolumeInfo& volume_info,
100 bool is_remounting) OVERRIDE {
102 event.type = Event::VOLUME_MOUNTED;
103 event.device_path = volume_info.source_path.AsUTF8Unsafe();
104 event.mount_error = error_code;
105 event.is_remounting = is_remounting;
106 events_.push_back(event);
109 virtual void OnVolumeUnmounted(chromeos::MountError error_code,
110 const VolumeInfo& volume_info) OVERRIDE {
112 event.type = Event::VOLUME_UNMOUNTED;
113 event.device_path = volume_info.source_path.AsUTF8Unsafe();
114 event.mount_error = error_code;
115 events_.push_back(event);
118 virtual void OnHardUnplugged(const std::string& device_path) OVERRIDE {
120 event.type = Event::HARD_UNPLUGGED;
121 event.device_path = device_path;
122 events_.push_back(event);
125 virtual void OnFormatStarted(
126 const std::string& device_path, bool success) OVERRIDE {
128 event.type = Event::FORMAT_STARTED;
129 event.device_path = device_path;
130 event.success = success;
131 events_.push_back(event);
134 virtual void OnFormatCompleted(
135 const std::string& device_path, bool success) OVERRIDE {
137 event.type = Event::FORMAT_COMPLETED;
138 event.device_path = device_path;
139 event.success = success;
140 events_.push_back(event);
144 std::vector<Event> events_;
146 DISALLOW_COPY_AND_ASSIGN(LoggingObserver);
151 class VolumeManagerTest : public testing::Test {
153 // Helper class that contains per-profile objects.
154 class ProfileEnvironment {
156 ProfileEnvironment(chromeos::PowerManagerClient* power_manager_client,
157 chromeos::disks::DiskMountManager* disk_manager)
158 : profile_(new TestingProfile),
160 new extensions::ExtensionRegistry(profile_.get())),
161 file_system_provider_service_(
162 new chromeos::file_system_provider::Service(
164 extension_registry_.get())),
166 new VolumeManager(profile_.get(),
167 NULL, // DriveIntegrationService
168 power_manager_client,
170 file_system_provider_service_.get())) {
171 file_system_provider_service_->SetFileSystemFactoryForTesting(base::Bind(
172 &chromeos::file_system_provider::FakeProvidedFileSystem::Create));
175 Profile* profile() const { return profile_.get(); }
176 VolumeManager* volume_manager() const { return volume_manager_.get(); }
179 scoped_ptr<TestingProfile> profile_;
180 scoped_ptr<extensions::ExtensionRegistry> extension_registry_;
181 scoped_ptr<chromeos::file_system_provider::Service>
182 file_system_provider_service_;
183 scoped_ptr<VolumeManager> volume_manager_;
186 virtual void SetUp() OVERRIDE {
187 power_manager_client_.reset(new chromeos::FakePowerManagerClient);
188 disk_mount_manager_.reset(new FakeDiskMountManager);
189 main_profile_.reset(new ProfileEnvironment(power_manager_client_.get(),
190 disk_mount_manager_.get()));
193 Profile* profile() const { return main_profile_->profile(); }
194 VolumeManager* volume_manager() const {
195 return main_profile_->volume_manager();
198 content::TestBrowserThreadBundle thread_bundle_;
199 scoped_ptr<chromeos::FakePowerManagerClient> power_manager_client_;
200 scoped_ptr<FakeDiskMountManager> disk_mount_manager_;
201 scoped_ptr<ProfileEnvironment> main_profile_;
204 TEST_F(VolumeManagerTest, OnDriveFileSystemMountAndUnmount) {
205 LoggingObserver observer;
206 volume_manager()->AddObserver(&observer);
208 volume_manager()->OnFileSystemMounted();
210 ASSERT_EQ(1U, observer.events().size());
211 LoggingObserver::Event event = observer.events()[0];
212 EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, event.type);
213 EXPECT_EQ(drive::util::GetDriveMountPointPath(profile()).AsUTF8Unsafe(),
215 EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
216 EXPECT_FALSE(event.is_remounting);
218 volume_manager()->OnFileSystemBeingUnmounted();
220 ASSERT_EQ(2U, observer.events().size());
221 event = observer.events()[1];
222 EXPECT_EQ(LoggingObserver::Event::VOLUME_UNMOUNTED, event.type);
223 EXPECT_EQ(drive::util::GetDriveMountPointPath(profile()).AsUTF8Unsafe(),
225 EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
227 volume_manager()->RemoveObserver(&observer);
230 TEST_F(VolumeManagerTest, OnDriveFileSystemUnmountWithoutMount) {
231 LoggingObserver observer;
232 volume_manager()->AddObserver(&observer);
233 volume_manager()->OnFileSystemBeingUnmounted();
235 // Unmount event for non-mounted volume is not reported.
236 ASSERT_EQ(0U, observer.events().size());
237 volume_manager()->RemoveObserver(&observer);
240 TEST_F(VolumeManagerTest, OnDiskEvent_Hidden) {
241 LoggingObserver observer;
242 volume_manager()->AddObserver(&observer);
244 const bool kIsHidden = true;
245 const chromeos::disks::DiskMountManager::Disk kDisk(
246 "device1", "", "", "", "", "", "", "", "", "", "", "",
247 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false,
250 volume_manager()->OnDiskEvent(
251 chromeos::disks::DiskMountManager::DISK_ADDED, &kDisk);
252 EXPECT_EQ(0U, observer.events().size());
254 volume_manager()->OnDiskEvent(
255 chromeos::disks::DiskMountManager::DISK_REMOVED, &kDisk);
256 EXPECT_EQ(0U, observer.events().size());
258 volume_manager()->OnDiskEvent(
259 chromeos::disks::DiskMountManager::DISK_CHANGED, &kDisk);
260 EXPECT_EQ(0U, observer.events().size());
262 volume_manager()->RemoveObserver(&observer);
265 TEST_F(VolumeManagerTest, OnDiskEvent_Added) {
266 // Enable external storage.
267 profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
269 LoggingObserver observer;
270 volume_manager()->AddObserver(&observer);
272 const chromeos::disks::DiskMountManager::Disk kEmptyDevicePathDisk(
273 "", // empty device path.
274 "", "", "", "", "", "", "", "", "", "", "",
275 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false,
277 volume_manager()->OnDiskEvent(
278 chromeos::disks::DiskMountManager::DISK_ADDED, &kEmptyDevicePathDisk);
279 EXPECT_EQ(0U, observer.events().size());
281 const bool kHasMedia = true;
282 const chromeos::disks::DiskMountManager::Disk kMediaDisk(
283 "device1", "", "", "", "", "", "", "", "", "", "", "",
284 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, kHasMedia, false, false,
286 volume_manager()->OnDiskEvent(
287 chromeos::disks::DiskMountManager::DISK_ADDED, &kMediaDisk);
288 ASSERT_EQ(1U, observer.events().size());
289 const LoggingObserver::Event& event = observer.events()[0];
290 EXPECT_EQ(LoggingObserver::Event::DISK_ADDED, event.type);
291 EXPECT_EQ("device1", event.device_path);
292 EXPECT_TRUE(event.mounting);
294 ASSERT_EQ(1U, disk_mount_manager_->mount_requests().size());
295 const FakeDiskMountManager::MountRequest& mount_request =
296 disk_mount_manager_->mount_requests()[0];
297 EXPECT_EQ("device1", mount_request.source_path);
298 EXPECT_EQ("", mount_request.source_format);
299 EXPECT_EQ("", mount_request.mount_label);
300 EXPECT_EQ(chromeos::MOUNT_TYPE_DEVICE, mount_request.type);
302 volume_manager()->RemoveObserver(&observer);
305 TEST_F(VolumeManagerTest, OnDiskEvent_AddedNonMounting) {
306 // Enable external storage.
307 profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
309 // Device which is already mounted.
311 LoggingObserver observer;
312 volume_manager()->AddObserver(&observer);
314 const bool kHasMedia = true;
315 const chromeos::disks::DiskMountManager::Disk kMountedMediaDisk(
316 "device1", "mounted", "", "", "", "", "", "", "", "", "", "",
317 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false,
318 kHasMedia, false, false, false);
319 volume_manager()->OnDiskEvent(
320 chromeos::disks::DiskMountManager::DISK_ADDED, &kMountedMediaDisk);
321 ASSERT_EQ(1U, observer.events().size());
322 const LoggingObserver::Event& event = observer.events()[0];
323 EXPECT_EQ(LoggingObserver::Event::DISK_ADDED, event.type);
324 EXPECT_EQ("device1", event.device_path);
325 EXPECT_FALSE(event.mounting);
327 ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
329 volume_manager()->RemoveObserver(&observer);
332 // Device without media.
334 LoggingObserver observer;
335 volume_manager()->AddObserver(&observer);
337 const bool kWithoutMedia = false;
338 const chromeos::disks::DiskMountManager::Disk kNoMediaDisk(
339 "device1", "", "", "", "", "", "", "", "", "", "", "",
340 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false,
341 kWithoutMedia, false, false, false);
342 volume_manager()->OnDiskEvent(
343 chromeos::disks::DiskMountManager::DISK_ADDED, &kNoMediaDisk);
344 ASSERT_EQ(1U, observer.events().size());
345 const LoggingObserver::Event& event = observer.events()[0];
346 EXPECT_EQ(LoggingObserver::Event::DISK_ADDED, event.type);
347 EXPECT_EQ("device1", event.device_path);
348 EXPECT_FALSE(event.mounting);
350 ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
352 volume_manager()->RemoveObserver(&observer);
355 // External storage is disabled.
357 profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, true);
359 LoggingObserver observer;
360 volume_manager()->AddObserver(&observer);
362 const bool kHasMedia = true;
363 const chromeos::disks::DiskMountManager::Disk kMediaDisk(
364 "device1", "", "", "", "", "", "", "", "", "", "", "",
365 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false,
366 kHasMedia, false, false, false);
367 volume_manager()->OnDiskEvent(
368 chromeos::disks::DiskMountManager::DISK_ADDED, &kMediaDisk);
369 ASSERT_EQ(1U, observer.events().size());
370 const LoggingObserver::Event& event = observer.events()[0];
371 EXPECT_EQ(LoggingObserver::Event::DISK_ADDED, event.type);
372 EXPECT_EQ("device1", event.device_path);
373 EXPECT_FALSE(event.mounting);
375 ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
377 volume_manager()->RemoveObserver(&observer);
381 TEST_F(VolumeManagerTest, OnDiskEvent_Removed) {
382 LoggingObserver observer;
383 volume_manager()->AddObserver(&observer);
385 const chromeos::disks::DiskMountManager::Disk kMountedDisk(
386 "device1", "mount_path", "", "", "", "", "", "", "", "", "", "",
387 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false,
389 volume_manager()->OnDiskEvent(
390 chromeos::disks::DiskMountManager::DISK_REMOVED, &kMountedDisk);
392 ASSERT_EQ(2U, observer.events().size());
393 const LoggingObserver::Event& event = observer.events()[0];
394 EXPECT_EQ(LoggingObserver::Event::DISK_REMOVED, event.type);
395 EXPECT_EQ("device1", event.device_path);
397 // Since the Disk has non-empty mount_path, it's regarded as hard unplugging.
398 EXPECT_EQ(LoggingObserver::Event::HARD_UNPLUGGED,
399 observer.events()[1].type);
401 ASSERT_EQ(1U, disk_mount_manager_->unmount_requests().size());
402 const FakeDiskMountManager::UnmountRequest& unmount_request =
403 disk_mount_manager_->unmount_requests()[0];
404 EXPECT_EQ("mount_path", unmount_request.mount_path);
405 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_LAZY, unmount_request.options);
407 volume_manager()->RemoveObserver(&observer);
410 TEST_F(VolumeManagerTest, OnDiskEvent_RemovedNotMounted) {
411 LoggingObserver observer;
412 volume_manager()->AddObserver(&observer);
414 const chromeos::disks::DiskMountManager::Disk kNotMountedDisk(
415 "device1", "", "", "", "", "", "", "", "", "", "", "",
416 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false,
418 volume_manager()->OnDiskEvent(
419 chromeos::disks::DiskMountManager::DISK_REMOVED, &kNotMountedDisk);
421 ASSERT_EQ(1U, observer.events().size());
422 const LoggingObserver::Event& event = observer.events()[0];
423 EXPECT_EQ(LoggingObserver::Event::DISK_REMOVED, event.type);
424 EXPECT_EQ("device1", event.device_path);
426 ASSERT_EQ(0U, disk_mount_manager_->unmount_requests().size());
428 volume_manager()->RemoveObserver(&observer);
431 TEST_F(VolumeManagerTest, OnDiskEvent_Changed) {
432 // Changed event should cause mounting (if possible).
433 LoggingObserver observer;
434 volume_manager()->AddObserver(&observer);
436 const chromeos::disks::DiskMountManager::Disk kDisk(
437 "device1", "", "", "", "", "", "", "", "", "", "", "",
438 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, true, false, false,
440 volume_manager()->OnDiskEvent(
441 chromeos::disks::DiskMountManager::DISK_CHANGED, &kDisk);
443 EXPECT_EQ(1U, observer.events().size());
444 EXPECT_EQ(1U, disk_mount_manager_->mount_requests().size());
445 EXPECT_EQ(0U, disk_mount_manager_->unmount_requests().size());
447 volume_manager()->RemoveObserver(&observer);
450 TEST_F(VolumeManagerTest, OnDeviceEvent_Added) {
451 LoggingObserver observer;
452 volume_manager()->AddObserver(&observer);
454 volume_manager()->OnDeviceEvent(
455 chromeos::disks::DiskMountManager::DEVICE_ADDED, "device1");
457 ASSERT_EQ(1U, observer.events().size());
458 const LoggingObserver::Event& event = observer.events()[0];
459 EXPECT_EQ(LoggingObserver::Event::DEVICE_ADDED, event.type);
460 EXPECT_EQ("device1", event.device_path);
462 volume_manager()->RemoveObserver(&observer);
465 TEST_F(VolumeManagerTest, OnDeviceEvent_Removed) {
466 LoggingObserver observer;
467 volume_manager()->AddObserver(&observer);
469 volume_manager()->OnDeviceEvent(
470 chromeos::disks::DiskMountManager::DEVICE_REMOVED, "device1");
472 ASSERT_EQ(1U, observer.events().size());
473 const LoggingObserver::Event& event = observer.events()[0];
474 EXPECT_EQ(LoggingObserver::Event::DEVICE_REMOVED, event.type);
475 EXPECT_EQ("device1", event.device_path);
477 volume_manager()->RemoveObserver(&observer);
480 TEST_F(VolumeManagerTest, OnDeviceEvent_Scanned) {
481 LoggingObserver observer;
482 volume_manager()->AddObserver(&observer);
484 volume_manager()->OnDeviceEvent(
485 chromeos::disks::DiskMountManager::DEVICE_SCANNED, "device1");
487 // SCANNED event is just ignored.
488 EXPECT_EQ(0U, observer.events().size());
490 volume_manager()->RemoveObserver(&observer);
493 TEST_F(VolumeManagerTest, OnMountEvent_MountingAndUnmounting) {
494 LoggingObserver observer;
495 volume_manager()->AddObserver(&observer);
497 const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint(
500 chromeos::MOUNT_TYPE_DEVICE,
501 chromeos::disks::MOUNT_CONDITION_NONE);
503 volume_manager()->OnMountEvent(chromeos::disks::DiskMountManager::MOUNTING,
504 chromeos::MOUNT_ERROR_NONE,
507 ASSERT_EQ(1U, observer.events().size());
508 LoggingObserver::Event event = observer.events()[0];
509 EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, event.type);
510 EXPECT_EQ("device1", event.device_path);
511 EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
512 EXPECT_FALSE(event.is_remounting);
514 volume_manager()->OnMountEvent(chromeos::disks::DiskMountManager::UNMOUNTING,
515 chromeos::MOUNT_ERROR_NONE,
518 ASSERT_EQ(2U, observer.events().size());
519 event = observer.events()[1];
520 EXPECT_EQ(LoggingObserver::Event::VOLUME_UNMOUNTED, event.type);
521 EXPECT_EQ("device1", event.device_path);
522 EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
524 volume_manager()->RemoveObserver(&observer);
527 TEST_F(VolumeManagerTest, OnMountEvent_Remounting) {
528 scoped_ptr<chromeos::disks::DiskMountManager::Disk> disk(
529 new chromeos::disks::DiskMountManager::Disk(
530 "device1", "", "", "", "", "", "", "", "", "", "uuid1", "",
531 chromeos::DEVICE_TYPE_UNKNOWN, 0,
532 false, false, false, false, false, false));
533 disk_mount_manager_->AddDiskForTest(disk.release());
534 disk_mount_manager_->MountPath(
535 "device1", "", "", chromeos::MOUNT_TYPE_DEVICE);
537 const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint(
540 chromeos::MOUNT_TYPE_DEVICE,
541 chromeos::disks::MOUNT_CONDITION_NONE);
543 volume_manager()->OnMountEvent(
544 chromeos::disks::DiskMountManager::MOUNTING,
545 chromeos::MOUNT_ERROR_NONE,
548 LoggingObserver observer;
550 // Emulate system suspend and then resume.
552 power_manager_client_->SendSuspendImminent();
553 power_manager_client_->SendSuspendDone();
555 // After resume, the device is unmounted and then mounted.
556 volume_manager()->OnMountEvent(
557 chromeos::disks::DiskMountManager::UNMOUNTING,
558 chromeos::MOUNT_ERROR_NONE,
561 // Observe what happened for the mount event.
562 volume_manager()->AddObserver(&observer);
564 volume_manager()->OnMountEvent(
565 chromeos::disks::DiskMountManager::MOUNTING,
566 chromeos::MOUNT_ERROR_NONE,
570 ASSERT_EQ(1U, observer.events().size());
571 const LoggingObserver::Event& event = observer.events()[0];
572 EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, event.type);
573 EXPECT_EQ("device1", event.device_path);
574 EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
575 EXPECT_TRUE(event.is_remounting);
577 volume_manager()->RemoveObserver(&observer);
580 TEST_F(VolumeManagerTest, OnMountEvent_UnmountingWithoutMounting) {
581 LoggingObserver observer;
582 volume_manager()->AddObserver(&observer);
584 const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint(
587 chromeos::MOUNT_TYPE_DEVICE,
588 chromeos::disks::MOUNT_CONDITION_NONE);
590 volume_manager()->OnMountEvent(chromeos::disks::DiskMountManager::UNMOUNTING,
591 chromeos::MOUNT_ERROR_NONE,
594 // Unmount event for a disk not mounted in this manager is not reported.
595 ASSERT_EQ(0U, observer.events().size());
597 volume_manager()->RemoveObserver(&observer);
600 TEST_F(VolumeManagerTest, OnFormatEvent_Started) {
601 LoggingObserver observer;
602 volume_manager()->AddObserver(&observer);
604 volume_manager()->OnFormatEvent(
605 chromeos::disks::DiskMountManager::FORMAT_STARTED,
606 chromeos::FORMAT_ERROR_NONE,
609 ASSERT_EQ(1U, observer.events().size());
610 const LoggingObserver::Event& event = observer.events()[0];
611 EXPECT_EQ(LoggingObserver::Event::FORMAT_STARTED, event.type);
612 EXPECT_EQ("device1", event.device_path);
613 EXPECT_TRUE(event.success);
615 volume_manager()->RemoveObserver(&observer);
618 TEST_F(VolumeManagerTest, OnFormatEvent_StartFailed) {
619 LoggingObserver observer;
620 volume_manager()->AddObserver(&observer);
622 volume_manager()->OnFormatEvent(
623 chromeos::disks::DiskMountManager::FORMAT_STARTED,
624 chromeos::FORMAT_ERROR_UNKNOWN,
627 ASSERT_EQ(1U, observer.events().size());
628 const LoggingObserver::Event& event = observer.events()[0];
629 EXPECT_EQ(LoggingObserver::Event::FORMAT_STARTED, event.type);
630 EXPECT_EQ("device1", event.device_path);
631 EXPECT_FALSE(event.success);
633 volume_manager()->RemoveObserver(&observer);
636 TEST_F(VolumeManagerTest, OnFormatEvent_Completed) {
637 LoggingObserver observer;
638 volume_manager()->AddObserver(&observer);
640 volume_manager()->OnFormatEvent(
641 chromeos::disks::DiskMountManager::FORMAT_COMPLETED,
642 chromeos::FORMAT_ERROR_NONE,
645 ASSERT_EQ(1U, observer.events().size());
646 const LoggingObserver::Event& event = observer.events()[0];
647 EXPECT_EQ(LoggingObserver::Event::FORMAT_COMPLETED, event.type);
648 EXPECT_EQ("device1", event.device_path);
649 EXPECT_TRUE(event.success);
651 // When "format" is successfully done, VolumeManager requests to mount it.
652 ASSERT_EQ(1U, disk_mount_manager_->mount_requests().size());
653 const FakeDiskMountManager::MountRequest& mount_request =
654 disk_mount_manager_->mount_requests()[0];
655 EXPECT_EQ("device1", mount_request.source_path);
656 EXPECT_EQ("", mount_request.source_format);
657 EXPECT_EQ("", mount_request.mount_label);
658 EXPECT_EQ(chromeos::MOUNT_TYPE_DEVICE, mount_request.type);
660 volume_manager()->RemoveObserver(&observer);
663 TEST_F(VolumeManagerTest, OnFormatEvent_CompletedFailed) {
664 LoggingObserver observer;
665 volume_manager()->AddObserver(&observer);
667 volume_manager()->OnFormatEvent(
668 chromeos::disks::DiskMountManager::FORMAT_COMPLETED,
669 chromeos::FORMAT_ERROR_UNKNOWN,
672 ASSERT_EQ(1U, observer.events().size());
673 const LoggingObserver::Event& event = observer.events()[0];
674 EXPECT_EQ(LoggingObserver::Event::FORMAT_COMPLETED, event.type);
675 EXPECT_EQ("device1", event.device_path);
676 EXPECT_FALSE(event.success);
678 EXPECT_EQ(0U, disk_mount_manager_->mount_requests().size());
680 volume_manager()->RemoveObserver(&observer);
683 TEST_F(VolumeManagerTest, OnExternalStorageDisabledChanged) {
684 // Here create two mount points.
685 disk_mount_manager_->MountPath(
686 "mount1", "", "", chromeos::MOUNT_TYPE_DEVICE);
687 disk_mount_manager_->MountPath(
688 "mount2", "", "", chromeos::MOUNT_TYPE_DEVICE);
690 // Initially, there are two mount points.
691 ASSERT_EQ(2U, disk_mount_manager_->mount_points().size());
692 ASSERT_EQ(0U, disk_mount_manager_->unmount_requests().size());
694 // Emulate to set kExternalStorageDisabled to false.
695 profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
696 volume_manager()->OnExternalStorageDisabledChanged();
698 // Expect no effects.
699 EXPECT_EQ(2U, disk_mount_manager_->mount_points().size());
700 EXPECT_EQ(0U, disk_mount_manager_->unmount_requests().size());
702 // Emulate to set kExternalStorageDisabled to true.
703 profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, true);
704 volume_manager()->OnExternalStorageDisabledChanged();
706 // The all mount points should be unmounted.
707 EXPECT_EQ(0U, disk_mount_manager_->mount_points().size());
709 EXPECT_EQ(2U, disk_mount_manager_->unmount_requests().size());
710 const FakeDiskMountManager::UnmountRequest& unmount_request1 =
711 disk_mount_manager_->unmount_requests()[0];
712 EXPECT_EQ("mount1", unmount_request1.mount_path);
714 const FakeDiskMountManager::UnmountRequest& unmount_request2 =
715 disk_mount_manager_->unmount_requests()[1];
716 EXPECT_EQ("mount2", unmount_request2.mount_path);
719 TEST_F(VolumeManagerTest, ExternalStorageDisabledPolicyMultiProfile) {
720 ProfileEnvironment secondary(power_manager_client_.get(),
721 disk_mount_manager_.get());
722 volume_manager()->Initialize();
723 secondary.volume_manager()->Initialize();
725 // Simulates the case that the main profile has kExternalStorageDisabled set
726 // as false, and the secondary profile has the config set to true.
727 profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
728 secondary.profile()->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled,
731 LoggingObserver main_observer, secondary_observer;
732 volume_manager()->AddObserver(&main_observer);
733 secondary.volume_manager()->AddObserver(&secondary_observer);
736 const chromeos::disks::DiskMountManager::Disk kMediaDisk(
737 "device1", "", "", "", "", "", "", "", "", "", "", "",
738 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, true, false, false,
740 volume_manager()->OnDiskEvent(
741 chromeos::disks::DiskMountManager::DISK_ADDED, &kMediaDisk);
742 secondary.volume_manager()->OnDiskEvent(
743 chromeos::disks::DiskMountManager::DISK_ADDED, &kMediaDisk);
745 // The profile with external storage enabled should have mounted the volume.
746 bool has_volume_mounted = false;
747 for (size_t i = 0; i < main_observer.events().size(); ++i) {
748 if (main_observer.events()[i].type ==
749 LoggingObserver::Event::VOLUME_MOUNTED)
750 has_volume_mounted = true;
752 EXPECT_TRUE(has_volume_mounted);
754 // The other profiles with external storage disabled should have not.
755 has_volume_mounted = false;
756 for (size_t i = 0; i < secondary_observer.events().size(); ++i) {
757 if (secondary_observer.events()[i].type ==
758 LoggingObserver::Event::VOLUME_MOUNTED)
759 has_volume_mounted = true;
761 EXPECT_FALSE(has_volume_mounted);
763 volume_manager()->RemoveObserver(&main_observer);
764 secondary.volume_manager()->RemoveObserver(&secondary_observer);
767 TEST_F(VolumeManagerTest, GetVolumeInfoList) {
768 volume_manager()->Initialize(); // Adds "Downloads"
769 std::vector<VolumeInfo> info_list = volume_manager()->GetVolumeInfoList();
770 ASSERT_EQ(1u, info_list.size());
771 EXPECT_EQ("downloads:Downloads", info_list[0].volume_id);
772 EXPECT_EQ(VOLUME_TYPE_DOWNLOADS_DIRECTORY, info_list[0].type);
775 TEST_F(VolumeManagerTest, FindVolumeInfoById) {
776 volume_manager()->Initialize(); // Adds "Downloads"
777 VolumeInfo volume_info;
778 ASSERT_FALSE(volume_manager()->FindVolumeInfoById(
779 "nonexistent", &volume_info));
780 ASSERT_TRUE(volume_manager()->FindVolumeInfoById(
781 "downloads:Downloads", &volume_info));
782 EXPECT_EQ("downloads:Downloads", volume_info.volume_id);
783 EXPECT_EQ(VOLUME_TYPE_DOWNLOADS_DIRECTORY, volume_info.type);
786 TEST_F(VolumeManagerTest, ArchiveSourceFiltering) {
787 LoggingObserver observer;
788 volume_manager()->AddObserver(&observer);
790 // Mount a USB stick.
791 volume_manager()->OnMountEvent(
792 chromeos::disks::DiskMountManager::MOUNTING,
793 chromeos::MOUNT_ERROR_NONE,
794 chromeos::disks::DiskMountManager::MountPointInfo(
797 chromeos::MOUNT_TYPE_DEVICE,
798 chromeos::disks::MOUNT_CONDITION_NONE));
800 // Mount a zip archive in the stick.
801 volume_manager()->OnMountEvent(
802 chromeos::disks::DiskMountManager::MOUNTING,
803 chromeos::MOUNT_ERROR_NONE,
804 chromeos::disks::DiskMountManager::MountPointInfo(
805 "/removable/usb/1.zip",
807 chromeos::MOUNT_TYPE_ARCHIVE,
808 chromeos::disks::MOUNT_CONDITION_NONE));
809 VolumeInfo volume_info;
810 ASSERT_TRUE(volume_manager()->FindVolumeInfoById("archive:1", &volume_info));
811 EXPECT_EQ("/archive/1", volume_info.mount_path.AsUTF8Unsafe());
812 EXPECT_EQ(2u, observer.events().size());
814 // Mount a zip archive in the previous zip archive.
815 volume_manager()->OnMountEvent(
816 chromeos::disks::DiskMountManager::MOUNTING,
817 chromeos::MOUNT_ERROR_NONE,
818 chromeos::disks::DiskMountManager::MountPointInfo(
821 chromeos::MOUNT_TYPE_ARCHIVE,
822 chromeos::disks::MOUNT_CONDITION_NONE));
823 ASSERT_TRUE(volume_manager()->FindVolumeInfoById("archive:2", &volume_info));
824 EXPECT_EQ("/archive/2", volume_info.mount_path.AsUTF8Unsafe());
825 EXPECT_EQ(3u, observer.events().size());
827 // A zip file is mounted from other profile. It must be ignored in the current
829 volume_manager()->OnMountEvent(
830 chromeos::disks::DiskMountManager::MOUNTING,
831 chromeos::MOUNT_ERROR_NONE,
832 chromeos::disks::DiskMountManager::MountPointInfo(
833 "/other/profile/drive/folder/3.zip",
835 chromeos::MOUNT_TYPE_ARCHIVE,
836 chromeos::disks::MOUNT_CONDITION_NONE));
837 EXPECT_FALSE(volume_manager()->FindVolumeInfoById("archive:3", &volume_info));
838 EXPECT_EQ(3u, observer.events().size());
841 TEST_F(VolumeManagerTest, HardUnplugged) {
842 volume_manager()->Initialize();
843 LoggingObserver observer;
844 volume_manager()->AddObserver(&observer);
846 // Disk that has a mount path is removed.
847 chromeos::disks::DiskMountManager::Disk mounted_disk(
860 chromeos::DEVICE_TYPE_UNKNOWN,
869 chromeos::disks::DiskMountManager::Disk unmounted_disk(
882 chromeos::DEVICE_TYPE_UNKNOWN,
891 // Do not publish the hard_unplugged event for a disk that is already
893 disk_mount_manager_->InvokeDiskEventForTest(
894 chromeos::disks::DiskMountManager::DISK_REMOVED, &unmounted_disk);
895 // Publish the hard_unplugged event for a disk that is currently mounted.
896 disk_mount_manager_->InvokeDiskEventForTest(
897 chromeos::disks::DiskMountManager::DISK_REMOVED, &mounted_disk);
898 // Do not publish the hard_unplugged event twice for the same disk.
899 disk_mount_manager_->InvokeDiskEventForTest(
900 chromeos::disks::DiskMountManager::DISK_REMOVED, &mounted_disk);
902 EXPECT_EQ(4u, observer.events().size());
903 EXPECT_EQ(LoggingObserver::Event::DISK_REMOVED, observer.events()[0].type);
904 EXPECT_EQ(LoggingObserver::Event::DISK_REMOVED, observer.events()[1].type);
905 EXPECT_EQ(LoggingObserver::Event::HARD_UNPLUGGED, observer.events()[2].type);
906 EXPECT_EQ(LoggingObserver::Event::DISK_REMOVED, observer.events()[3].type);
909 TEST_F(VolumeManagerTest, MTPPlugAndUnplug) {
910 LoggingObserver observer;
911 volume_manager()->AddObserver(&observer);
913 storage_monitor::StorageInfo info(
914 storage_monitor::StorageInfo::MakeDeviceId(
915 storage_monitor::StorageInfo::MTP_OR_PTP, "dummy-device-id"),
916 FILE_PATH_LITERAL("/dummy/device/location"),
917 base::UTF8ToUTF16("label"),
918 base::UTF8ToUTF16("vendor"),
919 base::UTF8ToUTF16("model"),
922 storage_monitor::StorageInfo non_mtp_info(
923 storage_monitor::StorageInfo::MakeDeviceId(
924 storage_monitor::StorageInfo::IPHOTO, "dummy-device-id2"),
925 FILE_PATH_LITERAL("/dummy/device/location2"),
926 base::UTF8ToUTF16("label2"),
927 base::UTF8ToUTF16("vendor2"),
928 base::UTF8ToUTF16("model2"),
932 volume_manager()->OnRemovableStorageAttached(info);
933 ASSERT_EQ(1u, observer.events().size());
934 EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, observer.events()[0].type);
936 VolumeInfo volume_info;
937 ASSERT_TRUE(volume_manager()->FindVolumeInfoById("mtp:model", &volume_info));
938 EXPECT_EQ(VOLUME_TYPE_MTP, volume_info.type);
940 // Non MTP events from storage monitor are ignored.
941 volume_manager()->OnRemovableStorageAttached(non_mtp_info);
942 EXPECT_EQ(1u, observer.events().size());
945 volume_manager()->OnRemovableStorageDetached(info);
946 ASSERT_EQ(2u, observer.events().size());
947 EXPECT_EQ(LoggingObserver::Event::VOLUME_UNMOUNTED,
948 observer.events()[1].type);
950 EXPECT_FALSE(volume_manager()->FindVolumeInfoById("mtp:model", &volume_info));
953 } // namespace file_manager