1 // Copyright (c) 2012 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 "chromeos/disks/mock_disk_mount_manager.h"
6
7 #include <utility>
8
9 #include "base/message_loop/message_loop.h"
10 #include "base/stl_util.h"
11 #include "base/strings/string_util.h"
12
13 using testing::_;
14 using testing::AnyNumber;
15 using testing::Invoke;
16 using testing::ReturnRef;
17
18 namespace chromeos {
19 namespace disks {
20
21 namespace {
22
23 const char* kTestSystemPath = "/this/system/path";
24 const char* kTestSystemPathPrefix = "/this/system";
25 const char* kTestDevicePath = "/this/device/path";
26 const char* kTestMountPath = "/media/foofoo";
27 const char* kTestFilePath = "/this/file/path";
28 const char* kTestDeviceLabel = "A label";
29 const char* kTestDriveLabel = "Another label";
30 const char* kTestVendorId = "0123";
31 const char* kTestVendorName = "A vendor";
32 const char* kTestProductId = "abcd";
33 const char* kTestProductName = "A product";
34 const char* kTestUuid = "FFFF-FFFF";
35
36 } // namespace
37
AddObserverInternal(DiskMountManager::Observer * observer)38 void MockDiskMountManager::AddObserverInternal(
39 DiskMountManager::Observer* observer) {
40 observers_.AddObserver(observer);
41 }
42
RemoveObserverInternal(DiskMountManager::Observer * observer)43 void MockDiskMountManager::RemoveObserverInternal(
44 DiskMountManager::Observer* observer) {
45 observers_.RemoveObserver(observer);
46 }
47
MockDiskMountManager()48 MockDiskMountManager::MockDiskMountManager() {
49 ON_CALL(*this, AddObserver(_))
50 .WillByDefault(Invoke(this, &MockDiskMountManager::AddObserverInternal));
51 ON_CALL(*this, RemoveObserver(_))
52 .WillByDefault(Invoke(this,
53 &MockDiskMountManager::RemoveObserverInternal));
54 ON_CALL(*this, disks())
55 .WillByDefault(Invoke(this, &MockDiskMountManager::disksInternal));
56 ON_CALL(*this, mount_points())
57 .WillByDefault(Invoke(this, &MockDiskMountManager::mountPointsInternal));
58 ON_CALL(*this, FindDiskBySourcePath(_))
59 .WillByDefault(Invoke(
60 this, &MockDiskMountManager::FindDiskBySourcePathInternal));
61 ON_CALL(*this, EnsureMountInfoRefreshed(_))
62 .WillByDefault(Invoke(
63 this, &MockDiskMountManager::EnsureMountInfoRefreshedInternal));
64 }
65
~MockDiskMountManager()66 MockDiskMountManager::~MockDiskMountManager() {
67 STLDeleteContainerPairSecondPointers(disks_.begin(), disks_.end());
68 disks_.clear();
69 }
70
NotifyDeviceInsertEvents()71 void MockDiskMountManager::NotifyDeviceInsertEvents() {
72 scoped_ptr<DiskMountManager::Disk> disk1(new DiskMountManager::Disk(
73 std::string(kTestDevicePath),
74 std::string(),
75 std::string(kTestSystemPath),
76 std::string(kTestFilePath),
77 std::string(),
78 std::string(kTestDriveLabel),
79 std::string(kTestVendorId),
80 std::string(kTestVendorName),
81 std::string(kTestProductId),
82 std::string(kTestProductName),
83 std::string(kTestUuid),
84 std::string(kTestSystemPathPrefix),
85 DEVICE_TYPE_USB,
86 4294967295U,
87 false, // is_parent
88 false, // is_read_only
89 true, // has_media
90 false, // on_boot_device
91 true, // on_removable_device
92 false)); // is_hidden
93
94 disks_.clear();
95 disks_.insert(std::pair<std::string, DiskMountManager::Disk*>(
96 std::string(kTestDevicePath), disk1.get()));
97
98 // Device Added
99 NotifyDeviceChanged(DEVICE_ADDED, kTestSystemPath);
100
101 // Disk Added
102 NotifyDiskChanged(DISK_ADDED, disk1.get());
103
104 // Disk Changed
105 scoped_ptr<DiskMountManager::Disk> disk2(new DiskMountManager::Disk(
106 std::string(kTestDevicePath),
107 std::string(kTestMountPath),
108 std::string(kTestSystemPath),
109 std::string(kTestFilePath),
110 std::string(kTestDeviceLabel),
111 std::string(kTestDriveLabel),
112 std::string(kTestVendorId),
113 std::string(kTestVendorName),
114 std::string(kTestProductId),
115 std::string(kTestProductName),
116 std::string(kTestUuid),
117 std::string(kTestSystemPathPrefix),
118 DEVICE_TYPE_MOBILE,
119 1073741824,
120 false, // is_parent
121 false, // is_read_only
122 true, // has_media
123 false, // on_boot_device
124 true, // on_removable_device
125 false)); // is_hidden
126 disks_.clear();
127 disks_.insert(std::pair<std::string, DiskMountManager::Disk*>(
128 std::string(kTestDevicePath), disk2.get()));
129 NotifyDiskChanged(DISK_CHANGED, disk2.get());
130 }
131
NotifyDeviceRemoveEvents()132 void MockDiskMountManager::NotifyDeviceRemoveEvents() {
133 scoped_ptr<DiskMountManager::Disk> disk(new DiskMountManager::Disk(
134 std::string(kTestDevicePath),
135 std::string(kTestMountPath),
136 std::string(kTestSystemPath),
137 std::string(kTestFilePath),
138 std::string(kTestDeviceLabel),
139 std::string(kTestDriveLabel),
140 std::string(kTestVendorId),
141 std::string(kTestVendorName),
142 std::string(kTestProductId),
143 std::string(kTestProductName),
144 std::string(kTestUuid),
145 std::string(kTestSystemPathPrefix),
146 DEVICE_TYPE_SD,
147 1073741824,
148 false, // is_parent
149 false, // is_read_only
150 true, // has_media
151 false, // on_boot_device
152 true, // on_removable_device
153 false)); // is_hidden
154 disks_.clear();
155 disks_.insert(std::pair<std::string, DiskMountManager::Disk*>(
156 std::string(kTestDevicePath), disk.get()));
157 NotifyDiskChanged(DISK_REMOVED, disk.get());
158 }
159
SetupDefaultReplies()160 void MockDiskMountManager::SetupDefaultReplies() {
161 EXPECT_CALL(*this, AddObserver(_))
162 .Times(AnyNumber());
163 EXPECT_CALL(*this, RemoveObserver(_))
164 .Times(AnyNumber());
165 EXPECT_CALL(*this, disks())
166 .WillRepeatedly(ReturnRef(disks_));
167 EXPECT_CALL(*this, mount_points())
168 .WillRepeatedly(ReturnRef(mount_points_));
169 EXPECT_CALL(*this, FindDiskBySourcePath(_))
170 .Times(AnyNumber());
171 EXPECT_CALL(*this, EnsureMountInfoRefreshed(_))
172 .Times(AnyNumber());
173 EXPECT_CALL(*this, MountPath(_, _, _, _))
174 .Times(AnyNumber());
175 EXPECT_CALL(*this, UnmountPath(_, _, _))
176 .Times(AnyNumber());
177 EXPECT_CALL(*this, FormatMountedDevice(_))
178 .Times(AnyNumber());
179 EXPECT_CALL(*this, UnmountDeviceRecursively(_, _))
180 .Times(AnyNumber());
181 }
182
CreateDiskEntryForMountDevice(const DiskMountManager::MountPointInfo & mount_info,const std::string & device_id,const std::string & device_label,const std::string & vendor_name,const std::string & product_name,DeviceType device_type,uint64 total_size_in_bytes,bool is_parent,bool has_media,bool on_boot_device,bool on_removable_device)183 void MockDiskMountManager::CreateDiskEntryForMountDevice(
184 const DiskMountManager::MountPointInfo& mount_info,
185 const std::string& device_id,
186 const std::string& device_label,
187 const std::string& vendor_name,
188 const std::string& product_name,
189 DeviceType device_type,
190 uint64 total_size_in_bytes,
191 bool is_parent,
192 bool has_media,
193 bool on_boot_device,
194 bool on_removable_device) {
195 Disk* disk = new DiskMountManager::Disk(mount_info.source_path,
196 mount_info.mount_path,
197 std::string(), // system_path
198 mount_info.source_path,
199 device_label,
200 std::string(), // drive_label
201 std::string(), // vendor_id
202 vendor_name,
203 std::string(), // product_id
204 product_name,
205 device_id, // fs_uuid
206 std::string(), // system_path_prefix
207 device_type,
208 total_size_in_bytes,
209 is_parent,
210 false, // is_read_only
211 has_media,
212 on_boot_device,
213 on_removable_device,
214 false); // is_hidden
215 DiskMountManager::DiskMap::iterator it = disks_.find(mount_info.source_path);
216 if (it == disks_.end()) {
217 disks_.insert(std::make_pair(std::string(mount_info.source_path), disk));
218 } else {
219 delete it->second;
220 it->second = disk;
221 }
222 }
223
RemoveDiskEntryForMountDevice(const DiskMountManager::MountPointInfo & mount_info)224 void MockDiskMountManager::RemoveDiskEntryForMountDevice(
225 const DiskMountManager::MountPointInfo& mount_info) {
226 DiskMountManager::DiskMap::iterator it = disks_.find(mount_info.source_path);
227 if (it != disks_.end()) {
228 delete it->second;
229 disks_.erase(it);
230 }
231 }
232
233 const DiskMountManager::MountPointMap&
mountPointsInternal() const234 MockDiskMountManager::mountPointsInternal() const {
235 return mount_points_;
236 }
237
238 const DiskMountManager::Disk*
FindDiskBySourcePathInternal(const std::string & source_path) const239 MockDiskMountManager::FindDiskBySourcePathInternal(
240 const std::string& source_path) const {
241 DiskMap::const_iterator disk_it = disks_.find(source_path);
242 return disk_it == disks_.end() ? NULL : disk_it->second;
243 }
244
EnsureMountInfoRefreshedInternal(const EnsureMountInfoRefreshedCallback & callback)245 void MockDiskMountManager::EnsureMountInfoRefreshedInternal(
246 const EnsureMountInfoRefreshedCallback& callback) {
247 callback.Run(true);
248 }
249
NotifyDiskChanged(DiskEvent event,const DiskMountManager::Disk * disk)250 void MockDiskMountManager::NotifyDiskChanged(
251 DiskEvent event,
252 const DiskMountManager::Disk* disk) {
253 FOR_EACH_OBSERVER(Observer, observers_, OnDiskEvent(event, disk));
254 }
255
NotifyDeviceChanged(DeviceEvent event,const std::string & path)256 void MockDiskMountManager::NotifyDeviceChanged(DeviceEvent event,
257 const std::string& path) {
258 FOR_EACH_OBSERVER(Observer, observers_, OnDeviceEvent(event, path));
259 }
260
261 } // namespace disks
262 } // namespace chromeos
263