volume_manager_unittest.cc revision 58537e28ecd584eab876aee8be7156509866d23a
18b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen// Copyright 2013 The Chromium Authors. All rights reserved.
28b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen// Use of this source code is governed by a BSD-style license that can be
38b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen// found in the LICENSE file.
48b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
54ee451de366474b9c228b4e5fa573795a715216dChris Lattner#include "chrome/browser/chromeos/file_manager/volume_manager.h"
64ee451de366474b9c228b4e5fa573795a715216dChris Lattner
78b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen#include <string>
88b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen#include <vector>
98b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
108b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen#include "base/basictypes.h"
118b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen#include "base/prefs/pref_service.h"
128b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen#include "chrome/browser/chromeos/file_manager/fake_disk_mount_manager.h"
138b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen#include "chrome/browser/chromeos/file_manager/volume_manager_observer.h"
148b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen#include "chrome/common/pref_names.h"
158b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen#include "chrome/test/base/testing_profile.h"
168b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen#include "chromeos/dbus/fake_power_manager_client.h"
178b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen#include "chromeos/disks/disk_mount_manager.h"
188b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen#include "content/public/test/test_browser_thread_bundle.h"
198b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen#include "testing/gtest/include/gtest/gtest.h"
20851ba39dab544ad986f150aec9573add9d978397Chris Lattner
218b477ed579794ba6d76915d56b3f448a7dd20120Owen Andersonnamespace file_manager {
2246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksennamespace {
231ae6135fa37eb061499d079b9b33dc82dcc1283fGordon Henriksen
24851ba39dab544ad986f150aec9573add9d978397Chris Lattnerclass LoggingObserver : public VolumeManagerObserver {
252a9c671a51126def8020870103316e6aedc73edfGordon Henriksen public:
26da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen  struct Event {
27e2435da8abe5ca62c7f08f29c242b6b98e0ec7afGordon Henriksen    enum EventType {
288b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      DISK_ADDED,
29da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      DISK_REMOVED,
30ae9f3a3b7c915f725aef5a7250e88eaeddda03c6Anton Korobeynikov      DEVICE_ADDED,
318b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      DEVICE_REMOVED,
328b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      VOLUME_MOUNTED,
338b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      VOLUME_UNMOUNTED,
348b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      FORMAT_STARTED,
35da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen      FORMAT_COMPLETED,
36da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    } type;
37da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
38da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    // Available on DEVICE_ADDED, DEVICE_REMOVED, VOLUME_MOUNTED,
39da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    // VOLUME_UNMOUNTED, FORMAT_STARTED and FORMAT_COMPLETED.
40da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen    std::string device_path;
41da1435f86ebc9886dd7704294e01d192d79e069cGordon Henriksen
428b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson    // Available on DISK_ADDED.
438b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson    bool mounting;
448b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson
458b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson    // Available on VOLUME_MOUNTED and VOLUME_UNMOUNTED.
468b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson    chromeos::MountError mount_error;
478b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson
48c70e62110b7e165ab8f04c38ffd97f905dcda95dOwen Anderson    // Available on VOLUME_MOUNTED.
49c70e62110b7e165ab8f04c38ffd97f905dcda95dOwen Anderson    bool is_remounting;
50c70e62110b7e165ab8f04c38ffd97f905dcda95dOwen Anderson
51c70e62110b7e165ab8f04c38ffd97f905dcda95dOwen Anderson    // Available on FORMAT_STARTED and FORMAT_COMPLETED.
528b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson    bool success;
538b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson  };
548b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson
558b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson  LoggingObserver() {}
568b477ed579794ba6d76915d56b3f448a7dd20120Owen Anderson  virtual ~LoggingObserver() {}
578b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
588b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  const std::vector<Event>& events() const { return events_; }
59c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson
60c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson  // VolumeManagerObserver overrides.
61c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson  virtual void OnDiskAdded(const chromeos::disks::DiskMountManager::Disk& disk,
62c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson                           bool mounting) OVERRIDE {
63c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson    Event event;
64c8897d9c2f9fcee6061a2c2d380028269026a836Owen Anderson    event.type = Event::DISK_ADDED;
6531895e73591d3c9ceae731a1274c8f56194b9616Owen Anderson    event.device_path = disk.device_path();  // Keep only device_path.
668b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    event.mounting = mounting;
678b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    events_.push_back(event);
688b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  }
698b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
708b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  virtual void OnDiskRemoved(
718b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      const chromeos::disks::DiskMountManager::Disk& disk) OVERRIDE {
72a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen    Event event;
73a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen    event.type = Event::DISK_REMOVED;
74a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen    event.device_path = disk.device_path();  // Keep only device_path.
75a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen    events_.push_back(event);
76a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  }
77a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
78a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  virtual void OnDeviceAdded(const std::string& device_path) OVERRIDE {
79a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen    Event event;
80a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen    event.type = Event::DEVICE_ADDED;
81a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen    event.device_path = device_path;
82a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen    events_.push_back(event);
83a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  }
84a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen
85a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  virtual void OnDeviceRemoved(const std::string& device_path) OVERRIDE {
86a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen    Event event;
87a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen    event.type = Event::DEVICE_REMOVED;
88a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen    event.device_path = device_path;
89a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen    events_.push_back(event);
90a353ffa7e556bfd2864474911174da691117f691Gordon Henriksen  }
918b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
928b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  virtual void OnVolumeMounted(chromeos::MountError error_code,
938b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen                               const VolumeInfo& volume_info,
948b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen                               bool is_remounting) OVERRIDE {
9546abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen    Event event;
9646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen    event.type = Event::VOLUME_MOUNTED;
9746abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen    event.device_path = volume_info.source_path.AsUTF8Unsafe();
9846abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen    event.mount_error = error_code;
9946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen    event.is_remounting = is_remounting;
10046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen    events_.push_back(event);
10146abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  }
10246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen
10346abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  virtual void OnVolumeUnmounted(chromeos::MountError error_code,
104e4840bc611f8260065d3879a412ea3b501550995Chris Lattner                                 const VolumeInfo& volume_info) OVERRIDE {
105e4840bc611f8260065d3879a412ea3b501550995Chris Lattner    Event event;
106e4840bc611f8260065d3879a412ea3b501550995Chris Lattner    event.type = Event::VOLUME_UNMOUNTED;
107e4840bc611f8260065d3879a412ea3b501550995Chris Lattner    event.device_path = volume_info.source_path.AsUTF8Unsafe();
108e4840bc611f8260065d3879a412ea3b501550995Chris Lattner    event.mount_error = error_code;
109af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen    events_.push_back(event);
110af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen  }
111af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen
112af59b105bb3f9a31f1812e470eb9db28a8a1b491Gordon Henriksen  virtual void OnFormatStarted(
1138b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      const std::string& device_path, bool success) OVERRIDE {
1148b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    Event event;
1158b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    event.type = Event::FORMAT_STARTED;
1168b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    event.device_path = device_path;
1178b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    event.success = success;
1188b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    events_.push_back(event);
1198b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  }
1208b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
1218b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  virtual void OnFormatCompleted(
1228b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      const std::string& device_path, bool success) OVERRIDE {
1238b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    Event event;
12416c1f44d91211a225497062ea508d58fd25085a9Gordon Henriksen    event.type = Event::FORMAT_COMPLETED;
12516c1f44d91211a225497062ea508d58fd25085a9Gordon Henriksen    event.device_path = device_path;
12616c1f44d91211a225497062ea508d58fd25085a9Gordon Henriksen    event.success = success;
12716c1f44d91211a225497062ea508d58fd25085a9Gordon Henriksen    events_.push_back(event);
12816c1f44d91211a225497062ea508d58fd25085a9Gordon Henriksen  }
1298b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
13081a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen private:
1318b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  std::vector<Event> events_;
1328b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
1338b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  DISALLOW_COPY_AND_ASSIGN(LoggingObserver);
13446abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen};
1358b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
1368b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen}  // namespace
1378b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
1388b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksenclass VolumeManagerTest : public testing::Test {
1398b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen protected:
14016c1f44d91211a225497062ea508d58fd25085a9Gordon Henriksen  VolumeManagerTest() {
14116c1f44d91211a225497062ea508d58fd25085a9Gordon Henriksen  }
14216c1f44d91211a225497062ea508d58fd25085a9Gordon Henriksen  virtual ~VolumeManagerTest() {
14316c1f44d91211a225497062ea508d58fd25085a9Gordon Henriksen  }
14416c1f44d91211a225497062ea508d58fd25085a9Gordon Henriksen
1458b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  virtual void SetUp() OVERRIDE {
1468b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    power_manager_client_.reset(new chromeos::FakePowerManagerClient);
1478b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    disk_mount_manager_.reset(new FakeDiskMountManager);
14881a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen    profile_.reset(new TestingProfile);
14981a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen    volume_manager_.reset(new VolumeManager(profile_.get(),
15081a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen                                            power_manager_client_.get(),
1518b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen                                            disk_mount_manager_.get()));
1528b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  }
1538b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
1548b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  content::TestBrowserThreadBundle thread_bundle_;
1558b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  scoped_ptr<chromeos::FakePowerManagerClient> power_manager_client_;
1568b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  scoped_ptr<FakeDiskMountManager> disk_mount_manager_;
1578b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  scoped_ptr<TestingProfile> profile_;
1588b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  scoped_ptr<VolumeManager> volume_manager_;
1598b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen};
1608b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
1618b94a14a782867b1da1f272b6f502562d0c2a1aaGordon HenriksenTEST_F(VolumeManagerTest, OnDiskEvent_Hidden) {
16246abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LoggingObserver observer;
1638b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->AddObserver(&observer);
1648b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
1658b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  const bool kIsHidden = true;
16646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  const chromeos::disks::DiskMountManager::Disk kDisk(
1678b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      "device1", "", "", "", "", "", "", "", "", "", "", "",
1688b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, kIsHidden);
1698b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
17046abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  volume_manager_->OnDiskEvent(
1718b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      chromeos::disks::DiskMountManager::DISK_ADDED, &kDisk);
1728b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  EXPECT_EQ(0U, observer.events().size());
1738b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
1748b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->OnDiskEvent(
1758b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      chromeos::disks::DiskMountManager::DISK_REMOVED, &kDisk);
1768b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  EXPECT_EQ(0U, observer.events().size());
1778b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
1788b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->OnDiskEvent(
17981a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen      chromeos::disks::DiskMountManager::DISK_CHANGED, &kDisk);
18081a788176ecf158432af2b208b0a85321e5ec74aGordon Henriksen  EXPECT_EQ(0U, observer.events().size());
1818b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
1828b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->RemoveObserver(&observer);
1838b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen}
1848b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
1858b94a14a782867b1da1f272b6f502562d0c2a1aaGordon HenriksenTEST_F(VolumeManagerTest, OnDiskEvent_Added) {
1868b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  // Enable external storage.
1878b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
1888b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
18946abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen  LoggingObserver observer;
1908b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->AddObserver(&observer);
1918b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
1928b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  const chromeos::disks::DiskMountManager::Disk kEmptyDevicePathDisk(
1938b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      "",  // empty device path.
1948b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      "", "", "", "", "", "", "", "", "", "", "",
1958b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false);
1968b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->OnDiskEvent(
1978b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      chromeos::disks::DiskMountManager::DISK_ADDED, &kEmptyDevicePathDisk);
1988b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  EXPECT_EQ(0U, observer.events().size());
1998b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
2008b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  const bool kHasMedia = true;
2018b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  const chromeos::disks::DiskMountManager::Disk kMediaDisk(
2028b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      "device1", "", "", "", "", "", "", "", "", "", "", "",
2038b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, kHasMedia, false, false);
2048b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->OnDiskEvent(
2058b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      chromeos::disks::DiskMountManager::DISK_ADDED, &kMediaDisk);
20657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  ASSERT_EQ(1U, observer.events().size());
2078b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  const LoggingObserver::Event& event = observer.events()[0];
2088b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  EXPECT_EQ(LoggingObserver::Event::DISK_ADDED, event.type);
2098b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  EXPECT_EQ("device1", event.device_path);
21057cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  EXPECT_TRUE(event.mounting);
21157cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
2128b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  ASSERT_EQ(1U, disk_mount_manager_->mount_requests().size());
2138b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  const FakeDiskMountManager::MountRequest& mount_request =
21457cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen      disk_mount_manager_->mount_requests()[0];
2158b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  EXPECT_EQ("device1", mount_request.source_path);
2168b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  EXPECT_EQ("", mount_request.source_format);
2178b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  EXPECT_EQ("", mount_request.mount_label);
2188b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  EXPECT_EQ(chromeos::MOUNT_TYPE_DEVICE, mount_request.type);
2198b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
2208b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->RemoveObserver(&observer);
2218b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen}
2228b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
2238b94a14a782867b1da1f272b6f502562d0c2a1aaGordon HenriksenTEST_F(VolumeManagerTest, OnDiskEvent_AddedNonMounting) {
2248b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  // Enable external storage.
2258b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, false);
22657cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen
22757cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  // Device which is already mounted.
22857cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen  {
22957cebeec7ba08b55f29f5bf98ad0a3a17e9d0c71Gordon Henriksen    LoggingObserver observer;
2308b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    volume_manager_->AddObserver(&observer);
2318b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
2328b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    const bool kHasMedia = true;
2338b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    const chromeos::disks::DiskMountManager::Disk kMountedMediaDisk(
2348b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen        "device1", "mounted", "", "", "", "", "", "", "", "", "", "",
2358b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen        chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false,
23616c1f44d91211a225497062ea508d58fd25085a9Gordon Henriksen        kHasMedia, false, false);
23716c1f44d91211a225497062ea508d58fd25085a9Gordon Henriksen    volume_manager_->OnDiskEvent(
2388b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen        chromeos::disks::DiskMountManager::DISK_ADDED, &kMountedMediaDisk);
23916c1f44d91211a225497062ea508d58fd25085a9Gordon Henriksen    ASSERT_EQ(1U, observer.events().size());
2408b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    const LoggingObserver::Event& event = observer.events()[0];
2418b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    EXPECT_EQ(LoggingObserver::Event::DISK_ADDED, event.type);
2428b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    EXPECT_EQ("device1", event.device_path);
243dc1ce7bdc6e32e7a4c4a110caa32834730183c1bGordon Henriksen    EXPECT_FALSE(event.mounting);
2441cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen
2451cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen    ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
2461cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen
2471cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen    volume_manager_->RemoveObserver(&observer);
2481cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen  }
2491cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen
2501cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen  // Device without media.
2511cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen  {
2521cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen    LoggingObserver observer;
2531cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen    volume_manager_->AddObserver(&observer);
2541cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen
2551cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen    const bool kWithoutMedia = false;
2561cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen    const chromeos::disks::DiskMountManager::Disk kNoMediaDisk(
2571cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen        "device1", "", "", "", "", "", "", "", "", "", "", "",
2581cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen        chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false,
2591cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen        kWithoutMedia, false, false);
2601cf08fddc7413076dedad58dbb8d8d67e69a490fGordon Henriksen    volume_manager_->OnDiskEvent(
2618b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen        chromeos::disks::DiskMountManager::DISK_ADDED, &kNoMediaDisk);
2628b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    ASSERT_EQ(1U, observer.events().size());
2638b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    const LoggingObserver::Event& event = observer.events()[0];
2648b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    EXPECT_EQ(LoggingObserver::Event::DISK_ADDED, event.type);
2658b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    EXPECT_EQ("device1", event.device_path);
26646abf91f7378fb7bb118d66fe6d69b5d3af1e9d5Gordon Henriksen    EXPECT_FALSE(event.mounting);
2678b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
2688b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
2698b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
2708b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    volume_manager_->RemoveObserver(&observer);
2718b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  }
2728b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
2738b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  // External storage is disabled.
2748b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  {
2758b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    profile_->GetPrefs()->SetBoolean(prefs::kExternalStorageDisabled, true);
2768b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
2778b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    LoggingObserver observer;
27888cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen    volume_manager_->AddObserver(&observer);
27988cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen
28088cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen    const bool kHasMedia = true;
28188cc699942f7f972ef9bc3afa1df0a44d059e1d8Gordon Henriksen    const chromeos::disks::DiskMountManager::Disk kMediaDisk(
2822a9c671a51126def8020870103316e6aedc73edfGordon Henriksen        "device1", "", "", "", "", "", "", "", "", "", "", "",
2832a9c671a51126def8020870103316e6aedc73edfGordon Henriksen        chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false,
2842a9c671a51126def8020870103316e6aedc73edfGordon Henriksen        kHasMedia, false, false);
2852a9c671a51126def8020870103316e6aedc73edfGordon Henriksen    volume_manager_->OnDiskEvent(
2862a9c671a51126def8020870103316e6aedc73edfGordon Henriksen        chromeos::disks::DiskMountManager::DISK_ADDED, &kMediaDisk);
2872a9c671a51126def8020870103316e6aedc73edfGordon Henriksen    ASSERT_EQ(1U, observer.events().size());
2882a9c671a51126def8020870103316e6aedc73edfGordon Henriksen    const LoggingObserver::Event& event = observer.events()[0];
2892a9c671a51126def8020870103316e6aedc73edfGordon Henriksen    EXPECT_EQ(LoggingObserver::Event::DISK_ADDED, event.type);
2902a9c671a51126def8020870103316e6aedc73edfGordon Henriksen    EXPECT_EQ("device1", event.device_path);
2912a9c671a51126def8020870103316e6aedc73edfGordon Henriksen    EXPECT_FALSE(event.mounting);
2922a9c671a51126def8020870103316e6aedc73edfGordon Henriksen
2938b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen    ASSERT_EQ(0U, disk_mount_manager_->mount_requests().size());
2948b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
295e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen    volume_manager_->RemoveObserver(&observer);
2968b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  }
2978b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen}
2988b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
299e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenTEST_F(VolumeManagerTest, OnDiskEvent_Removed) {
3008b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  LoggingObserver observer;
3018b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->AddObserver(&observer);
3028b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
3038b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  const chromeos::disks::DiskMountManager::Disk kMountedDisk(
3048b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      "device1", "mount_path", "", "", "", "", "", "", "", "", "", "",
3058b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false);
3068b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->OnDiskEvent(
307344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen      chromeos::disks::DiskMountManager::DISK_REMOVED, &kMountedDisk);
308344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
309344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen  ASSERT_EQ(1U, observer.events().size());
310344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen  const LoggingObserver::Event& event = observer.events()[0];
3118b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  EXPECT_EQ(LoggingObserver::Event::DISK_REMOVED, event.type);
3128b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  EXPECT_EQ("device1", event.device_path);
3138b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
3148b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  ASSERT_EQ(1U, disk_mount_manager_->unmount_requests().size());
3158b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  const FakeDiskMountManager::UnmountRequest& unmount_request =
3168b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      disk_mount_manager_->unmount_requests()[0];
317344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen  EXPECT_EQ("mount_path", unmount_request.mount_path);
318344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen  EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_LAZY, unmount_request.options);
319344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen
320344be5fbecec9908bab611eafeae0549ba3be6d7Gordon Henriksen  volume_manager_->RemoveObserver(&observer);
321e4840bc611f8260065d3879a412ea3b501550995Chris Lattner}
322e4840bc611f8260065d3879a412ea3b501550995Chris Lattner
323e4840bc611f8260065d3879a412ea3b501550995Chris LattnerTEST_F(VolumeManagerTest, OnDiskEvent_RemovedNotMounted) {
324e4840bc611f8260065d3879a412ea3b501550995Chris Lattner  LoggingObserver observer;
3258b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->AddObserver(&observer);
3268b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
327e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  const chromeos::disks::DiskMountManager::Disk kNotMountedDisk(
328e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen      "device1", "", "", "", "", "", "", "", "", "", "", "",
3298b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false);
3308b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->OnDiskEvent(
3318b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      chromeos::disks::DiskMountManager::DISK_REMOVED, &kNotMountedDisk);
332e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen
333e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen  ASSERT_EQ(1U, observer.events().size());
334e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen  const LoggingObserver::Event& event = observer.events()[0];
335e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen  EXPECT_EQ(LoggingObserver::Event::DISK_REMOVED, event.type);
336e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen  EXPECT_EQ("device1", event.device_path);
337e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen
338e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen  ASSERT_EQ(0U, disk_mount_manager_->unmount_requests().size());
339e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen
340e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen  volume_manager_->RemoveObserver(&observer);
341e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen}
342e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen
343e62a8a353c3b21b551c00b9025800d3352e5349eGordon HenriksenTEST_F(VolumeManagerTest, OnDiskEvent_Changed) {
344e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen  // Changed event is just ignored.
345e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen  LoggingObserver observer;
346e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen  volume_manager_->AddObserver(&observer);
347e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
348e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen  const chromeos::disks::DiskMountManager::Disk kDisk(
34923a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen      "device1", "", "", "", "", "", "", "", "", "", "", "",
35023a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen      chromeos::DEVICE_TYPE_UNKNOWN, 0, false, false, false, false, false);
35123a98551ab65eeb8fe5019df8b7db4891582a4bdDale Johannesen  volume_manager_->OnDiskEvent(
352eb9c8e1e3fd81607f8aa71f2b8b1592d6d333337Chris Lattner      chromeos::disks::DiskMountManager::DISK_CHANGED, &kDisk);
353e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen
354e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen  EXPECT_EQ(0U, observer.events().size());
355e62a8a353c3b21b551c00b9025800d3352e5349eGordon Henriksen  EXPECT_EQ(0U, disk_mount_manager_->mount_requests().size());
356eb9c8e1e3fd81607f8aa71f2b8b1592d6d333337Chris Lattner  EXPECT_EQ(0U, disk_mount_manager_->unmount_requests().size());
3578b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
3588b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->RemoveObserver(&observer);
3598b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen}
3608b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
361e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenTEST_F(VolumeManagerTest, OnDeviceEvent_Added) {
362e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  LoggingObserver observer;
3638b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->AddObserver(&observer);
3648b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
3658b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->OnDeviceEvent(
3668b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      chromeos::disks::DiskMountManager::DEVICE_ADDED, "device1");
3678b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
3688b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  ASSERT_EQ(1U, observer.events().size());
369e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  const LoggingObserver::Event& event = observer.events()[0];
370e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  EXPECT_EQ(LoggingObserver::Event::DEVICE_ADDED, event.type);
3718b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  EXPECT_EQ("device1", event.device_path);
3728b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
3738b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->RemoveObserver(&observer);
3748b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen}
3758b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
376e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon HenriksenTEST_F(VolumeManagerTest, OnDeviceEvent_Removed) {
377e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen  LoggingObserver observer;
3788b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->AddObserver(&observer);
3798b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen
3808b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  volume_manager_->OnDeviceEvent(
3818b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen      chromeos::disks::DiskMountManager::DEVICE_REMOVED, "device1");
382e3b989d4a4ba47f77d5d38c35ff17e9673d9f87bGordon Henriksen
3838b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  ASSERT_EQ(1U, observer.events().size());
3848b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  const LoggingObserver::Event& event = observer.events()[0];
3858b94a14a782867b1da1f272b6f502562d0c2a1aaGordon Henriksen  EXPECT_EQ(LoggingObserver::Event::DEVICE_REMOVED, event.type);
3864647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ("device1", event.device_path);
3874647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
3884647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->RemoveObserver(&observer);
389ef854af5bd231ae0c059eb4f07d13352d2a50a9dDuncan Sands}
390ef854af5bd231ae0c059eb4f07d13352d2a50a9dDuncan Sands
391ef854af5bd231ae0c059eb4f07d13352d2a50a9dDuncan SandsTEST_F(VolumeManagerTest, OnDeviceEvent_Scanned) {
392ef854af5bd231ae0c059eb4f07d13352d2a50a9dDuncan Sands  LoggingObserver observer;
3934647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->AddObserver(&observer);
3944647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
3954647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->OnDeviceEvent(
3964647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      chromeos::disks::DiskMountManager::DEVICE_SCANNED, "device1");
3974647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
3984647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  // SCANNED event is just ignored.
3994647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ(0U, observer.events().size());
4004647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4014647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->RemoveObserver(&observer);
4024647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
4034647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4044647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenTEST_F(VolumeManagerTest, OnMountEvent_Mounting) {
4054647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  LoggingObserver observer;
4064647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->AddObserver(&observer);
4074647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4084647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint(
4094647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      "device1",
4104647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      "mount1",
4114647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      chromeos::MOUNT_TYPE_DEVICE,
4124647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      chromeos::disks::MOUNT_CONDITION_NONE);
4134647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4144647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->OnMountEvent(chromeos::disks::DiskMountManager::MOUNTING,
4154647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                chromeos::MOUNT_ERROR_NONE,
4164647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                kMountPoint);
4174647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4184647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  ASSERT_EQ(1U, observer.events().size());
4194647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  const LoggingObserver::Event& event = observer.events()[0];
4204647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, event.type);
4214647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ("device1", event.device_path);
4224647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
4234647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_FALSE(event.is_remounting);
4244647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4254647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->RemoveObserver(&observer);
4264647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
4274647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4284647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenTEST_F(VolumeManagerTest, OnMountEvent_Remounting) {
4294647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  scoped_ptr<chromeos::disks::DiskMountManager::Disk> disk(
4304647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      new chromeos::disks::DiskMountManager::Disk(
4314647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen          "device1", "", "", "", "", "", "", "", "", "", "uuid1", "",
4324647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen          chromeos::DEVICE_TYPE_UNKNOWN, 0,
4334647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen          false, false, false, false, false));
4344647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  disk_mount_manager_->AddDiskForTest(disk.release());
4354647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  disk_mount_manager_->MountPath(
4364647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      "device1", "", "", chromeos::MOUNT_TYPE_DEVICE);
4374647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4384647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  // Emulate system suspend and then resume.
4394647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  {
4404647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen    power_manager_client_->SendSuspendImminent();
4414647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen    power_manager::SuspendState state;
4424647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen    state.set_type(power_manager::SuspendState_Type_SUSPEND_TO_MEMORY);
4434647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen    state.set_wall_time(0);
4444647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen    power_manager_client_->SendSuspendStateChanged(state);
4454647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen    state.set_type(power_manager::SuspendState_Type_RESUME);
4464647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen    power_manager_client_->SendSuspendStateChanged(state);
4474647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4484647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen    // After resume, the device is unmounted and then mounted.
4494647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen    disk_mount_manager_->UnmountPath(
4504647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen        "device1", chromeos::UNMOUNT_OPTIONS_NONE,
4514647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen        chromeos::disks::DiskMountManager::UnmountPathCallback());
4524647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen    disk_mount_manager_->MountPath(
4534647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen        "device1", "", "", chromeos::MOUNT_TYPE_DEVICE);
4544647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  }
4554647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4564647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  LoggingObserver observer;
4574647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->AddObserver(&observer);
4584647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4594647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint(
4604647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      "device1",
4614647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      "mount1",
4624647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      chromeos::MOUNT_TYPE_DEVICE,
4634647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      chromeos::disks::MOUNT_CONDITION_NONE);
4644647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4654647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->OnMountEvent(chromeos::disks::DiskMountManager::MOUNTING,
4664647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                chromeos::MOUNT_ERROR_NONE,
4674647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                kMountPoint);
4684647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4694647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  ASSERT_EQ(1U, observer.events().size());
4704647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  const LoggingObserver::Event& event = observer.events()[0];
4714647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ(LoggingObserver::Event::VOLUME_MOUNTED, event.type);
4724647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ("device1", event.device_path);
4734647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
4744647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_TRUE(event.is_remounting);
4754647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4764647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->RemoveObserver(&observer);
4774647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
4784647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4794647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenTEST_F(VolumeManagerTest, OnMountEvent_Unmounting) {
4804647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  LoggingObserver observer;
4814647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->AddObserver(&observer);
4824647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4834647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  const chromeos::disks::DiskMountManager::MountPointInfo kMountPoint(
4844647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      "device1",
4854647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      "mount1",
4864647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      chromeos::MOUNT_TYPE_DEVICE,
4874647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      chromeos::disks::MOUNT_CONDITION_NONE);
4884647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4894647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->OnMountEvent(chromeos::disks::DiskMountManager::UNMOUNTING,
4904647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                chromeos::MOUNT_ERROR_NONE,
4914647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen                                kMountPoint);
4924647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4934647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  ASSERT_EQ(1U, observer.events().size());
4944647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  const LoggingObserver::Event& event = observer.events()[0];
4954647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ(LoggingObserver::Event::VOLUME_UNMOUNTED, event.type);
4964647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ("device1", event.device_path);
4974647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, event.mount_error);
4984647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
4994647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->RemoveObserver(&observer);
5004647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
5014647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5024647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenTEST_F(VolumeManagerTest, OnFormatEvent_Started) {
5034647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  LoggingObserver observer;
5044647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->AddObserver(&observer);
5054647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5064647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->OnFormatEvent(
5074647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      chromeos::disks::DiskMountManager::FORMAT_STARTED,
5084647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      chromeos::FORMAT_ERROR_NONE,
5094647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      "device1");
5104647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5114647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  ASSERT_EQ(1U, observer.events().size());
5124647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  const LoggingObserver::Event& event = observer.events()[0];
5134647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ(LoggingObserver::Event::FORMAT_STARTED, event.type);
5144647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ("device1", event.device_path);
5154647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_TRUE(event.success);
5164647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5174647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->RemoveObserver(&observer);
5184647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
5194647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5204647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenTEST_F(VolumeManagerTest, OnFormatEvent_StartFailed) {
5214647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  LoggingObserver observer;
5224647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->AddObserver(&observer);
5234647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5244647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->OnFormatEvent(
5254647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      chromeos::disks::DiskMountManager::FORMAT_STARTED,
5264647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      chromeos::FORMAT_ERROR_UNKNOWN,
5274647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      "device1");
5284647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5294647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  ASSERT_EQ(1U, observer.events().size());
5304647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  const LoggingObserver::Event& event = observer.events()[0];
5314647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ(LoggingObserver::Event::FORMAT_STARTED, event.type);
5324647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ("device1", event.device_path);
5334647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_FALSE(event.success);
5344647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5354647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->RemoveObserver(&observer);
5364647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
5374647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5384647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenTEST_F(VolumeManagerTest, OnFormatEvent_Completed) {
5394647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  LoggingObserver observer;
5404647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->AddObserver(&observer);
5414647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5424647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->OnFormatEvent(
5434647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      chromeos::disks::DiskMountManager::FORMAT_COMPLETED,
5444647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      chromeos::FORMAT_ERROR_NONE,
5454647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      "device1");
5464647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5474647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  ASSERT_EQ(1U, observer.events().size());
5484647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  const LoggingObserver::Event& event = observer.events()[0];
5494647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ(LoggingObserver::Event::FORMAT_COMPLETED, event.type);
5504647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ("device1", event.device_path);
5514647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_TRUE(event.success);
5524647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5534647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  // When "format" is successfully done, VolumeManager requests to mount it.
5544647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  ASSERT_EQ(1U, disk_mount_manager_->mount_requests().size());
5554647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  const FakeDiskMountManager::MountRequest& mount_request =
5564647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      disk_mount_manager_->mount_requests()[0];
5574647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ("device1", mount_request.source_path);
5584647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ("", mount_request.source_format);
5594647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ("", mount_request.mount_label);
5604647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ(chromeos::MOUNT_TYPE_DEVICE, mount_request.type);
5614647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5624647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->RemoveObserver(&observer);
5634647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
5644647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5654647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon HenriksenTEST_F(VolumeManagerTest, OnFormatEvent_CompletedFailed) {
5664647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  LoggingObserver observer;
5674647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->AddObserver(&observer);
5684647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5694647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->OnFormatEvent(
5704647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      chromeos::disks::DiskMountManager::FORMAT_COMPLETED,
5714647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      chromeos::FORMAT_ERROR_UNKNOWN,
5724647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen      "device1");
5734647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5744647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  ASSERT_EQ(1U, observer.events().size());
5754647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  const LoggingObserver::Event& event = observer.events()[0];
5764647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ(LoggingObserver::Event::FORMAT_COMPLETED, event.type);
5774647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ("device1", event.device_path);
5784647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_FALSE(event.success);
5794647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5804647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  EXPECT_EQ(0U, disk_mount_manager_->mount_requests().size());
5814647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5824647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen  volume_manager_->RemoveObserver(&observer);
5834647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}
5844647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen
5854647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen}  // namespace file_manager
5864647569fe7706e76135a08ca0e5f90a447ccc5b4Gordon Henriksen