OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <stddef.h> | 5 #include <stddef.h> |
6 #include <stdint.h> | 6 #include <stdint.h> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/memory/ptr_util.h" | |
10 #include "base/message_loop/message_loop.h" | 9 #include "base/message_loop/message_loop.h" |
11 #include "base/strings/stringprintf.h" | |
12 #include "chromeos/dbus/dbus_thread_manager.h" | 10 #include "chromeos/dbus/dbus_thread_manager.h" |
13 #include "chromeos/dbus/fake_cros_disks_client.h" | 11 #include "chromeos/dbus/fake_cros_disks_client.h" |
14 #include "chromeos/disks/disk_mount_manager.h" | 12 #include "chromeos/disks/disk_mount_manager.h" |
| 13 #include "testing/gmock/include/gmock/gmock.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
16 | 15 |
17 using base::MakeUnique; | |
18 using base::StringPrintf; | |
19 using chromeos::disks::DiskMountManager; | 16 using chromeos::disks::DiskMountManager; |
20 using chromeos::CrosDisksClient; | 17 using chromeos::CrosDisksClient; |
21 using chromeos::DBusThreadManager; | 18 using chromeos::DBusThreadManager; |
22 using chromeos::FakeCrosDisksClient; | 19 using chromeos::FakeCrosDisksClient; |
23 using chromeos::MountType; | 20 using testing::_; |
24 using chromeos::disks::MountCondition; | 21 using testing::Field; |
| 22 using testing::InSequence; |
| 23 using testing::InvokeWithoutArgs; |
25 | 24 |
26 namespace { | 25 namespace { |
27 | 26 |
28 const char kReadOnlyMountpath[] = "/device/read_only_mount_path"; | 27 const char kReadOnlyMountpath[] = "/device/read_only_mount_path"; |
29 const char kReadOnlyDeviceSource[] = "/device/read_only_source_path"; | 28 const char kReadOnlyDeviceSource[] = "/device/read_only_source_path"; |
30 | 29 |
31 // Holds information needed to create a DiskMountManager::Disk instance. | 30 // Holds information needed to create a DiskMountManager::Disk instance. |
32 struct TestDiskInfo { | 31 struct TestDiskInfo { |
33 const char* source_path; | 32 const char* source_path; |
34 const char* mount_path; | 33 const char* mount_path; |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
145 chromeos::disks::MOUNT_CONDITION_NONE | 144 chromeos::disks::MOUNT_CONDITION_NONE |
146 }, | 145 }, |
147 { | 146 { |
148 kReadOnlyDeviceSource, | 147 kReadOnlyDeviceSource, |
149 kReadOnlyMountpath, | 148 kReadOnlyMountpath, |
150 chromeos::MOUNT_TYPE_DEVICE, | 149 chromeos::MOUNT_TYPE_DEVICE, |
151 chromeos::disks::MOUNT_CONDITION_NONE | 150 chromeos::disks::MOUNT_CONDITION_NONE |
152 }, | 151 }, |
153 }; | 152 }; |
154 | 153 |
155 // Represents which function in |DiskMountManager::Observer| was invoked. | 154 // Mocks DiskMountManager observer. |
156 enum ObserverEventType { | 155 class MockDiskMountManagerObserver : public DiskMountManager::Observer { |
157 DEVICE_EVENT, // OnDeviceEvent() | 156 public: |
158 DISK_EVENT, // OnDiskEvent() | 157 virtual ~MockDiskMountManagerObserver() {} |
159 FORMAT_EVENT, // OnFormatEvent() | 158 |
160 MOUNT_EVENT // OnMountEvent() | 159 MOCK_METHOD2(OnDiskEvent, void(DiskMountManager::DiskEvent event, |
| 160 const DiskMountManager::Disk* disk)); |
| 161 MOCK_METHOD2(OnDeviceEvent, void(DiskMountManager::DeviceEvent event, |
| 162 const std::string& device_path)); |
| 163 MOCK_METHOD3(OnMountEvent, |
| 164 void(DiskMountManager::MountEvent event, |
| 165 chromeos::MountError error_code, |
| 166 const DiskMountManager::MountPointInfo& mount_point)); |
| 167 MOCK_METHOD3(OnFormatEvent, |
| 168 void(DiskMountManager::FormatEvent event, |
| 169 chromeos::FormatError error_code, |
| 170 const std::string& device_path)); |
161 }; | 171 }; |
162 | 172 |
163 // Represents every event notified to |DiskMountManager::Observer|. | 173 // Expect |is_read_only| value of a disk object keyed by |source_path|. |
164 struct ObserverEvent { | 174 void ExpectDiskReadOnly(const DiskMountManager* manager, |
165 public: | 175 const std::string& source_path, |
166 virtual ObserverEventType type() const = 0; | 176 bool expected) { |
167 }; | 177 EXPECT_EQ(expected, |
168 | 178 manager->disks().find(source_path)->second->is_read_only()); |
169 // Represents an invocation of |DiskMountManager::Observer::OnDeviceEvent()|. | |
170 struct DeviceEvent : public ObserverEvent { | |
171 DiskMountManager::DeviceEvent event; | |
172 std::string device_path; | |
173 | |
174 DeviceEvent() {} | |
175 | |
176 DeviceEvent(DiskMountManager::DeviceEvent event, | |
177 const std::string& device_path) | |
178 : event(event), device_path(device_path) {} | |
179 | |
180 ObserverEventType type() const override { return DEVICE_EVENT; } | |
181 | |
182 bool operator==(const DeviceEvent& other) const { | |
183 return event == other.event && device_path == other.device_path; | |
184 } | |
185 | |
186 std::string DebugString() const { | |
187 return StringPrintf("OnDeviceEvent(%d, %s)", event, device_path.c_str()); | |
188 } | |
189 }; | |
190 | |
191 // Represents an invocation of |DiskMountManager::Observer::OnDiskEvent()|. | |
192 struct DiskEvent : public ObserverEvent { | |
193 DiskMountManager::DiskEvent event; | |
194 std::unique_ptr<DiskMountManager::Disk> disk; | |
195 | |
196 DiskEvent(DiskMountManager::DiskEvent event, | |
197 const DiskMountManager::Disk& disk) | |
198 : event(event), | |
199 disk(std::unique_ptr<DiskMountManager::Disk>( | |
200 new DiskMountManager::Disk(disk))) {} | |
201 | |
202 DiskEvent(DiskEvent&& other) | |
203 : event(other.event), disk(std::move(other.disk)) {} | |
204 | |
205 ObserverEventType type() const override { return DISK_EVENT; } | |
206 | |
207 bool operator==(const DiskEvent& other) const { | |
208 return event == other.event && disk == other.disk; | |
209 } | |
210 | |
211 std::string DebugString() const { | |
212 return StringPrintf("OnDiskEvent(event=%d, device_path=%s, mount_path=%s", | |
213 event, disk->device_path().c_str(), | |
214 disk->mount_path().c_str()); | |
215 } | |
216 }; | |
217 | |
218 // Represents an invocation of |DiskMountManager::Observer::OnFormatEvent()|. | |
219 struct FormatEvent : public ObserverEvent { | |
220 DiskMountManager::FormatEvent event; | |
221 chromeos::FormatError error_code; | |
222 std::string device_path; | |
223 | |
224 FormatEvent() {} | |
225 FormatEvent(DiskMountManager::FormatEvent event, | |
226 chromeos::FormatError error_code, | |
227 const std::string& device_path) | |
228 : event(event), error_code(error_code), device_path(device_path) {} | |
229 | |
230 ObserverEventType type() const override { return FORMAT_EVENT; } | |
231 | |
232 bool operator==(const FormatEvent& other) const { | |
233 return event == other.event && error_code == other.error_code && | |
234 device_path == other.device_path; | |
235 } | |
236 | |
237 std::string DebugString() const { | |
238 return StringPrintf("OnFormatEvent(%d, %d, %s)", event, error_code, | |
239 device_path.c_str()); | |
240 } | |
241 }; | |
242 | |
243 // Represents an invocation of |DiskMountManager::Observer::OnMountEvent()|. | |
244 struct MountEvent : public ObserverEvent { | |
245 DiskMountManager::MountEvent event; | |
246 chromeos::MountError error_code; | |
247 DiskMountManager::MountPointInfo mount_point; | |
248 | |
249 // Not passed to callback, but read by handlers. So it's captured upon | |
250 // callback. | |
251 std::unique_ptr<DiskMountManager::Disk> disk; | |
252 | |
253 MountEvent(MountEvent&& other) | |
254 : event(other.event), | |
255 error_code(other.error_code), | |
256 mount_point(other.mount_point), | |
257 disk(std::move(other.disk)) {} | |
258 MountEvent(DiskMountManager::MountEvent event, | |
259 chromeos::MountError error_code, | |
260 const DiskMountManager::MountPointInfo& mount_point, | |
261 const DiskMountManager::Disk& disk) | |
262 : event(event), | |
263 error_code(error_code), | |
264 mount_point(mount_point), | |
265 disk(new DiskMountManager::Disk(disk)) {} | |
266 | |
267 ObserverEventType type() const override { return MOUNT_EVENT; } | |
268 | |
269 bool operator==(const MountEvent& other) const; | |
270 | |
271 std::string DebugString() const { | |
272 return StringPrintf("OnMountEvent(%d, %d, %s, %s, %d, %d)", event, | |
273 error_code, mount_point.source_path.c_str(), | |
274 mount_point.mount_path.c_str(), mount_point.mount_type, | |
275 mount_point.mount_condition); | |
276 } | |
277 }; | |
278 | |
279 // A mock |Observer| class which records all invocation of the methods invoked | |
280 // from DiskMountManager and all the arguments passed to them. | |
281 class MockDiskMountManagerObserver : public DiskMountManager::Observer { | |
282 public: | |
283 MockDiskMountManagerObserver(const DiskMountManager* manager) | |
284 : manager_(manager) {} | |
285 ~MockDiskMountManagerObserver() override {} | |
286 | |
287 // Mock notify methods. | |
288 void OnDeviceEvent(DiskMountManager::DeviceEvent event, | |
289 const std::string& device_path) override { | |
290 events_.push_back(MakeUnique<DeviceEvent>(event, device_path)); | |
291 } | |
292 | |
293 void OnDiskEvent(DiskMountManager::DiskEvent event, | |
294 const DiskMountManager::Disk* disk) override { | |
295 // Take a snapshot (copy) of the Disk object at the time of invocation for | |
296 // later verification. | |
297 events_.push_back(MakeUnique<DiskEvent>(event, *disk)); | |
298 } | |
299 | |
300 void OnFormatEvent(DiskMountManager::FormatEvent event, | |
301 chromeos::FormatError error_code, | |
302 const std::string& device_path) override { | |
303 events_.push_back(MakeUnique<FormatEvent>(event, error_code, device_path)); | |
304 } | |
305 | |
306 void OnMountEvent( | |
307 DiskMountManager::MountEvent event, | |
308 chromeos::MountError error_code, | |
309 const DiskMountManager::MountPointInfo& mount_point) override { | |
310 // Take a snapshot (copy) of a Disk object at the time of invocation. | |
311 // It can be verified later besides the arguments. | |
312 events_.push_back(MakeUnique<MountEvent>( | |
313 event, error_code, mount_point, | |
314 *manager_->disks().find(mount_point.source_path)->second)); | |
315 } | |
316 | |
317 // Gets invocation history to be verified by testcases. | |
318 // Verifies if the |index|th invocation is OnDeviceEvent() and returns | |
319 // details. | |
320 const DeviceEvent& GetDeviceEvent(size_t index) { | |
321 DCHECK_GT(events_.size(), index); | |
322 DCHECK_EQ(DEVICE_EVENT, events_[index]->type()); | |
323 return static_cast<const DeviceEvent&>(*events_[index]); | |
324 } | |
325 | |
326 // Verifies if the |index|th invocation is OnDiskEvent() and returns details. | |
327 const DiskEvent& GetDiskEvent(size_t index) { | |
328 DCHECK_GT(events_.size(), index); | |
329 DCHECK_EQ(DISK_EVENT, events_[index]->type()); | |
330 return static_cast<const DiskEvent&>(*events_[index]); | |
331 } | |
332 | |
333 // Verifies if the |index|th invocation is OnFormatEvent() and returns | |
334 // details. | |
335 const FormatEvent& GetFormatEvent(size_t index) { | |
336 DCHECK_GT(events_.size(), index); | |
337 DCHECK_EQ(FORMAT_EVENT, events_[index]->type()); | |
338 return static_cast<const FormatEvent&>(*events_[index]); | |
339 } | |
340 | |
341 // Verifies if the |index|th invocation is OnMountEvent() and returns details. | |
342 const MountEvent& GetMountEvent(size_t index) { | |
343 DCHECK_GT(events_.size(), index); | |
344 DCHECK_EQ(MOUNT_EVENT, events_[index]->type()); | |
345 return static_cast<const MountEvent&>(*events_[index]); | |
346 } | |
347 | |
348 // Returns number of callback invocations happened so far. | |
349 size_t GetEventCount() { return events_.size(); } | |
350 | |
351 // Counts the number of |MountEvent| recorded so far that matches the given | |
352 // condition. | |
353 size_t CountMountEvents(DiskMountManager::MountEvent mount_event_type, | |
354 chromeos::MountError error_code, | |
355 const std::string& mount_path) { | |
356 size_t num_matched = 0; | |
357 for (const auto& it : events_) { | |
358 if (it->type() != MOUNT_EVENT) | |
359 continue; | |
360 const MountEvent& mount_event = static_cast<const MountEvent&>(*it); | |
361 if (mount_event.event == mount_event_type && | |
362 mount_event.error_code == error_code && | |
363 mount_event.mount_point.mount_path == mount_path) | |
364 num_matched++; | |
365 } | |
366 return num_matched; | |
367 } | |
368 | |
369 // Counts the number of |FormatEvent| recorded so far that matches with | |
370 // |format_event|. | |
371 size_t CountFormatEvents(const FormatEvent& exptected_format_event) { | |
372 size_t num_matched = 0; | |
373 for (const auto& it : events_) { | |
374 if (it->type() != FORMAT_EVENT) | |
375 continue; | |
376 if (static_cast<const FormatEvent&>(*it) == exptected_format_event) | |
377 num_matched++; | |
378 } | |
379 return num_matched; | |
380 } | |
381 | |
382 private: | |
383 // Pointer to the manager object to which this |Observer| is registered. | |
384 const DiskMountManager* manager_; | |
385 | |
386 // Records all invocations. | |
387 std::vector<std::unique_ptr<ObserverEvent>> events_; | |
388 }; | |
389 | |
390 // Shift operators of ostream. | |
391 // Needed to print values in case of EXPECT_* failure in gtest. | |
392 std::ostream& operator<<(std::ostream& stream, | |
393 const DeviceEvent& device_event) { | |
394 return stream << device_event.DebugString(); | |
395 } | |
396 | |
397 std::ostream& operator<<(std::ostream& stream, const DiskEvent& disk_event) { | |
398 return stream << disk_event.DebugString(); | |
399 } | |
400 | |
401 std::ostream& operator<<(std::ostream& stream, | |
402 const FormatEvent& format_event) { | |
403 return stream << format_event.DebugString(); | |
404 } | |
405 | |
406 std::ostream& operator<<(std::ostream& stream, const MountEvent& mount_event) { | |
407 return stream << mount_event.DebugString(); | |
408 } | 179 } |
409 | 180 |
410 class DiskMountManagerTest : public testing::Test { | 181 class DiskMountManagerTest : public testing::Test { |
411 public: | 182 public: |
412 DiskMountManagerTest() : observer_(NULL) {} | 183 DiskMountManagerTest() {} |
413 ~DiskMountManagerTest() override {} | 184 ~DiskMountManagerTest() override {} |
414 | 185 |
415 // Sets up test dbus tread manager and disks mount manager. | 186 // Sets up test dbus tread manager and disks mount manager. |
416 // Initializes disk mount manager disks and mount points. | 187 // Initializes disk mount manager disks and mount points. |
417 // Adds a test observer to the disk mount manager. | 188 // Adds a test observer to the disk mount manager. |
418 void SetUp() override { | 189 void SetUp() override { |
419 fake_cros_disks_client_ = new FakeCrosDisksClient; | 190 fake_cros_disks_client_ = new FakeCrosDisksClient; |
420 DBusThreadManager::GetSetterForTesting()->SetCrosDisksClient( | 191 DBusThreadManager::GetSetterForTesting()->SetCrosDisksClient( |
421 std::unique_ptr<CrosDisksClient>(fake_cros_disks_client_)); | 192 std::unique_ptr<CrosDisksClient>(fake_cros_disks_client_)); |
422 | 193 |
423 DiskMountManager::Initialize(); | 194 DiskMountManager::Initialize(); |
424 | 195 |
425 InitDisksAndMountPoints(); | 196 InitDisksAndMountPoints(); |
426 | 197 |
427 observer_ = | 198 DiskMountManager::GetInstance()->AddObserver(&observer_); |
428 new MockDiskMountManagerObserver(DiskMountManager::GetInstance()); | |
429 DiskMountManager::GetInstance()->AddObserver(observer_); | |
430 } | 199 } |
431 | 200 |
432 // Shuts down dbus thread manager and disk moutn manager used in the test. | 201 // Shuts down dbus thread manager and disk moutn manager used in the test. |
433 void TearDown() override { | 202 void TearDown() override { |
434 DiskMountManager::GetInstance()->RemoveObserver(observer_); | 203 DiskMountManager::GetInstance()->RemoveObserver(&observer_); |
435 DiskMountManager::Shutdown(); | 204 DiskMountManager::Shutdown(); |
436 DBusThreadManager::Shutdown(); | 205 DBusThreadManager::Shutdown(); |
437 } | 206 } |
438 | 207 |
439 protected: | 208 protected: |
440 // Checks if disk mount manager contains a mount point with specified moutn | 209 // Checks if disk mount manager contains a mount point with specified moutn |
441 // path. | 210 // path. |
442 bool HasMountPoint(const std::string& mount_path) { | 211 bool HasMountPoint(const std::string& mount_path) { |
443 const DiskMountManager::MountPointMap& mount_points = | 212 const DiskMountManager::MountPointMap& mount_points = |
444 DiskMountManager::GetInstance()->mount_points(); | 213 DiskMountManager::GetInstance()->mount_points(); |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 // expected that the corresponding disk is already added). | 257 // expected that the corresponding disk is already added). |
489 for (size_t i = 0; i < arraysize(kTestDisks); i++) | 258 for (size_t i = 0; i < arraysize(kTestDisks); i++) |
490 AddTestDisk(kTestDisks[i]); | 259 AddTestDisk(kTestDisks[i]); |
491 | 260 |
492 for (size_t i = 0; i < arraysize(kTestMountPoints); i++) | 261 for (size_t i = 0; i < arraysize(kTestMountPoints); i++) |
493 AddTestMountPoint(kTestMountPoints[i]); | 262 AddTestMountPoint(kTestMountPoints[i]); |
494 } | 263 } |
495 | 264 |
496 protected: | 265 protected: |
497 chromeos::FakeCrosDisksClient* fake_cros_disks_client_; | 266 chromeos::FakeCrosDisksClient* fake_cros_disks_client_; |
498 MockDiskMountManagerObserver* observer_; | 267 MockDiskMountManagerObserver observer_; |
499 base::MessageLoopForUI message_loop_; | 268 base::MessageLoopForUI message_loop_; |
500 }; | 269 }; |
501 | 270 |
502 // Tests that the observer gets notified on attempt to format non existent mount | 271 // Tests that the observer gets notified on attempt to format non existent mount |
503 // point. | 272 // point. |
504 TEST_F(DiskMountManagerTest, Format_NotMounted) { | 273 TEST_F(DiskMountManagerTest, Format_NotMounted) { |
| 274 EXPECT_CALL(observer_, OnFormatEvent(DiskMountManager::FORMAT_COMPLETED, |
| 275 chromeos::FORMAT_ERROR_UNKNOWN, |
| 276 "/mount/non_existent")) |
| 277 .Times(1); |
505 DiskMountManager::GetInstance()->FormatMountedDevice("/mount/non_existent"); | 278 DiskMountManager::GetInstance()->FormatMountedDevice("/mount/non_existent"); |
506 ASSERT_EQ(1U, observer_->GetEventCount()); | |
507 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_COMPLETED, | |
508 chromeos::FORMAT_ERROR_UNKNOWN, "/mount/non_existent"), | |
509 observer_->GetFormatEvent(0)); | |
510 } | 279 } |
511 | 280 |
512 // Tests that the observer gets notified on attempt to format read-only mount | 281 // Tests that the observer gets notified on attempt to format read-only mount |
513 // point. | 282 // point. |
514 TEST_F(DiskMountManagerTest, Format_ReadOnly) { | 283 TEST_F(DiskMountManagerTest, Format_ReadOnly) { |
| 284 EXPECT_CALL(observer_, |
| 285 OnFormatEvent(DiskMountManager::FORMAT_COMPLETED, |
| 286 chromeos::FORMAT_ERROR_DEVICE_NOT_ALLOWED, |
| 287 kReadOnlyMountpath)) |
| 288 .Times(1); |
515 DiskMountManager::GetInstance()->FormatMountedDevice(kReadOnlyMountpath); | 289 DiskMountManager::GetInstance()->FormatMountedDevice(kReadOnlyMountpath); |
516 ASSERT_EQ(1U, observer_->GetEventCount()); | |
517 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_COMPLETED, | |
518 chromeos::FORMAT_ERROR_DEVICE_NOT_ALLOWED, | |
519 kReadOnlyMountpath), | |
520 observer_->GetFormatEvent(0)); | |
521 } | 290 } |
522 | 291 |
523 // Tests that it is not possible to format archive mount point. | 292 // Tests that it is not possible to format archive mount point. |
524 TEST_F(DiskMountManagerTest, Format_Archive) { | 293 TEST_F(DiskMountManagerTest, Format_Archive) { |
| 294 EXPECT_CALL(observer_, OnFormatEvent(DiskMountManager::FORMAT_COMPLETED, |
| 295 chromeos::FORMAT_ERROR_UNKNOWN, |
| 296 "/archive/source_path")) |
| 297 .Times(1); |
| 298 |
525 DiskMountManager::GetInstance()->FormatMountedDevice("/archive/mount_path"); | 299 DiskMountManager::GetInstance()->FormatMountedDevice("/archive/mount_path"); |
526 ASSERT_EQ(1U, observer_->GetEventCount()); | |
527 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_COMPLETED, | |
528 chromeos::FORMAT_ERROR_UNKNOWN, "/archive/source_path"), | |
529 observer_->GetFormatEvent(0)); | |
530 } | 300 } |
531 | 301 |
532 // Tests that format fails if the device cannot be unmounted. | 302 // Tests that format fails if the device cannot be unmounted. |
533 TEST_F(DiskMountManagerTest, Format_FailToUnmount) { | 303 TEST_F(DiskMountManagerTest, Format_FailToUnmount) { |
534 // Before formatting mounted device, the device should be unmounted. | 304 // Before formatting mounted device, the device should be unmounted. |
535 // In this test unmount will fail, and there should be no attempt to | 305 // In this test unmount will fail, and there should be no attempt to |
536 // format the device. | 306 // format the device. |
537 | 307 |
| 308 // Set up expectations for observer mock. |
| 309 // Observer should be notified that unmount attempt fails and format task |
| 310 // failed to start. |
| 311 { |
| 312 InSequence s; |
| 313 |
| 314 EXPECT_CALL(observer_, |
| 315 OnMountEvent(DiskMountManager::UNMOUNTING, |
| 316 chromeos::MOUNT_ERROR_INTERNAL, |
| 317 Field(&DiskMountManager::MountPointInfo::mount_path, |
| 318 "/device/mount_path"))) |
| 319 .Times(1); |
| 320 |
| 321 EXPECT_CALL(observer_, OnFormatEvent(DiskMountManager::FORMAT_COMPLETED, |
| 322 chromeos::FORMAT_ERROR_UNKNOWN, |
| 323 "/device/source_path")) |
| 324 .Times(1); |
| 325 } |
| 326 |
538 fake_cros_disks_client_->MakeUnmountFail(); | 327 fake_cros_disks_client_->MakeUnmountFail(); |
539 // Start test. | 328 // Start test. |
540 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); | 329 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); |
541 | 330 |
542 // Cros disks will respond asynchronoulsy, so let's drain the message loop. | 331 // Cros disks will respond asynchronoulsy, so let's drain the message loop. |
543 message_loop_.RunUntilIdle(); | 332 message_loop_.RunUntilIdle(); |
544 | 333 |
545 // Observer should be notified that unmount attempt fails and format task | |
546 // failed to start. | |
547 ASSERT_EQ(2U, observer_->GetEventCount()); | |
548 const MountEvent& mount_event = observer_->GetMountEvent(0); | |
549 EXPECT_EQ(DiskMountManager::UNMOUNTING, mount_event.event); | |
550 EXPECT_EQ(chromeos::MOUNT_ERROR_INTERNAL, mount_event.error_code); | |
551 EXPECT_EQ("/device/mount_path", mount_event.mount_point.mount_path); | |
552 | |
553 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_COMPLETED, | |
554 chromeos::FORMAT_ERROR_UNKNOWN, "/device/source_path"), | |
555 observer_->GetFormatEvent(1)); | |
556 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count()); | 334 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count()); |
557 EXPECT_EQ("/device/mount_path", | 335 EXPECT_EQ("/device/mount_path", |
558 fake_cros_disks_client_->last_unmount_device_path()); | 336 fake_cros_disks_client_->last_unmount_device_path()); |
559 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, | 337 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, |
560 fake_cros_disks_client_->last_unmount_options()); | 338 fake_cros_disks_client_->last_unmount_options()); |
561 EXPECT_EQ(0, fake_cros_disks_client_->format_call_count()); | 339 EXPECT_EQ(0, fake_cros_disks_client_->format_call_count()); |
562 | 340 |
563 // The device mount should still be here. | 341 // The device mount should still be here. |
564 EXPECT_TRUE(HasMountPoint("/device/mount_path")); | 342 EXPECT_TRUE(HasMountPoint("/device/mount_path")); |
565 } | 343 } |
566 | 344 |
567 // Tests that observer is notified when cros disks fails to start format | 345 // Tests that observer is notified when cros disks fails to start format |
568 // process. | 346 // process. |
569 TEST_F(DiskMountManagerTest, Format_FormatFailsToStart) { | 347 TEST_F(DiskMountManagerTest, Format_FormatFailsToStart) { |
570 // Before formatting mounted device, the device should be unmounted. | 348 // Before formatting mounted device, the device should be unmounted. |
571 // In this test, unmount will succeed, but call to Format method will | 349 // In this test, unmount will succeed, but call to Format method will |
572 // fail. | 350 // fail. |
573 | 351 |
| 352 // Set up expectations for observer mock. |
| 353 // Observer should be notified that the device was unmounted and format task |
| 354 // failed to start. |
| 355 { |
| 356 InSequence s; |
| 357 |
| 358 EXPECT_CALL(observer_, |
| 359 OnMountEvent(DiskMountManager::UNMOUNTING, |
| 360 chromeos::MOUNT_ERROR_NONE, |
| 361 Field(&DiskMountManager::MountPointInfo::mount_path, |
| 362 "/device/mount_path"))) |
| 363 .Times(1); |
| 364 |
| 365 EXPECT_CALL(observer_, OnFormatEvent(DiskMountManager::FORMAT_COMPLETED, |
| 366 chromeos::FORMAT_ERROR_UNKNOWN, |
| 367 "/device/source_path")) |
| 368 .Times(1); |
| 369 } |
| 370 |
574 fake_cros_disks_client_->MakeFormatFail(); | 371 fake_cros_disks_client_->MakeFormatFail(); |
575 // Start the test. | 372 // Start the test. |
576 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); | 373 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); |
577 | 374 |
578 // Cros disks will respond asynchronoulsy, so let's drain the message loop. | 375 // Cros disks will respond asynchronoulsy, so let's drain the message loop. |
579 message_loop_.RunUntilIdle(); | 376 message_loop_.RunUntilIdle(); |
580 | 377 |
581 // Observer should be notified that the device was unmounted and format task | |
582 // failed to start. | |
583 ASSERT_EQ(2U, observer_->GetEventCount()); | |
584 const MountEvent& mount_event = observer_->GetMountEvent(0); | |
585 EXPECT_EQ(DiskMountManager::UNMOUNTING, mount_event.event); | |
586 EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, mount_event.error_code); | |
587 EXPECT_EQ("/device/mount_path", mount_event.mount_point.mount_path); | |
588 | |
589 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_COMPLETED, | |
590 chromeos::FORMAT_ERROR_UNKNOWN, "/device/source_path"), | |
591 observer_->GetFormatEvent(1)); | |
592 | |
593 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count()); | 378 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count()); |
594 EXPECT_EQ("/device/mount_path", | 379 EXPECT_EQ("/device/mount_path", |
595 fake_cros_disks_client_->last_unmount_device_path()); | 380 fake_cros_disks_client_->last_unmount_device_path()); |
596 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, | 381 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, |
597 fake_cros_disks_client_->last_unmount_options()); | 382 fake_cros_disks_client_->last_unmount_options()); |
598 EXPECT_EQ(1, fake_cros_disks_client_->format_call_count()); | 383 EXPECT_EQ(1, fake_cros_disks_client_->format_call_count()); |
599 EXPECT_EQ("/device/source_path", | 384 EXPECT_EQ("/device/source_path", |
600 fake_cros_disks_client_->last_format_device_path()); | 385 fake_cros_disks_client_->last_format_device_path()); |
601 EXPECT_EQ("vfat", fake_cros_disks_client_->last_format_filesystem()); | 386 EXPECT_EQ("vfat", fake_cros_disks_client_->last_format_filesystem()); |
602 | 387 |
603 // The device mount should be gone. | 388 // The device mount should be gone. |
604 EXPECT_FALSE(HasMountPoint("/device/mount_path")); | 389 EXPECT_FALSE(HasMountPoint("/device/mount_path")); |
605 } | 390 } |
606 | 391 |
607 // Tests the case where there are two format requests for the same device. | 392 // Tests the case where there are two format requests for the same device. |
608 TEST_F(DiskMountManagerTest, Format_ConcurrentFormatCalls) { | 393 TEST_F(DiskMountManagerTest, Format_ConcurrentFormatCalls) { |
609 // Only the first format request should be processed (the second unmount | 394 // Only the first format request should be processed (the second unmount |
610 // request fails because the device is already unmounted at that point). | 395 // request fails because the device is already unmounted at that point). |
611 // CrosDisksClient will report that the format process for the first request | 396 // CrosDisksClient will report that the format process for the first request |
612 // is successfully started. | 397 // is successfully started. |
613 | 398 |
614 fake_cros_disks_client_->set_unmount_listener( | 399 // Set up expectations for observer mock. |
615 base::Bind(&FakeCrosDisksClient::MakeUnmountFail, | |
616 base::Unretained(fake_cros_disks_client_))); | |
617 // Start the test. | |
618 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); | |
619 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); | |
620 | |
621 // Cros disks will respond asynchronoulsy, so let's drain the message loop. | |
622 message_loop_.RunUntilIdle(); | |
623 | |
624 // The observer should get a FORMAT_STARTED event for one format request and a | 400 // The observer should get a FORMAT_STARTED event for one format request and a |
625 // FORMAT_COMPLETED with an error code for the other format request. The | 401 // FORMAT_COMPLETED with an error code for the other format request. The |
626 // formatting will be started only for the first request. | 402 // formatting will be started only for the first request. |
627 // There should be only one UNMOUNTING event. The result of the second one | 403 // There should be only one UNMOUNTING event. The result of the second one |
628 // should not be reported as the mount point will go away after the first | 404 // should not be reported as the mount point will go away after the first |
629 // request. | 405 // request. |
630 // | 406 // |
631 // Note that in this test the format completion signal will not be simulated, | 407 // Note that in this test the format completion signal will not be simulated, |
632 // so the observer should not get FORMAT_COMPLETED signal. | 408 // so the observer should not get FORMAT_COMPLETED signal. |
| 409 { |
| 410 InSequence s; |
633 | 411 |
634 ASSERT_EQ(3U, observer_->GetEventCount()); | 412 EXPECT_CALL(observer_, |
635 const MountEvent& mount_event = observer_->GetMountEvent(0); | 413 OnMountEvent(DiskMountManager::UNMOUNTING, |
636 EXPECT_EQ(DiskMountManager::UNMOUNTING, mount_event.event); | 414 chromeos::MOUNT_ERROR_NONE, |
637 EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, mount_event.error_code); | 415 Field(&DiskMountManager::MountPointInfo::mount_path, |
638 EXPECT_EQ("/device/mount_path", mount_event.mount_point.mount_path); | 416 "/device/mount_path"))) |
639 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_COMPLETED, | 417 .Times(1); |
640 chromeos::FORMAT_ERROR_UNKNOWN, "/device/source_path"), | 418 |
641 observer_->GetFormatEvent(1)); | 419 EXPECT_CALL(observer_, OnFormatEvent(DiskMountManager::FORMAT_COMPLETED, |
642 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_STARTED, | 420 chromeos::FORMAT_ERROR_UNKNOWN, |
643 chromeos::FORMAT_ERROR_NONE, "/device/source_path"), | 421 "/device/source_path")) |
644 observer_->GetFormatEvent(2)); | 422 .Times(1); |
| 423 |
| 424 EXPECT_CALL(observer_, OnFormatEvent(DiskMountManager::FORMAT_STARTED, |
| 425 chromeos::FORMAT_ERROR_NONE, |
| 426 "/device/source_path")) |
| 427 .Times(1); |
| 428 } |
| 429 |
| 430 fake_cros_disks_client_->set_unmount_listener( |
| 431 base::Bind(&FakeCrosDisksClient::MakeUnmountFail, |
| 432 base::Unretained(fake_cros_disks_client_))); |
| 433 // Start the test. |
| 434 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); |
| 435 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); |
| 436 |
| 437 // Cros disks will respond asynchronoulsy, so let's drain the message loop. |
| 438 message_loop_.RunUntilIdle(); |
645 | 439 |
646 EXPECT_EQ(2, fake_cros_disks_client_->unmount_call_count()); | 440 EXPECT_EQ(2, fake_cros_disks_client_->unmount_call_count()); |
647 EXPECT_EQ("/device/mount_path", | 441 EXPECT_EQ("/device/mount_path", |
648 fake_cros_disks_client_->last_unmount_device_path()); | 442 fake_cros_disks_client_->last_unmount_device_path()); |
649 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, | 443 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, |
650 fake_cros_disks_client_->last_unmount_options()); | 444 fake_cros_disks_client_->last_unmount_options()); |
651 EXPECT_EQ(1, fake_cros_disks_client_->format_call_count()); | 445 EXPECT_EQ(1, fake_cros_disks_client_->format_call_count()); |
652 EXPECT_EQ("/device/source_path", | 446 EXPECT_EQ("/device/source_path", |
653 fake_cros_disks_client_->last_format_device_path()); | 447 fake_cros_disks_client_->last_format_device_path()); |
654 EXPECT_EQ("vfat", | 448 EXPECT_EQ("vfat", |
655 fake_cros_disks_client_->last_format_filesystem()); | 449 fake_cros_disks_client_->last_format_filesystem()); |
656 | 450 |
657 // The device mount should be gone. | 451 // The device mount should be gone. |
658 EXPECT_FALSE(HasMountPoint("/device/mount_path")); | 452 EXPECT_FALSE(HasMountPoint("/device/mount_path")); |
659 } | 453 } |
660 | 454 |
661 // Verifies a |MountEvent| with the given condition. This function only checks | |
662 // the |mount_path| in |MountPointInfo| to make sure to match the event with | |
663 // preceding mount invocations. | |
664 void VerifyMountEvent(const MountEvent& mount_event, | |
665 DiskMountManager::MountEvent mount_event_type, | |
666 chromeos::MountError error_code, | |
667 const std::string& mount_path) { | |
668 EXPECT_EQ(mount_event_type, mount_event.event); | |
669 EXPECT_EQ(error_code, mount_event.error_code); | |
670 EXPECT_EQ(mount_path, mount_event.mount_point.mount_path); | |
671 } | |
672 | |
673 // Tests the case when the format process actually starts and fails. | 455 // Tests the case when the format process actually starts and fails. |
674 TEST_F(DiskMountManagerTest, Format_FormatFails) { | 456 TEST_F(DiskMountManagerTest, Format_FormatFails) { |
675 // Both unmount and format device cals are successful in this test. | 457 // Both unmount and format device cals are successful in this test. |
676 | 458 |
| 459 // Set up expectations for observer mock. |
| 460 // The observer should get notified that the device was unmounted and that |
| 461 // formatting has started. |
| 462 // After the formatting starts, the test will simulate failing |
| 463 // FORMAT_COMPLETED signal, so the observer should also be notified the |
| 464 // formatting has failed (FORMAT_COMPLETED event). |
| 465 { |
| 466 InSequence s; |
| 467 |
| 468 EXPECT_CALL(observer_, |
| 469 OnMountEvent(DiskMountManager::UNMOUNTING, |
| 470 chromeos::MOUNT_ERROR_NONE, |
| 471 Field(&DiskMountManager::MountPointInfo::mount_path, |
| 472 "/device/mount_path"))) |
| 473 .Times(1); |
| 474 |
| 475 EXPECT_CALL(observer_, OnFormatEvent(DiskMountManager::FORMAT_STARTED, |
| 476 chromeos::FORMAT_ERROR_NONE, |
| 477 "/device/source_path")) |
| 478 .Times(1); |
| 479 |
| 480 EXPECT_CALL(observer_, OnFormatEvent(DiskMountManager::FORMAT_COMPLETED, |
| 481 chromeos::FORMAT_ERROR_UNKNOWN, |
| 482 "/device/source_path")) |
| 483 .Times(1); |
| 484 } |
| 485 |
677 // Start the test. | 486 // Start the test. |
678 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); | 487 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); |
679 | 488 |
680 // Wait for Unmount and Format calls to end. | 489 // Wait for Unmount and Format calls to end. |
681 message_loop_.RunUntilIdle(); | 490 message_loop_.RunUntilIdle(); |
682 | 491 |
683 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count()); | 492 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count()); |
684 EXPECT_EQ("/device/mount_path", | 493 EXPECT_EQ("/device/mount_path", |
685 fake_cros_disks_client_->last_unmount_device_path()); | 494 fake_cros_disks_client_->last_unmount_device_path()); |
686 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, | 495 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, |
687 fake_cros_disks_client_->last_unmount_options()); | 496 fake_cros_disks_client_->last_unmount_options()); |
688 EXPECT_EQ(1, fake_cros_disks_client_->format_call_count()); | 497 EXPECT_EQ(1, fake_cros_disks_client_->format_call_count()); |
689 EXPECT_EQ("/device/source_path", | 498 EXPECT_EQ("/device/source_path", |
690 fake_cros_disks_client_->last_format_device_path()); | 499 fake_cros_disks_client_->last_format_device_path()); |
691 EXPECT_EQ("vfat", fake_cros_disks_client_->last_format_filesystem()); | 500 EXPECT_EQ("vfat", fake_cros_disks_client_->last_format_filesystem()); |
692 | 501 |
693 // The device should be unmounted by now. | 502 // The device should be unmounted by now. |
694 EXPECT_FALSE(HasMountPoint("/device/mount_path")); | 503 EXPECT_FALSE(HasMountPoint("/device/mount_path")); |
695 | 504 |
696 // Send failing FORMAT_COMPLETED signal. | 505 // Send failing FORMAT_COMPLETED signal. |
697 // The failure is marked by ! in fromt of the path (but this should change | 506 // The failure is marked by ! in fromt of the path (but this should change |
698 // soon). | 507 // soon). |
699 fake_cros_disks_client_->SendFormatCompletedEvent( | 508 fake_cros_disks_client_->SendFormatCompletedEvent( |
700 chromeos::FORMAT_ERROR_UNKNOWN, "/device/source_path"); | 509 chromeos::FORMAT_ERROR_UNKNOWN, "/device/source_path"); |
701 | |
702 // The observer should get notified that the device was unmounted and that | |
703 // formatting has started. | |
704 // After the formatting starts, the test will simulate failing | |
705 // FORMAT_COMPLETED signal, so the observer should also be notified the | |
706 // formatting has failed (FORMAT_COMPLETED event). | |
707 ASSERT_EQ(3U, observer_->GetEventCount()); | |
708 VerifyMountEvent(observer_->GetMountEvent(0), DiskMountManager::UNMOUNTING, | |
709 chromeos::MOUNT_ERROR_NONE, "/device/mount_path"); | |
710 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_STARTED, | |
711 chromeos::FORMAT_ERROR_NONE, "/device/source_path"), | |
712 observer_->GetFormatEvent(1)); | |
713 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_COMPLETED, | |
714 chromeos::FORMAT_ERROR_UNKNOWN, "/device/source_path"), | |
715 observer_->GetFormatEvent(2)); | |
716 } | 510 } |
717 | 511 |
718 // Tests the case when formatting completes successfully. | 512 // Tests the case when formatting completes successfully. |
719 TEST_F(DiskMountManagerTest, Format_FormatSuccess) { | 513 TEST_F(DiskMountManagerTest, Format_FormatSuccess) { |
720 // Set up cros disks client mocks. | 514 // Set up cros disks client mocks. |
721 // Both unmount and format device cals are successful in this test. | 515 // Both unmount and format device cals are successful in this test. |
722 | 516 |
| 517 // Set up expectations for observer mock. |
| 518 // The observer should receive UNMOUNTING, FORMAT_STARTED and FORMAT_COMPLETED |
| 519 // events (all of them without an error set). |
| 520 { |
| 521 InSequence s; |
| 522 |
| 523 EXPECT_CALL(observer_, |
| 524 OnMountEvent(DiskMountManager::UNMOUNTING, |
| 525 chromeos::MOUNT_ERROR_NONE, |
| 526 Field(&DiskMountManager::MountPointInfo::mount_path, |
| 527 "/device/mount_path"))) |
| 528 .Times(1); |
| 529 |
| 530 EXPECT_CALL(observer_, OnFormatEvent(DiskMountManager::FORMAT_STARTED, |
| 531 chromeos::FORMAT_ERROR_NONE, |
| 532 "/device/source_path")) |
| 533 .Times(1); |
| 534 |
| 535 EXPECT_CALL(observer_, OnFormatEvent(DiskMountManager::FORMAT_COMPLETED, |
| 536 chromeos::FORMAT_ERROR_NONE, |
| 537 "/device/source_path")) |
| 538 .Times(1); |
| 539 } |
| 540 |
723 // Start the test. | 541 // Start the test. |
724 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); | 542 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); |
725 | 543 |
726 // Wait for Unmount and Format calls to end. | 544 // Wait for Unmount and Format calls to end. |
727 message_loop_.RunUntilIdle(); | 545 message_loop_.RunUntilIdle(); |
728 | 546 |
729 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count()); | 547 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count()); |
730 EXPECT_EQ("/device/mount_path", | 548 EXPECT_EQ("/device/mount_path", |
731 fake_cros_disks_client_->last_unmount_device_path()); | 549 fake_cros_disks_client_->last_unmount_device_path()); |
732 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, | 550 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, |
733 fake_cros_disks_client_->last_unmount_options()); | 551 fake_cros_disks_client_->last_unmount_options()); |
734 EXPECT_EQ(1, fake_cros_disks_client_->format_call_count()); | 552 EXPECT_EQ(1, fake_cros_disks_client_->format_call_count()); |
735 EXPECT_EQ("/device/source_path", | 553 EXPECT_EQ("/device/source_path", |
736 fake_cros_disks_client_->last_format_device_path()); | 554 fake_cros_disks_client_->last_format_device_path()); |
737 EXPECT_EQ("vfat", fake_cros_disks_client_->last_format_filesystem()); | 555 EXPECT_EQ("vfat", fake_cros_disks_client_->last_format_filesystem()); |
738 | 556 |
739 // The device should be unmounted by now. | 557 // The device should be unmounted by now. |
740 EXPECT_FALSE(HasMountPoint("/device/mount_path")); | 558 EXPECT_FALSE(HasMountPoint("/device/mount_path")); |
741 | 559 |
742 // Simulate cros_disks reporting success. | 560 // Simulate cros_disks reporting success. |
743 fake_cros_disks_client_->SendFormatCompletedEvent( | 561 fake_cros_disks_client_->SendFormatCompletedEvent( |
744 chromeos::FORMAT_ERROR_NONE, "/device/source_path"); | 562 chromeos::FORMAT_ERROR_NONE, "/device/source_path"); |
745 | |
746 // The observer should receive UNMOUNTING, FORMAT_STARTED and FORMAT_COMPLETED | |
747 // events (all of them without an error set). | |
748 ASSERT_EQ(3U, observer_->GetEventCount()); | |
749 VerifyMountEvent(observer_->GetMountEvent(0), DiskMountManager::UNMOUNTING, | |
750 chromeos::MOUNT_ERROR_NONE, "/device/mount_path"); | |
751 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_STARTED, | |
752 chromeos::FORMAT_ERROR_NONE, "/device/source_path"), | |
753 observer_->GetFormatEvent(1)); | |
754 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_COMPLETED, | |
755 chromeos::FORMAT_ERROR_NONE, "/device/source_path"), | |
756 observer_->GetFormatEvent(2)); | |
757 } | 563 } |
758 | 564 |
759 // Tests that it's possible to format the device twice in a row (this may not be | 565 // Tests that it's possible to format the device twice in a row (this may not be |
760 // true if the list of pending formats is not properly cleared). | 566 // true if the list of pending formats is not properly cleared). |
761 TEST_F(DiskMountManagerTest, Format_ConsecutiveFormatCalls) { | 567 TEST_F(DiskMountManagerTest, Format_ConsecutiveFormatCalls) { |
762 // All unmount and format device cals are successful in this test. | 568 // All unmount and format device cals are successful in this test. |
763 // Each of the should be made twice (once for each formatting task). | 569 // Each of the should be made twice (once for each formatting task). |
764 | 570 |
| 571 // Set up expectations for observer mock. |
| 572 // The observer should receive UNMOUNTING, FORMAT_STARTED and FORMAT_COMPLETED |
| 573 // events (all of them without an error set) twice (once for each formatting |
| 574 // task). |
| 575 // Also, there should be a MOUNTING event when the device remounting is |
| 576 // simulated. |
| 577 EXPECT_CALL(observer_, OnFormatEvent(DiskMountManager::FORMAT_COMPLETED, |
| 578 chromeos::FORMAT_ERROR_NONE, |
| 579 "/device/source_path")) |
| 580 .Times(2); |
| 581 |
| 582 EXPECT_CALL(observer_, OnFormatEvent(DiskMountManager::FORMAT_STARTED, |
| 583 chromeos::FORMAT_ERROR_NONE, |
| 584 "/device/source_path")) |
| 585 .Times(2); |
| 586 |
| 587 EXPECT_CALL(observer_, |
| 588 OnMountEvent(DiskMountManager::UNMOUNTING, |
| 589 chromeos::MOUNT_ERROR_NONE, |
| 590 Field(&DiskMountManager::MountPointInfo::mount_path, |
| 591 "/device/mount_path"))) |
| 592 .Times(2); |
| 593 |
| 594 EXPECT_CALL(observer_, |
| 595 OnMountEvent(DiskMountManager::MOUNTING, |
| 596 chromeos::MOUNT_ERROR_NONE, |
| 597 Field(&DiskMountManager::MountPointInfo::mount_path, |
| 598 "/device/mount_path"))) |
| 599 .Times(1); |
| 600 |
765 // Start the test. | 601 // Start the test. |
766 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); | 602 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); |
767 | 603 |
768 // Wait for Unmount and Format calls to end. | 604 // Wait for Unmount and Format calls to end. |
769 message_loop_.RunUntilIdle(); | 605 message_loop_.RunUntilIdle(); |
770 | 606 |
771 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count()); | 607 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count()); |
772 EXPECT_EQ("/device/mount_path", | 608 EXPECT_EQ("/device/mount_path", |
773 fake_cros_disks_client_->last_unmount_device_path()); | 609 fake_cros_disks_client_->last_unmount_device_path()); |
774 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, | 610 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, | 642 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, |
807 fake_cros_disks_client_->last_unmount_options()); | 643 fake_cros_disks_client_->last_unmount_options()); |
808 EXPECT_EQ(2, fake_cros_disks_client_->format_call_count()); | 644 EXPECT_EQ(2, fake_cros_disks_client_->format_call_count()); |
809 EXPECT_EQ("/device/source_path", | 645 EXPECT_EQ("/device/source_path", |
810 fake_cros_disks_client_->last_format_device_path()); | 646 fake_cros_disks_client_->last_format_device_path()); |
811 EXPECT_EQ("vfat", fake_cros_disks_client_->last_format_filesystem()); | 647 EXPECT_EQ("vfat", fake_cros_disks_client_->last_format_filesystem()); |
812 | 648 |
813 // Simulate cros_disks reporting success. | 649 // Simulate cros_disks reporting success. |
814 fake_cros_disks_client_->SendFormatCompletedEvent( | 650 fake_cros_disks_client_->SendFormatCompletedEvent( |
815 chromeos::FORMAT_ERROR_NONE, "/device/source_path"); | 651 chromeos::FORMAT_ERROR_NONE, "/device/source_path"); |
816 | |
817 // The observer should receive UNMOUNTING, FORMAT_STARTED and FORMAT_COMPLETED | |
818 // events (all of them without an error set) twice (once for each formatting | |
819 // task). | |
820 // Also, there should be a MOUNTING event when the device remounting is | |
821 // simulated. | |
822 EXPECT_EQ(7U, observer_->GetEventCount()); | |
823 | |
824 EXPECT_EQ(2U, observer_->CountFormatEvents(FormatEvent( | |
825 DiskMountManager::FORMAT_COMPLETED, | |
826 chromeos::FORMAT_ERROR_NONE, "/device/source_path"))); | |
827 | |
828 EXPECT_EQ(2U, observer_->CountFormatEvents(FormatEvent( | |
829 DiskMountManager::FORMAT_STARTED, | |
830 chromeos::FORMAT_ERROR_NONE, "/device/source_path"))); | |
831 | |
832 EXPECT_EQ(2U, observer_->CountMountEvents(DiskMountManager::UNMOUNTING, | |
833 chromeos::MOUNT_ERROR_NONE, | |
834 "/device/mount_path")); | |
835 | |
836 EXPECT_EQ(1U, observer_->CountMountEvents(DiskMountManager::MOUNTING, | |
837 chromeos::MOUNT_ERROR_NONE, | |
838 "/device/mount_path")); | |
839 } | 652 } |
840 | 653 |
841 TEST_F(DiskMountManagerTest, MountPath_RecordAccessMode) { | 654 TEST_F(DiskMountManagerTest, MountPath_RecordAccessMode) { |
842 DiskMountManager* manager = DiskMountManager::GetInstance(); | 655 DiskMountManager* manager = DiskMountManager::GetInstance(); |
843 const std::string kSourcePath1 = "/device/source_path"; | 656 const std::string kSourcePath1 = "/device/source_path"; |
844 const std::string kSourcePath2 = "/device/source_path2"; | 657 const std::string kSourcePath2 = "/device/source_path2"; |
845 const std::string kSourceFormat = std::string(); | 658 const std::string kSourceFormat = std::string(); |
846 const std::string kMountLabel = std::string(); // N/A for MOUNT_TYPE_DEVICE | 659 const std::string kMountLabel = std::string(); // N/A for MOUNT_TYPE_DEVICE |
847 // For MountCompleted. Must be non-empty strings. | 660 // For MountCompleted. Must be non-empty strings. |
848 const std::string kMountPath1 = "/media/foo"; | 661 const std::string kMountPath1 = "/media/foo"; |
849 const std::string kMountPath2 = "/media/bar"; | 662 const std::string kMountPath2 = "/media/bar"; |
850 | 663 |
| 664 // Event handlers of observers should be called. |
| 665 EXPECT_CALL( |
| 666 observer_, |
| 667 OnMountEvent( |
| 668 DiskMountManager::MOUNTING, chromeos::MOUNT_ERROR_NONE, |
| 669 Field(&DiskMountManager::MountPointInfo::mount_path, kMountPath1))); |
| 670 // For the 2nd source, the disk (block device) is not read-only but the |
| 671 // test will mount it in read-only mode. |
| 672 // Observers query |disks_| from |DiskMountManager| in its event handler for |
| 673 // a mount completion event. Therefore |disks_| must be updated with correct |
| 674 // |read_only| value before notifying to observers. |
| 675 EXPECT_CALL( |
| 676 observer_, |
| 677 OnMountEvent( |
| 678 DiskMountManager::MOUNTING, chromeos::MOUNT_ERROR_NONE, |
| 679 Field(&DiskMountManager::MountPointInfo::mount_path, kMountPath2))) |
| 680 .WillOnce(InvokeWithoutArgs( |
| 681 // Verify if the disk appears read-only at the time of notification |
| 682 // to observers. |
| 683 [&]() { ExpectDiskReadOnly(manager, kSourcePath2, true); })); |
| 684 |
851 manager->MountPath(kSourcePath1, kSourceFormat, std::string(), | 685 manager->MountPath(kSourcePath1, kSourceFormat, std::string(), |
852 chromeos::MOUNT_TYPE_DEVICE, | 686 chromeos::MOUNT_TYPE_DEVICE, |
853 chromeos::MOUNT_ACCESS_MODE_READ_WRITE); | 687 chromeos::MOUNT_ACCESS_MODE_READ_WRITE); |
854 manager->MountPath(kSourcePath2, kSourceFormat, std::string(), | 688 manager->MountPath(kSourcePath2, kSourceFormat, std::string(), |
855 chromeos::MOUNT_TYPE_DEVICE, | 689 chromeos::MOUNT_TYPE_DEVICE, |
856 chromeos::MOUNT_ACCESS_MODE_READ_ONLY); | 690 chromeos::MOUNT_ACCESS_MODE_READ_ONLY); |
857 // Simulate cros_disks reporting mount completed. | 691 // Simulate cros_disks reporting mount completed. |
858 fake_cros_disks_client_->SendMountCompletedEvent( | 692 fake_cros_disks_client_->SendMountCompletedEvent( |
859 chromeos::MOUNT_ERROR_NONE, kSourcePath1, chromeos::MOUNT_TYPE_DEVICE, | 693 chromeos::MOUNT_ERROR_NONE, kSourcePath1, chromeos::MOUNT_TYPE_DEVICE, |
860 kMountPath1); | 694 kMountPath1); |
861 fake_cros_disks_client_->SendMountCompletedEvent( | 695 fake_cros_disks_client_->SendMountCompletedEvent( |
862 chromeos::MOUNT_ERROR_NONE, kSourcePath2, chromeos::MOUNT_TYPE_DEVICE, | 696 chromeos::MOUNT_ERROR_NONE, kSourcePath2, chromeos::MOUNT_TYPE_DEVICE, |
863 kMountPath2); | 697 kMountPath2); |
864 | 698 |
865 // Event handlers of observers should be called. | |
866 ASSERT_EQ(2U, observer_->GetEventCount()); | |
867 VerifyMountEvent(observer_->GetMountEvent(0), DiskMountManager::MOUNTING, | |
868 chromeos::MOUNT_ERROR_NONE, kMountPath1); | |
869 // For the 2nd source, the disk (block device) is not read-only but the | |
870 // test will mount it in read-only mode. | |
871 // Observers query |disks_| from |DiskMountManager| in its event handler for | |
872 // a mount completion event. Therefore |disks_| must be updated with correct | |
873 // |read_only| value before notifying to observers. | |
874 const MountEvent& secondMountEvent = observer_->GetMountEvent(1); | |
875 EXPECT_EQ(DiskMountManager::MOUNTING, secondMountEvent.event); | |
876 EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, secondMountEvent.error_code); | |
877 EXPECT_EQ(kMountPath2, secondMountEvent.mount_point.mount_path); | |
878 // Verify if the disk appears read-only at the time of notification to | |
879 // observers. | |
880 EXPECT_TRUE(secondMountEvent.disk->is_read_only()); | |
881 | |
882 // Verify the final state of manager->disks. | |
883 const DiskMountManager::DiskMap& disks = manager->disks(); | 699 const DiskMountManager::DiskMap& disks = manager->disks(); |
884 ASSERT_GT(disks.count(kSourcePath1), 0U); | 700 ASSERT_GT(disks.count(kSourcePath1), 0U); |
885 EXPECT_FALSE(disks.find(kSourcePath1)->second->is_read_only()); | 701 EXPECT_FALSE(disks.find(kSourcePath1)->second->is_read_only()); |
886 ASSERT_GT(disks.count(kSourcePath2), 0U); | 702 ASSERT_GT(disks.count(kSourcePath2), 0U); |
887 EXPECT_TRUE(disks.find(kSourcePath2)->second->is_read_only()); | 703 EXPECT_TRUE(disks.find(kSourcePath2)->second->is_read_only()); |
888 } | 704 } |
889 | 705 |
890 TEST_F(DiskMountManagerTest, MountPath_ReadOnlyDevice) { | 706 TEST_F(DiskMountManagerTest, MountPath_ReadOnlyDevice) { |
891 DiskMountManager* manager = DiskMountManager::GetInstance(); | 707 DiskMountManager* manager = DiskMountManager::GetInstance(); |
892 const std::string kSourceFormat = std::string(); | 708 const std::string kSourceFormat = std::string(); |
893 const std::string kMountLabel = std::string(); // N/A for MOUNT_TYPE_DEVICE | 709 const std::string kMountLabel = std::string(); // N/A for MOUNT_TYPE_DEVICE |
894 | 710 |
| 711 // Event handlers of observers should be called. |
| 712 EXPECT_CALL( |
| 713 observer_, |
| 714 OnMountEvent(DiskMountManager::MOUNTING, chromeos::MOUNT_ERROR_NONE, |
| 715 Field(&DiskMountManager::MountPointInfo::mount_path, |
| 716 kReadOnlyMountpath))); |
| 717 |
895 // Attempt to mount a read-only device in read-write mode. | 718 // Attempt to mount a read-only device in read-write mode. |
896 manager->MountPath(kReadOnlyDeviceSource, kSourceFormat, std::string(), | 719 manager->MountPath(kReadOnlyDeviceSource, kSourceFormat, std::string(), |
897 chromeos::MOUNT_TYPE_DEVICE, | 720 chromeos::MOUNT_TYPE_DEVICE, |
898 chromeos::MOUNT_ACCESS_MODE_READ_WRITE); | 721 chromeos::MOUNT_ACCESS_MODE_READ_WRITE); |
899 // Simulate cros_disks reporting mount completed. | 722 // Simulate cros_disks reporting mount completed. |
900 fake_cros_disks_client_->SendMountCompletedEvent( | 723 fake_cros_disks_client_->SendMountCompletedEvent( |
901 chromeos::MOUNT_ERROR_NONE, kReadOnlyDeviceSource, | 724 chromeos::MOUNT_ERROR_NONE, kReadOnlyDeviceSource, |
902 chromeos::MOUNT_TYPE_DEVICE, kReadOnlyMountpath); | 725 chromeos::MOUNT_TYPE_DEVICE, kReadOnlyMountpath); |
903 | 726 |
904 // Event handlers of observers should be called. | |
905 ASSERT_EQ(1U, observer_->GetEventCount()); | |
906 VerifyMountEvent(observer_->GetMountEvent(0), DiskMountManager::MOUNTING, | |
907 chromeos::MOUNT_ERROR_NONE, kReadOnlyMountpath); | |
908 const DiskMountManager::DiskMap& disks = manager->disks(); | 727 const DiskMountManager::DiskMap& disks = manager->disks(); |
909 ASSERT_GT(disks.count(kReadOnlyDeviceSource), 0U); | 728 ASSERT_GT(disks.count(kReadOnlyDeviceSource), 0U); |
910 // The mounted disk should preserve the read-only flag of the block device. | 729 // The mounted disk should preserve the read-only flag of the block device. |
911 EXPECT_TRUE(disks.find(kReadOnlyDeviceSource)->second->is_read_only()); | 730 EXPECT_TRUE(disks.find(kReadOnlyDeviceSource)->second->is_read_only()); |
912 } | 731 } |
913 | 732 |
914 } // namespace | 733 } // namespace |
OLD | NEW |