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

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: style fix 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;
satorux1 2016/09/08 06:03:55 shared_ptr is rarely used in Chrome code. Can you
yamaguchi 2016/09/08 09:05:47 Done. Also replaced the similar one for DiskEvent.
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.
satorux1 2016/09/08 06:03:55 Get -> Gets
yamaguchi 2016/09/08 09:05:47 Done.
326 // Verifies if the |index|th invocation is OnDeviceEvent() and returns
327 // details.
328 DeviceEvent GetDeviceEvent(size_t index) {
329 DCHECK_GT(events_.size(), index);
330 DCHECK_EQ(DEVICE_EVENT, events_[index]->type());
331 return static_cast<const DeviceEvent&>(*events_[index]);
332 }
333
334 // Verifies if the |index|th invocation is OnDiskEvent() and returns details.
335 DiskEvent GetDiskEvent(size_t index) {
336 DCHECK_GT(events_.size(), index);
337 DCHECK_EQ(DISK_EVENT, events_[index]->type());
338 return static_cast<const DiskEvent&>(*events_[index]);
339 }
340
341 // Verifies if the |index|th invocation is OnFormatEvent() and returns
342 // details.
343 FormatEvent GetFormatEvent(size_t index) {
344 DCHECK_GT(events_.size(), index);
345 DCHECK_EQ(FORMAT_EVENT, events_[index]->type());
346 return static_cast<const FormatEvent&>(*events_[index]);
347 }
348
349 // Verifies if the |index|th invocation is OnMountEvent() and returns details.
350 MountEvent GetMountEvent(size_t index) {
351 DCHECK_GT(events_.size(), index);
352 DCHECK_EQ(MOUNT_EVENT, events_[index]->type());
353 return static_cast<const MountEvent&>(*events_[index]);
354 }
355
356 // Returns number of callback invocations happened so far.
357 size_t GetEventCount() { return events_.size(); }
358
359 // Counts the number of |MountEvent| recorded so far that matches the given
360 // condition.
361 size_t CountMountEvents(DiskMountManager::MountEvent mount_event_type,
362 chromeos::MountError error_code,
363 const std::string& mount_path) {
364 size_t matched = 0;
365 for (auto& it : events_) {
366 if (it->type() != MOUNT_EVENT)
367 continue;
368 const MountEvent& mount_event = static_cast<const MountEvent&>(*it);
369 if (mount_event.event == mount_event_type &&
370 mount_event.error_code == error_code &&
371 mount_event.mount_point.mount_path == mount_path)
372 matched++;
373 }
374 return matched;
375 }
376
377 // Counts the number of |FormatEvent| recorded so far that matches with
378 // |format_event|.
379 size_t CountFormatEvents(const FormatEvent& exptected_format_event) {
380 size_t matched = 0;
381 for (auto& it : events_) {
382 if (it->type() != FORMAT_EVENT)
383 continue;
384 if (static_cast<const FormatEvent&>(*it) == exptected_format_event)
385 matched++;
386 }
387 return matched;
388 }
389
390 private:
391 // Pointer to the manager object to which this |Observer| is registered.
392 const DiskMountManager* manager_;
393
394 // Records all invocations.
395 std::vector<std::unique_ptr<ObserverEvent>> events_;
396 };
397
398 // Shift operators of ostream.
399 // Needed to print values in case of EXPECT_* failure in gtest.
400 std::ostream& operator<<(std::ostream& stream,
401 const DeviceEvent& device_event) {
402 return stream << device_event.DebugString();
403 }
404
405 std::ostream& operator<<(std::ostream& stream, const DiskEvent& disk_event) {
406 return stream << disk_event.DebugString();
407 }
408
409 std::ostream& operator<<(std::ostream& stream,
410 const FormatEvent& format_event) {
411 return stream << format_event.DebugString();
412 }
413
414 std::ostream& operator<<(std::ostream& stream, const MountEvent& mount_event) {
415 return stream << mount_event.DebugString();
179 } 416 }
180 417
181 class DiskMountManagerTest : public testing::Test { 418 class DiskMountManagerTest : public testing::Test {
182 public: 419 public:
183 DiskMountManagerTest() {} 420 DiskMountManagerTest() : observer_(NULL) {}
184 ~DiskMountManagerTest() override {} 421 ~DiskMountManagerTest() override {}
185 422
186 // Sets up test dbus tread manager and disks mount manager. 423 // Sets up test dbus tread manager and disks mount manager.
187 // Initializes disk mount manager disks and mount points. 424 // Initializes disk mount manager disks and mount points.
188 // Adds a test observer to the disk mount manager. 425 // Adds a test observer to the disk mount manager.
189 void SetUp() override { 426 void SetUp() override {
190 fake_cros_disks_client_ = new FakeCrosDisksClient; 427 fake_cros_disks_client_ = new FakeCrosDisksClient;
191 DBusThreadManager::GetSetterForTesting()->SetCrosDisksClient( 428 DBusThreadManager::GetSetterForTesting()->SetCrosDisksClient(
192 std::unique_ptr<CrosDisksClient>(fake_cros_disks_client_)); 429 std::unique_ptr<CrosDisksClient>(fake_cros_disks_client_));
193 430
194 DiskMountManager::Initialize(); 431 DiskMountManager::Initialize();
195 432
196 InitDisksAndMountPoints(); 433 InitDisksAndMountPoints();
197 434
198 DiskMountManager::GetInstance()->AddObserver(&observer_); 435 observer_ =
436 new MockDiskMountManagerObserver(DiskMountManager::GetInstance());
437 DiskMountManager::GetInstance()->AddObserver(observer_);
199 } 438 }
200 439
201 // Shuts down dbus thread manager and disk moutn manager used in the test. 440 // Shuts down dbus thread manager and disk moutn manager used in the test.
202 void TearDown() override { 441 void TearDown() override {
203 DiskMountManager::GetInstance()->RemoveObserver(&observer_); 442 DiskMountManager::GetInstance()->RemoveObserver(observer_);
204 DiskMountManager::Shutdown(); 443 DiskMountManager::Shutdown();
205 DBusThreadManager::Shutdown(); 444 DBusThreadManager::Shutdown();
206 } 445 }
207 446
208 protected: 447 protected:
209 // Checks if disk mount manager contains a mount point with specified moutn 448 // Checks if disk mount manager contains a mount point with specified moutn
210 // path. 449 // path.
211 bool HasMountPoint(const std::string& mount_path) { 450 bool HasMountPoint(const std::string& mount_path) {
212 const DiskMountManager::MountPointMap& mount_points = 451 const DiskMountManager::MountPointMap& mount_points =
213 DiskMountManager::GetInstance()->mount_points(); 452 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). 496 // expected that the corresponding disk is already added).
258 for (size_t i = 0; i < arraysize(kTestDisks); i++) 497 for (size_t i = 0; i < arraysize(kTestDisks); i++)
259 AddTestDisk(kTestDisks[i]); 498 AddTestDisk(kTestDisks[i]);
260 499
261 for (size_t i = 0; i < arraysize(kTestMountPoints); i++) 500 for (size_t i = 0; i < arraysize(kTestMountPoints); i++)
262 AddTestMountPoint(kTestMountPoints[i]); 501 AddTestMountPoint(kTestMountPoints[i]);
263 } 502 }
264 503
265 protected: 504 protected:
266 chromeos::FakeCrosDisksClient* fake_cros_disks_client_; 505 chromeos::FakeCrosDisksClient* fake_cros_disks_client_;
267 MockDiskMountManagerObserver observer_; 506 MockDiskMountManagerObserver* observer_;
268 base::MessageLoopForUI message_loop_; 507 base::MessageLoopForUI message_loop_;
269 }; 508 };
270 509
271 // Tests that the observer gets notified on attempt to format non existent mount 510 // Tests that the observer gets notified on attempt to format non existent mount
272 // point. 511 // point.
273 TEST_F(DiskMountManagerTest, Format_NotMounted) { 512 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"); 513 DiskMountManager::GetInstance()->FormatMountedDevice("/mount/non_existent");
514 ASSERT_GE(1U, observer_->GetEventCount());
515 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_COMPLETED,
516 chromeos::FORMAT_ERROR_UNKNOWN, "/mount/non_existent"),
517 observer_->GetFormatEvent(0));
279 } 518 }
280 519
281 // Tests that the observer gets notified on attempt to format read-only mount 520 // Tests that the observer gets notified on attempt to format read-only mount
282 // point. 521 // point.
283 TEST_F(DiskMountManagerTest, Format_ReadOnly) { 522 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); 523 DiskMountManager::GetInstance()->FormatMountedDevice(kReadOnlyMountpath);
524 ASSERT_GE(1U, observer_->GetEventCount());
525 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_COMPLETED,
526 chromeos::FORMAT_ERROR_DEVICE_NOT_ALLOWED,
527 kReadOnlyMountpath),
528 observer_->GetFormatEvent(0));
290 } 529 }
291 530
292 // Tests that it is not possible to format archive mount point. 531 // Tests that it is not possible to format archive mount point.
293 TEST_F(DiskMountManagerTest, Format_Archive) { 532 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"); 533 DiskMountManager::GetInstance()->FormatMountedDevice("/archive/mount_path");
534 ASSERT_GE(1U, observer_->GetEventCount());
535 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_COMPLETED,
536 chromeos::FORMAT_ERROR_UNKNOWN, "/archive/source_path"),
537 observer_->GetFormatEvent(0));
300 } 538 }
301 539
302 // Tests that format fails if the device cannot be unmounted. 540 // Tests that format fails if the device cannot be unmounted.
303 TEST_F(DiskMountManagerTest, Format_FailToUnmount) { 541 TEST_F(DiskMountManagerTest, Format_FailToUnmount) {
304 // Before formatting mounted device, the device should be unmounted. 542 // Before formatting mounted device, the device should be unmounted.
305 // In this test unmount will fail, and there should be no attempt to 543 // In this test unmount will fail, and there should be no attempt to
306 // format the device. 544 // format the device.
307 545
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(); 546 fake_cros_disks_client_->MakeUnmountFail();
328 // Start test. 547 // Start test.
329 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); 548 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path");
330 549
331 // Cros disks will respond asynchronoulsy, so let's drain the message loop. 550 // Cros disks will respond asynchronoulsy, so let's drain the message loop.
332 message_loop_.RunUntilIdle(); 551 message_loop_.RunUntilIdle();
333 552
553 // Observer should be notified that unmount attempt fails and format task
554 // failed to start.
555 ASSERT_GE(2U, observer_->GetEventCount());
556 MountEvent mount_event = observer_->GetMountEvent(0);
557 EXPECT_EQ(DiskMountManager::UNMOUNTING, mount_event.event);
558 EXPECT_EQ(chromeos::MOUNT_ERROR_INTERNAL, mount_event.error_code);
559 EXPECT_EQ("/device/mount_path", mount_event.mount_point.mount_path);
560
561 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_COMPLETED,
562 chromeos::FORMAT_ERROR_UNKNOWN, "/device/source_path"),
563 observer_->GetFormatEvent(1));
334 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count()); 564 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count());
335 EXPECT_EQ("/device/mount_path", 565 EXPECT_EQ("/device/mount_path",
336 fake_cros_disks_client_->last_unmount_device_path()); 566 fake_cros_disks_client_->last_unmount_device_path());
337 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, 567 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE,
338 fake_cros_disks_client_->last_unmount_options()); 568 fake_cros_disks_client_->last_unmount_options());
339 EXPECT_EQ(0, fake_cros_disks_client_->format_call_count()); 569 EXPECT_EQ(0, fake_cros_disks_client_->format_call_count());
340 570
341 // The device mount should still be here. 571 // The device mount should still be here.
342 EXPECT_TRUE(HasMountPoint("/device/mount_path")); 572 EXPECT_TRUE(HasMountPoint("/device/mount_path"));
343 } 573 }
344 574
345 // Tests that observer is notified when cros disks fails to start format 575 // Tests that observer is notified when cros disks fails to start format
346 // process. 576 // process.
347 TEST_F(DiskMountManagerTest, Format_FormatFailsToStart) { 577 TEST_F(DiskMountManagerTest, Format_FormatFailsToStart) {
348 // Before formatting mounted device, the device should be unmounted. 578 // Before formatting mounted device, the device should be unmounted.
349 // In this test, unmount will succeed, but call to Format method will 579 // In this test, unmount will succeed, but call to Format method will
350 // fail. 580 // fail.
351 581
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(); 582 fake_cros_disks_client_->MakeFormatFail();
372 // Start the test. 583 // Start the test.
373 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); 584 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path");
374 585
375 // Cros disks will respond asynchronoulsy, so let's drain the message loop. 586 // Cros disks will respond asynchronoulsy, so let's drain the message loop.
376 message_loop_.RunUntilIdle(); 587 message_loop_.RunUntilIdle();
377 588
589 // Observer should be notified that the device was unmounted and format task
590 // failed to start.
591 ASSERT_GE(2U, observer_->GetEventCount());
592 MountEvent mount_event = observer_->GetMountEvent(0);
593 EXPECT_EQ(DiskMountManager::UNMOUNTING, mount_event.event);
594 EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, mount_event.error_code);
595 EXPECT_EQ("/device/mount_path", mount_event.mount_point.mount_path);
596
597 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_COMPLETED,
598 chromeos::FORMAT_ERROR_UNKNOWN, "/device/source_path"),
599 observer_->GetFormatEvent(1));
600
378 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count()); 601 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count());
379 EXPECT_EQ("/device/mount_path", 602 EXPECT_EQ("/device/mount_path",
380 fake_cros_disks_client_->last_unmount_device_path()); 603 fake_cros_disks_client_->last_unmount_device_path());
381 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, 604 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE,
382 fake_cros_disks_client_->last_unmount_options()); 605 fake_cros_disks_client_->last_unmount_options());
383 EXPECT_EQ(1, fake_cros_disks_client_->format_call_count()); 606 EXPECT_EQ(1, fake_cros_disks_client_->format_call_count());
384 EXPECT_EQ("/device/source_path", 607 EXPECT_EQ("/device/source_path",
385 fake_cros_disks_client_->last_format_device_path()); 608 fake_cros_disks_client_->last_format_device_path());
386 EXPECT_EQ("vfat", fake_cros_disks_client_->last_format_filesystem()); 609 EXPECT_EQ("vfat", fake_cros_disks_client_->last_format_filesystem());
387 610
388 // The device mount should be gone. 611 // The device mount should be gone.
389 EXPECT_FALSE(HasMountPoint("/device/mount_path")); 612 EXPECT_FALSE(HasMountPoint("/device/mount_path"));
390 } 613 }
391 614
392 // Tests the case where there are two format requests for the same device. 615 // Tests the case where there are two format requests for the same device.
393 TEST_F(DiskMountManagerTest, Format_ConcurrentFormatCalls) { 616 TEST_F(DiskMountManagerTest, Format_ConcurrentFormatCalls) {
394 // Only the first format request should be processed (the second unmount 617 // Only the first format request should be processed (the second unmount
395 // request fails because the device is already unmounted at that point). 618 // request fails because the device is already unmounted at that point).
396 // CrosDisksClient will report that the format process for the first request 619 // CrosDisksClient will report that the format process for the first request
397 // is successfully started. 620 // is successfully started.
398 621
399 // Set up expectations for observer mock. 622 fake_cros_disks_client_->set_unmount_listener(
623 base::Bind(&FakeCrosDisksClient::MakeUnmountFail,
624 base::Unretained(fake_cros_disks_client_)));
625 // Start the test.
626 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path");
627 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path");
628
629 // Cros disks will respond asynchronoulsy, so let's drain the message loop.
630 message_loop_.RunUntilIdle();
631
400 // The observer should get a FORMAT_STARTED event for one format request and a 632 // 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 633 // FORMAT_COMPLETED with an error code for the other format request. The
402 // formatting will be started only for the first request. 634 // formatting will be started only for the first request.
403 // There should be only one UNMOUNTING event. The result of the second one 635 // 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 636 // should not be reported as the mount point will go away after the first
405 // request. 637 // request.
406 // 638 //
407 // Note that in this test the format completion signal will not be simulated, 639 // Note that in this test the format completion signal will not be simulated,
408 // so the observer should not get FORMAT_COMPLETED signal. 640 // so the observer should not get FORMAT_COMPLETED signal.
409 {
410 InSequence s;
411 641
412 EXPECT_CALL(observer_, 642 ASSERT_GE(3U, observer_->GetEventCount());
413 OnMountEvent(DiskMountManager::UNMOUNTING, 643 MountEvent mount_event = observer_->GetMountEvent(0);
414 chromeos::MOUNT_ERROR_NONE, 644 EXPECT_EQ(DiskMountManager::UNMOUNTING, mount_event.event);
415 Field(&DiskMountManager::MountPointInfo::mount_path, 645 EXPECT_EQ(chromeos::MOUNT_ERROR_NONE, mount_event.error_code);
416 "/device/mount_path"))) 646 EXPECT_EQ("/device/mount_path", mount_event.mount_point.mount_path);
417 .Times(1); 647 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_COMPLETED,
418 648 chromeos::FORMAT_ERROR_UNKNOWN, "/device/source_path"),
419 EXPECT_CALL(observer_, OnFormatEvent(DiskMountManager::FORMAT_COMPLETED, 649 observer_->GetFormatEvent(1));
420 chromeos::FORMAT_ERROR_UNKNOWN, 650 EXPECT_EQ(FormatEvent(DiskMountManager::FORMAT_STARTED,
421 "/device/source_path")) 651 chromeos::FORMAT_ERROR_NONE, "/device/source_path"),
422 .Times(1); 652 observer_->GetFormatEvent(2));
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 653
440 EXPECT_EQ(2, fake_cros_disks_client_->unmount_call_count()); 654 EXPECT_EQ(2, fake_cros_disks_client_->unmount_call_count());
441 EXPECT_EQ("/device/mount_path", 655 EXPECT_EQ("/device/mount_path",
442 fake_cros_disks_client_->last_unmount_device_path()); 656 fake_cros_disks_client_->last_unmount_device_path());
443 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, 657 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE,
444 fake_cros_disks_client_->last_unmount_options()); 658 fake_cros_disks_client_->last_unmount_options());
445 EXPECT_EQ(1, fake_cros_disks_client_->format_call_count()); 659 EXPECT_EQ(1, fake_cros_disks_client_->format_call_count());
446 EXPECT_EQ("/device/source_path", 660 EXPECT_EQ("/device/source_path",
447 fake_cros_disks_client_->last_format_device_path()); 661 fake_cros_disks_client_->last_format_device_path());
448 EXPECT_EQ("vfat", 662 EXPECT_EQ("vfat",
449 fake_cros_disks_client_->last_format_filesystem()); 663 fake_cros_disks_client_->last_format_filesystem());
450 664
451 // The device mount should be gone. 665 // The device mount should be gone.
452 EXPECT_FALSE(HasMountPoint("/device/mount_path")); 666 EXPECT_FALSE(HasMountPoint("/device/mount_path"));
453 } 667 }
454 668
669 // Verifies a |MountEvent| with the given condition. This function only checks
670 // the |mount_path| in |MountPointInfo| to make sure to match the event with
671 // preceding mount invocations.
672 void VerifyMountEvent(MountEvent mount_event,
673 DiskMountManager::MountEvent mount_event_type,
674 chromeos::MountError error_code,
675 const std::string& mount_path) {
676 EXPECT_EQ(mount_event_type, mount_event.event);
677 EXPECT_EQ(error_code, mount_event.error_code);
678 EXPECT_EQ(mount_path, mount_event.mount_point.mount_path);
679 }
680
455 // Tests the case when the format process actually starts and fails. 681 // Tests the case when the format process actually starts and fails.
456 TEST_F(DiskMountManagerTest, Format_FormatFails) { 682 TEST_F(DiskMountManagerTest, Format_FormatFails) {
457 // Both unmount and format device cals are successful in this test. 683 // Both unmount and format device cals are successful in this test.
458 684
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. 685 // Start the test.
487 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); 686 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path");
488 687
489 // Wait for Unmount and Format calls to end. 688 // Wait for Unmount and Format calls to end.
490 message_loop_.RunUntilIdle(); 689 message_loop_.RunUntilIdle();
491 690
492 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count()); 691 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count());
493 EXPECT_EQ("/device/mount_path", 692 EXPECT_EQ("/device/mount_path",
494 fake_cros_disks_client_->last_unmount_device_path()); 693 fake_cros_disks_client_->last_unmount_device_path());
495 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, 694 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE,
496 fake_cros_disks_client_->last_unmount_options()); 695 fake_cros_disks_client_->last_unmount_options());
497 EXPECT_EQ(1, fake_cros_disks_client_->format_call_count()); 696 EXPECT_EQ(1, fake_cros_disks_client_->format_call_count());
498 EXPECT_EQ("/device/source_path", 697 EXPECT_EQ("/device/source_path",
499 fake_cros_disks_client_->last_format_device_path()); 698 fake_cros_disks_client_->last_format_device_path());
500 EXPECT_EQ("vfat", fake_cros_disks_client_->last_format_filesystem()); 699 EXPECT_EQ("vfat", fake_cros_disks_client_->last_format_filesystem());
501 700
502 // The device should be unmounted by now. 701 // The device should be unmounted by now.
503 EXPECT_FALSE(HasMountPoint("/device/mount_path")); 702 EXPECT_FALSE(HasMountPoint("/device/mount_path"));
504 703
505 // Send failing FORMAT_COMPLETED signal. 704 // Send failing FORMAT_COMPLETED signal.
506 // The failure is marked by ! in fromt of the path (but this should change 705 // The failure is marked by ! in fromt of the path (but this should change
507 // soon). 706 // soon).
508 fake_cros_disks_client_->SendFormatCompletedEvent( 707 fake_cros_disks_client_->SendFormatCompletedEvent(
509 chromeos::FORMAT_ERROR_UNKNOWN, "/device/source_path"); 708 chromeos::FORMAT_ERROR_UNKNOWN, "/device/source_path");
709
710 // The observer should get notified that the device was unmounted and that
711 // formatting has started.
712 // After the formatting starts, the test will simulate failing
713 // FORMAT_COMPLETED signal, so the observer should also be notified the
714 // formatting has failed (FORMAT_COMPLETED event).
715 ASSERT_EQ(3U, observer_->GetEventCount());
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_UNKNOWN, "/device/source_path"),
723 observer_->GetFormatEvent(2));
510 } 724 }
511 725
512 // Tests the case when formatting completes successfully. 726 // Tests the case when formatting completes successfully.
513 TEST_F(DiskMountManagerTest, Format_FormatSuccess) { 727 TEST_F(DiskMountManagerTest, Format_FormatSuccess) {
514 // Set up cros disks client mocks. 728 // Set up cros disks client mocks.
515 // Both unmount and format device cals are successful in this test. 729 // Both unmount and format device cals are successful in this test.
516 730
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. 731 // Start the test.
542 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); 732 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path");
543 733
544 // Wait for Unmount and Format calls to end. 734 // Wait for Unmount and Format calls to end.
545 message_loop_.RunUntilIdle(); 735 message_loop_.RunUntilIdle();
546 736
547 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count()); 737 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count());
548 EXPECT_EQ("/device/mount_path", 738 EXPECT_EQ("/device/mount_path",
549 fake_cros_disks_client_->last_unmount_device_path()); 739 fake_cros_disks_client_->last_unmount_device_path());
550 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, 740 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE,
551 fake_cros_disks_client_->last_unmount_options()); 741 fake_cros_disks_client_->last_unmount_options());
552 EXPECT_EQ(1, fake_cros_disks_client_->format_call_count()); 742 EXPECT_EQ(1, fake_cros_disks_client_->format_call_count());
553 EXPECT_EQ("/device/source_path", 743 EXPECT_EQ("/device/source_path",
554 fake_cros_disks_client_->last_format_device_path()); 744 fake_cros_disks_client_->last_format_device_path());
555 EXPECT_EQ("vfat", fake_cros_disks_client_->last_format_filesystem()); 745 EXPECT_EQ("vfat", fake_cros_disks_client_->last_format_filesystem());
556 746
557 // The device should be unmounted by now. 747 // The device should be unmounted by now.
558 EXPECT_FALSE(HasMountPoint("/device/mount_path")); 748 EXPECT_FALSE(HasMountPoint("/device/mount_path"));
559 749
560 // Simulate cros_disks reporting success. 750 // Simulate cros_disks reporting success.
561 fake_cros_disks_client_->SendFormatCompletedEvent( 751 fake_cros_disks_client_->SendFormatCompletedEvent(
562 chromeos::FORMAT_ERROR_NONE, "/device/source_path"); 752 chromeos::FORMAT_ERROR_NONE, "/device/source_path");
753
754 // The observer should receive UNMOUNTING, FORMAT_STARTED and FORMAT_COMPLETED
755 // events (all of them without an error set).
756 ASSERT_GE(3U, observer_->GetEventCount());
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_NONE, "/device/source_path"),
764 observer_->GetFormatEvent(2));
563 } 765 }
564 766
565 // Tests that it's possible to format the device twice in a row (this may not be 767 // 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). 768 // true if the list of pending formats is not properly cleared).
567 TEST_F(DiskMountManagerTest, Format_ConsecutiveFormatCalls) { 769 TEST_F(DiskMountManagerTest, Format_ConsecutiveFormatCalls) {
568 // All unmount and format device cals are successful in this test. 770 // All unmount and format device cals are successful in this test.
569 // Each of the should be made twice (once for each formatting task). 771 // Each of the should be made twice (once for each formatting task).
570 772
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. 773 // Start the test.
602 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path"); 774 DiskMountManager::GetInstance()->FormatMountedDevice("/device/mount_path");
603 775
604 // Wait for Unmount and Format calls to end. 776 // Wait for Unmount and Format calls to end.
605 message_loop_.RunUntilIdle(); 777 message_loop_.RunUntilIdle();
606 778
607 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count()); 779 EXPECT_EQ(1, fake_cros_disks_client_->unmount_call_count());
608 EXPECT_EQ("/device/mount_path", 780 EXPECT_EQ("/device/mount_path",
609 fake_cros_disks_client_->last_unmount_device_path()); 781 fake_cros_disks_client_->last_unmount_device_path());
610 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE, 782 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, 814 EXPECT_EQ(chromeos::UNMOUNT_OPTIONS_NONE,
643 fake_cros_disks_client_->last_unmount_options()); 815 fake_cros_disks_client_->last_unmount_options());
644 EXPECT_EQ(2, fake_cros_disks_client_->format_call_count()); 816 EXPECT_EQ(2, fake_cros_disks_client_->format_call_count());
645 EXPECT_EQ("/device/source_path", 817 EXPECT_EQ("/device/source_path",
646 fake_cros_disks_client_->last_format_device_path()); 818 fake_cros_disks_client_->last_format_device_path());
647 EXPECT_EQ("vfat", fake_cros_disks_client_->last_format_filesystem()); 819 EXPECT_EQ("vfat", fake_cros_disks_client_->last_format_filesystem());
648 820
649 // Simulate cros_disks reporting success. 821 // Simulate cros_disks reporting success.
650 fake_cros_disks_client_->SendFormatCompletedEvent( 822 fake_cros_disks_client_->SendFormatCompletedEvent(
651 chromeos::FORMAT_ERROR_NONE, "/device/source_path"); 823 chromeos::FORMAT_ERROR_NONE, "/device/source_path");
824
825 // The observer should receive UNMOUNTING, FORMAT_STARTED and FORMAT_COMPLETED
826 // events (all of them without an error set) twice (once for each formatting
827 // task).
828 // Also, there should be a MOUNTING event when the device remounting is
829 // simulated.
830 EXPECT_EQ(7U, observer_->GetEventCount());
831
832 EXPECT_EQ(2U, observer_->CountFormatEvents(FormatEvent(
833 DiskMountManager::FORMAT_COMPLETED,
834 chromeos::FORMAT_ERROR_NONE, "/device/source_path")));
835
836 EXPECT_EQ(2U, observer_->CountFormatEvents(FormatEvent(
837 DiskMountManager::FORMAT_STARTED,
838 chromeos::FORMAT_ERROR_NONE, "/device/source_path")));
839
840 EXPECT_EQ(2U, observer_->CountMountEvents(DiskMountManager::UNMOUNTING,
841 chromeos::MOUNT_ERROR_NONE,
842 "/device/mount_path"));
843
844 EXPECT_EQ(1U, observer_->CountMountEvents(DiskMountManager::MOUNTING,
845 chromeos::MOUNT_ERROR_NONE,
846 "/device/mount_path"));
652 } 847 }
653 848
654 TEST_F(DiskMountManagerTest, MountPath_RecordAccessMode) { 849 TEST_F(DiskMountManagerTest, MountPath_RecordAccessMode) {
655 DiskMountManager* manager = DiskMountManager::GetInstance(); 850 DiskMountManager* manager = DiskMountManager::GetInstance();
656 const std::string kSourcePath1 = "/device/source_path"; 851 const std::string kSourcePath1 = "/device/source_path";
657 const std::string kSourcePath2 = "/device/source_path2"; 852 const std::string kSourcePath2 = "/device/source_path2";
658 const std::string kSourceFormat = std::string(); 853 const std::string kSourceFormat = std::string();
659 const std::string kMountLabel = std::string(); // N/A for MOUNT_TYPE_DEVICE 854 const std::string kMountLabel = std::string(); // N/A for MOUNT_TYPE_DEVICE
660 // For MountCompleted. Must be non-empty strings. 855 // For MountCompleted. Must be non-empty strings.
661 const std::string kMountPath1 = "/media/foo"; 856 const std::string kMountPath1 = "/media/foo";
662 const std::string kMountPath2 = "/media/bar"; 857 const std::string kMountPath2 = "/media/bar";
663 858
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(), 859 manager->MountPath(kSourcePath1, kSourceFormat, std::string(),
686 chromeos::MOUNT_TYPE_DEVICE, 860 chromeos::MOUNT_TYPE_DEVICE,
687 chromeos::MOUNT_ACCESS_MODE_READ_WRITE); 861 chromeos::MOUNT_ACCESS_MODE_READ_WRITE);
688 manager->MountPath(kSourcePath2, kSourceFormat, std::string(), 862 manager->MountPath(kSourcePath2, kSourceFormat, std::string(),
689 chromeos::MOUNT_TYPE_DEVICE, 863 chromeos::MOUNT_TYPE_DEVICE,
690 chromeos::MOUNT_ACCESS_MODE_READ_ONLY); 864 chromeos::MOUNT_ACCESS_MODE_READ_ONLY);
691 // Simulate cros_disks reporting mount completed. 865 // Simulate cros_disks reporting mount completed.
692 fake_cros_disks_client_->SendMountCompletedEvent( 866 fake_cros_disks_client_->SendMountCompletedEvent(
693 chromeos::MOUNT_ERROR_NONE, kSourcePath1, chromeos::MOUNT_TYPE_DEVICE, 867 chromeos::MOUNT_ERROR_NONE, kSourcePath1, chromeos::MOUNT_TYPE_DEVICE,
694 kMountPath1); 868 kMountPath1);
695 fake_cros_disks_client_->SendMountCompletedEvent( 869 fake_cros_disks_client_->SendMountCompletedEvent(
696 chromeos::MOUNT_ERROR_NONE, kSourcePath2, chromeos::MOUNT_TYPE_DEVICE, 870 chromeos::MOUNT_ERROR_NONE, kSourcePath2, chromeos::MOUNT_TYPE_DEVICE,
697 kMountPath2); 871 kMountPath2);
698 872
873 // Event handlers of observers should be called.
874 ASSERT_GE(2U, observer_->GetEventCount());
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 TEST_F(DiskMountManagerTest, MountPath_ReadOnlyDevice) { 898 TEST_F(DiskMountManagerTest, MountPath_ReadOnlyDevice) {
707 DiskMountManager* manager = DiskMountManager::GetInstance(); 899 DiskMountManager* manager = DiskMountManager::GetInstance();
708 const std::string kSourceFormat = std::string(); 900 const std::string kSourceFormat = std::string();
709 const std::string kMountLabel = std::string(); // N/A for MOUNT_TYPE_DEVICE 901 const std::string kMountLabel = std::string(); // N/A for MOUNT_TYPE_DEVICE
710 902
711 // Event handlers of observers should be called.
712 EXPECT_CALL(
713 observer_,
714 OnMountEvent(DiskMountManager::MOUNTING, chromeos::MOUNT_ERROR_NONE,
715 Field(&DiskMountManager::MountPointInfo::mount_path,
716 kReadOnlyMountpath)));
717
718 // Attempt to mount a read-only device in read-write mode. 903 // Attempt to mount a read-only device in read-write mode.
719 manager->MountPath(kReadOnlyDeviceSource, kSourceFormat, std::string(), 904 manager->MountPath(kReadOnlyDeviceSource, kSourceFormat, std::string(),
720 chromeos::MOUNT_TYPE_DEVICE, 905 chromeos::MOUNT_TYPE_DEVICE,
721 chromeos::MOUNT_ACCESS_MODE_READ_WRITE); 906 chromeos::MOUNT_ACCESS_MODE_READ_WRITE);
722 // Simulate cros_disks reporting mount completed. 907 // Simulate cros_disks reporting mount completed.
723 fake_cros_disks_client_->SendMountCompletedEvent( 908 fake_cros_disks_client_->SendMountCompletedEvent(
724 chromeos::MOUNT_ERROR_NONE, kReadOnlyDeviceSource, 909 chromeos::MOUNT_ERROR_NONE, kReadOnlyDeviceSource,
725 chromeos::MOUNT_TYPE_DEVICE, kReadOnlyMountpath); 910 chromeos::MOUNT_TYPE_DEVICE, kReadOnlyMountpath);
726 911
912 // Event handlers of observers should be called.
913 ASSERT_GE(1U, observer_->GetEventCount());
914 VerifyMountEvent(observer_->GetMountEvent(0), DiskMountManager::MOUNTING,
915 chromeos::MOUNT_ERROR_NONE, kReadOnlyMountpath);
727 const DiskMountManager::DiskMap& disks = manager->disks(); 916 const DiskMountManager::DiskMap& disks = manager->disks();
728 ASSERT_GT(disks.count(kReadOnlyDeviceSource), 0U); 917 ASSERT_GT(disks.count(kReadOnlyDeviceSource), 0U);
729 // The mounted disk should preserve the read-only flag of the block device. 918 // The mounted disk should preserve the read-only flag of the block device.
730 EXPECT_TRUE(disks.find(kReadOnlyDeviceSource)->second->is_read_only()); 919 EXPECT_TRUE(disks.find(kReadOnlyDeviceSource)->second->is_read_only());
731 } 920 }
732 921
733 } // namespace 922 } // 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