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