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

Unified 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: Add TODO comment. Created 4 years, 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chromeos/disks/disk_mount_manager_unittest.cc
diff --git a/chromeos/disks/disk_mount_manager_unittest.cc b/chromeos/disks/disk_mount_manager_unittest.cc
index e104750629944de22db7f010562278d0808636f4..783944772aea734f51231d38253bcad26c4ed812 100644
--- a/chromeos/disks/disk_mount_manager_unittest.cc
+++ b/chromeos/disks/disk_mount_manager_unittest.cc
@@ -5,6 +5,8 @@
#include <stddef.h>
#include <stdint.h>
+#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.
+
#include "base/bind.h"
#include "base/message_loop/message_loop.h"
#include "chromeos/dbus/dbus_thread_manager.h"
@@ -17,6 +19,8 @@ using chromeos::disks::DiskMountManager;
using chromeos::CrosDisksClient;
using chromeos::DBusThreadManager;
using chromeos::FakeCrosDisksClient;
+using chromeos::MountType;
+using chromeos::disks::MountCondition;
using testing::_;
using testing::Field;
using testing::InSequence;
@@ -151,10 +155,12 @@ const TestMountPointInfo kTestMountPoints[] = {
},
};
-// Mocks DiskMountManager observer.
-class MockDiskMountManagerObserver : public DiskMountManager::Observer {
+// Mocks DiskMountManager observer using Google Mock.
+// TODO(yamaguchi): remove this class when all tests migrated to the new
+// 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.
+class GmockDiskMountManagerObserver : public DiskMountManager::Observer {
public:
- virtual ~MockDiskMountManagerObserver() {}
+ virtual ~GmockDiskMountManagerObserver() {}
MOCK_METHOD2(OnDiskEvent, void(DiskMountManager::DiskEvent event,
const DiskMountManager::Disk* disk));
@@ -170,6 +176,351 @@ class MockDiskMountManagerObserver : public DiskMountManager::Observer {
const std::string& device_path));
};
+// 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.
+// OnDeviceEvent()
+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.
+ public:
+ DeviceEvent() {}
+ ~DeviceEvent() {}
+
+ DeviceEvent(DiskMountManager::DeviceEvent event,
+ const std::string& device_path)
+ : event_(event), device_path_(device_path) {}
+
+ DeviceEvent(const DeviceEvent& other)
+ : event_(other.event_), device_path_(other.device_path_) {}
+
+ bool operator==(const DeviceEvent& other) const {
+ return event_ == other.event_ && device_path_ == other.device_path_;
+ }
+
+ DiskMountManager::DeviceEvent GetEvent() const { return event_; }
+
+ const std::string& GetDevicePath() const { return device_path_; }
+
+ std::string DebugString() const {
+ std::stringstream ss;
+ ss << "OnDeviceEvent(" << event_ << ", " << device_path_ << ")";
+ return ss.str();
+ }
+
+ private:
+ DiskMountManager::DeviceEvent event_;
+ std::string device_path_;
+};
+
+// OnDiskEvent()
+class DiskEvent {
+ public:
+ DiskEvent() {}
+
+ DiskEvent(DiskMountManager::DiskEvent event,
+ const DiskMountManager::Disk* disk)
+ : event_(event), disk_(disk) {}
+
+ DiskEvent(const DiskEvent& other)
+ : event_(other.event_), disk_(other.disk_) {}
+
+ DiskEvent& operator=(const DiskEvent& other) {
+ event_ = other.event_;
+ disk_ = other.disk_;
+ return *this;
+ }
+
+ bool operator==(const DiskEvent& other) const {
+ return event_ == other.event_ && disk_ == other.disk_;
+ }
+
+ std::string DebugString() const {
+ std::stringstream ss;
+ ss << "OnDiskEvent(event=" << event_
+ << ", device_path=" << disk_->device_path()
+ << ", mount_path=" << disk_->mount_path() << ")";
+ return ss.str();
+ }
+
+ private:
+ DiskMountManager::DiskEvent event_;
+ const DiskMountManager::Disk* disk_;
+};
+
+// OnFormatEvent()
+class FormatEvent {
+ public:
+ FormatEvent() {}
+ FormatEvent(DiskMountManager::FormatEvent event,
+ chromeos::FormatError error_code,
+ const std::string& device_path)
+ : event_(event), error_code_(error_code), device_path_(device_path) {}
+
+ bool operator==(const FormatEvent& other) const {
+ return event_ == other.event_ && error_code_ == other.error_code_ &&
+ device_path_ == other.device_path_;
+ }
+
+ DiskMountManager::FormatEvent GetEvent() const { return event_; }
+
+ chromeos::FormatError GetErrorCode() const { return error_code_; }
+
+ const std::string& GetDevicePath() const { return device_path_; }
+
+ std::string DebugString() const {
+ std::stringstream ss;
+ ss << "OnFormatEvent(" << event_ << ", " << error_code_ << ", "
+ << device_path_ << ")";
+ return ss.str();
+ }
+
+ private:
+ DiskMountManager::FormatEvent event_;
+ chromeos::FormatError error_code_;
+ std::string device_path_;
+};
+
+// OnMountEvent()
+class MountEvent {
+ public:
+ const DiskMountManager::MountEvent& GetEvent() const { return event_; }
+ chromeos::MountError GetErrorCode() const { return error_code_; }
+ const DiskMountManager::MountPointInfo& GetMountPoint() const {
+ return mount_point_;
+ }
+
+ MountEvent()
+ : mount_point_("",
+ "",
+ MountType::MOUNT_TYPE_INVALID,
+ MountCondition::MOUNT_CONDITION_NONE) {}
+ ~MountEvent() {}
+
+ MountEvent(const MountEvent& other)
+ : event_(other.event_),
+ error_code_(other.error_code_),
+ mount_point_(other.mount_point_),
+ disk_(other.disk_) {}
+ MountEvent(DiskMountManager::MountEvent event,
+ chromeos::MountError error_code,
+ const DiskMountManager::MountPointInfo& mount_point,
+ std::shared_ptr<DiskMountManager::Disk> disk)
+ : event_(event),
+ error_code_(error_code),
+ mount_point_(mount_point),
+ disk_(disk) {}
+
+ bool operator==(const MountEvent& other) const;
+
+ std::string DebugString() const {
+ std::stringstream ss;
+ ss << "OnMountEvent(" << event_ << ", " << error_code_ << ", "
+ << mount_point_.source_path << ", " << mount_point_.mount_path << ", "
+ << mount_point_.mount_type << ", " << mount_point_.mount_condition
+ << ")";
+ return ss.str();
+ }
+
+ private:
+ DiskMountManager::MountEvent event_;
+ chromeos::MountError error_code_;
+ DiskMountManager::MountPointInfo mount_point_;
+
+ // Not passed to callback, but read by handlers. So it's captured upon
+ // callback.
+ std::shared_ptr<DiskMountManager::Disk> disk_;
+};
+
+// Represents every event notified to |Observer|.
+class ObserverEvent {
+ private:
+ struct Event {
+ DeviceEvent device;
+ DiskEvent disk;
+ FormatEvent format;
+ MountEvent mount;
+ Event() {}
+ Event(const Event& other)
+ : device(other.device),
+ disk(other.disk),
+ format(other.format),
+ mount(other.mount) {}
+ ~Event() {}
+ } event_;
+ ObserverEvent() {}
+
+ public:
+ enum ObserverEventType {
+ DEVICE_EVENT,
+ DISK_EVENT,
+ FORMAT_EVENT,
+ MOUNT_EVENT
+ } type_;
+
+ static ObserverEvent FromDeviceEvent(DeviceEvent event) {
+ ObserverEvent result;
+ result.type_ = DEVICE_EVENT;
+ result.event_.device = event;
+ return result;
+ }
+
+ static ObserverEvent FromDiskEvent(DiskEvent event) {
+ ObserverEvent result;
+ result.type_ = DISK_EVENT;
+ result.event_.disk = event;
+ return result;
+ }
+
+ static ObserverEvent FromFormatEvent(FormatEvent event) {
+ ObserverEvent result;
+ result.type_ = FORMAT_EVENT;
+ result.event_.format = event;
+ return result;
+ }
+
+ static ObserverEvent FromMountEvent(MountEvent event) {
+ ObserverEvent result;
+ result.type_ = MOUNT_EVENT;
+ result.event_.mount = event;
+ return result;
+ }
+
+ ObserverEvent(const ObserverEvent& other) : type_(other.type_) {
+ switch (other.type_) {
+ case DEVICE_EVENT:
+ event_.device = other.event_.device;
+ break;
+ case DISK_EVENT:
+ event_.disk = other.event_.disk;
+ break;
+ case FORMAT_EVENT:
+ event_.format = other.event_.format;
+ break;
+ case MOUNT_EVENT:
+ event_.mount = other.event_.mount;
+ break;
+ }
+ }
+
+ Event GetEvent() { return event_; }
+
+ ObserverEventType GetType() { return type_; }
+
+ std::string DebugString() const {
+ switch (type_) {
+ case DEVICE_EVENT:
+ return event_.device.DebugString();
+ case DISK_EVENT:
+ return event_.disk.DebugString();
+ case FORMAT_EVENT:
+ return event_.format.DebugString();
+ case MOUNT_EVENT:
+ return event_.mount.DebugString();
+ }
+ return "(Unknown event type)";
+ }
+};
+
+// A mock |Observer| class which records all invocation of the methods invoked
+// from DiskMountManager and all the arguments passed to them.
+class MockDiskMountManagerObserver : public DiskMountManager::Observer {
+ public:
+ MockDiskMountManagerObserver(const DiskMountManager* manager)
+ : manager_(manager) {}
+ ~MockDiskMountManagerObserver() override {}
+
+ // Mock notify methods.
+ void OnDeviceEvent(DiskMountManager::DeviceEvent event,
+ const std::string& device_path) override {
+ events_.push_back(
+ ObserverEvent::FromDeviceEvent(DeviceEvent(event, device_path)));
+ }
+
+ void OnDiskEvent(DiskMountManager::DiskEvent event,
+ const DiskMountManager::Disk* disk) override {
+ // Take a snapshot (copy) of the Disk object at the time of invocation for
+ // later verification.
+ events_.push_back(ObserverEvent::FromDiskEvent(
+ DiskEvent(event, new DiskMountManager::Disk(*disk))));
+ }
+
+ void OnFormatEvent(DiskMountManager::FormatEvent event,
+ chromeos::FormatError error_code,
+ const std::string& device_path) override {
+ events_.push_back(ObserverEvent::FromFormatEvent(
+ FormatEvent(event, error_code, device_path)));
+ }
+
+ void OnMountEvent(
+ DiskMountManager::MountEvent event,
+ chromeos::MountError error_code,
+ const DiskMountManager::MountPointInfo& mount_point) override {
+ // Take a snapshot (copy) of a Disk object at the time of invocation.
+ // It can be verified later besides the arguments.
+ events_.push_back(ObserverEvent::FromMountEvent(MountEvent(
+ event, error_code, mount_point,
+ std::shared_ptr<DiskMountManager::Disk>(new DiskMountManager::Disk(
+ *manager_->disks().find(mount_point.source_path)->second)))));
+ }
+
+ // Get invocation history to be verified by testcases.
+ DeviceEvent GetDeviceEvent(size_t index) {
+ assert(events_.size() >= index + 1);
+ assert(ObserverEvent::DEVICE_EVENT == events_.at(index).GetType());
+ return events_[index].GetEvent().device;
+ }
+
+ DiskEvent GetDiskEvent(size_t index) {
+ 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.
+ assert(ObserverEvent::DISK_EVENT == events_.at(index).GetType());
+ return events_[index].GetEvent().disk;
+ }
+
+ FormatEvent GetFormatEvent(size_t index) {
+ assert(events_.size() >= index + 1);
+ assert(ObserverEvent::FORMAT_EVENT == events_.at(index).GetType());
+ return events_[index].GetEvent().format;
+ }
+
+ MountEvent GetMountEvent(size_t index) {
+ assert(events_.size() >= index + 1);
+ assert(ObserverEvent::MOUNT_EVENT == events_.at(index).GetType());
+ return events_[index].GetEvent().mount;
+ }
+
+ size_t GetEventCount() { return events_.size(); }
+
+ ObserverEvent GetEvent(size_t index) { return events_.at(index); }
+
+ private:
+ // Pointer to the manager object to which this |Observer| is registered.
+ const DiskMountManager* manager_;
+
+ // Records all invocations.
+ std::vector<ObserverEvent> events_;
+};
+
+// Shift operators of ostream.
+// Needed to print values in case of EXPECT_* failure in gtest.
+std::ostream& operator<<(std::ostream& stream,
+ const DeviceEvent& device_event) {
+ return stream << device_event.DebugString();
+}
+
+std::ostream& operator<<(std::ostream& stream, const DiskEvent& disk_event) {
+ return stream << disk_event.DebugString();
+}
+
+std::ostream& operator<<(std::ostream& stream,
+ const FormatEvent& format_event) {
+ return stream << format_event.DebugString();
+}
+
+std::ostream& operator<<(std::ostream& stream, const MountEvent& mount_event) {
+ return stream << mount_event.DebugString();
+}
+
+std::ostream& operator<<(std::ostream& stream, const ObserverEvent& event) {
+ return stream << event.DebugString();
+}
+
// Expect |is_read_only| value of a disk object keyed by |source_path|.
void ExpectDiskReadOnly(const DiskMountManager* manager,
const std::string& source_path,
@@ -264,7 +615,7 @@ class DiskMountManagerTest : public testing::Test {
protected:
chromeos::FakeCrosDisksClient* fake_cros_disks_client_;
- MockDiskMountManagerObserver observer_;
+ GmockDiskMountManagerObserver observer_;
base::MessageLoopForUI message_loop_;
};
« 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