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
3 // found in the LICENSE file.
5 #include "chromeos/dbus/modem_messaging_client.h"
8 #include "base/message_loop/message_loop.h"
9 #include "base/values.h"
10 #include "dbus/message.h"
11 #include "dbus/mock_bus.h"
12 #include "dbus/mock_object_proxy.h"
13 #include "dbus/object_path.h"
14 #include "dbus/values_util.h"
15 #include "testing/gmock/include/gmock/gmock.h"
16 #include "testing/gtest/include/gtest/gtest.h"
17 #include "third_party/cros_system_api/dbus/service_constants.h"
20 using ::testing::Invoke
;
21 using ::testing::Return
;
27 // A mock SmsReceivedHandler.
28 class MockSmsReceivedHandler
{
30 MOCK_METHOD2(Run
, void(const dbus::ObjectPath
&sms
, bool complete
));
33 // A mock DeleteCallback.
34 class MockDeleteCallback
{
36 MOCK_METHOD0(Run
, void());
39 // A mock ListCallback.
40 class MockListCallback
{
42 MOCK_METHOD1(Run
, void(const std::vector
<dbus::ObjectPath
>& result
));
45 // D-Bus service name used by test.
46 const char kServiceName
[] = "service.name";
47 // D-Bus object path used by test.
48 const char kObjectPath
[] = "/object/path";
52 class ModemMessagingClientTest
: public testing::Test
{
54 ModemMessagingClientTest() : response_(NULL
),
55 expected_result_(NULL
) {}
57 virtual void SetUp() OVERRIDE
{
59 dbus::Bus::Options options
;
60 options
.bus_type
= dbus::Bus::SYSTEM
;
61 mock_bus_
= new dbus::MockBus(options
);
63 // Create a mock proxy.
64 mock_proxy_
= new dbus::MockObjectProxy(mock_bus_
.get(),
66 dbus::ObjectPath(kObjectPath
));
68 // Set an expectation so mock_proxy's ConnectToSignal() will use
69 // OnConnectToSignal() to run the callback.
70 EXPECT_CALL(*mock_proxy_
.get(),
71 ConnectToSignal(modemmanager::kModemManager1MessagingInterface
,
72 modemmanager::kSMSAddedSignal
,
76 Invoke(this, &ModemMessagingClientTest::OnConnectToSignal
));
78 // Set an expectation so mock_bus's GetObjectProxy() for the given
79 // service name and the object path will return mock_proxy_.
80 EXPECT_CALL(*mock_bus_
.get(),
81 GetObjectProxy(kServiceName
, dbus::ObjectPath(kObjectPath
)))
82 .WillOnce(Return(mock_proxy_
.get()));
84 // ShutdownAndBlock() will be called in TearDown().
85 EXPECT_CALL(*mock_bus_
.get(), ShutdownAndBlock()).WillOnce(Return());
87 // Create a client with the mock bus.
88 client_
.reset(ModemMessagingClient::Create());
89 client_
->Init(mock_bus_
.get());
92 virtual void TearDown() OVERRIDE
{
93 mock_bus_
->ShutdownAndBlock();
96 // Handles Delete method call.
97 void OnDelete(dbus::MethodCall
* method_call
,
99 const dbus::ObjectProxy::ResponseCallback
& callback
) {
100 EXPECT_EQ(modemmanager::kModemManager1MessagingInterface
,
101 method_call
->GetInterface());
102 EXPECT_EQ(modemmanager::kSMSDeleteFunction
, method_call
->GetMember());
103 dbus::ObjectPath sms_path
;
104 dbus::MessageReader
reader(method_call
);
105 EXPECT_TRUE(reader
.PopObjectPath(&sms_path
));
106 EXPECT_EQ(expected_sms_path_
, sms_path
);
107 EXPECT_FALSE(reader
.HasMoreData());
109 message_loop_
.PostTask(FROM_HERE
, base::Bind(callback
, response_
));
112 // Handles List method call.
113 void OnList(dbus::MethodCall
* method_call
,
115 const dbus::ObjectProxy::ResponseCallback
& callback
) {
116 EXPECT_EQ(modemmanager::kModemManager1MessagingInterface
,
117 method_call
->GetInterface());
118 EXPECT_EQ(modemmanager::kSMSListFunction
, method_call
->GetMember());
119 dbus::MessageReader
reader(method_call
);
120 EXPECT_FALSE(reader
.HasMoreData());
122 message_loop_
.PostTask(FROM_HERE
, base::Bind(callback
, response_
));
125 // Checks the results of List.
126 void CheckResult(const std::vector
<dbus::ObjectPath
>& result
) {
127 EXPECT_EQ(result
, *expected_result_
);
131 // The client to be tested.
132 scoped_ptr
<ModemMessagingClient
> client_
;
133 // A message loop to emulate asynchronous behavior.
134 base::MessageLoop message_loop_
;
136 scoped_refptr
<dbus::MockBus
> mock_bus_
;
137 // The mock object proxy.
138 scoped_refptr
<dbus::MockObjectProxy
> mock_proxy_
;
139 // The SmsReceived signal handler given by the tested client.
140 dbus::ObjectProxy::SignalCallback sms_received_callback_
;
141 // Expected argument for Delete method.
142 dbus::ObjectPath expected_sms_path_
;
143 // Response returned by mock methods.
144 dbus::Response
* response_
;
145 // Expected result of List method.
146 std::vector
<dbus::ObjectPath
>* expected_result_
;
149 // Used to implement the mock proxy.
150 void OnConnectToSignal(
151 const std::string
& interface_name
,
152 const std::string
& signal_name
,
153 const dbus::ObjectProxy::SignalCallback
& signal_callback
,
154 const dbus::ObjectProxy::OnConnectedCallback
& on_connected_callback
) {
155 sms_received_callback_
= signal_callback
;
156 const bool success
= true;
157 message_loop_
.PostTask(FROM_HERE
, base::Bind(on_connected_callback
,
164 TEST_F(ModemMessagingClientTest
, SmsReceived
) {
166 const dbus::ObjectPath
kSmsPath("/SMS/0");
167 const bool kComplete
= true;
168 MockSmsReceivedHandler handler
;
169 EXPECT_CALL(handler
, Run(kSmsPath
, kComplete
)).Times(1);
171 client_
->SetSmsReceivedHandler(kServiceName
, dbus::ObjectPath(kObjectPath
),
172 base::Bind(&MockSmsReceivedHandler::Run
,
173 base::Unretained(&handler
)));
175 // Run the message loop to run the signal connection result callback.
176 message_loop_
.RunUntilIdle();
179 dbus::Signal
signal(modemmanager::kModemManager1MessagingInterface
,
180 modemmanager::kSMSAddedSignal
);
181 dbus::MessageWriter
writer(&signal
);
182 writer
.AppendObjectPath(kSmsPath
);
183 writer
.AppendBool(kComplete
);
184 ASSERT_FALSE(sms_received_callback_
.is_null());
185 sms_received_callback_
.Run(&signal
);
187 client_
->ResetSmsReceivedHandler(kServiceName
, dbus::ObjectPath(kObjectPath
));
188 // Send signal again.
189 sms_received_callback_
.Run(&signal
);
192 TEST_F(ModemMessagingClientTest
, Delete
) {
194 const dbus::ObjectPath
kSmsPath("/SMS/0");
195 expected_sms_path_
= kSmsPath
;
196 EXPECT_CALL(*mock_proxy_
.get(), CallMethod(_
, _
, _
))
197 .WillOnce(Invoke(this, &ModemMessagingClientTest::OnDelete
));
198 MockDeleteCallback callback
;
199 EXPECT_CALL(callback
, Run()).Times(1);
201 scoped_ptr
<dbus::Response
> response(dbus::Response::CreateEmpty());
202 response_
= response
.get();
204 client_
->Delete(kServiceName
, dbus::ObjectPath(kObjectPath
), kSmsPath
,
205 base::Bind(&MockDeleteCallback::Run
,
206 base::Unretained(&callback
)));
208 // Run the message loop.
209 message_loop_
.RunUntilIdle();
212 TEST_F(ModemMessagingClientTest
, List
) {
214 EXPECT_CALL(*mock_proxy_
.get(), CallMethod(_
, _
, _
))
215 .WillOnce(Invoke(this, &ModemMessagingClientTest::OnList
));
216 MockListCallback callback
;
217 EXPECT_CALL(callback
, Run(_
))
218 .WillOnce(Invoke(this, &ModemMessagingClientTest::CheckResult
));
220 scoped_ptr
<dbus::Response
> response(dbus::Response::CreateEmpty());
221 dbus::ObjectPath
path1("/SMS/1");
222 dbus::ObjectPath
path2("/SMS/2");
223 std::vector
<dbus::ObjectPath
> expected_result
;
224 expected_result
.push_back(path1
);
225 expected_result
.push_back(path2
);
227 dbus::MessageWriter
writer(response
.get());
228 writer
.AppendArrayOfObjectPaths(expected_result
);
229 response_
= response
.get();
231 // Save expected result.
232 expected_result_
= &expected_result
;
234 client_
->List(kServiceName
, dbus::ObjectPath(kObjectPath
),
235 base::Bind(&MockListCallback::Run
,
236 base::Unretained(&callback
)));
238 // Run the message loop.
239 message_loop_
.RunUntilIdle();
242 } // namespace chromeos