Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(95)

Side by Side Diff: chromeos/disks/disk_mount_manager_unittest.cc

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

Powered by Google App Engine
This is Rietveld 408576698