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 "chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h"
13 #include "chrome/browser/chromeos/file_manager/volume_manager_observer.h"
14 #include "chrome/common/pref_names.h"
15 #include "chrome/test/base/testing_profile.h"
16 #include "chromeos/dbus/fake_power_manager_client.h"
17 #include "chromeos/disks/disk_mount_manager.h"
18 #include "content/public/test/test_browser_thread_bundle.h"
19 #include "testing/gtest/include/gtest/gtest.h"
21 namespace file_manager {
24 class LoggingObserver : public VolumeManagerObserver {
38 // Available on DEVICE_ADDED, DEVICE_REMOVED, VOLUME_MOUNTED,
39 // VOLUME_UNMOUNTED, FORMAT_STARTED and FORMAT_COMPLETED.
40 std::string device_path;
42 // Available on DISK_ADDED.
45 // Available on VOLUME_MOUNTED and VOLUME_UNMOUNTED.
46 chromeos::MountError mount_error;
48 // Available on VOLUME_MOUNTED.
51 // Available on FORMAT_STARTED and FORMAT_COMPLETED.
56 virtual ~LoggingObserver() {}
58 const std::vector<Event>& events() const { return events_; }
60 // VolumeManagerObserver overrides.
61 virtual void OnDiskAdded(const chromeos::disks::DiskMountManager::Disk& disk,
62 bool mounting) OVERRIDE {
64 event.type = Event::DISK_ADDED;
65 event.device_path = disk.device_path(); // Keep only device_path.
66 event.mounting = mounting;
67 events_.push_back(event);
70 virtual void OnDiskRemoved(
71 const chromeos::disks::DiskMountManager::Disk& disk) OVERRIDE {
73 event.type = Event::DISK_REMOVED;
74 event.device_path = disk.device_path(); // Keep only device_path.
75 events_.push_back(event);
78 virtual void OnDeviceAdded(const std::string& device_path) OVERRIDE {
80 event.type = Event::DEVICE_ADDED;
81 event.device_path = device_path;
82 events_.push_back(event);
85 virtual void OnDeviceRemoved(const std::string& device_path) OVERRIDE {
87 event.type = Event::DEVICE_REMOVED;
88 event.device_path = device_path;
89 events_.push_back(event);
92 virtual void OnVolumeMounted(chromeos::MountError error_code,
93 const VolumeInfo& volume_info,
94 bool is_remounting) OVERRIDE {
96 event.type = Event::VOLUME_MOUNTED;
97 event.device_path = volume_info.source_path.AsUTF8Unsafe();
98 event.mount_error = error_code;
99 event.is_remounting = is_remounting;
100 events_.push_back(event);
103 virtual void OnVolumeUnmounted(chromeos::MountError error_code,
104 const VolumeInfo& volume_info) OVERRIDE {
106 event.type = Event::VOLUME_UNMOUNTED;
107 event.device_path = volume_info.source_path.AsUTF8Unsafe();
108 event.mount_error = error_code;
109 events_.push_back(event);
112 virtual void OnFormatStarted(
113 const std::string& device_path, bool success) OVERRIDE {
115 event.type = Event::FORMAT_STARTED;
116 event.device_path = device_path;
117 event.success = success;
118 events_.push_back(event);
121 virtual void OnFormatCompleted(
122 const std::string& device_path, bool success) OVERRIDE {
124 event.type = Event::FORMAT_COMPLETED;
125 event.device_path = device_path;
126 event.success = success;
127 events_.push_back(event);
131 std::vector<Event> events_;
133 DISALLOW_COPY_AND_ASSIGN(LoggingObserver);
138 class VolumeManagerTest : public testing::Test {
140 VolumeManagerTest() {
142 virtual ~VolumeManagerTest() {
145 virtual void SetUp() OVERRIDE {
146 power_manager_client_.reset(new chromeos::FakePowerManagerClient);
147 disk_mount_manager_.reset(new FakeDiskMountManager);
148 profile_.reset(new TestingProfile);
149 volume_manager_.reset(new VolumeManager(profile_.get(),
150 NULL, // DriveIntegrationService
151 power_manager_client_.get(),
152 disk_mount_manager_.get()));
155 content::TestBrowserThreadBundle thread_bundle_;
156 scoped_ptr<chromeos::FakePowerManagerClient> power_manager_client_;
157 scoped_ptr<FakeDiskMountManager> disk_mount_manager_;
158 scoped_ptr<TestingProfile> profile_;
159 scoped_ptr<VolumeManager> volume_manager_;
162 TEST_F(VolumeManagerTest, OnDriveFileSystemMountAndUnmount) {
163 LoggingObserver observer;
164 volume_manager_->AddObserver(&observer);
166 volume_manager_->OnFileSystemMounted();
168 ASSERT_EQ(1U, observer.events().size());
169 LoggingObserver::Event event = observer.events()[0];
170 EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, event.type);
171 EXPECT_EQ(drive::util::GetDriveMountPointPath(profile_.get()).AsUTF8Unsafe(),
173 EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
174 EXPECT_FALSE(event.is_remounting);
176 volume_manager_->OnFileSystemBeingUnmounted();
178 ASSERT_EQ(2U, observer.events().size());
179 event = observer.events()[1];
180 EXPECT_EQ(LoggingObserver::Event::VOLUME_UNMOUNTED, event.type);
181 EXPECT_EQ(drive::util::GetDriveMountPointPath(profile_.get()).AsUTF8Unsafe(),
183 EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
185 volume_manager_->RemoveObserver(&observer);
188 TEST_F(VolumeManagerTest, OnDriveFileSystemUnmountWithoutMount) {
189 LoggingObserver observer;
190 volume_manager_->AddObserver(&observer);
191 volume_manager_->OnFileSystemBeingUnmounted();
193 // Unmount event for non-mounted volume is not reported.
194 ASSERT_EQ(0U, observer.events().size());
195 volume_manager_->RemoveObserver(&observer);
198 TEST_F(VolumeManagerTest, OnDiskEvent_Hidden) {
199 LoggingObserver observer;
200 volume_manager_->AddObserver(&observer);
202 const bool kIsHidden = true;
203 const chromeos::disks::DiskMountManager::Disk kDisk(
204 "device1", "", "", "", "", "", "", "", "", "", "", "",
205 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, kIsHidden);
207 volume_manager_->OnDiskEvent(
208 chromeos::disks::DiskMountManager::DISK_ADDED, &kDisk);
209 EXPECT_EQ(0U, observer.events().size());
211 volume_manager_->OnDiskEvent(
212 chromeos::disks::DiskMountManager::DISK_REMOVED, &kDisk);
213 EXPECT_EQ(0U, observer.events().size());
215 volume_manager_->OnDiskEvent(
216 chromeos::disks::DiskMountManager::DISK_CHANGED, &kDisk);
217 EXPECT_EQ(0U, observer.events().size());
219 volume_manager_->RemoveObserver(&observer);
222 TEST_F(VolumeManagerTest, OnDiskEvent_Added) {
223 // Enable external storage.
224 profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
226 LoggingObserver observer;
227 volume_manager_->AddObserver(&observer);
229 const chromeos::disks::DiskMountManager::Disk kEmptyDevicePathDisk(
230 "", // empty device path.
231 "", "", "", "", "", "", "", "", "", "", "",
232 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false);
233 volume_manager_->OnDiskEvent(
234 chromeos::disks::DiskMountManager::DISK_ADDED, &kEmptyDevicePathDisk);
235 EXPECT_EQ(0U, observer.events().size());
237 const bool kHasMedia = true;
238 const chromeos::disks::DiskMountManager::Disk kMediaDisk(
239 "device1", "", "", "", "", "", "", "", "", "", "", "",
240 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, kHasMedia, false, false);
241 volume_manager_->OnDiskEvent(
242 chromeos::disks::DiskMountManager::DISK_ADDED, &kMediaDisk);
243 ASSERT_EQ(1U, observer.events().size());
244 const LoggingObserver::Event& event = observer.events()[0];
245 EXPECT_EQ(LoggingObserver::Event::DISK_ADDED, event.type);
246 EXPECT_EQ("device1", event.device_path);
247 EXPECT_TRUE(event.mounting);
249 ASSERT_EQ(1U, disk_mount_manager_->mount_requests().size());
250 const FakeDiskMountManager::MountRequest& mount_request =
251 disk_mount_manager_->mount_requests()[0];
252 EXPECT_EQ("device1", mount_request.source_path);
253 EXPECT_EQ("", mount_request.source_format);
254 EXPECT_EQ("", mount_request.mount_label);
255 EXPECT_EQ(chromeos::MOUNT_TYPE_DEVICE, mount_request.type);
257 volume_manager_->RemoveObserver(&observer);
260 TEST_F(VolumeManagerTest, OnDiskEvent_AddedNonMounting) {
261 // Enable external storage.
262 profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
264 // Device which is already mounted.
266 LoggingObserver observer;
267 volume_manager_->AddObserver(&observer);
269 const bool kHasMedia = true;
270 const chromeos::disks::DiskMountManager::Disk kMountedMediaDisk(
271 "device1", "mounted", "", "", "", "", "", "", "", "", "", "",
272 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false,
273 kHasMedia, false, false);
274 volume_manager_->OnDiskEvent(
275 chromeos::disks::DiskMountManager::DISK_ADDED, &kMountedMediaDisk);
276 ASSERT_EQ(1U, observer.events().size());
277 const LoggingObserver::Event& event = observer.events()[0];
278 EXPECT_EQ(LoggingObserver::Event::DISK_ADDED, event.type);
279 EXPECT_EQ("device1", event.device_path);
280 EXPECT_FALSE(event.mounting);
282 ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
284 volume_manager_->RemoveObserver(&observer);
287 // Device without media.
289 LoggingObserver observer;
290 volume_manager_->AddObserver(&observer);
292 const bool kWithoutMedia = false;
293 const chromeos::disks::DiskMountManager::Disk kNoMediaDisk(
294 "device1", "", "", "", "", "", "", "", "", "", "", "",
295 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false,
296 kWithoutMedia, false, false);
297 volume_manager_->OnDiskEvent(
298 chromeos::disks::DiskMountManager::DISK_ADDED, &kNoMediaDisk);
299 ASSERT_EQ(1U, observer.events().size());
300 const LoggingObserver::Event& event = observer.events()[0];
301 EXPECT_EQ(LoggingObserver::Event::DISK_ADDED, event.type);
302 EXPECT_EQ("device1", event.device_path);
303 EXPECT_FALSE(event.mounting);
305 ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
307 volume_manager_->RemoveObserver(&observer);
310 // External storage is disabled.
312 profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, true);
314 LoggingObserver observer;
315 volume_manager_->AddObserver(&observer);
317 const bool kHasMedia = true;
318 const chromeos::disks::DiskMountManager::Disk kMediaDisk(
319 "device1", "", "", "", "", "", "", "", "", "", "", "",
320 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false,
321 kHasMedia, false, false);
322 volume_manager_->OnDiskEvent(
323 chromeos::disks::DiskMountManager::DISK_ADDED, &kMediaDisk);
324 ASSERT_EQ(1U, observer.events().size());
325 const LoggingObserver::Event& event = observer.events()[0];
326 EXPECT_EQ(LoggingObserver::Event::DISK_ADDED, event.type);
327 EXPECT_EQ("device1", event.device_path);
328 EXPECT_FALSE(event.mounting);
330 ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
332 volume_manager_->RemoveObserver(&observer);
336 TEST_F(VolumeManagerTest, OnDiskEvent_Removed) {
337 LoggingObserver observer;
338 volume_manager_->AddObserver(&observer);
340 const chromeos::disks::DiskMountManager::Disk kMountedDisk(
341 "device1", "mount_path", "", "", "", "", "", "", "", "", "", "",
342 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false);
343 volume_manager_->OnDiskEvent(
344 chromeos::disks::DiskMountManager::DISK_REMOVED, &kMountedDisk);
346 ASSERT_EQ(1U, observer.events().size());
347 const LoggingObserver::Event& event = observer.events()[0];
348 EXPECT_EQ(LoggingObserver::Event::DISK_REMOVED, event.type);
349 EXPECT_EQ("device1", event.device_path);
351 ASSERT_EQ(1U, disk_mount_manager_->unmount_requests().size());
352 const FakeDiskMountManager::UnmountRequest& unmount_request =
353 disk_mount_manager_->unmount_requests()[0];
354 EXPECT_EQ("mount_path", unmount_request.mount_path);
355 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_LAZY, unmount_request.options);
357 volume_manager_->RemoveObserver(&observer);
360 TEST_F(VolumeManagerTest, OnDiskEvent_RemovedNotMounted) {
361 LoggingObserver observer;
362 volume_manager_->AddObserver(&observer);
364 const chromeos::disks::DiskMountManager::Disk kNotMountedDisk(
365 "device1", "", "", "", "", "", "", "", "", "", "", "",
366 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false);
367 volume_manager_->OnDiskEvent(
368 chromeos::disks::DiskMountManager::DISK_REMOVED, &kNotMountedDisk);
370 ASSERT_EQ(1U, observer.events().size());
371 const LoggingObserver::Event& event = observer.events()[0];
372 EXPECT_EQ(LoggingObserver::Event::DISK_REMOVED, event.type);
373 EXPECT_EQ("device1", event.device_path);
375 ASSERT_EQ(0U, disk_mount_manager_->unmount_requests().size());
377 volume_manager_->RemoveObserver(&observer);
380 TEST_F(VolumeManagerTest, OnDiskEvent_Changed) {
381 // Changed event is just ignored.
382 LoggingObserver observer;
383 volume_manager_->AddObserver(&observer);
385 const chromeos::disks::DiskMountManager::Disk kDisk(
386 "device1", "", "", "", "", "", "", "", "", "", "", "",
387 chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false);
388 volume_manager_->OnDiskEvent(
389 chromeos::disks::DiskMountManager::DISK_CHANGED, &kDisk);
391 EXPECT_EQ(0U, observer.events().size());
392 EXPECT_EQ(0U, disk_mount_manager_->mount_requests().size());
393 EXPECT_EQ(0U, disk_mount_manager_->unmount_requests().size());
395 volume_manager_->RemoveObserver(&observer);
398 TEST_F(VolumeManagerTest, OnDeviceEvent_Added) {
399 LoggingObserver observer;
400 volume_manager_->AddObserver(&observer);
402 volume_manager_->OnDeviceEvent(
403 chromeos::disks::DiskMountManager::DEVICE_ADDED, "device1");
405 ASSERT_EQ(1U, observer.events().size());
406 const LoggingObserver::Event& event = observer.events()[0];
407 EXPECT_EQ(LoggingObserver::Event::DEVICE_ADDED, event.type);
408 EXPECT_EQ("device1", event.device_path);
410 volume_manager_->RemoveObserver(&observer);
413 TEST_F(VolumeManagerTest, OnDeviceEvent_Removed) {
414 LoggingObserver observer;
415 volume_manager_->AddObserver(&observer);
417 volume_manager_->OnDeviceEvent(
418 chromeos::disks::DiskMountManager::DEVICE_REMOVED, "device1");
420 ASSERT_EQ(1U, observer.events().size());
421 const LoggingObserver::Event& event = observer.events()[0];
422 EXPECT_EQ(LoggingObserver::Event::DEVICE_REMOVED, event.type);
423 EXPECT_EQ("device1", event.device_path);
425 volume_manager_->RemoveObserver(&observer);
428 TEST_F(VolumeManagerTest, OnDeviceEvent_Scanned) {
429 LoggingObserver observer;
430 volume_manager_->AddObserver(&observer);
432 volume_manager_->OnDeviceEvent(
433 chromeos::disks::DiskMountManager::DEVICE_SCANNED, "device1");
435 // SCANNED event is just ignored.
436 EXPECT_EQ(0U, observer.events().size());
438 volume_manager_->RemoveObserver(&observer);
441 TEST_F(VolumeManagerTest, OnMountEvent_MountingAndUnmounting) {
442 LoggingObserver observer;
443 volume_manager_->AddObserver(&observer);
445 const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint(
448 chromeos::MOUNT_TYPE_DEVICE,
449 chromeos::disks::MOUNT_CONDITION_NONE);
451 volume_manager_->OnMountEvent(chromeos::disks::DiskMountManager::MOUNTING,
452 chromeos::MOUNT_ERROR_NONE,
455 ASSERT_EQ(1U, observer.events().size());
456 LoggingObserver::Event event = observer.events()[0];
457 EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, event.type);
458 EXPECT_EQ("device1", event.device_path);
459 EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
460 EXPECT_FALSE(event.is_remounting);
462 volume_manager_->OnMountEvent(chromeos::disks::DiskMountManager::UNMOUNTING,
463 chromeos::MOUNT_ERROR_NONE,
466 ASSERT_EQ(2U, observer.events().size());
467 event = observer.events()[1];
468 EXPECT_EQ(LoggingObserver::Event::VOLUME_UNMOUNTED, event.type);
469 EXPECT_EQ("device1", event.device_path);
470 EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
472 volume_manager_->RemoveObserver(&observer);
475 TEST_F(VolumeManagerTest, OnMountEvent_Remounting) {
476 scoped_ptr<chromeos::disks::DiskMountManager::Disk> disk(
477 new chromeos::disks::DiskMountManager::Disk(
478 "device1", "", "", "", "", "", "", "", "", "", "uuid1", "",
479 chromeos::DEVICE_TYPE_UNKNOWN, 0,
480 false, false, false, false, false));
481 disk_mount_manager_->AddDiskForTest(disk.release());
482 disk_mount_manager_->MountPath(
483 "device1", "", "", chromeos::MOUNT_TYPE_DEVICE);
485 // Emulate system suspend and then resume.
487 power_manager_client_->SendSuspendImminent();
488 power_manager::SuspendState state;
489 state.set_type(power_manager::SuspendState_Type_SUSPEND_TO_MEMORY);
490 state.set_wall_time(0);
491 power_manager_client_->SendSuspendStateChanged(state);
492 state.set_type(power_manager::SuspendState_Type_RESUME);
493 power_manager_client_->SendSuspendStateChanged(state);
495 // After resume, the device is unmounted and then mounted.
496 disk_mount_manager_->UnmountPath(
497 "device1", chromeos::UNMOUNT_OPTIONS_NONE,
498 chromeos::disks::DiskMountManager::UnmountPathCallback());
499 disk_mount_manager_->MountPath(
500 "device1", "", "", chromeos::MOUNT_TYPE_DEVICE);
503 LoggingObserver observer;
504 volume_manager_->AddObserver(&observer);
506 const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint(
509 chromeos::MOUNT_TYPE_DEVICE,
510 chromeos::disks::MOUNT_CONDITION_NONE);
512 volume_manager_->OnMountEvent(chromeos::disks::DiskMountManager::MOUNTING,
513 chromeos::MOUNT_ERROR_NONE,
516 ASSERT_EQ(1U, observer.events().size());
517 const LoggingObserver::Event& event = observer.events()[0];
518 EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, event.type);
519 EXPECT_EQ("device1", event.device_path);
520 EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
521 EXPECT_TRUE(event.is_remounting);
523 volume_manager_->RemoveObserver(&observer);
526 TEST_F(VolumeManagerTest, OnMountEvent_UnmountingWithoutMounting) {
527 LoggingObserver observer;
528 volume_manager_->AddObserver(&observer);
530 const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint(
533 chromeos::MOUNT_TYPE_DEVICE,
534 chromeos::disks::MOUNT_CONDITION_NONE);
536 volume_manager_->OnMountEvent(chromeos::disks::DiskMountManager::UNMOUNTING,
537 chromeos::MOUNT_ERROR_NONE,
540 // Unmount event for a disk not mounted in this manager is not reported.
541 ASSERT_EQ(0U, observer.events().size());
543 volume_manager_->RemoveObserver(&observer);
546 TEST_F(VolumeManagerTest, OnFormatEvent_Started) {
547 LoggingObserver observer;
548 volume_manager_->AddObserver(&observer);
550 volume_manager_->OnFormatEvent(
551 chromeos::disks::DiskMountManager::FORMAT_STARTED,
552 chromeos::FORMAT_ERROR_NONE,
555 ASSERT_EQ(1U, observer.events().size());
556 const LoggingObserver::Event& event = observer.events()[0];
557 EXPECT_EQ(LoggingObserver::Event::FORMAT_STARTED, event.type);
558 EXPECT_EQ("device1", event.device_path);
559 EXPECT_TRUE(event.success);
561 volume_manager_->RemoveObserver(&observer);
564 TEST_F(VolumeManagerTest, OnFormatEvent_StartFailed) {
565 LoggingObserver observer;
566 volume_manager_->AddObserver(&observer);
568 volume_manager_->OnFormatEvent(
569 chromeos::disks::DiskMountManager::FORMAT_STARTED,
570 chromeos::FORMAT_ERROR_UNKNOWN,
573 ASSERT_EQ(1U, observer.events().size());
574 const LoggingObserver::Event& event = observer.events()[0];
575 EXPECT_EQ(LoggingObserver::Event::FORMAT_STARTED, event.type);
576 EXPECT_EQ("device1", event.device_path);
577 EXPECT_FALSE(event.success);
579 volume_manager_->RemoveObserver(&observer);
582 TEST_F(VolumeManagerTest, OnFormatEvent_Completed) {
583 LoggingObserver observer;
584 volume_manager_->AddObserver(&observer);
586 volume_manager_->OnFormatEvent(
587 chromeos::disks::DiskMountManager::FORMAT_COMPLETED,
588 chromeos::FORMAT_ERROR_NONE,
591 ASSERT_EQ(1U, observer.events().size());
592 const LoggingObserver::Event& event = observer.events()[0];
593 EXPECT_EQ(LoggingObserver::Event::FORMAT_COMPLETED, event.type);
594 EXPECT_EQ("device1", event.device_path);
595 EXPECT_TRUE(event.success);
597 // When "format" is successfully done, VolumeManager requests to mount it.
598 ASSERT_EQ(1U, disk_mount_manager_->mount_requests().size());
599 const FakeDiskMountManager::MountRequest& mount_request =
600 disk_mount_manager_->mount_requests()[0];
601 EXPECT_EQ("device1", mount_request.source_path);
602 EXPECT_EQ("", mount_request.source_format);
603 EXPECT_EQ("", mount_request.mount_label);
604 EXPECT_EQ(chromeos::MOUNT_TYPE_DEVICE, mount_request.type);
606 volume_manager_->RemoveObserver(&observer);
609 TEST_F(VolumeManagerTest, OnFormatEvent_CompletedFailed) {
610 LoggingObserver observer;
611 volume_manager_->AddObserver(&observer);
613 volume_manager_->OnFormatEvent(
614 chromeos::disks::DiskMountManager::FORMAT_COMPLETED,
615 chromeos::FORMAT_ERROR_UNKNOWN,
618 ASSERT_EQ(1U, observer.events().size());
619 const LoggingObserver::Event& event = observer.events()[0];
620 EXPECT_EQ(LoggingObserver::Event::FORMAT_COMPLETED, event.type);
621 EXPECT_EQ("device1", event.device_path);
622 EXPECT_FALSE(event.success);
624 EXPECT_EQ(0U, disk_mount_manager_->mount_requests().size());
626 volume_manager_->RemoveObserver(&observer);
629 TEST_F(VolumeManagerTest, OnExternalStorageDisabledChanged) {
630 // Here create two mount points.
631 disk_mount_manager_->MountPath(
632 "mount1", "", "", chromeos::MOUNT_TYPE_DEVICE);
633 disk_mount_manager_->MountPath(
634 "mount2", "", "", chromeos::MOUNT_TYPE_DEVICE);
636 // Initially, there are two mount points.
637 ASSERT_EQ(2U, disk_mount_manager_->mount_points().size());
638 ASSERT_EQ(0U, disk_mount_manager_->unmount_requests().size());
640 // Emulate to set kExternalStorageDisabled to false.
641 profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
642 volume_manager_->OnExternalStorageDisabledChanged();
644 // Expect no effects.
645 EXPECT_EQ(2U, disk_mount_manager_->mount_points().size());
646 EXPECT_EQ(0U, disk_mount_manager_->unmount_requests().size());
648 // Emulate to set kExternalStorageDisabled to true.
649 profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, true);
650 volume_manager_->OnExternalStorageDisabledChanged();
652 // The all mount points should be unmounted.
653 EXPECT_EQ(0U, disk_mount_manager_->mount_points().size());
655 EXPECT_EQ(2U, disk_mount_manager_->unmount_requests().size());
656 const FakeDiskMountManager::UnmountRequest& unmount_request1 =
657 disk_mount_manager_->unmount_requests()[0];
658 EXPECT_EQ("mount1", unmount_request1.mount_path);
660 const FakeDiskMountManager::UnmountRequest& unmount_request2 =
661 disk_mount_manager_->unmount_requests()[1];
662 EXPECT_EQ("mount2", unmount_request2.mount_path);
665 TEST_F(VolumeManagerTest, GetVolumeInfoList) {
666 volume_manager_->Initialize(); // Adds "Downloads"
667 std::vector<VolumeInfo> info_list = volume_manager_->GetVolumeInfoList();
668 ASSERT_EQ(1u, info_list.size());
669 EXPECT_EQ("downloads:Downloads", info_list[0].volume_id);
670 EXPECT_EQ(VOLUME_TYPE_DOWNLOADS_DIRECTORY, info_list[0].type);
673 TEST_F(VolumeManagerTest, FindVolumeInfoById) {
674 volume_manager_->Initialize(); // Adds "Downloads"
675 VolumeInfo volume_info;
676 ASSERT_FALSE(volume_manager_->FindVolumeInfoById(
677 "nonexistent", &volume_info));
678 ASSERT_TRUE(volume_manager_->FindVolumeInfoById(
679 "downloads:Downloads", &volume_info));
680 EXPECT_EQ("downloads:Downloads", volume_info.volume_id);
681 EXPECT_EQ(VOLUME_TYPE_DOWNLOADS_DIRECTORY, volume_info.type);
684 TEST_F(VolumeManagerTest, ArchiveSourceFiltering) {
685 LoggingObserver observer;
686 volume_manager_->AddObserver(&observer);
688 // Mount a USB stick.
689 volume_manager_->OnMountEvent(
690 chromeos::disks::DiskMountManager::MOUNTING,
691 chromeos::MOUNT_ERROR_NONE,
692 chromeos::disks::DiskMountManager::MountPointInfo(
695 chromeos::MOUNT_TYPE_DEVICE,
696 chromeos::disks::MOUNT_CONDITION_NONE));
698 // Mount a zip archive in the stick.
699 volume_manager_->OnMountEvent(
700 chromeos::disks::DiskMountManager::MOUNTING,
701 chromeos::MOUNT_ERROR_NONE,
702 chromeos::disks::DiskMountManager::MountPointInfo(
703 "/removable/usb/1.zip",
705 chromeos::MOUNT_TYPE_ARCHIVE,
706 chromeos::disks::MOUNT_CONDITION_NONE));
707 VolumeInfo volume_info;
708 ASSERT_TRUE(volume_manager_->FindVolumeInfoById("archive:1", &volume_info));
709 EXPECT_EQ("/archive/1", volume_info.mount_path.AsUTF8Unsafe());
710 EXPECT_EQ(2u, observer.events().size());
712 // Mount a zip archive in the previous zip archive.
713 volume_manager_->OnMountEvent(
714 chromeos::disks::DiskMountManager::MOUNTING,
715 chromeos::MOUNT_ERROR_NONE,
716 chromeos::disks::DiskMountManager::MountPointInfo(
719 chromeos::MOUNT_TYPE_ARCHIVE,
720 chromeos::disks::MOUNT_CONDITION_NONE));
721 ASSERT_TRUE(volume_manager_->FindVolumeInfoById("archive:2", &volume_info));
722 EXPECT_EQ("/archive/2", volume_info.mount_path.AsUTF8Unsafe());
723 EXPECT_EQ(3u, observer.events().size());
725 // A zip file is mounted from other profile. It must be ignored in the current
727 volume_manager_->OnMountEvent(
728 chromeos::disks::DiskMountManager::MOUNTING,
729 chromeos::MOUNT_ERROR_NONE,
730 chromeos::disks::DiskMountManager::MountPointInfo(
731 "/other/profile/drive/folder/3.zip",
733 chromeos::MOUNT_TYPE_ARCHIVE,
734 chromeos::disks::MOUNT_CONDITION_NONE));
735 EXPECT_FALSE(volume_manager_->FindVolumeInfoById("archive:3", &volume_info));
736 EXPECT_EQ(3u, observer.events().size());
739 } // namespace file_manager