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

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