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/shill_client_unittest_base.h"
8 #include "base/json/json_writer.h"
9 #include "base/values.h"
10 #include "chromeos/network/shill_property_util.h"
11 #include "dbus/message.h"
12 #include "dbus/object_path.h"
13 #include "dbus/values_util.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h"
16 #include "third_party/cros_system_api/dbus/service_constants.h"
19 using ::testing::Invoke
;
20 using ::testing::Return
;
26 // Pops a string-to-string dictionary from the reader.
27 base::DictionaryValue
* PopStringToStringDictionary(
28 dbus::MessageReader
* reader
) {
29 dbus::MessageReader
array_reader(NULL
);
30 if (!reader
->PopArray(&array_reader
))
32 scoped_ptr
<base::DictionaryValue
> result(new base::DictionaryValue
);
33 while (array_reader
.HasMoreData()) {
34 dbus::MessageReader
entry_reader(NULL
);
37 if (!array_reader
.PopDictEntry(&entry_reader
) ||
38 !entry_reader
.PopString(&key
) ||
39 !entry_reader
.PopString(&value
))
41 result
->SetWithoutPathExpansion(key
, base::Value::CreateStringValue(value
));
43 return result
.release();
48 ValueMatcher::ValueMatcher(const base::Value
& value
)
49 : expected_value_(value
.DeepCopy()) {}
51 bool ValueMatcher::MatchAndExplain(const base::Value
& value
,
52 MatchResultListener
* listener
) const {
53 return expected_value_
->Equals(&value
);
56 void ValueMatcher::DescribeTo(::std::ostream
* os
) const {
57 std::string expected_value_str
;
58 base::JSONWriter::WriteWithOptions(expected_value_
.get(),
59 base::JSONWriter::OPTIONS_PRETTY_PRINT
,
61 *os
<< "value equals " << expected_value_str
;
64 void ValueMatcher::DescribeNegationTo(::std::ostream
* os
) const {
65 std::string expected_value_str
;
66 base::JSONWriter::WriteWithOptions(expected_value_
.get(),
67 base::JSONWriter::OPTIONS_PRETTY_PRINT
,
69 *os
<< "value does not equal " << expected_value_str
;
73 ShillClientUnittestBase::MockClosure::MockClosure() {}
75 ShillClientUnittestBase::MockClosure::~MockClosure() {}
77 base::Closure
ShillClientUnittestBase::MockClosure::GetCallback() {
78 return base::Bind(&MockClosure::Run
, base::Unretained(this));
82 ShillClientUnittestBase::MockListValueCallback::MockListValueCallback() {}
84 ShillClientUnittestBase::MockListValueCallback::~MockListValueCallback() {}
86 ShillClientHelper::ListValueCallback
87 ShillClientUnittestBase::MockListValueCallback::GetCallback() {
88 return base::Bind(&MockListValueCallback::Run
, base::Unretained(this));
92 ShillClientUnittestBase::MockErrorCallback::MockErrorCallback() {}
94 ShillClientUnittestBase::MockErrorCallback::~MockErrorCallback() {}
96 ShillClientUnittestBase::MockPropertyChangeObserver::
97 MockPropertyChangeObserver() {}
99 ShillClientUnittestBase::MockPropertyChangeObserver::
100 ~MockPropertyChangeObserver() {}
102 ShillClientHelper::ErrorCallback
103 ShillClientUnittestBase::MockErrorCallback::GetCallback() {
104 return base::Bind(&MockErrorCallback::Run
, base::Unretained(this));
108 ShillClientUnittestBase::ShillClientUnittestBase(
109 const std::string
& interface_name
,
110 const dbus::ObjectPath
& object_path
)
111 : interface_name_(interface_name
),
112 object_path_(object_path
),
116 ShillClientUnittestBase::~ShillClientUnittestBase() {
119 void ShillClientUnittestBase::SetUp() {
120 // Create a mock bus.
121 dbus::Bus::Options options
;
122 options
.bus_type
= dbus::Bus::SYSTEM
;
123 mock_bus_
= new dbus::MockBus(options
);
125 // Create a mock proxy.
126 mock_proxy_
= new dbus::MockObjectProxy(
128 shill::kFlimflamServiceName
,
131 // Set an expectation so mock_proxy's CallMethod() will use OnCallMethod()
132 // to return responses.
133 EXPECT_CALL(*mock_proxy_
.get(), CallMethod(_
, _
, _
))
134 .WillRepeatedly(Invoke(this, &ShillClientUnittestBase::OnCallMethod
));
136 // Set an expectation so mock_proxy's CallMethodWithErrorCallback() will use
137 // OnCallMethodWithErrorCallback() to return responses.
138 EXPECT_CALL(*mock_proxy_
.get(), CallMethodWithErrorCallback(_
, _
, _
, _
))
139 .WillRepeatedly(Invoke(
140 this, &ShillClientUnittestBase::OnCallMethodWithErrorCallback
));
142 // Set an expectation so mock_proxy's ConnectToSignal() will use
143 // OnConnectToSignal() to run the callback.
146 ConnectToSignal(interface_name_
, shill::kMonitorPropertyChanged
, _
, _
))
148 Invoke(this, &ShillClientUnittestBase::OnConnectToSignal
));
150 // Set an expectation so mock_bus's GetObjectProxy() for the given
151 // service name and the object path will return mock_proxy_.
152 EXPECT_CALL(*mock_bus_
.get(),
153 GetObjectProxy(shill::kFlimflamServiceName
, object_path_
))
154 .WillOnce(Return(mock_proxy_
.get()));
156 // Set an expectation so mock_bus's GetDBusTaskRunner will return the current
158 EXPECT_CALL(*mock_bus_
.get(), GetDBusTaskRunner())
159 .WillRepeatedly(Return(message_loop_
.message_loop_proxy()));
161 // ShutdownAndBlock() will be called in TearDown().
162 EXPECT_CALL(*mock_bus_
.get(), ShutdownAndBlock()).WillOnce(Return());
165 void ShillClientUnittestBase::TearDown() {
166 mock_bus_
->ShutdownAndBlock();
169 void ShillClientUnittestBase::PrepareForMethodCall(
170 const std::string
& method_name
,
171 const ArgumentCheckCallback
& argument_checker
,
172 dbus::Response
* response
) {
173 expected_method_name_
= method_name
;
174 argument_checker_
= argument_checker
;
175 response_
= response
;
178 void ShillClientUnittestBase::SendPropertyChangedSignal(
179 dbus::Signal
* signal
) {
180 ASSERT_FALSE(property_changed_handler_
.is_null());
181 property_changed_handler_
.Run(signal
);
185 void ShillClientUnittestBase::ExpectPropertyChanged(
186 const std::string
& expected_name
,
187 const base::Value
* expected_value
,
188 const std::string
& name
,
189 const base::Value
& value
) {
190 EXPECT_EQ(expected_name
, name
);
191 EXPECT_TRUE(expected_value
->Equals(&value
));
195 void ShillClientUnittestBase::ExpectNoArgument(dbus::MessageReader
* reader
) {
196 EXPECT_FALSE(reader
->HasMoreData());
200 void ShillClientUnittestBase::ExpectStringArgument(
201 const std::string
& expected_string
,
202 dbus::MessageReader
* reader
) {
204 ASSERT_TRUE(reader
->PopString(&str
));
205 EXPECT_EQ(expected_string
, str
);
206 EXPECT_FALSE(reader
->HasMoreData());
210 void ShillClientUnittestBase::ExpectArrayOfStringsArgument(
211 const std::vector
<std::string
>& expected_strings
,
212 dbus::MessageReader
* reader
) {
213 std::vector
<std::string
> strs
;
214 ASSERT_TRUE(reader
->PopArrayOfStrings(&strs
));
215 EXPECT_EQ(expected_strings
, strs
);
216 EXPECT_FALSE(reader
->HasMoreData());
220 void ShillClientUnittestBase::ExpectValueArgument(
221 const base::Value
* expected_value
,
222 dbus::MessageReader
* reader
) {
223 scoped_ptr
<base::Value
> value(dbus::PopDataAsValue(reader
));
224 ASSERT_TRUE(value
.get());
225 EXPECT_TRUE(value
->Equals(expected_value
));
226 EXPECT_FALSE(reader
->HasMoreData());
230 void ShillClientUnittestBase::ExpectStringAndValueArguments(
231 const std::string
& expected_string
,
232 const base::Value
* expected_value
,
233 dbus::MessageReader
* reader
) {
235 ASSERT_TRUE(reader
->PopString(&str
));
236 EXPECT_EQ(expected_string
, str
);
237 scoped_ptr
<base::Value
> value(dbus::PopDataAsValue(reader
));
238 ASSERT_TRUE(value
.get());
239 EXPECT_TRUE(value
->Equals(expected_value
));
240 EXPECT_FALSE(reader
->HasMoreData());
244 void ShillClientUnittestBase::ExpectDictionaryValueArgument(
245 const base::DictionaryValue
* expected_dictionary
,
246 dbus::MessageReader
* reader
) {
247 dbus::MessageReader
array_reader(NULL
);
248 ASSERT_TRUE(reader
->PopArray(&array_reader
));
249 while (array_reader
.HasMoreData()) {
250 dbus::MessageReader
entry_reader(NULL
);
251 ASSERT_TRUE(array_reader
.PopDictEntry(&entry_reader
));
253 ASSERT_TRUE(entry_reader
.PopString(&key
));
254 dbus::MessageReader
variant_reader(NULL
);
255 ASSERT_TRUE(entry_reader
.PopVariant(&variant_reader
));
256 scoped_ptr
<base::Value
> value
;
257 // Variants in the dictionary can be basic types or string-to-string
259 switch (variant_reader
.GetDataType()) {
260 case dbus::Message::ARRAY
:
261 value
.reset(PopStringToStringDictionary(&variant_reader
));
263 case dbus::Message::BOOL
:
264 case dbus::Message::INT32
:
265 case dbus::Message::STRING
:
266 value
.reset(dbus::PopDataAsValue(&variant_reader
));
271 ASSERT_TRUE(value
.get());
272 const base::Value
* expected_value
= NULL
;
273 EXPECT_TRUE(expected_dictionary
->GetWithoutPathExpansion(key
,
275 EXPECT_TRUE(value
->Equals(expected_value
));
280 base::DictionaryValue
*
281 ShillClientUnittestBase::CreateExampleServiceProperties() {
282 base::DictionaryValue
* properties
= new base::DictionaryValue
;
283 properties
->SetWithoutPathExpansion(
284 shill::kGuidProperty
,
285 base::Value::CreateStringValue("00000000-0000-0000-0000-000000000000"));
286 properties
->SetWithoutPathExpansion(
287 shill::kModeProperty
,
288 base::Value::CreateStringValue(shill::kModeManaged
));
289 properties
->SetWithoutPathExpansion(
290 shill::kTypeProperty
,
291 base::Value::CreateStringValue(shill::kTypeWifi
));
292 shill_property_util::SetSSID("testssid", properties
);
293 properties
->SetWithoutPathExpansion(
294 shill::kSecurityProperty
,
295 base::Value::CreateStringValue(shill::kSecurityPsk
));
301 void ShillClientUnittestBase::ExpectNoResultValue(
302 DBusMethodCallStatus call_status
) {
303 EXPECT_EQ(DBUS_METHOD_CALL_SUCCESS
, call_status
);
307 void ShillClientUnittestBase::ExpectObjectPathResult(
308 const dbus::ObjectPath
& expected_result
,
309 DBusMethodCallStatus call_status
,
310 const dbus::ObjectPath
& result
) {
311 EXPECT_EQ(DBUS_METHOD_CALL_SUCCESS
, call_status
);
312 EXPECT_EQ(expected_result
, result
);
316 void ShillClientUnittestBase::ExpectObjectPathResultWithoutStatus(
317 const dbus::ObjectPath
& expected_result
,
318 const dbus::ObjectPath
& result
) {
319 EXPECT_EQ(expected_result
, result
);
323 void ShillClientUnittestBase::ExpectBoolResultWithoutStatus(
324 bool expected_result
,
326 EXPECT_EQ(expected_result
, result
);
330 void ShillClientUnittestBase::ExpectStringResultWithoutStatus(
331 const std::string
& expected_result
,
332 const std::string
& result
) {
333 EXPECT_EQ(expected_result
, result
);
337 void ShillClientUnittestBase::ExpectDictionaryValueResultWithoutStatus(
338 const base::DictionaryValue
* expected_result
,
339 const base::DictionaryValue
& result
) {
340 std::string expected_result_string
;
341 base::JSONWriter::Write(expected_result
, &expected_result_string
);
342 std::string result_string
;
343 base::JSONWriter::Write(&result
, &result_string
);
344 EXPECT_EQ(expected_result_string
, result_string
);
348 void ShillClientUnittestBase::ExpectDictionaryValueResult(
349 const base::DictionaryValue
* expected_result
,
350 DBusMethodCallStatus call_status
,
351 const base::DictionaryValue
& result
) {
352 EXPECT_EQ(DBUS_METHOD_CALL_SUCCESS
, call_status
);
353 ExpectDictionaryValueResultWithoutStatus(expected_result
, result
);
356 void ShillClientUnittestBase::OnConnectToSignal(
357 const std::string
& interface_name
,
358 const std::string
& signal_name
,
359 const dbus::ObjectProxy::SignalCallback
& signal_callback
,
360 const dbus::ObjectProxy::OnConnectedCallback
& on_connected_callback
) {
361 property_changed_handler_
= signal_callback
;
362 const bool success
= true;
363 message_loop_
.PostTask(FROM_HERE
,
364 base::Bind(on_connected_callback
,
370 void ShillClientUnittestBase::OnCallMethod(
371 dbus::MethodCall
* method_call
,
373 const dbus::ObjectProxy::ResponseCallback
& response_callback
) {
374 EXPECT_EQ(interface_name_
, method_call
->GetInterface());
375 EXPECT_EQ(expected_method_name_
, method_call
->GetMember());
376 dbus::MessageReader
reader(method_call
);
377 argument_checker_
.Run(&reader
);
378 message_loop_
.PostTask(FROM_HERE
,
379 base::Bind(response_callback
, response_
));
382 void ShillClientUnittestBase::OnCallMethodWithErrorCallback(
383 dbus::MethodCall
* method_call
,
385 const dbus::ObjectProxy::ResponseCallback
& response_callback
,
386 const dbus::ObjectProxy::ErrorCallback
& error_callback
) {
387 OnCallMethod(method_call
, timeout_ms
, response_callback
);
390 } // namespace chromeos