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

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

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