volume_manager_unittest.cc revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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 <string>
8#include <vector>
9
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"
20
21namespace file_manager {
22namespace {
23
24class LoggingObserver : public VolumeManagerObserver {
25 public:
26  struct Event {
27    enum EventType {
28      DISK_ADDED,
29      DISK_REMOVED,
30      DEVICE_ADDED,
31      DEVICE_REMOVED,
32      VOLUME_MOUNTED,
33      VOLUME_UNMOUNTED,
34      FORMAT_STARTED,
35      FORMAT_COMPLETED,
36    } type;
37
38    // Available on DEVICE_ADDED, DEVICE_REMOVED, VOLUME_MOUNTED,
39    // VOLUME_UNMOUNTED, FORMAT_STARTED and FORMAT_COMPLETED.
40    std::string device_path;
41
42    // Available on DISK_ADDED.
43    bool mounting;
44
45    // Available on VOLUME_MOUNTED and VOLUME_UNMOUNTED.
46    chromeos::MountError mount_error;
47
48    // Available on VOLUME_MOUNTED.
49    bool is_remounting;
50
51    // Available on FORMAT_STARTED and FORMAT_COMPLETED.
52    bool success;
53  };
54
55  LoggingObserver() {}
56  virtual ~LoggingObserver() {}
57
58  const std::vector<Event>& events() const { return events_; }
59
60  // VolumeManagerObserver overrides.
61  virtual void OnDiskAdded(const chromeos::disks::DiskMountManager::Disk& disk,
62                           bool mounting) OVERRIDE {
63    Event event;
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);
68  }
69
70  virtual void OnDiskRemoved(
71      const chromeos::disks::DiskMountManager::Disk& disk) OVERRIDE {
72    Event event;
73    event.type = Event::DISK_REMOVED;
74    event.device_path = disk.device_path();  // Keep only device_path.
75    events_.push_back(event);
76  }
77
78  virtual void OnDeviceAdded(const std::string& device_path) OVERRIDE {
79    Event event;
80    event.type = Event::DEVICE_ADDED;
81    event.device_path = device_path;
82    events_.push_back(event);
83  }
84
85  virtual void OnDeviceRemoved(const std::string& device_path) OVERRIDE {
86    Event event;
87    event.type = Event::DEVICE_REMOVED;
88    event.device_path = device_path;
89    events_.push_back(event);
90  }
91
92  virtual void OnVolumeMounted(chromeos::MountError error_code,
93                               const VolumeInfo& volume_info,
94                               bool is_remounting) OVERRIDE {
95    Event event;
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);
101  }
102
103  virtual void OnVolumeUnmounted(chromeos::MountError error_code,
104                                 const VolumeInfo& volume_info) OVERRIDE {
105    Event event;
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);
110  }
111
112  virtual void OnFormatStarted(
113      const std::string& device_path, bool success) OVERRIDE {
114    Event event;
115    event.type = Event::FORMAT_STARTED;
116    event.device_path = device_path;
117    event.success = success;
118    events_.push_back(event);
119  }
120
121  virtual void OnFormatCompleted(
122      const std::string& device_path, bool success) OVERRIDE {
123    Event event;
124    event.type = Event::FORMAT_COMPLETED;
125    event.device_path = device_path;
126    event.success = success;
127    events_.push_back(event);
128  }
129
130 private:
131  std::vector<Event> events_;
132
133  DISALLOW_COPY_AND_ASSIGN(LoggingObserver);
134};
135
136}  // namespace
137
138class VolumeManagerTest : public testing::Test {
139 protected:
140  VolumeManagerTest() {
141  }
142  virtual ~VolumeManagerTest() {
143  }
144
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()));
153  }
154
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_;
160};
161
162TEST_F(VolumeManagerTest, OnDriveFileSystemMountAndUnmount) {
163  LoggingObserver observer;
164  volume_manager_->AddObserver(&observer);
165
166  volume_manager_->OnFileSystemMounted();
167
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(),
172            event.device_path);
173  EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
174  EXPECT_FALSE(event.is_remounting);
175
176  volume_manager_->OnFileSystemBeingUnmounted();
177
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(),
182            event.device_path);
183  EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
184
185  volume_manager_->RemoveObserver(&observer);
186}
187
188TEST_F(VolumeManagerTest, OnDriveFileSystemUnmountWithoutMount) {
189  LoggingObserver observer;
190  volume_manager_->AddObserver(&observer);
191  volume_manager_->OnFileSystemBeingUnmounted();
192
193  // Unmount event for non-mounted volume is not reported.
194  ASSERT_EQ(0U, observer.events().size());
195  volume_manager_->RemoveObserver(&observer);
196}
197
198TEST_F(VolumeManagerTest, OnDiskEvent_Hidden) {
199  LoggingObserver observer;
200  volume_manager_->AddObserver(&observer);
201
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);
206
207  volume_manager_->OnDiskEvent(
208      chromeos::disks::DiskMountManager::DISK_ADDED, &kDisk);
209  EXPECT_EQ(0U, observer.events().size());
210
211  volume_manager_->OnDiskEvent(
212      chromeos::disks::DiskMountManager::DISK_REMOVED, &kDisk);
213  EXPECT_EQ(0U, observer.events().size());
214
215  volume_manager_->OnDiskEvent(
216      chromeos::disks::DiskMountManager::DISK_CHANGED, &kDisk);
217  EXPECT_EQ(0U, observer.events().size());
218
219  volume_manager_->RemoveObserver(&observer);
220}
221
222TEST_F(VolumeManagerTest, OnDiskEvent_Added) {
223  // Enable external storage.
224  profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
225
226  LoggingObserver observer;
227  volume_manager_->AddObserver(&observer);
228
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());
236
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);
248
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);
256
257  volume_manager_->RemoveObserver(&observer);
258}
259
260TEST_F(VolumeManagerTest, OnDiskEvent_AddedNonMounting) {
261  // Enable external storage.
262  profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
263
264  // Device which is already mounted.
265  {
266    LoggingObserver observer;
267    volume_manager_->AddObserver(&observer);
268
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);
281
282    ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
283
284    volume_manager_->RemoveObserver(&observer);
285  }
286
287  // Device without media.
288  {
289    LoggingObserver observer;
290    volume_manager_->AddObserver(&observer);
291
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);
304
305    ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
306
307    volume_manager_->RemoveObserver(&observer);
308  }
309
310  // External storage is disabled.
311  {
312    profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, true);
313
314    LoggingObserver observer;
315    volume_manager_->AddObserver(&observer);
316
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);
329
330    ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
331
332    volume_manager_->RemoveObserver(&observer);
333  }
334}
335
336TEST_F(VolumeManagerTest, OnDiskEvent_Removed) {
337  LoggingObserver observer;
338  volume_manager_->AddObserver(&observer);
339
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);
345
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);
350
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);
356
357  volume_manager_->RemoveObserver(&observer);
358}
359
360TEST_F(VolumeManagerTest, OnDiskEvent_RemovedNotMounted) {
361  LoggingObserver observer;
362  volume_manager_->AddObserver(&observer);
363
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);
369
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);
374
375  ASSERT_EQ(0U, disk_mount_manager_->unmount_requests().size());
376
377  volume_manager_->RemoveObserver(&observer);
378}
379
380TEST_F(VolumeManagerTest, OnDiskEvent_Changed) {
381  // Changed event should cause mounting (if possible).
382  LoggingObserver observer;
383  volume_manager_->AddObserver(&observer);
384
385  const chromeos::disks::DiskMountManager::Disk kDisk(
386      "device1", "", "", "", "", "", "", "", "", "", "", "",
387      chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, true, false, false);
388  volume_manager_->OnDiskEvent(
389      chromeos::disks::DiskMountManager::DISK_CHANGED, &kDisk);
390
391  EXPECT_EQ(1U, observer.events().size());
392  EXPECT_EQ(1U, disk_mount_manager_->mount_requests().size());
393  EXPECT_EQ(0U, disk_mount_manager_->unmount_requests().size());
394
395  volume_manager_->RemoveObserver(&observer);
396}
397
398TEST_F(VolumeManagerTest, OnDeviceEvent_Added) {
399  LoggingObserver observer;
400  volume_manager_->AddObserver(&observer);
401
402  volume_manager_->OnDeviceEvent(
403      chromeos::disks::DiskMountManager::DEVICE_ADDED, "device1");
404
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);
409
410  volume_manager_->RemoveObserver(&observer);
411}
412
413TEST_F(VolumeManagerTest, OnDeviceEvent_Removed) {
414  LoggingObserver observer;
415  volume_manager_->AddObserver(&observer);
416
417  volume_manager_->OnDeviceEvent(
418      chromeos::disks::DiskMountManager::DEVICE_REMOVED, "device1");
419
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);
424
425  volume_manager_->RemoveObserver(&observer);
426}
427
428TEST_F(VolumeManagerTest, OnDeviceEvent_Scanned) {
429  LoggingObserver observer;
430  volume_manager_->AddObserver(&observer);
431
432  volume_manager_->OnDeviceEvent(
433      chromeos::disks::DiskMountManager::DEVICE_SCANNED, "device1");
434
435  // SCANNED event is just ignored.
436  EXPECT_EQ(0U, observer.events().size());
437
438  volume_manager_->RemoveObserver(&observer);
439}
440
441TEST_F(VolumeManagerTest, OnMountEvent_MountingAndUnmounting) {
442  LoggingObserver observer;
443  volume_manager_->AddObserver(&observer);
444
445  const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint(
446      "device1",
447      "mount1",
448      chromeos::MOUNT_TYPE_DEVICE,
449      chromeos::disks::MOUNT_CONDITION_NONE);
450
451  volume_manager_->OnMountEvent(chromeos::disks::DiskMountManager::MOUNTING,
452                                chromeos::MOUNT_ERROR_NONE,
453                                kMountPoint);
454
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);
461
462  volume_manager_->OnMountEvent(chromeos::disks::DiskMountManager::UNMOUNTING,
463                                chromeos::MOUNT_ERROR_NONE,
464                                kMountPoint);
465
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);
471
472  volume_manager_->RemoveObserver(&observer);
473}
474
475TEST_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);
484
485  // Emulate system suspend and then resume.
486  {
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);
494
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);
501  }
502
503  LoggingObserver observer;
504  volume_manager_->AddObserver(&observer);
505
506  const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint(
507      "device1",
508      "mount1",
509      chromeos::MOUNT_TYPE_DEVICE,
510      chromeos::disks::MOUNT_CONDITION_NONE);
511
512  volume_manager_->OnMountEvent(chromeos::disks::DiskMountManager::MOUNTING,
513                                chromeos::MOUNT_ERROR_NONE,
514                                kMountPoint);
515
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);
522
523  volume_manager_->RemoveObserver(&observer);
524}
525
526TEST_F(VolumeManagerTest, OnMountEvent_UnmountingWithoutMounting) {
527  LoggingObserver observer;
528  volume_manager_->AddObserver(&observer);
529
530  const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint(
531      "device1",
532      "mount1",
533      chromeos::MOUNT_TYPE_DEVICE,
534      chromeos::disks::MOUNT_CONDITION_NONE);
535
536  volume_manager_->OnMountEvent(chromeos::disks::DiskMountManager::UNMOUNTING,
537                                chromeos::MOUNT_ERROR_NONE,
538                                kMountPoint);
539
540  // Unmount event for a disk not mounted in this manager is not reported.
541  ASSERT_EQ(0U, observer.events().size());
542
543  volume_manager_->RemoveObserver(&observer);
544}
545
546TEST_F(VolumeManagerTest, OnFormatEvent_Started) {
547  LoggingObserver observer;
548  volume_manager_->AddObserver(&observer);
549
550  volume_manager_->OnFormatEvent(
551      chromeos::disks::DiskMountManager::FORMAT_STARTED,
552      chromeos::FORMAT_ERROR_NONE,
553      "device1");
554
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);
560
561  volume_manager_->RemoveObserver(&observer);
562}
563
564TEST_F(VolumeManagerTest, OnFormatEvent_StartFailed) {
565  LoggingObserver observer;
566  volume_manager_->AddObserver(&observer);
567
568  volume_manager_->OnFormatEvent(
569      chromeos::disks::DiskMountManager::FORMAT_STARTED,
570      chromeos::FORMAT_ERROR_UNKNOWN,
571      "device1");
572
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);
578
579  volume_manager_->RemoveObserver(&observer);
580}
581
582TEST_F(VolumeManagerTest, OnFormatEvent_Completed) {
583  LoggingObserver observer;
584  volume_manager_->AddObserver(&observer);
585
586  volume_manager_->OnFormatEvent(
587      chromeos::disks::DiskMountManager::FORMAT_COMPLETED,
588      chromeos::FORMAT_ERROR_NONE,
589      "device1");
590
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);
596
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);
605
606  volume_manager_->RemoveObserver(&observer);
607}
608
609TEST_F(VolumeManagerTest, OnFormatEvent_CompletedFailed) {
610  LoggingObserver observer;
611  volume_manager_->AddObserver(&observer);
612
613  volume_manager_->OnFormatEvent(
614      chromeos::disks::DiskMountManager::FORMAT_COMPLETED,
615      chromeos::FORMAT_ERROR_UNKNOWN,
616      "device1");
617
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);
623
624  EXPECT_EQ(0U, disk_mount_manager_->mount_requests().size());
625
626  volume_manager_->RemoveObserver(&observer);
627}
628
629TEST_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);
635
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());
639
640  // Emulate to set kExternalStorageDisabled to false.
641  profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
642  volume_manager_->OnExternalStorageDisabledChanged();
643
644  // Expect no effects.
645  EXPECT_EQ(2U, disk_mount_manager_->mount_points().size());
646  EXPECT_EQ(0U, disk_mount_manager_->unmount_requests().size());
647
648  // Emulate to set kExternalStorageDisabled to true.
649  profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, true);
650  volume_manager_->OnExternalStorageDisabledChanged();
651
652  // The all mount points should be unmounted.
653  EXPECT_EQ(0U, disk_mount_manager_->mount_points().size());
654
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);
659
660  const FakeDiskMountManager::UnmountRequest& unmount_request2 =
661      disk_mount_manager_->unmount_requests()[1];
662  EXPECT_EQ("mount2", unmount_request2.mount_path);
663}
664
665TEST_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);
671}
672
673TEST_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);
682}
683
684TEST_F(VolumeManagerTest, ArchiveSourceFiltering) {
685  LoggingObserver observer;
686  volume_manager_->AddObserver(&observer);
687
688  // Mount a USB stick.
689  volume_manager_->OnMountEvent(
690      chromeos::disks::DiskMountManager::MOUNTING,
691      chromeos::MOUNT_ERROR_NONE,
692      chromeos::disks::DiskMountManager::MountPointInfo(
693          "/removable/usb",
694          "/removable/usb",
695          chromeos::MOUNT_TYPE_DEVICE,
696          chromeos::disks::MOUNT_CONDITION_NONE));
697
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",
704          "/archive/1",
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());
711
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(
717          "/archive/1/2.zip",
718          "/archive/2",
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());
724
725  // A zip file is mounted from other profile. It must be ignored in the current
726  // VolumeManager.
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",
732          "/archive/3",
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());
737}
738
739}  // namespace file_manager
740