OLD | NEW |
---|---|
(Empty) | |
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. | |
4 | |
5 #include "dbus/values_util.h" | |
6 | |
7 #include <vector> | |
8 | |
9 #include "base/float_util.h" | |
10 #include "base/json/json_writer.h" | |
11 #include "base/memory/scoped_ptr.h" | |
12 #include "base/values.h" | |
13 #include "dbus/message.h" | |
14 #include "testing/gtest/include/gtest/gtest.h" | |
15 | |
16 TEST(ValuesUtilTest, PopBasicTypes) { | |
17 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); | |
18 // Append basic type values. | |
19 dbus::MessageWriter writer(response.get()); | |
20 const uint8 kByteValue = 42; | |
21 writer.AppendByte(kByteValue); | |
22 const bool kBoolValue = true; | |
23 writer.AppendBool(kBoolValue); | |
24 const int16 kInt16Value = -43; | |
25 writer.AppendInt16(kInt16Value); | |
26 const uint16 kUint16Value = 44; | |
27 writer.AppendUint16(kUint16Value); | |
28 const int32 kInt32Value = -45; | |
29 writer.AppendInt32(kInt32Value); | |
30 const uint32 kUint32Value = 46; | |
31 writer.AppendUint32(kUint32Value); | |
32 const int64 kInt64Value = -47; | |
33 writer.AppendInt64(kInt64Value); | |
34 const uint64 kUint64Value = 48; | |
35 writer.AppendUint64(kUint64Value); | |
36 const double kDoubleValue = 4.9; | |
37 writer.AppendDouble(kDoubleValue); | |
38 const std::string kStringValue = "fifty"; | |
39 writer.AppendString(kStringValue); | |
40 const std::string kEmptyStringValue; | |
41 writer.AppendString(kEmptyStringValue); | |
42 const dbus::ObjectPath kObjectPathValue("ObjectPath"); | |
43 writer.AppendObjectPath(kObjectPathValue); | |
44 | |
45 dbus::MessageReader reader(response.get()); | |
46 scoped_ptr<Value> value; | |
47 // Pop a byte. | |
48 value.reset(dbus::PopDataAsValue(&reader)); | |
49 EXPECT_TRUE(value.get() != NULL); | |
50 EXPECT_TRUE(value->Equals(Value::CreateIntegerValue(kByteValue))); | |
51 // Pop a bool. | |
52 value.reset(dbus::PopDataAsValue(&reader)); | |
53 EXPECT_TRUE(value.get() != NULL); | |
54 EXPECT_TRUE(value->Equals(Value::CreateBooleanValue(kBoolValue))); | |
55 // Pop an int16. | |
56 value.reset(dbus::PopDataAsValue(&reader)); | |
57 EXPECT_TRUE(value.get() != NULL); | |
58 EXPECT_TRUE(value->Equals(Value::CreateIntegerValue(kInt16Value))); | |
59 // Pop a uint16. | |
60 value.reset(dbus::PopDataAsValue(&reader)); | |
61 EXPECT_TRUE(value.get() != NULL); | |
62 EXPECT_TRUE(value->Equals(Value::CreateIntegerValue(kUint16Value))); | |
63 // Pop an int32. | |
64 value.reset(dbus::PopDataAsValue(&reader)); | |
65 EXPECT_TRUE(value.get() != NULL); | |
66 EXPECT_TRUE(value->Equals(Value::CreateIntegerValue(kInt32Value))); | |
67 // Pop a uint32. | |
68 value.reset(dbus::PopDataAsValue(&reader)); | |
69 EXPECT_TRUE(value.get() != NULL); | |
70 EXPECT_TRUE(value->Equals(Value::CreateDoubleValue(kUint32Value))); | |
71 // Pop an int64. | |
72 value.reset(dbus::PopDataAsValue(&reader)); | |
73 EXPECT_TRUE(value.get() != NULL); | |
74 EXPECT_TRUE(value->Equals(Value::CreateDoubleValue(kInt64Value))); | |
75 // Pop a uint64. | |
76 value.reset(dbus::PopDataAsValue(&reader)); | |
77 EXPECT_TRUE(value.get() != NULL); | |
78 EXPECT_TRUE(value->Equals(Value::CreateDoubleValue(kUint64Value))); | |
79 // Pop a double. | |
80 value.reset(dbus::PopDataAsValue(&reader)); | |
81 EXPECT_TRUE(value.get() != NULL); | |
82 EXPECT_TRUE(value->Equals(Value::CreateDoubleValue(kDoubleValue))); | |
83 // Pop a string. | |
84 value.reset(dbus::PopDataAsValue(&reader)); | |
85 EXPECT_TRUE(value.get() != NULL); | |
86 EXPECT_TRUE(value->Equals(Value::CreateStringValue(kStringValue))); | |
87 // Pop an empty string. | |
88 value.reset(dbus::PopDataAsValue(&reader)); | |
89 EXPECT_TRUE(value.get() != NULL); | |
90 EXPECT_TRUE(value->Equals(Value::CreateStringValue(kEmptyStringValue))); | |
91 // Pop an object path. | |
92 value.reset(dbus::PopDataAsValue(&reader)); | |
93 EXPECT_TRUE(value.get() != NULL); | |
94 EXPECT_TRUE( | |
95 value->Equals(Value::CreateStringValue(kObjectPathValue.value()))); | |
96 } | |
97 | |
98 TEST(ValuesUtilTest, PopVariant) { | |
99 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); | |
100 // Append variant values. | |
101 dbus::MessageWriter writer(response.get()); | |
102 const bool kBoolValue = true; | |
103 writer.AppendVariantOfBool(kBoolValue); | |
104 const int32 kInt32Value = -45; | |
105 writer.AppendVariantOfInt32(kInt32Value); | |
106 const double kDoubleValue = 4.9; | |
107 writer.AppendVariantOfDouble(kDoubleValue); | |
108 const std::string kStringValue = "fifty"; | |
109 writer.AppendVariantOfString(kStringValue); | |
110 | |
111 dbus::MessageReader reader(response.get()); | |
112 scoped_ptr<Value> value; | |
113 // Pop a bool. | |
114 value.reset(dbus::PopDataAsValue(&reader)); | |
115 EXPECT_TRUE(value.get() != NULL); | |
116 EXPECT_TRUE(value->Equals(Value::CreateBooleanValue(kBoolValue))); | |
117 // Pop an int32. | |
118 value.reset(dbus::PopDataAsValue(&reader)); | |
119 EXPECT_TRUE(value.get() != NULL); | |
120 EXPECT_TRUE(value->Equals(Value::CreateIntegerValue(kInt32Value))); | |
121 // Pop a double. | |
122 value.reset(dbus::PopDataAsValue(&reader)); | |
123 EXPECT_TRUE(value.get() != NULL); | |
124 EXPECT_TRUE(value->Equals(Value::CreateDoubleValue(kDoubleValue))); | |
125 // Pop a string. | |
126 value.reset(dbus::PopDataAsValue(&reader)); | |
127 EXPECT_TRUE(value.get() != NULL); | |
128 EXPECT_TRUE(value->Equals(Value::CreateStringValue(kStringValue))); | |
129 } | |
130 | |
131 TEST(ValuesUtilTest, PopIntArray) { | |
132 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); | |
133 // Append an int32 array. | |
134 dbus::MessageWriter writer(response.get()); | |
135 dbus::MessageWriter sub_writer(NULL); | |
136 std::vector<int32> data; | |
137 data.push_back(0); | |
138 data.push_back(1); | |
139 data.push_back(2); | |
140 writer.OpenArray("i", &sub_writer); | |
141 for (size_t i = 0; i != data.size(); ++i) | |
142 sub_writer.AppendInt32(data[i]); | |
143 writer.CloseContainer(&sub_writer); | |
144 | |
145 // Create the expected value. | |
146 ListValue* list_value = new ListValue; | |
147 for (size_t i = 0; i != data.size(); ++i) | |
148 list_value->Append(Value::CreateIntegerValue(data[i])); | |
149 | |
150 // Pop an int32 array. | |
151 dbus::MessageReader reader(response.get()); | |
152 scoped_ptr<Value> value(dbus::PopDataAsValue(&reader)); | |
153 EXPECT_TRUE(value.get() != NULL); | |
154 EXPECT_TRUE(value->Equals(list_value)); | |
155 } | |
156 | |
157 TEST(ValuesUtilTest, PopStringArray) { | |
158 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); | |
159 // Append a string array. | |
160 dbus::MessageWriter writer(response.get()); | |
161 dbus::MessageWriter sub_writer(NULL); | |
162 std::vector<std::string> data; | |
163 data.push_back("Dreamlifter"); | |
164 data.push_back("Beluga"); | |
165 data.push_back("Mriya"); | |
166 writer.AppendArrayOfStrings(data); | |
167 | |
168 // Create the expected value. | |
169 ListValue* list_value = new ListValue; | |
170 for (size_t i = 0; i != data.size(); ++i) | |
171 list_value->Append(Value::CreateStringValue(data[i])); | |
172 | |
173 // Pop a string array. | |
174 dbus::MessageReader reader(response.get()); | |
175 scoped_ptr<Value> value(dbus::PopDataAsValue(&reader)); | |
176 EXPECT_TRUE(value.get() != NULL); | |
177 EXPECT_TRUE(value->Equals(list_value)); | |
178 } | |
179 | |
180 TEST(ValuesUtilTest, PopStruct) { | |
181 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); | |
182 // Append a struct. | |
183 dbus::MessageWriter writer(response.get()); | |
184 dbus::MessageWriter sub_writer(NULL); | |
185 writer.OpenStruct(&sub_writer); | |
186 const bool kBoolValue = true; | |
187 sub_writer.AppendBool(kBoolValue); | |
188 const int32 kInt32Value = -123; | |
189 sub_writer.AppendInt32(kInt32Value); | |
190 const double kDoubleValue = 1.23; | |
191 sub_writer.AppendDouble(kDoubleValue); | |
192 const std::string kStringValue = "one two three"; | |
193 sub_writer.AppendString(kStringValue); | |
194 writer.CloseContainer(&sub_writer); | |
195 | |
196 // Create the expected value. | |
197 ListValue list_value; | |
198 list_value.Append(Value::CreateBooleanValue(kBoolValue)); | |
199 list_value.Append(Value::CreateIntegerValue(kInt32Value)); | |
200 list_value.Append(Value::CreateDoubleValue(kDoubleValue)); | |
201 list_value.Append(Value::CreateStringValue(kStringValue)); | |
202 | |
203 // Pop a struct. | |
204 dbus::MessageReader reader(response.get()); | |
205 scoped_ptr<Value> value(dbus::PopDataAsValue(&reader)); | |
206 EXPECT_TRUE(value.get() != NULL); | |
207 EXPECT_TRUE(value->Equals(&list_value)); | |
208 } | |
209 | |
210 TEST(ValuesUtilTest, PopStringToVariantDictionary) { | |
211 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); | |
212 // Append a dictionary. | |
213 dbus::MessageWriter writer(response.get()); | |
214 dbus::MessageWriter sub_writer(NULL); | |
215 dbus::MessageWriter entry_writer(NULL); | |
216 writer.OpenArray("{sv}", &sub_writer); | |
217 sub_writer.OpenDictEntry(&entry_writer); | |
218 const std::string kKey1 = "one"; | |
219 entry_writer.AppendString(kKey1); | |
220 const bool kBoolValue = true; | |
221 entry_writer.AppendVariantOfBool(kBoolValue); | |
222 sub_writer.CloseContainer(&entry_writer); | |
223 sub_writer.OpenDictEntry(&entry_writer); | |
224 const std::string kKey2 = "two"; | |
225 entry_writer.AppendString(kKey2); | |
226 const int32 kInt32Value = -45; | |
227 entry_writer.AppendVariantOfInt32(kInt32Value); | |
228 sub_writer.CloseContainer(&entry_writer); | |
229 sub_writer.OpenDictEntry(&entry_writer); | |
230 const std::string kKey3 = "three"; | |
231 entry_writer.AppendString(kKey3); | |
232 const double kDoubleValue = 4.9; | |
233 entry_writer.AppendVariantOfDouble(kDoubleValue); | |
234 sub_writer.CloseContainer(&entry_writer); | |
235 sub_writer.OpenDictEntry(&entry_writer); | |
236 const std::string kKey4 = "four"; | |
237 entry_writer.AppendString(kKey4); | |
238 const std::string kStringValue = "fifty"; | |
239 entry_writer.AppendVariantOfString(kStringValue); | |
240 sub_writer.CloseContainer(&entry_writer); | |
241 writer.CloseContainer(&sub_writer); | |
242 | |
243 // Create the expected value. | |
244 DictionaryValue dictionary_value; | |
245 dictionary_value.SetBoolean(kKey1, kBoolValue); | |
246 dictionary_value.SetInteger(kKey2, kInt32Value); | |
247 dictionary_value.SetDouble(kKey3, kDoubleValue); | |
248 dictionary_value.SetString(kKey4, kStringValue); | |
249 | |
250 // Pop a dictinoary. | |
251 dbus::MessageReader reader(response.get()); | |
252 scoped_ptr<Value> value(dbus::PopDataAsValue(&reader)); | |
253 EXPECT_TRUE(value.get() != NULL); | |
254 EXPECT_TRUE(value->Equals(&dictionary_value)); | |
255 } | |
satorux1
2012/03/16 18:28:12
we might want to test a dictionary with non-string
hashimoto
2012/03/16 19:21:44
PopDoubleToIntDictionary is doing it.
| |
256 | |
257 TEST(ValuesUtilTest, PopDoubleToIntDictionary) { | |
258 // Create test data. | |
259 static const int32 kValues[] = {0, 1, 1, 2, 3, 5, 8, 13, 21}; | |
stevenjb
2012/03/16 18:37:41
Avoid static here, it's not necessary and could ca
hashimoto
2012/03/16 19:21:44
Done.
| |
260 static const size_t length = arraysize(kValues); | |
stevenjb
2012/03/16 18:37:41
Here too.
hashimoto
2012/03/16 19:21:44
Done.
| |
261 double keys[length]; | |
satorux1
2012/03/16 18:28:12
I may be wrong, but this is probably not allowed i
stevenjb
2012/03/16 18:37:41
Yes, you could use arraysize(kValues) directly, bu
hashimoto
2012/03/16 19:21:44
Done.
| |
262 for (size_t i = 0; i != length; ++i) | |
263 keys[i] = sqrt(kValues[i]); | |
264 | |
265 // Append a dictionary. | |
266 scoped_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); | |
267 dbus::MessageWriter writer(response.get()); | |
268 dbus::MessageWriter sub_writer(NULL); | |
269 writer.OpenArray("{di}", &sub_writer); | |
270 for (size_t i = 0; i != length; ++i) { | |
271 dbus::MessageWriter entry_writer(NULL); | |
272 sub_writer.OpenDictEntry(&entry_writer); | |
273 entry_writer.AppendDouble(keys[i]); | |
274 entry_writer.AppendInt32(kValues[i]); | |
275 sub_writer.CloseContainer(&entry_writer); | |
276 } | |
277 writer.CloseContainer(&sub_writer); | |
278 | |
279 // Create the expected value. | |
280 DictionaryValue dictionary_value; | |
281 for (size_t i = 0; i != length; ++i) { | |
282 scoped_ptr<Value> key_value(Value::CreateDoubleValue(keys[i])); | |
283 std::string key_string; | |
284 base::JSONWriter::Write(key_value.get(), &key_string); | |
285 dictionary_value.SetInteger(key_string, kValues[i]); | |
286 } | |
287 | |
288 // Pop a dictionary. | |
289 dbus::MessageReader reader(response.get()); | |
290 scoped_ptr<Value> value(dbus::PopDataAsValue(&reader)); | |
291 EXPECT_TRUE(value.get() != NULL); | |
292 EXPECT_TRUE(value->Equals(&dictionary_value)); | |
satorux1
2012/03/16 18:28:12
do we have a test for int64 that cannot be precise
hashimoto
2012/03/16 19:21:44
Added PopExtremelyLargeIntegers.
| |
293 } | |
OLD | NEW |