OLD | NEW |
---|---|
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 <sstream> | |
satorux1
2016/08/30 07:27:29
Streams are not recommended. let's use StringPrint
yamaguchi
2016/08/30 09:49:18
Done.
| |
9 | |
8 #include "base/bind.h" | 10 #include "base/bind.h" |
9 #include "base/message_loop/message_loop.h" | 11 #include "base/message_loop/message_loop.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" | 15 #include "testing/gmock/include/gmock/gmock.h" |
14 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
15 | 17 |
16 using chromeos::disks::DiskMountManager; | 18 using chromeos::disks::DiskMountManager; |
17 using chromeos::CrosDisksClient; | 19 using chromeos::CrosDisksClient; |
18 using chromeos::DBusThreadManager; | 20 using chromeos::DBusThreadManager; |
19 using chromeos::FakeCrosDisksClient; | 21 using chromeos::FakeCrosDisksClient; |
22 using chromeos::MountType; | |
23 using chromeos::disks::MountCondition; | |
20 using testing::_; | 24 using testing::_; |
21 using testing::Field; | 25 using testing::Field; |
22 using testing::InSequence; | 26 using testing::InSequence; |
23 using testing::InvokeWithoutArgs; | 27 using testing::InvokeWithoutArgs; |
24 | 28 |
25 namespace { | 29 namespace { |
26 | 30 |
27 const char kReadOnlyMountpath[] = "/device/read_only_mount_path"; | 31 const char kReadOnlyMountpath[] = "/device/read_only_mount_path"; |
28 const char kReadOnlyDeviceSource[] = "/device/read_only_source_path"; | 32 const char kReadOnlyDeviceSource[] = "/device/read_only_source_path"; |
29 | 33 |
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
144 chromeos::disks::MOUNT_CONDITION_NONE | 148 chromeos::disks::MOUNT_CONDITION_NONE |
145 }, | 149 }, |
146 { | 150 { |
147 kReadOnlyDeviceSource, | 151 kReadOnlyDeviceSource, |
148 kReadOnlyMountpath, | 152 kReadOnlyMountpath, |
149 chromeos::MOUNT_TYPE_DEVICE, | 153 chromeos::MOUNT_TYPE_DEVICE, |
150 chromeos::disks::MOUNT_CONDITION_NONE | 154 chromeos::disks::MOUNT_CONDITION_NONE |
151 }, | 155 }, |
152 }; | 156 }; |
153 | 157 |
154 // Mocks DiskMountManager observer. | 158 // Mocks DiskMountManager observer using Google Mock. |
155 class MockDiskMountManagerObserver : public DiskMountManager::Observer { | 159 // TODO(yamaguchi): remove this class when all tests migrated to the new |
160 // MockDiskMountManagerObserver. | |
satorux1
2016/08/30 07:27:29
Can you update the tests in the same patch? That'd
yamaguchi
2016/08/30 09:49:18
Updated the tests.
| |
161 class GmockDiskMountManagerObserver : public DiskMountManager::Observer { | |
156 public: | 162 public: |
157 virtual ~MockDiskMountManagerObserver() {} | 163 virtual ~GmockDiskMountManagerObserver() {} |
158 | 164 |
159 MOCK_METHOD2(OnDiskEvent, void(DiskMountManager::DiskEvent event, | 165 MOCK_METHOD2(OnDiskEvent, void(DiskMountManager::DiskEvent event, |
160 const DiskMountManager::Disk* disk)); | 166 const DiskMountManager::Disk* disk)); |
161 MOCK_METHOD2(OnDeviceEvent, void(DiskMountManager::DeviceEvent event, | 167 MOCK_METHOD2(OnDeviceEvent, void(DiskMountManager::DeviceEvent event, |
162 const std::string& device_path)); | 168 const std::string& device_path)); |
163 MOCK_METHOD3(OnMountEvent, | 169 MOCK_METHOD3(OnMountEvent, |
164 void(DiskMountManager::MountEvent event, | 170 void(DiskMountManager::MountEvent event, |
165 chromeos::MountError error_code, | 171 chromeos::MountError error_code, |
166 const DiskMountManager::MountPointInfo& mount_point)); | 172 const DiskMountManager::MountPointInfo& mount_point)); |
167 MOCK_METHOD3(OnFormatEvent, | 173 MOCK_METHOD3(OnFormatEvent, |
168 void(DiskMountManager::FormatEvent event, | 174 void(DiskMountManager::FormatEvent event, |
169 chromeos::FormatError error_code, | 175 chromeos::FormatError error_code, |
170 const std::string& device_path)); | 176 const std::string& device_path)); |
171 }; | 177 }; |
172 | 178 |
179 // Event classes which represents each invocation of functions in |Observer|. | |
satorux1
2016/08/30 07:27:29
represents -> represent
yamaguchi
2016/08/30 09:49:18
Done.
| |
180 // OnDeviceEvent() | |
181 class DeviceEvent { | |
satorux1
2016/08/30 07:27:29
can this be just a struct? ditto with other simila
yamaguchi
2016/08/30 09:49:18
Done.
| |
182 public: | |
183 DeviceEvent() {} | |
184 ~DeviceEvent() {} | |
185 | |
186 DeviceEvent(DiskMountManager::DeviceEvent event, | |
187 const std::string& device_path) | |
188 : event_(event), device_path_(device_path) {} | |
189 | |
190 DeviceEvent(const DeviceEvent& other) | |
191 : event_(other.event_), device_path_(other.device_path_) {} | |
192 | |
193 bool operator==(const DeviceEvent& other) const { | |
194 return event_ == other.event_ && device_path_ == other.device_path_; | |
195 } | |
196 | |
197 DiskMountManager::DeviceEvent GetEvent() const { return event_; } | |
198 | |
199 const std::string& GetDevicePath() const { return device_path_; } | |
200 | |
201 std::string DebugString() const { | |
202 std::stringstream ss; | |
203 ss << "OnDeviceEvent(" << event_ << ", " << device_path_ << ")"; | |
204 return ss.str(); | |
205 } | |
206 | |
207 private: | |
208 DiskMountManager::DeviceEvent event_; | |
209 std::string device_path_; | |
210 }; | |
211 | |
212 // OnDiskEvent() | |
213 class DiskEvent { | |
214 public: | |
215 DiskEvent() {} | |
216 | |
217 DiskEvent(DiskMountManager::DiskEvent event, | |
218 const DiskMountManager::Disk* disk) | |
219 : event_(event), disk_(disk) {} | |
220 | |
221 DiskEvent(const DiskEvent& other) | |
222 : event_(other.event_), disk_(other.disk_) {} | |
223 | |
224 DiskEvent& operator=(const DiskEvent& other) { | |
225 event_ = other.event_; | |
226 disk_ = other.disk_; | |
227 return *this; | |
228 } | |
229 | |
230 bool operator==(const DiskEvent& other) const { | |
231 return event_ == other.event_ && disk_ == other.disk_; | |
232 } | |
233 | |
234 std::string DebugString() const { | |
235 std::stringstream ss; | |
236 ss << "OnDiskEvent(event=" << event_ | |
237 << ", device_path=" << disk_->device_path() | |
238 << ", mount_path=" << disk_->mount_path() << ")"; | |
239 return ss.str(); | |
240 } | |
241 | |
242 private: | |
243 DiskMountManager::DiskEvent event_; | |
244 const DiskMountManager::Disk* disk_; | |
245 }; | |
246 | |
247 // OnFormatEvent() | |
248 class FormatEvent { | |
249 public: | |
250 FormatEvent() {} | |
251 FormatEvent(DiskMountManager::FormatEvent event, | |
252 chromeos::FormatError error_code, | |
253 const std::string& device_path) | |
254 : event_(event), error_code_(error_code), device_path_(device_path) {} | |
255 | |
256 bool operator==(const FormatEvent& other) const { | |
257 return event_ == other.event_ && error_code_ == other.error_code_ && | |
258 device_path_ == other.device_path_; | |
259 } | |
260 | |
261 DiskMountManager::FormatEvent GetEvent() const { return event_; } | |
262 | |
263 chromeos::FormatError GetErrorCode() const { return error_code_; } | |
264 | |
265 const std::string& GetDevicePath() const { return device_path_; } | |
266 | |
267 std::string DebugString() const { | |
268 std::stringstream ss; | |
269 ss << "OnFormatEvent(" << event_ << ", " << error_code_ << ", " | |
270 << device_path_ << ")"; | |
271 return ss.str(); | |
272 } | |
273 | |
274 private: | |
275 DiskMountManager::FormatEvent event_; | |
276 chromeos::FormatError error_code_; | |
277 std::string device_path_; | |
278 }; | |
279 | |
280 // OnMountEvent() | |
281 class MountEvent { | |
282 public: | |
283 const DiskMountManager::MountEvent& GetEvent() const { return event_; } | |
284 chromeos::MountError GetErrorCode() const { return error_code_; } | |
285 const DiskMountManager::MountPointInfo& GetMountPoint() const { | |
286 return mount_point_; | |
287 } | |
288 | |
289 MountEvent() | |
290 : mount_point_("", | |
291 "", | |
292 MountType::MOUNT_TYPE_INVALID, | |
293 MountCondition::MOUNT_CONDITION_NONE) {} | |
294 ~MountEvent() {} | |
295 | |
296 MountEvent(const MountEvent& other) | |
297 : event_(other.event_), | |
298 error_code_(other.error_code_), | |
299 mount_point_(other.mount_point_), | |
300 disk_(other.disk_) {} | |
301 MountEvent(DiskMountManager::MountEvent event, | |
302 chromeos::MountError error_code, | |
303 const DiskMountManager::MountPointInfo& mount_point, | |
304 std::shared_ptr<DiskMountManager::Disk> disk) | |
305 : event_(event), | |
306 error_code_(error_code), | |
307 mount_point_(mount_point), | |
308 disk_(disk) {} | |
309 | |
310 bool operator==(const MountEvent& other) const; | |
311 | |
312 std::string DebugString() const { | |
313 std::stringstream ss; | |
314 ss << "OnMountEvent(" << event_ << ", " << error_code_ << ", " | |
315 << mount_point_.source_path << ", " << mount_point_.mount_path << ", " | |
316 << mount_point_.mount_type << ", " << mount_point_.mount_condition | |
317 << ")"; | |
318 return ss.str(); | |
319 } | |
320 | |
321 private: | |
322 DiskMountManager::MountEvent event_; | |
323 chromeos::MountError error_code_; | |
324 DiskMountManager::MountPointInfo mount_point_; | |
325 | |
326 // Not passed to callback, but read by handlers. So it's captured upon | |
327 // callback. | |
328 std::shared_ptr<DiskMountManager::Disk> disk_; | |
329 }; | |
330 | |
331 // Represents every event notified to |Observer|. | |
332 class ObserverEvent { | |
333 private: | |
334 struct Event { | |
335 DeviceEvent device; | |
336 DiskEvent disk; | |
337 FormatEvent format; | |
338 MountEvent mount; | |
339 Event() {} | |
340 Event(const Event& other) | |
341 : device(other.device), | |
342 disk(other.disk), | |
343 format(other.format), | |
344 mount(other.mount) {} | |
345 ~Event() {} | |
346 } event_; | |
347 ObserverEvent() {} | |
348 | |
349 public: | |
350 enum ObserverEventType { | |
351 DEVICE_EVENT, | |
352 DISK_EVENT, | |
353 FORMAT_EVENT, | |
354 MOUNT_EVENT | |
355 } type_; | |
356 | |
357 static ObserverEvent FromDeviceEvent(DeviceEvent event) { | |
358 ObserverEvent result; | |
359 result.type_ = DEVICE_EVENT; | |
360 result.event_.device = event; | |
361 return result; | |
362 } | |
363 | |
364 static ObserverEvent FromDiskEvent(DiskEvent event) { | |
365 ObserverEvent result; | |
366 result.type_ = DISK_EVENT; | |
367 result.event_.disk = event; | |
368 return result; | |
369 } | |
370 | |
371 static ObserverEvent FromFormatEvent(FormatEvent event) { | |
372 ObserverEvent result; | |
373 result.type_ = FORMAT_EVENT; | |
374 result.event_.format = event; | |
375 return result; | |
376 } | |
377 | |
378 static ObserverEvent FromMountEvent(MountEvent event) { | |
379 ObserverEvent result; | |
380 result.type_ = MOUNT_EVENT; | |
381 result.event_.mount = event; | |
382 return result; | |
383 } | |
384 | |
385 ObserverEvent(const ObserverEvent& other) : type_(other.type_) { | |
386 switch (other.type_) { | |
387 case DEVICE_EVENT: | |
388 event_.device = other.event_.device; | |
389 break; | |
390 case DISK_EVENT: | |
391 event_.disk = other.event_.disk; | |
392 break; | |
393 case FORMAT_EVENT: | |
394 event_.format = other.event_.format; | |
395 break; | |
396 case MOUNT_EVENT: | |
397 event_.mount = other.event_.mount; | |
398 break; | |
399 } | |
400 } | |
401 | |
402 Event GetEvent() { return event_; } | |
403 | |
404 ObserverEventType GetType() { return type_; } | |
405 | |
406 std::string DebugString() const { | |
407 switch (type_) { | |
408 case DEVICE_EVENT: | |
409 return event_.device.DebugString(); | |
410 case DISK_EVENT: | |
411 return event_.disk.DebugString(); | |
412 case FORMAT_EVENT: | |
413 return event_.format.DebugString(); | |
414 case MOUNT_EVENT: | |
415 return event_.mount.DebugString(); | |
416 } | |
417 return "(Unknown event type)"; | |
418 } | |
419 }; | |
420 | |
421 // A mock |Observer| class which records all invocation of the methods invoked | |
422 // from DiskMountManager and all the arguments passed to them. | |
423 class MockDiskMountManagerObserver : public DiskMountManager::Observer { | |
424 public: | |
425 MockDiskMountManagerObserver(const DiskMountManager* manager) | |
426 : manager_(manager) {} | |
427 ~MockDiskMountManagerObserver() override {} | |
428 | |
429 // Mock notify methods. | |
430 void OnDeviceEvent(DiskMountManager::DeviceEvent event, | |
431 const std::string& device_path) override { | |
432 events_.push_back( | |
433 ObserverEvent::FromDeviceEvent(DeviceEvent(event, device_path))); | |
434 } | |
435 | |
436 void OnDiskEvent(DiskMountManager::DiskEvent event, | |
437 const DiskMountManager::Disk* disk) override { | |
438 // Take a snapshot (copy) of the Disk object at the time of invocation for | |
439 // later verification. | |
440 events_.push_back(ObserverEvent::FromDiskEvent( | |
441 DiskEvent(event, new DiskMountManager::Disk(*disk)))); | |
442 } | |
443 | |
444 void OnFormatEvent(DiskMountManager::FormatEvent event, | |
445 chromeos::FormatError error_code, | |
446 const std::string& device_path) override { | |
447 events_.push_back(ObserverEvent::FromFormatEvent( | |
448 FormatEvent(event, error_code, device_path))); | |
449 } | |
450 | |
451 void OnMountEvent( | |
452 DiskMountManager::MountEvent event, | |
453 chromeos::MountError error_code, | |
454 const DiskMountManager::MountPointInfo& mount_point) override { | |
455 // Take a snapshot (copy) of a Disk object at the time of invocation. | |
456 // It can be verified later besides the arguments. | |
457 events_.push_back(ObserverEvent::FromMountEvent(MountEvent( | |
458 event, error_code, mount_point, | |
459 std::shared_ptr<DiskMountManager::Disk>(new DiskMountManager::Disk( | |
460 *manager_->disks().find(mount_point.source_path)->second))))); | |
461 } | |
462 | |
463 // Get invocation history to be verified by testcases. | |
464 DeviceEvent GetDeviceEvent(size_t index) { | |
465 assert(events_.size() >= index + 1); | |
466 assert(ObserverEvent::DEVICE_EVENT == events_.at(index).GetType()); | |
467 return events_[index].GetEvent().device; | |
468 } | |
469 | |
470 DiskEvent GetDiskEvent(size_t index) { | |
471 assert(events_.size() >= index + 1); | |
satorux1
2016/08/30 07:27:29
assert -> DCHECK
satorux1
2016/08/30 07:28:06
for this casek DCHECK_GE
yamaguchi
2016/08/30 09:49:18
Done.
yamaguchi
2016/08/30 09:49:18
Done.
| |
472 assert(ObserverEvent::DISK_EVENT == events_.at(index).GetType()); | |
473 return events_[index].GetEvent().disk; | |
474 } | |
475 | |
476 FormatEvent GetFormatEvent(size_t index) { | |
477 assert(events_.size() >= index + 1); | |
478 assert(ObserverEvent::FORMAT_EVENT == events_.at(index).GetType()); | |
479 return events_[index].GetEvent().format; | |
480 } | |
481 | |
482 MountEvent GetMountEvent(size_t index) { | |
483 assert(events_.size() >= index + 1); | |
484 assert(ObserverEvent::MOUNT_EVENT == events_.at(index).GetType()); | |
485 return events_[index].GetEvent().mount; | |
486 } | |
487 | |
488 size_t GetEventCount() { return events_.size(); } | |
489 | |
490 ObserverEvent GetEvent(size_t index) { return events_.at(index); } | |
491 | |
492 private: | |
493 // Pointer to the manager object to which this |Observer| is registered. | |
494 const DiskMountManager* manager_; | |
495 | |
496 // Records all invocations. | |
497 std::vector<ObserverEvent> events_; | |
498 }; | |
499 | |
500 // Shift operators of ostream. | |
501 // Needed to print values in case of EXPECT_* failure in gtest. | |
502 std::ostream& operator<<(std::ostream& stream, | |
503 const DeviceEvent& device_event) { | |
504 return stream << device_event.DebugString(); | |
505 } | |
506 | |
507 std::ostream& operator<<(std::ostream& stream, const DiskEvent& disk_event) { | |
508 return stream << disk_event.DebugString(); | |
509 } | |
510 | |
511 std::ostream& operator<<(std::ostream& stream, | |
512 const FormatEvent& format_event) { | |
513 return stream << format_event.DebugString(); | |
514 } | |
515 | |
516 std::ostream& operator<<(std::ostream& stream, const MountEvent& mount_event) { | |
517 return stream << mount_event.DebugString(); | |
518 } | |
519 | |
520 std::ostream& operator<<(std::ostream& stream, const ObserverEvent& event) { | |
521 return stream << event.DebugString(); | |
522 } | |
523 | |
173 // Expect |is_read_only| value of a disk object keyed by |source_path|. | 524 // Expect |is_read_only| value of a disk object keyed by |source_path|. |
174 void ExpectDiskReadOnly(const DiskMountManager* manager, | 525 void ExpectDiskReadOnly(const DiskMountManager* manager, |
175 const std::string& source_path, | 526 const std::string& source_path, |
176 bool expected) { | 527 bool expected) { |
177 EXPECT_EQ(expected, | 528 EXPECT_EQ(expected, |
178 manager->disks().find(source_path)->second->is_read_only()); | 529 manager->disks().find(source_path)->second->is_read_only()); |
179 } | 530 } |
180 | 531 |
181 class DiskMountManagerTest : public testing::Test { | 532 class DiskMountManagerTest : public testing::Test { |
182 public: | 533 public: |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
257 // expected that the corresponding disk is already added). | 608 // expected that the corresponding disk is already added). |
258 for (size_t i = 0; i < arraysize(kTestDisks); i++) | 609 for (size_t i = 0; i < arraysize(kTestDisks); i++) |
259 AddTestDisk(kTestDisks[i]); | 610 AddTestDisk(kTestDisks[i]); |
260 | 611 |
261 for (size_t i = 0; i < arraysize(kTestMountPoints); i++) | 612 for (size_t i = 0; i < arraysize(kTestMountPoints); i++) |
262 AddTestMountPoint(kTestMountPoints[i]); | 613 AddTestMountPoint(kTestMountPoints[i]); |
263 } | 614 } |
264 | 615 |
265 protected: | 616 protected: |
266 chromeos::FakeCrosDisksClient* fake_cros_disks_client_; | 617 chromeos::FakeCrosDisksClient* fake_cros_disks_client_; |
267 MockDiskMountManagerObserver observer_; | 618 GmockDiskMountManagerObserver observer_; |
268 base::MessageLoopForUI message_loop_; | 619 base::MessageLoopForUI message_loop_; |
269 }; | 620 }; |
270 | 621 |
271 // Tests that the observer gets notified on attempt to format non existent mount | 622 // Tests that the observer gets notified on attempt to format non existent mount |
272 // point. | 623 // point. |
273 TEST_F(DiskMountManagerTest, Format_NotMounted) { | 624 TEST_F(DiskMountManagerTest, Format_NotMounted) { |
274 EXPECT_CALL(observer_, OnFormatEvent(DiskMountManager::FORMAT_COMPLETED, | 625 EXPECT_CALL(observer_, OnFormatEvent(DiskMountManager::FORMAT_COMPLETED, |
275 chromeos::FORMAT_ERROR_UNKNOWN, | 626 chromeos::FORMAT_ERROR_UNKNOWN, |
276 "/mount/non_existent")) | 627 "/mount/non_existent")) |
277 .Times(1); | 628 .Times(1); |
(...skipping 419 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
697 kMountPath2); | 1048 kMountPath2); |
698 | 1049 |
699 const DiskMountManager::DiskMap& disks = manager->disks(); | 1050 const DiskMountManager::DiskMap& disks = manager->disks(); |
700 ASSERT_GT(disks.count(kSourcePath1), 0U); | 1051 ASSERT_GT(disks.count(kSourcePath1), 0U); |
701 EXPECT_FALSE(disks.find(kSourcePath1)->second->is_read_only()); | 1052 EXPECT_FALSE(disks.find(kSourcePath1)->second->is_read_only()); |
702 ASSERT_GT(disks.count(kSourcePath2), 0U); | 1053 ASSERT_GT(disks.count(kSourcePath2), 0U); |
703 EXPECT_TRUE(disks.find(kSourcePath2)->second->is_read_only()); | 1054 EXPECT_TRUE(disks.find(kSourcePath2)->second->is_read_only()); |
704 } | 1055 } |
705 | 1056 |
706 } // namespace | 1057 } // namespace |
OLD | NEW |