This source file includes following definitions.
- expected_result_
- SetUp
- TearDown
- OnDelete
- OnList
- CheckResult
- OnConnectToSignal
- TEST_F
- TEST_F
- TEST_F
#include "chromeos/dbus/modem_messaging_client.h"
#include "base/bind.h"
#include "base/message_loop/message_loop.h"
#include "base/values.h"
#include "dbus/message.h"
#include "dbus/mock_bus.h"
#include "dbus/mock_object_proxy.h"
#include "dbus/object_path.h"
#include "dbus/values_util.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/cros_system_api/dbus/service_constants.h"
using ::testing::_;
using ::testing::Invoke;
using ::testing::Return;
namespace chromeos {
namespace {
class MockSmsReceivedHandler {
public:
MOCK_METHOD2(Run, void(const dbus::ObjectPath &sms, bool complete));
};
class MockDeleteCallback {
public:
MOCK_METHOD0(Run, void());
};
class MockListCallback {
public:
MOCK_METHOD1(Run, void(const std::vector<dbus::ObjectPath>& result));
};
const char kServiceName[] = "service.name";
const char kObjectPath[] = "/object/path";
}
class ModemMessagingClientTest : public testing::Test {
public:
ModemMessagingClientTest() : response_(NULL),
expected_result_(NULL) {}
virtual void SetUp() OVERRIDE {
dbus::Bus::Options options;
options.bus_type = dbus::Bus::SYSTEM;
mock_bus_ = new dbus::MockBus(options);
mock_proxy_ = new dbus::MockObjectProxy(mock_bus_.get(),
kServiceName,
dbus::ObjectPath(kObjectPath));
EXPECT_CALL(*mock_proxy_.get(),
ConnectToSignal(modemmanager::kModemManager1MessagingInterface,
modemmanager::kSMSAddedSignal,
_,
_))
.WillRepeatedly(
Invoke(this, &ModemMessagingClientTest::OnConnectToSignal));
EXPECT_CALL(*mock_bus_.get(),
GetObjectProxy(kServiceName, dbus::ObjectPath(kObjectPath)))
.WillOnce(Return(mock_proxy_.get()));
EXPECT_CALL(*mock_bus_.get(), ShutdownAndBlock()).WillOnce(Return());
client_.reset(ModemMessagingClient::Create());
client_->Init(mock_bus_.get());
}
virtual void TearDown() OVERRIDE {
mock_bus_->ShutdownAndBlock();
}
void OnDelete(dbus::MethodCall* method_call,
int timeout_ms,
const dbus::ObjectProxy::ResponseCallback& callback) {
EXPECT_EQ(modemmanager::kModemManager1MessagingInterface,
method_call->GetInterface());
EXPECT_EQ(modemmanager::kSMSDeleteFunction, method_call->GetMember());
dbus::ObjectPath sms_path;
dbus::MessageReader reader(method_call);
EXPECT_TRUE(reader.PopObjectPath(&sms_path));
EXPECT_EQ(expected_sms_path_, sms_path);
EXPECT_FALSE(reader.HasMoreData());
message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
}
void OnList(dbus::MethodCall* method_call,
int timeout_ms,
const dbus::ObjectProxy::ResponseCallback& callback) {
EXPECT_EQ(modemmanager::kModemManager1MessagingInterface,
method_call->GetInterface());
EXPECT_EQ(modemmanager::kSMSListFunction, method_call->GetMember());
dbus::MessageReader reader(method_call);
EXPECT_FALSE(reader.HasMoreData());
message_loop_.PostTask(FROM_HERE, base::Bind(callback, response_));
}
void CheckResult(const std::vector<dbus::ObjectPath>& result) {
EXPECT_EQ(result, *expected_result_);
}
protected:
scoped_ptr<ModemMessagingClient> client_;
base::MessageLoop message_loop_;
scoped_refptr<dbus::MockBus> mock_bus_;
scoped_refptr<dbus::MockObjectProxy> mock_proxy_;
dbus::ObjectProxy::SignalCallback sms_received_callback_;
dbus::ObjectPath expected_sms_path_;
dbus::Response* response_;
std::vector<dbus::ObjectPath>* expected_result_;
private:
void OnConnectToSignal(
const std::string& interface_name,
const std::string& signal_name,
const dbus::ObjectProxy::SignalCallback& signal_callback,
const dbus::ObjectProxy::OnConnectedCallback& on_connected_callback) {
sms_received_callback_ = signal_callback;
const bool success = true;
message_loop_.PostTask(FROM_HERE, base::Bind(on_connected_callback,
interface_name,
signal_name,
success));
}
};
TEST_F(ModemMessagingClientTest, SmsReceived) {
const dbus::ObjectPath kSmsPath("/SMS/0");
const bool kComplete = true;
MockSmsReceivedHandler handler;
EXPECT_CALL(handler, Run(kSmsPath, kComplete)).Times(1);
client_->SetSmsReceivedHandler(kServiceName, dbus::ObjectPath(kObjectPath),
base::Bind(&MockSmsReceivedHandler::Run,
base::Unretained(&handler)));
message_loop_.RunUntilIdle();
dbus::Signal signal(modemmanager::kModemManager1MessagingInterface,
modemmanager::kSMSAddedSignal);
dbus::MessageWriter writer(&signal);
writer.AppendObjectPath(kSmsPath);
writer.AppendBool(kComplete);
ASSERT_FALSE(sms_received_callback_.is_null());
sms_received_callback_.Run(&signal);
client_->ResetSmsReceivedHandler(kServiceName, dbus::ObjectPath(kObjectPath));
sms_received_callback_.Run(&signal);
}
TEST_F(ModemMessagingClientTest, Delete) {
const dbus::ObjectPath kSmsPath("/SMS/0");
expected_sms_path_ = kSmsPath;
EXPECT_CALL(*mock_proxy_.get(), CallMethod(_, _, _))
.WillOnce(Invoke(this, &ModemMessagingClientTest::OnDelete));
MockDeleteCallback callback;
EXPECT_CALL(callback, Run()).Times(1);
scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
response_ = response.get();
client_->Delete(kServiceName, dbus::ObjectPath(kObjectPath), kSmsPath,
base::Bind(&MockDeleteCallback::Run,
base::Unretained(&callback)));
message_loop_.RunUntilIdle();
}
TEST_F(ModemMessagingClientTest, List) {
EXPECT_CALL(*mock_proxy_.get(), CallMethod(_, _, _))
.WillOnce(Invoke(this, &ModemMessagingClientTest::OnList));
MockListCallback callback;
EXPECT_CALL(callback, Run(_))
.WillOnce(Invoke(this, &ModemMessagingClientTest::CheckResult));
scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty());
dbus::ObjectPath path1("/SMS/1");
dbus::ObjectPath path2("/SMS/2");
std::vector<dbus::ObjectPath> expected_result;
expected_result.push_back(path1);
expected_result.push_back(path2);
dbus::MessageWriter writer(response.get());
writer.AppendArrayOfObjectPaths(expected_result);
response_ = response.get();
expected_result_ = &expected_result;
client_->List(kServiceName, dbus::ObjectPath(kObjectPath),
base::Bind(&MockListCallback::Run,
base::Unretained(&callback)));
message_loop_.RunUntilIdle();
}
}