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

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