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 namespace dbus { 17 18 TEST(ValuesUtilTest, PopBasicTypes) { 19 scoped_ptr<Response> response(Response::CreateEmpty()); 20 // Append basic type values. 21 MessageWriter writer(response.get()); 22 const uint8 kByteValue = 42; 23 writer.AppendByte(kByteValue); 24 const bool kBoolValue = true; 25 writer.AppendBool(kBoolValue); 26 const int16 kInt16Value = -43; 27 writer.AppendInt16(kInt16Value); 28 const uint16 kUint16Value = 44; 29 writer.AppendUint16(kUint16Value); 30 const int32 kInt32Value = -45; 31 writer.AppendInt32(kInt32Value); 32 const uint32 kUint32Value = 46; 33 writer.AppendUint32(kUint32Value); 34 const int64 kInt64Value = -47; 35 writer.AppendInt64(kInt64Value); 36 const uint64 kUint64Value = 48; 37 writer.AppendUint64(kUint64Value); 38 const double kDoubleValue = 4.9; 39 writer.AppendDouble(kDoubleValue); 40 const std::string kStringValue = "fifty"; 41 writer.AppendString(kStringValue); 42 const std::string kEmptyStringValue; 43 writer.AppendString(kEmptyStringValue); 44 const ObjectPath kObjectPathValue("/ObjectPath"); 45 writer.AppendObjectPath(kObjectPathValue); 46 47 MessageReader reader(response.get()); 48 scoped_ptr<base::Value> value; 49 scoped_ptr<base::Value> expected_value; 50 // Pop a byte. 51 value.reset(PopDataAsValue(&reader)); 52 ASSERT_TRUE(value.get() != NULL); 53 expected_value.reset(new base::FundamentalValue(kByteValue)); 54 EXPECT_TRUE(value->Equals(expected_value.get())); 55 // Pop a bool. 56 value.reset(PopDataAsValue(&reader)); 57 ASSERT_TRUE(value.get() != NULL); 58 expected_value.reset(new base::FundamentalValue(kBoolValue)); 59 EXPECT_TRUE(value->Equals(expected_value.get())); 60 // Pop an int16. 61 value.reset(PopDataAsValue(&reader)); 62 ASSERT_TRUE(value.get() != NULL); 63 expected_value.reset(new base::FundamentalValue(kInt16Value)); 64 EXPECT_TRUE(value->Equals(expected_value.get())); 65 // Pop a uint16. 66 value.reset(PopDataAsValue(&reader)); 67 ASSERT_TRUE(value.get() != NULL); 68 expected_value.reset(new base::FundamentalValue(kUint16Value)); 69 EXPECT_TRUE(value->Equals(expected_value.get())); 70 // Pop an int32. 71 value.reset(PopDataAsValue(&reader)); 72 ASSERT_TRUE(value.get() != NULL); 73 expected_value.reset(new base::FundamentalValue(kInt32Value)); 74 EXPECT_TRUE(value->Equals(expected_value.get())); 75 // Pop a uint32. 76 value.reset(PopDataAsValue(&reader)); 77 ASSERT_TRUE(value.get() != NULL); 78 expected_value.reset( 79 new base::FundamentalValue(static_cast<double>(kUint32Value))); 80 EXPECT_TRUE(value->Equals(expected_value.get())); 81 // Pop an int64. 82 value.reset(PopDataAsValue(&reader)); 83 ASSERT_TRUE(value.get() != NULL); 84 expected_value.reset( 85 new base::FundamentalValue(static_cast<double>(kInt64Value))); 86 EXPECT_TRUE(value->Equals(expected_value.get())); 87 // Pop a uint64. 88 value.reset(PopDataAsValue(&reader)); 89 ASSERT_TRUE(value.get() != NULL); 90 expected_value.reset( 91 new base::FundamentalValue(static_cast<double>(kUint64Value))); 92 EXPECT_TRUE(value->Equals(expected_value.get())); 93 // Pop a double. 94 value.reset(PopDataAsValue(&reader)); 95 ASSERT_TRUE(value.get() != NULL); 96 expected_value.reset(new base::FundamentalValue(kDoubleValue)); 97 EXPECT_TRUE(value->Equals(expected_value.get())); 98 // Pop a string. 99 value.reset(PopDataAsValue(&reader)); 100 ASSERT_TRUE(value.get() != NULL); 101 expected_value.reset(new base::StringValue(kStringValue)); 102 EXPECT_TRUE(value->Equals(expected_value.get())); 103 // Pop an empty string. 104 value.reset(PopDataAsValue(&reader)); 105 ASSERT_TRUE(value.get() != NULL); 106 expected_value.reset(new base::StringValue(kEmptyStringValue)); 107 EXPECT_TRUE(value->Equals(expected_value.get())); 108 // Pop an object path. 109 value.reset(PopDataAsValue(&reader)); 110 ASSERT_TRUE(value.get() != NULL); 111 expected_value.reset(new base::StringValue(kObjectPathValue.value())); 112 EXPECT_TRUE(value->Equals(expected_value.get())); 113 } 114 115 TEST(ValuesUtilTest, PopVariant) { 116 scoped_ptr<Response> response(Response::CreateEmpty()); 117 // Append variant values. 118 MessageWriter writer(response.get()); 119 const bool kBoolValue = true; 120 writer.AppendVariantOfBool(kBoolValue); 121 const int32 kInt32Value = -45; 122 writer.AppendVariantOfInt32(kInt32Value); 123 const double kDoubleValue = 4.9; 124 writer.AppendVariantOfDouble(kDoubleValue); 125 const std::string kStringValue = "fifty"; 126 writer.AppendVariantOfString(kStringValue); 127 128 MessageReader reader(response.get()); 129 scoped_ptr<base::Value> value; 130 scoped_ptr<base::Value> expected_value; 131 // Pop a bool. 132 value.reset(PopDataAsValue(&reader)); 133 ASSERT_TRUE(value.get() != NULL); 134 expected_value.reset(new base::FundamentalValue(kBoolValue)); 135 EXPECT_TRUE(value->Equals(expected_value.get())); 136 // Pop an int32. 137 value.reset(PopDataAsValue(&reader)); 138 ASSERT_TRUE(value.get() != NULL); 139 expected_value.reset(new base::FundamentalValue(kInt32Value)); 140 EXPECT_TRUE(value->Equals(expected_value.get())); 141 // Pop a double. 142 value.reset(PopDataAsValue(&reader)); 143 ASSERT_TRUE(value.get() != NULL); 144 expected_value.reset(new base::FundamentalValue(kDoubleValue)); 145 EXPECT_TRUE(value->Equals(expected_value.get())); 146 // Pop a string. 147 value.reset(PopDataAsValue(&reader)); 148 ASSERT_TRUE(value.get() != NULL); 149 expected_value.reset(new base::StringValue(kStringValue)); 150 EXPECT_TRUE(value->Equals(expected_value.get())); 151 } 152 153 // Pop extremely large integers which cannot be precisely represented in 154 // double. 155 TEST(ValuesUtilTest, PopExtremelyLargeIntegers) { 156 scoped_ptr<Response> response(Response::CreateEmpty()); 157 // Append large integers. 158 MessageWriter writer(response.get()); 159 const int64 kInt64Value = -123456789012345689LL; 160 writer.AppendInt64(kInt64Value); 161 const uint64 kUint64Value = 9876543210987654321ULL; 162 writer.AppendUint64(kUint64Value); 163 164 MessageReader reader(response.get()); 165 scoped_ptr<base::Value> value; 166 scoped_ptr<base::Value> expected_value; 167 double double_value = 0; 168 // Pop an int64. 169 value.reset(PopDataAsValue(&reader)); 170 ASSERT_TRUE(value.get() != NULL); 171 expected_value.reset( 172 new base::FundamentalValue(static_cast<double>(kInt64Value))); 173 EXPECT_TRUE(value->Equals(expected_value.get())); 174 ASSERT_TRUE(value->GetAsDouble(&double_value)); 175 EXPECT_NE(kInt64Value, static_cast<int64>(double_value)); 176 // Pop a uint64. 177 value.reset(PopDataAsValue(&reader)); 178 ASSERT_TRUE(value.get() != NULL); 179 expected_value.reset( 180 new base::FundamentalValue(static_cast<double>(kUint64Value))); 181 EXPECT_TRUE(value->Equals(expected_value.get())); 182 ASSERT_TRUE(value->GetAsDouble(&double_value)); 183 EXPECT_NE(kUint64Value, static_cast<uint64>(double_value)); 184 } 185 186 TEST(ValuesUtilTest, PopIntArray) { 187 scoped_ptr<Response> response(Response::CreateEmpty()); 188 // Append an int32 array. 189 MessageWriter writer(response.get()); 190 MessageWriter sub_writer(NULL); 191 std::vector<int32> data; 192 data.push_back(0); 193 data.push_back(1); 194 data.push_back(2); 195 writer.OpenArray("i", &sub_writer); 196 for (size_t i = 0; i != data.size(); ++i) 197 sub_writer.AppendInt32(data[i]); 198 writer.CloseContainer(&sub_writer); 199 200 // Create the expected value. 201 scoped_ptr<base::ListValue> list_value(new base::ListValue); 202 for (size_t i = 0; i != data.size(); ++i) 203 list_value->Append(new base::FundamentalValue(data[i])); 204 205 // Pop an int32 array. 206 MessageReader reader(response.get()); 207 scoped_ptr<base::Value> value(PopDataAsValue(&reader)); 208 ASSERT_TRUE(value.get() != NULL); 209 EXPECT_TRUE(value->Equals(list_value.get())); 210 } 211 212 TEST(ValuesUtilTest, PopStringArray) { 213 scoped_ptr<Response> response(Response::CreateEmpty()); 214 // Append a string array. 215 MessageWriter writer(response.get()); 216 MessageWriter sub_writer(NULL); 217 std::vector<std::string> data; 218 data.push_back("Dreamlifter"); 219 data.push_back("Beluga"); 220 data.push_back("Mriya"); 221 writer.AppendArrayOfStrings(data); 222 223 // Create the expected value. 224 scoped_ptr<base::ListValue> list_value(new base::ListValue); 225 for (size_t i = 0; i != data.size(); ++i) 226 list_value->Append(new base::StringValue(data[i])); 227 228 // Pop a string array. 229 MessageReader reader(response.get()); 230 scoped_ptr<base::Value> value(PopDataAsValue(&reader)); 231 ASSERT_TRUE(value.get() != NULL); 232 EXPECT_TRUE(value->Equals(list_value.get())); 233 } 234 235 TEST(ValuesUtilTest, PopStruct) { 236 scoped_ptr<Response> response(Response::CreateEmpty()); 237 // Append a struct. 238 MessageWriter writer(response.get()); 239 MessageWriter sub_writer(NULL); 240 writer.OpenStruct(&sub_writer); 241 const bool kBoolValue = true; 242 sub_writer.AppendBool(kBoolValue); 243 const int32 kInt32Value = -123; 244 sub_writer.AppendInt32(kInt32Value); 245 const double kDoubleValue = 1.23; 246 sub_writer.AppendDouble(kDoubleValue); 247 const std::string kStringValue = "one two three"; 248 sub_writer.AppendString(kStringValue); 249 writer.CloseContainer(&sub_writer); 250 251 // Create the expected value. 252 base::ListValue list_value; 253 list_value.Append(new base::FundamentalValue(kBoolValue)); 254 list_value.Append(new base::FundamentalValue(kInt32Value)); 255 list_value.Append(new base::FundamentalValue(kDoubleValue)); 256 list_value.Append(new base::StringValue(kStringValue)); 257 258 // Pop a struct. 259 MessageReader reader(response.get()); 260 scoped_ptr<base::Value> value(PopDataAsValue(&reader)); 261 ASSERT_TRUE(value.get() != NULL); 262 EXPECT_TRUE(value->Equals(&list_value)); 263 } 264 265 TEST(ValuesUtilTest, PopStringToVariantDictionary) { 266 scoped_ptr<Response> response(Response::CreateEmpty()); 267 // Append a dictionary. 268 MessageWriter writer(response.get()); 269 MessageWriter sub_writer(NULL); 270 MessageWriter entry_writer(NULL); 271 writer.OpenArray("{sv}", &sub_writer); 272 sub_writer.OpenDictEntry(&entry_writer); 273 const std::string kKey1 = "one"; 274 entry_writer.AppendString(kKey1); 275 const bool kBoolValue = true; 276 entry_writer.AppendVariantOfBool(kBoolValue); 277 sub_writer.CloseContainer(&entry_writer); 278 sub_writer.OpenDictEntry(&entry_writer); 279 const std::string kKey2 = "two"; 280 entry_writer.AppendString(kKey2); 281 const int32 kInt32Value = -45; 282 entry_writer.AppendVariantOfInt32(kInt32Value); 283 sub_writer.CloseContainer(&entry_writer); 284 sub_writer.OpenDictEntry(&entry_writer); 285 const std::string kKey3 = "three"; 286 entry_writer.AppendString(kKey3); 287 const double kDoubleValue = 4.9; 288 entry_writer.AppendVariantOfDouble(kDoubleValue); 289 sub_writer.CloseContainer(&entry_writer); 290 sub_writer.OpenDictEntry(&entry_writer); 291 const std::string kKey4 = "four"; 292 entry_writer.AppendString(kKey4); 293 const std::string kStringValue = "fifty"; 294 entry_writer.AppendVariantOfString(kStringValue); 295 sub_writer.CloseContainer(&entry_writer); 296 writer.CloseContainer(&sub_writer); 297 298 // Create the expected value. 299 base::DictionaryValue dictionary_value; 300 dictionary_value.SetBoolean(kKey1, kBoolValue); 301 dictionary_value.SetInteger(kKey2, kInt32Value); 302 dictionary_value.SetDouble(kKey3, kDoubleValue); 303 dictionary_value.SetString(kKey4, kStringValue); 304 305 // Pop a dictinoary. 306 MessageReader reader(response.get()); 307 scoped_ptr<base::Value> value(PopDataAsValue(&reader)); 308 ASSERT_TRUE(value.get() != NULL); 309 EXPECT_TRUE(value->Equals(&dictionary_value)); 310 } 311 312 TEST(ValuesUtilTest, PopDictionaryWithDottedStringKey) { 313 scoped_ptr<Response> response(Response::CreateEmpty()); 314 // Append a dictionary. 315 MessageWriter writer(response.get()); 316 MessageWriter sub_writer(NULL); 317 MessageWriter entry_writer(NULL); 318 writer.OpenArray("{sv}", &sub_writer); 319 sub_writer.OpenDictEntry(&entry_writer); 320 const std::string kKey1 = "www.example.com"; // String including dots. 321 entry_writer.AppendString(kKey1); 322 const bool kBoolValue = true; 323 entry_writer.AppendVariantOfBool(kBoolValue); 324 sub_writer.CloseContainer(&entry_writer); 325 sub_writer.OpenDictEntry(&entry_writer); 326 const std::string kKey2 = ".example"; // String starting with a dot. 327 entry_writer.AppendString(kKey2); 328 const int32 kInt32Value = -45; 329 entry_writer.AppendVariantOfInt32(kInt32Value); 330 sub_writer.CloseContainer(&entry_writer); 331 sub_writer.OpenDictEntry(&entry_writer); 332 const std::string kKey3 = "example."; // String ending with a dot. 333 entry_writer.AppendString(kKey3); 334 const double kDoubleValue = 4.9; 335 entry_writer.AppendVariantOfDouble(kDoubleValue); 336 sub_writer.CloseContainer(&entry_writer); 337 writer.CloseContainer(&sub_writer); 338 339 // Create the expected value. 340 base::DictionaryValue dictionary_value; 341 dictionary_value.SetWithoutPathExpansion( 342 kKey1, new base::FundamentalValue(kBoolValue)); 343 dictionary_value.SetWithoutPathExpansion( 344 kKey2, new base::FundamentalValue(kInt32Value)); 345 dictionary_value.SetWithoutPathExpansion( 346 kKey3, new base::FundamentalValue(kDoubleValue)); 347 348 // Pop a dictinoary. 349 MessageReader reader(response.get()); 350 scoped_ptr<base::Value> value(PopDataAsValue(&reader)); 351 ASSERT_TRUE(value.get() != NULL); 352 EXPECT_TRUE(value->Equals(&dictionary_value)); 353 } 354 355 TEST(ValuesUtilTest, PopDoubleToIntDictionary) { 356 // Create test data. 357 const int32 kValues[] = {0, 1, 1, 2, 3, 5, 8, 13, 21}; 358 const std::vector<int32> values(kValues, kValues + arraysize(kValues)); 359 std::vector<double> keys(values.size()); 360 for (size_t i = 0; i != values.size(); ++i) 361 keys[i] = sqrt(values[i]); 362 363 // Append a dictionary. 364 scoped_ptr<Response> response(Response::CreateEmpty()); 365 MessageWriter writer(response.get()); 366 MessageWriter sub_writer(NULL); 367 writer.OpenArray("{di}", &sub_writer); 368 for (size_t i = 0; i != values.size(); ++i) { 369 MessageWriter entry_writer(NULL); 370 sub_writer.OpenDictEntry(&entry_writer); 371 entry_writer.AppendDouble(keys[i]); 372 entry_writer.AppendInt32(values[i]); 373 sub_writer.CloseContainer(&entry_writer); 374 } 375 writer.CloseContainer(&sub_writer); 376 377 // Create the expected value. 378 base::DictionaryValue dictionary_value; 379 for (size_t i = 0; i != values.size(); ++i) { 380 scoped_ptr<base::Value> key_value(new base::FundamentalValue(keys[i])); 381 std::string key_string; 382 base::JSONWriter::Write(key_value.get(), &key_string); 383 dictionary_value.SetWithoutPathExpansion( 384 key_string, new base::FundamentalValue(values[i])); 385 } 386 387 // Pop a dictionary. 388 MessageReader reader(response.get()); 389 scoped_ptr<base::Value> value(PopDataAsValue(&reader)); 390 ASSERT_TRUE(value.get() != NULL); 391 EXPECT_TRUE(value->Equals(&dictionary_value)); 392 } 393 394 TEST(ValuesUtilTest, AppendBasicTypes) { 395 const base::FundamentalValue kBoolValue(false); 396 const base::FundamentalValue kIntegerValue(42); 397 const base::FundamentalValue kDoubleValue(4.2); 398 const base::StringValue kStringValue("string"); 399 400 scoped_ptr<Response> response(Response::CreateEmpty()); 401 MessageWriter writer(response.get()); 402 AppendBasicTypeValueData(&writer, kBoolValue); 403 AppendBasicTypeValueData(&writer, kIntegerValue); 404 AppendBasicTypeValueData(&writer, kDoubleValue); 405 AppendBasicTypeValueData(&writer, kStringValue); 406 407 MessageReader reader(response.get()); 408 scoped_ptr<base::Value> value; 409 value.reset(PopDataAsValue(&reader)); 410 ASSERT_TRUE(value.get() != NULL); 411 EXPECT_TRUE(value->Equals(&kBoolValue)); 412 value.reset(PopDataAsValue(&reader)); 413 ASSERT_TRUE(value.get() != NULL); 414 EXPECT_TRUE(value->Equals(&kIntegerValue)); 415 value.reset(PopDataAsValue(&reader)); 416 ASSERT_TRUE(value.get() != NULL); 417 EXPECT_TRUE(value->Equals(&kDoubleValue)); 418 value.reset(PopDataAsValue(&reader)); 419 ASSERT_TRUE(value.get() != NULL); 420 EXPECT_TRUE(value->Equals(&kStringValue)); 421 } 422 423 TEST(ValuesUtilTest, AppendBasicTypesAsVariant) { 424 const base::FundamentalValue kBoolValue(false); 425 const base::FundamentalValue kIntegerValue(42); 426 const base::FundamentalValue kDoubleValue(4.2); 427 const base::StringValue kStringValue("string"); 428 429 scoped_ptr<Response> response(Response::CreateEmpty()); 430 MessageWriter writer(response.get()); 431 AppendBasicTypeValueDataAsVariant(&writer, kBoolValue); 432 AppendBasicTypeValueDataAsVariant(&writer, kIntegerValue); 433 AppendBasicTypeValueDataAsVariant(&writer, kDoubleValue); 434 AppendBasicTypeValueDataAsVariant(&writer, kStringValue); 435 436 MessageReader reader(response.get()); 437 scoped_ptr<base::Value> value; 438 value.reset(PopDataAsValue(&reader)); 439 ASSERT_TRUE(value.get() != NULL); 440 EXPECT_TRUE(value->Equals(&kBoolValue)); 441 value.reset(PopDataAsValue(&reader)); 442 ASSERT_TRUE(value.get() != NULL); 443 EXPECT_TRUE(value->Equals(&kIntegerValue)); 444 value.reset(PopDataAsValue(&reader)); 445 ASSERT_TRUE(value.get() != NULL); 446 EXPECT_TRUE(value->Equals(&kDoubleValue)); 447 value.reset(PopDataAsValue(&reader)); 448 ASSERT_TRUE(value.get() != NULL); 449 EXPECT_TRUE(value->Equals(&kStringValue)); 450 } 451 452 } // namespace dbus 453