1 // 2 // Copyright (C) 2012 The Android Open Source Project 3 // 4 // Licensed under the Apache License, Version 2.0 (the "License"); 5 // you may not use this file except in compliance with the License. 6 // You may obtain a copy of the License at 7 // 8 // http://www.apache.org/licenses/LICENSE-2.0 9 // 10 // Unless required by applicable law or agreed to in writing, software 11 // distributed under the License is distributed on an "AS IS" BASIS, 12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 // See the License for the specific language governing permissions and 14 // limitations under the License. 15 // 16 17 #include "shill/key_value_store.h" 18 19 #include <gtest/gtest.h> 20 21 using std::map; 22 using std::string; 23 using std::vector; 24 using testing::Test; 25 26 namespace shill { 27 28 class KeyValueStoreTest : public Test { 29 public: 30 KeyValueStoreTest() {} 31 32 protected: 33 KeyValueStore store_; 34 }; 35 36 TEST_F(KeyValueStoreTest, Any) { 37 const string kKey("foo"); 38 const string kValue("baz"); 39 EXPECT_FALSE(store_.Contains(kKey)); 40 store_.Set(kKey, brillo::Any(kValue)); 41 EXPECT_TRUE(store_.Contains(kKey)); 42 EXPECT_EQ(kValue, store_.Get(kKey).Get<string>()); 43 store_.Remove(kKey); 44 EXPECT_FALSE(store_.Contains(kKey)); 45 } 46 47 TEST_F(KeyValueStoreTest, Bool) { 48 const string kKey("foo"); 49 const bool kDefaultValue = true; 50 const bool kValue = false; 51 EXPECT_FALSE(store_.ContainsBool(kKey)); 52 EXPECT_EQ(kDefaultValue, store_.LookupBool(kKey, kDefaultValue)); 53 store_.SetBool(kKey, kValue); 54 EXPECT_TRUE(store_.ContainsBool(kKey)); 55 // TODO(shenhan): investigate if a newer version of gtest handles EXPECT_EQ 56 // for bools in a manner that gcc 4.7 is happy with. (Improper conversion from 57 // "false" to "NULL"). 58 EXPECT_EQ(static_cast<int>(kValue), 59 static_cast<int>(store_.LookupBool(kKey, kDefaultValue))); 60 EXPECT_EQ(static_cast<int>(kValue), 61 static_cast<int>(store_.GetBool(kKey))); 62 } 63 64 TEST_F(KeyValueStoreTest, ByteArrays) { 65 const string kKey("foo"); 66 const vector<vector<uint8_t>> kValue{ {1, 2, 3 } }; 67 EXPECT_FALSE(store_.ContainsByteArrays(kKey)); 68 store_.SetByteArrays(kKey, kValue); 69 EXPECT_TRUE(store_.ContainsByteArrays(kKey)); 70 EXPECT_EQ(kValue, store_.GetByteArrays(kKey)); 71 store_.RemoveByteArrays(kKey); 72 EXPECT_FALSE(store_.ContainsByteArrays(kKey)); 73 } 74 75 TEST_F(KeyValueStoreTest, Int) { 76 const string kKey("foo"); 77 const int kValue = 456; 78 EXPECT_FALSE(store_.ContainsInt(kKey)); 79 const int kDefaultValue = 789; 80 EXPECT_EQ(kDefaultValue, store_.LookupInt(kKey, kDefaultValue)); 81 store_.SetInt(kKey, kValue); 82 EXPECT_TRUE(store_.ContainsInt(kKey)); 83 EXPECT_EQ(kValue, store_.GetInt(kKey)); 84 EXPECT_EQ(kValue, store_.LookupInt(kKey, kDefaultValue)); 85 store_.RemoveInt(kKey); 86 EXPECT_FALSE(store_.ContainsInt(kKey)); 87 } 88 89 TEST_F(KeyValueStoreTest, Int16) { 90 const string kKey("foo"); 91 const int16_t kValue = 123; 92 EXPECT_FALSE(store_.ContainsInt16(kKey)); 93 store_.SetInt16(kKey, kValue); 94 EXPECT_TRUE(store_.ContainsInt16(kKey)); 95 EXPECT_EQ(kValue, store_.GetInt16(kKey)); 96 store_.RemoveInt16(kKey); 97 EXPECT_FALSE(store_.ContainsInt16(kKey)); 98 } 99 100 TEST_F(KeyValueStoreTest, KeyValueStore) { 101 const string kSubKey("foo"); 102 const map<string, string> kSubValue{ { "bar0", "baz0" }, { "bar1", "baz1" } }; 103 KeyValueStore value; 104 value.SetStringmap(kSubKey, kSubValue); 105 const string kKey("foo"); 106 EXPECT_FALSE(store_.ContainsKeyValueStore(kKey)); 107 store_.SetKeyValueStore(kKey, value); 108 EXPECT_TRUE(store_.ContainsKeyValueStore(kKey)); 109 EXPECT_EQ(value, store_.GetKeyValueStore(kKey)); 110 store_.RemoveKeyValueStore(kKey); 111 EXPECT_FALSE(store_.ContainsKeyValueStore(kKey)); 112 } 113 114 TEST_F(KeyValueStoreTest, RpcIdentifier) { 115 const string kKey("foo"); 116 const string kValue("baz"); 117 EXPECT_FALSE(store_.ContainsRpcIdentifier(kKey)); 118 store_.SetRpcIdentifier(kKey, kValue); 119 EXPECT_TRUE(store_.ContainsRpcIdentifier(kKey)); 120 EXPECT_EQ(kValue, store_.GetRpcIdentifier(kKey)); 121 store_.RemoveRpcIdentifier(kKey); 122 EXPECT_FALSE(store_.ContainsRpcIdentifier(kKey)); 123 } 124 125 TEST_F(KeyValueStoreTest, RpcIdentifiers) { 126 const string kKey("foo"); 127 const vector<string> kValue{ "baz0", "baz1", "baz2" }; 128 EXPECT_FALSE(store_.ContainsRpcIdentifiers(kKey)); 129 store_.SetRpcIdentifiers(kKey, kValue); 130 EXPECT_TRUE(store_.ContainsRpcIdentifiers(kKey)); 131 EXPECT_EQ(kValue, store_.GetRpcIdentifiers(kKey)); 132 store_.Remove(kKey); 133 EXPECT_FALSE(store_.ContainsRpcIdentifiers(kKey)); 134 } 135 136 TEST_F(KeyValueStoreTest, String) { 137 const string kKey("foo"); 138 const string kDefaultValue("bar"); 139 const string kValue("baz"); 140 EXPECT_FALSE(store_.ContainsString(kKey)); 141 EXPECT_EQ(kDefaultValue, store_.LookupString(kKey, kDefaultValue)); 142 store_.SetString(kKey, kValue); 143 EXPECT_TRUE(store_.ContainsString(kKey)); 144 EXPECT_EQ(kValue, store_.LookupString(kKey, kDefaultValue)); 145 EXPECT_EQ(kValue, store_.GetString(kKey)); 146 store_.RemoveString(kKey); 147 EXPECT_FALSE(store_.ContainsString(kKey)); 148 EXPECT_EQ(kDefaultValue, store_.LookupString(kKey, kDefaultValue)); 149 } 150 151 TEST_F(KeyValueStoreTest, Stringmap) { 152 const string kKey("foo"); 153 const map<string, string> kValue{ { "bar0", "baz0" }, { "bar1", "baz1" } }; 154 EXPECT_FALSE(store_.ContainsStringmap(kKey)); 155 store_.SetStringmap(kKey, kValue); 156 EXPECT_TRUE(store_.ContainsStringmap(kKey)); 157 EXPECT_EQ(kValue, store_.GetStringmap(kKey)); 158 store_.RemoveStringmap(kKey); 159 EXPECT_FALSE(store_.ContainsStringmap(kKey)); 160 } 161 162 TEST_F(KeyValueStoreTest, Strings) { 163 const string kKey("foo"); 164 const vector<string> kValue{ "baz0", "baz1", "baz2" }; 165 EXPECT_FALSE(store_.ContainsStrings(kKey)); 166 store_.SetStrings(kKey, kValue); 167 EXPECT_TRUE(store_.ContainsStrings(kKey)); 168 EXPECT_EQ(kValue, store_.GetStrings(kKey)); 169 store_.RemoveStrings(kKey); 170 EXPECT_FALSE(store_.ContainsStrings(kKey)); 171 } 172 173 TEST_F(KeyValueStoreTest, Uint) { 174 const string kKey("foo"); 175 const uint32_t kValue = 456; 176 EXPECT_FALSE(store_.ContainsUint(kKey)); 177 store_.SetUint(kKey, kValue); 178 EXPECT_TRUE(store_.ContainsUint(kKey)); 179 EXPECT_EQ(kValue, store_.GetUint(kKey)); 180 } 181 182 TEST_F(KeyValueStoreTest, Uint16) { 183 const string kKey("foo"); 184 const uint16_t kValue = 456; 185 EXPECT_FALSE(store_.ContainsUint16(kKey)); 186 store_.SetUint16(kKey, kValue); 187 EXPECT_TRUE(store_.ContainsUint16(kKey)); 188 EXPECT_EQ(kValue, store_.GetUint16(kKey)); 189 } 190 191 TEST_F(KeyValueStoreTest, Uint8) { 192 const string kKey("foo"); 193 const uint8_t kValue = 123; 194 EXPECT_FALSE(store_.ContainsUint8(kKey)); 195 store_.SetUint8(kKey, kValue); 196 EXPECT_TRUE(store_.ContainsUint8(kKey)); 197 EXPECT_EQ(kValue, store_.GetUint8(kKey)); 198 store_.RemoveUint8(kKey); 199 EXPECT_FALSE(store_.ContainsUint8(kKey)); 200 } 201 202 TEST_F(KeyValueStoreTest, Uint8s) { 203 const string kKey("foo"); 204 const vector<uint8_t> kValue{ 1, 2, 3 }; 205 EXPECT_FALSE(store_.ContainsUint8s(kKey)); 206 store_.SetUint8s(kKey, kValue); 207 EXPECT_TRUE(store_.ContainsUint8s(kKey)); 208 EXPECT_EQ(kValue, store_.GetUint8s(kKey)); 209 store_.RemoveUint8s(kKey); 210 EXPECT_FALSE(store_.ContainsUint8s(kKey)); 211 } 212 213 TEST_F(KeyValueStoreTest, Uint32s) { 214 const string kKey("foo"); 215 const vector<uint32_t> kValue{ 1, 2, 3 }; 216 EXPECT_FALSE(store_.ContainsUint32s(kKey)); 217 store_.SetUint32s(kKey, kValue); 218 EXPECT_TRUE(store_.ContainsUint32s(kKey)); 219 EXPECT_EQ(kValue, store_.GetUint32s(kKey)); 220 store_.RemoveUint32s(kKey); 221 EXPECT_FALSE(store_.ContainsUint32s(kKey)); 222 } 223 224 TEST_F(KeyValueStoreTest, DoubleRemove) { 225 const string kKey("foo"); 226 // Make sure we don't get an exception/infinite loop if we do a 227 // "Remove()" when the key does not exist. 228 store_.RemoveInt(kKey); 229 store_.RemoveInt(kKey); 230 store_.RemoveString(kKey); 231 store_.RemoveString(kKey); 232 } 233 234 TEST_F(KeyValueStoreTest, Clear) { 235 EXPECT_TRUE(store_.IsEmpty()); 236 const string kBoolKey("foo"); 237 const bool kBoolValue = true; 238 store_.SetBool(kBoolKey, kBoolValue); 239 const string kByteArraysKey("bytearrays"); 240 const vector<vector<uint8_t>> kByteArraysValue{ {1, 2} }; 241 store_.SetByteArrays(kByteArraysKey, kByteArraysValue); 242 const string kIntKey("bar"); 243 const int kIntValue = 123; 244 store_.SetInt(kIntKey, kIntValue); 245 const string kInt16Key("int16"); 246 const int16_t kInt16Value = 123; 247 store_.SetInt16(kInt16Key, kInt16Value); 248 const string kKeyValueStoreKey("bear"); 249 const KeyValueStore kKeyValueStoreValue; 250 store_.SetKeyValueStore(kKeyValueStoreKey, kKeyValueStoreValue); 251 const string kRpcIdentifierKey("rpcid"); 252 const string kRpcIdentifierValue("rpc_identifier"); 253 store_.SetRpcIdentifier(kRpcIdentifierKey, kRpcIdentifierValue); 254 const string kStringKey("baz"); 255 const string kStringValue("string"); 256 store_.SetString(kStringKey, kStringValue); 257 const string kStringmapKey("stringMapKey"); 258 const map<string, string> kStringmapValue; 259 store_.SetStringmap(kStringmapKey, kStringmapValue); 260 const string kStringsKey("stringsKey"); 261 const vector<string> kStringsValue; 262 store_.SetStrings(kStringsKey, kStringsValue); 263 const string kUintKey("bun"); 264 const uint32_t kUintValue = 456; 265 store_.SetUint(kUintKey, kUintValue); 266 const string kUint16Key("uint16"); 267 const uint16_t kUint16Value = 123; 268 store_.SetUint16(kUint16Key, kUint16Value); 269 const string kUint8sKey("uint8s"); 270 const vector<uint8_t> kUint8sValue{ 1, 2, 3 }; 271 store_.SetUint8s(kUint8sKey, kUint8sValue); 272 const string kUint32sKey("uint32s"); 273 const vector<uint32_t> kUint32sValue{ 1, 2, 3 }; 274 store_.SetUint32s(kUint32sKey, kUint32sValue); 275 276 EXPECT_TRUE(store_.ContainsBool(kBoolKey)); 277 EXPECT_TRUE(store_.ContainsByteArrays(kByteArraysKey)); 278 EXPECT_TRUE(store_.ContainsInt(kIntKey)); 279 EXPECT_TRUE(store_.ContainsInt16(kInt16Key)); 280 EXPECT_TRUE(store_.ContainsKeyValueStore(kKeyValueStoreKey)); 281 EXPECT_TRUE(store_.ContainsRpcIdentifier(kRpcIdentifierKey)); 282 EXPECT_TRUE(store_.ContainsString(kStringKey)); 283 EXPECT_TRUE(store_.ContainsStringmap(kStringmapKey)); 284 EXPECT_TRUE(store_.ContainsStrings(kStringsKey)); 285 EXPECT_TRUE(store_.ContainsUint(kUintKey)); 286 EXPECT_TRUE(store_.ContainsUint16(kUint16Key)); 287 EXPECT_TRUE(store_.ContainsUint8s(kUint8sKey)); 288 EXPECT_TRUE(store_.ContainsUint32s(kUint32sKey)); 289 EXPECT_FALSE(store_.IsEmpty()); 290 store_.Clear(); 291 EXPECT_TRUE(store_.IsEmpty()); 292 EXPECT_FALSE(store_.ContainsBool(kBoolKey)); 293 EXPECT_FALSE(store_.ContainsByteArrays(kByteArraysKey)); 294 EXPECT_FALSE(store_.ContainsInt(kIntKey)); 295 EXPECT_FALSE(store_.ContainsInt16(kInt16Key)); 296 EXPECT_FALSE(store_.ContainsInt(kKeyValueStoreKey)); 297 EXPECT_FALSE(store_.ContainsRpcIdentifier(kRpcIdentifierKey)); 298 EXPECT_FALSE(store_.ContainsString(kStringKey)); 299 EXPECT_FALSE(store_.ContainsStringmap(kStringmapKey)); 300 EXPECT_FALSE(store_.ContainsStrings(kStringsKey)); 301 EXPECT_FALSE(store_.ContainsUint(kUintKey)); 302 EXPECT_FALSE(store_.ContainsUint16(kUint16Key)); 303 EXPECT_FALSE(store_.ContainsUint8s(kUint8sKey)); 304 EXPECT_FALSE(store_.ContainsUint32s(kUint32sKey)); 305 } 306 307 TEST_F(KeyValueStoreTest, Equals) { 308 KeyValueStore first, second; 309 310 first.SetBool("boolKey", true); 311 EXPECT_NE(first, second); 312 313 first.Clear(); 314 second.Clear(); 315 second.SetBool("boolKey", true); 316 EXPECT_NE(first, second); 317 318 first.Clear(); 319 second.Clear(); 320 first.SetBool("boolKey", true); 321 second.SetBool("boolOtherKey", true); 322 EXPECT_NE(first, second); 323 324 first.Clear(); 325 second.Clear(); 326 first.SetBool("boolKey", true); 327 second.SetBool("boolKey", false); 328 EXPECT_NE(first, second); 329 330 const vector<vector<uint8_t>> kByteArrays1{ {1, 2} }; 331 const vector<vector<uint8_t>> kByteArrays2{ {3, 4} }; 332 333 first.Clear(); 334 second.Clear(); 335 first.SetByteArrays("byteArraysKey", kByteArrays1); 336 second.SetByteArrays("byteArraysOtherKey", kByteArrays1); 337 EXPECT_NE(first, second); 338 339 first.Clear(); 340 second.Clear(); 341 first.SetByteArrays("byteArraysKey", kByteArrays1); 342 second.SetByteArrays("byteArraysOtherKey", kByteArrays2); 343 EXPECT_NE(first, second); 344 345 first.Clear(); 346 second.Clear(); 347 first.SetInt("intKey", 123); 348 second.SetInt("intOtherKey", 123); 349 EXPECT_NE(first, second); 350 351 first.Clear(); 352 second.Clear(); 353 first.SetInt("intKey", 123); 354 second.SetInt("intKey", 456); 355 EXPECT_NE(first, second); 356 357 first.Clear(); 358 second.Clear(); 359 first.SetInt16("int16Key", 123); 360 second.SetInt16("int16OtherKey", 123); 361 EXPECT_NE(first, second); 362 363 first.Clear(); 364 second.Clear(); 365 first.SetInt16("int16Key", 123); 366 second.SetInt16("int16Key", 456); 367 EXPECT_NE(first, second); 368 369 KeyValueStore key_value0; 370 key_value0.SetInt("intKey", 123); 371 KeyValueStore key_value1; 372 key_value1.SetInt("intOtherKey", 123); 373 374 first.Clear(); 375 second.Clear(); 376 first.SetKeyValueStore("keyValueKey", key_value0); 377 second.SetKeyValueStore("keyValueKey", key_value1); 378 EXPECT_NE(first, second); 379 380 first.Clear(); 381 second.Clear(); 382 first.SetKeyValueStore("keyValueKey", key_value0); 383 second.SetKeyValueStore("keyValueOtherKey", key_value0); 384 EXPECT_NE(first, second); 385 386 first.Clear(); 387 second.Clear(); 388 first.SetRpcIdentifier("rpcIdentifierKey", "rpcIdentifier"); 389 second.SetRpcIdentifier("rpcIdentifierOtherKey", "rpcIdentifier"); 390 EXPECT_NE(first, second); 391 392 first.Clear(); 393 second.Clear(); 394 first.SetRpcIdentifier("rpcIdentifierKey", "rpcIdentifier"); 395 second.SetRpcIdentifier("rpcIdentifierKey", "otherRpcIdentifier"); 396 EXPECT_NE(first, second); 397 398 first.Clear(); 399 second.Clear(); 400 first.SetString("stringKey", "string"); 401 second.SetString("stringOtherKey", "string"); 402 EXPECT_NE(first, second); 403 404 first.Clear(); 405 second.Clear(); 406 first.SetString("stringKey", "string"); 407 second.SetString("stringKey", "otherString"); 408 EXPECT_NE(first, second); 409 410 411 const map<string, string> kStringmap1{ { "key", "value" } }; 412 const map<string, string> kStringmap2{ { "otherKey", "value" } }; 413 const map<string, string> kStringmap3{ { "key", "otherValue" } }; 414 415 first.Clear(); 416 second.Clear(); 417 first.SetStringmap("stringmapKey", kStringmap1); 418 second.SetStringmap("stringmapOtherKey", kStringmap1); 419 EXPECT_NE(first, second); 420 421 first.Clear(); 422 second.Clear(); 423 first.SetStringmap("stringmapKey", kStringmap1); 424 second.SetStringmap("stringmapKey", kStringmap2); 425 EXPECT_NE(first, second); 426 427 first.Clear(); 428 second.Clear(); 429 first.SetStringmap("stringmapKey", kStringmap1); 430 second.SetStringmap("stringmapKey", kStringmap3); 431 EXPECT_NE(first, second); 432 433 const vector<string> kStrings1{ "value" }; 434 const vector<string> kStrings2{ "otherValue" }; 435 436 first.Clear(); 437 second.Clear(); 438 first.SetStrings("stringsKey", kStrings1); 439 second.SetStrings("stringsOtherKey", kStrings1); 440 EXPECT_NE(first, second); 441 442 first.Clear(); 443 second.Clear(); 444 first.SetStrings("stringsKey", kStrings1); 445 second.SetStrings("stringsKey", kStrings2); 446 EXPECT_NE(first, second); 447 448 first.Clear(); 449 second.Clear(); 450 first.SetUint("uintKey", 1); 451 second.SetUint("uintOtherKey", 1); 452 EXPECT_NE(first, second); 453 454 first.Clear(); 455 second.Clear(); 456 first.SetUint("uintKey", 1); 457 second.SetUint("uintKey", 2); 458 EXPECT_NE(first, second); 459 460 first.Clear(); 461 second.Clear(); 462 first.SetUint16("uint16Key", 1); 463 second.SetUint16("uint16OtherKey", 1); 464 EXPECT_NE(first, second); 465 466 first.Clear(); 467 second.Clear(); 468 first.SetUint16("uint16Key", 1); 469 second.SetUint16("uint16Key", 2); 470 EXPECT_NE(first, second); 471 472 const vector<uint8_t> kUint8s1{ 1 }; 473 const vector<uint8_t> kUint8s2{ 2 }; 474 475 first.Clear(); 476 second.Clear(); 477 first.SetUint8s("uint8sKey", kUint8s1); 478 second.SetUint8s("uint8sOtherKey", kUint8s1); 479 EXPECT_NE(first, second); 480 481 first.Clear(); 482 second.Clear(); 483 first.SetUint8s("uint8sKey", kUint8s1); 484 second.SetUint8s("uint8sKey", kUint8s2); 485 EXPECT_NE(first, second); 486 487 const vector<uint32_t> kUint32s1{ 1 }; 488 const vector<uint32_t> kUint32s2{ 2 }; 489 490 first.Clear(); 491 second.Clear(); 492 first.SetUint32s("uint32sKey", kUint32s1); 493 second.SetUint32s("uint32sOtherKey", kUint32s1); 494 EXPECT_NE(first, second); 495 496 first.Clear(); 497 second.Clear(); 498 first.SetUint32s("uint32sKey", kUint32s1); 499 second.SetUint32s("uint32sKey", kUint32s2); 500 EXPECT_NE(first, second); 501 502 first.Clear(); 503 second.Clear(); 504 first.SetBool("boolKey", true); 505 first.SetByteArrays("byteArraysKey", kByteArrays1); 506 first.SetInt("intKey", 123); 507 first.SetInt("int16Key", 123); 508 first.SetRpcIdentifier("rpcIdentifierKey", "rpcid"); 509 first.SetString("stringKey", "value"); 510 first.SetStringmap("stringmapKey", kStringmap1); 511 first.SetStrings("stringsKey", kStrings1); 512 first.SetUint("uintKey", 1); 513 first.SetUint16("uint16Key", 1); 514 first.SetUint8s("uint8sKey", kUint8s1); 515 first.SetUint32s("uint32sKey", kUint32s1); 516 second.SetBool("boolKey", true); 517 second.SetByteArrays("byteArraysKey", kByteArrays1); 518 second.SetInt("intKey", 123); 519 second.SetInt("int16Key", 123); 520 second.SetRpcIdentifier("rpcIdentifierKey", "rpcid"); 521 second.SetString("stringKey", "value"); 522 second.SetStringmap("stringmapKey", kStringmap1); 523 second.SetStrings("stringsKey", kStrings1); 524 second.SetUint("uintKey", 1); 525 second.SetUint16("uint16Key", 1); 526 second.SetUint8s("uint8sKey", kUint8s1); 527 second.SetUint32s("uint32sKey", kUint32s1); 528 EXPECT_EQ(first, second); 529 } 530 531 TEST_F(KeyValueStoreTest, CopyFrom) { 532 KeyValueStore donor; 533 const string kBoolKey("foo"); 534 const bool kBoolValue = true; 535 donor.SetBool(kBoolKey, kBoolValue); 536 const string kByteArraysKey("bytearrays"); 537 const vector<vector<uint8_t>> kByteArraysValue{ {1} }; 538 donor.SetByteArrays(kByteArraysKey, kByteArraysValue); 539 const string kIntKey("bar"); 540 const int kIntValue = 123; 541 donor.SetInt(kIntKey, kIntValue); 542 const string kInt16Key("int16"); 543 const int16_t kInt16Value = 123; 544 donor.SetInt16(kInt16Key, kInt16Value); 545 const string kKeyValueStoreKey("bear"); 546 KeyValueStore keyValueStoreValue; 547 keyValueStoreValue.SetInt(kIntKey, kIntValue); 548 donor.SetKeyValueStore(kKeyValueStoreKey, keyValueStoreValue); 549 const string kRpcIdentifierKey("rpcidentifier"); 550 const string kRpcIdentifierValue("rpcid"); 551 donor.SetRpcIdentifier(kRpcIdentifierKey, kRpcIdentifierValue); 552 const string kStringKey("baz"); 553 const string kStringValue("string"); 554 donor.SetString(kStringKey, kStringValue); 555 const string kStringmapKey("stringMapKey"); 556 const map<string, string> kStringmapValue{ { "key", "value" } }; 557 donor.SetStringmap(kStringmapKey, kStringmapValue); 558 const string kStringsKey("stringsKey"); 559 const vector<string> kStringsValue{ "string0", "string1" }; 560 donor.SetStrings(kStringsKey, kStringsValue); 561 const string kUintKey("bun"); 562 const uint32_t kUintValue = 456; 563 donor.SetUint(kUintKey, kUintValue); 564 const string kUint16Key("uint16"); 565 const uint16_t kUint16Value = 456; 566 donor.SetUint16(kUint16Key, kUint16Value); 567 const string kUint8sKey("uint8s"); 568 const vector<uint8_t> kUint8sValue{ 1 }; 569 donor.SetUint8s(kUint8sKey, kUint8sValue); 570 const string kUint32sKey("uint32s"); 571 const vector<uint32_t> kUint32sValue{ 1 }; 572 donor.SetUint32s(kUint32sKey, kUint32sValue); 573 574 EXPECT_TRUE(store_.IsEmpty()); 575 store_.CopyFrom(donor); 576 EXPECT_FALSE(store_.IsEmpty()); 577 EXPECT_EQ(donor, store_); 578 } 579 580 TEST_F(KeyValueStoreTest, ConvertToVariantDictionary) { 581 static const char kStringKey[] = "StringKey"; 582 static const char kStringValue[] = "StringValue"; 583 static const char kStringmapKey[] = "StringmapKey"; 584 const map<string, string> kStringmapValue = { { "key", "value" } }; 585 static const char kStringsKey[] = "StringsKey"; 586 const vector<string> kStringsValue = {"StringsValue1", "StringsValue2"}; 587 static const char kBoolKey[] = "BoolKey"; 588 const bool kBoolValue = true; 589 static const char kInt32Key[] = "Int32Key"; 590 const int32_t kInt32Value = 123; 591 static const char kUint32Key[] = "Uint32Key"; 592 const uint32_t kUint32Value = 654; 593 static const char kByteArraysKey[] = "ByteArraysKey"; 594 const vector<vector<uint8_t>> kByteArraysValue{ {1}, {2} }; 595 static const char kInt16Key[] = "Int16Key"; 596 const int16_t kInt16Value = 123; 597 static const char kRpcIdentifierKey[] = "RpcIdentifierKey"; 598 static const char kRpcIdentifierValue[] = "/org/chromium/test"; 599 static const char kUint16Key[] = "Uint16Key"; 600 const uint16_t kUint16Value = 123; 601 static const char kUint8sKey[] = "Uint8sKey"; 602 const vector<uint8_t> kUint8sValue{ 1, 2 }; 603 static const char kUint32sKey[] = "Uint32sKey"; 604 const vector<uint32_t> kUint32sValue{ 1, 2 }; 605 static const char kKeyValueStoreKey[] = "KeyValueStoreKey"; 606 static const char kNestedInt32Key[] = "NestedKey32Key"; 607 const int32_t kNestedInt32Value = 1; 608 KeyValueStore nested_store; 609 nested_store.SetInt(kNestedInt32Key, kNestedInt32Value); 610 611 KeyValueStore store; 612 store.SetString(kStringKey, kStringValue); 613 store.SetStringmap(kStringmapKey, kStringmapValue); 614 store.SetStrings(kStringsKey, kStringsValue); 615 store.SetBool(kBoolKey, kBoolValue); 616 store.SetInt(kInt32Key, kInt32Value); 617 store.SetUint(kUint32Key, kUint32Value); 618 store.SetByteArrays(kByteArraysKey, kByteArraysValue); 619 store.SetInt16(kInt16Key, kInt16Value); 620 store.SetRpcIdentifier(kRpcIdentifierKey, kRpcIdentifierValue); 621 store.SetUint16(kUint16Key, kUint16Value); 622 store.SetUint8s(kUint8sKey, kUint8sValue); 623 store.SetUint32s(kUint32sKey, kUint32sValue); 624 store.SetKeyValueStore(kKeyValueStoreKey, nested_store); 625 626 brillo::VariantDictionary dict; 627 KeyValueStore::ConvertToVariantDictionary(store, &dict); 628 EXPECT_EQ(13, dict.size()); 629 EXPECT_EQ(kStringValue, dict[kStringKey].Get<string>()); 630 map<string, string> stringmap_value = 631 dict[kStringmapKey].Get<map<string, string>>(); 632 EXPECT_EQ(kStringmapValue, stringmap_value); 633 EXPECT_EQ(kStringsValue, dict[kStringsKey].Get<vector<string>>()); 634 EXPECT_EQ(kBoolValue, dict[kBoolKey].Get<bool>()); 635 EXPECT_EQ(kInt32Value, dict[kInt32Key].Get<int32_t>()); 636 EXPECT_EQ(kUint32Value, dict[kUint32Key].Get<uint32_t>()); 637 EXPECT_EQ(kByteArraysValue, 638 dict[kByteArraysKey].Get<vector<vector<uint8_t>>>()); 639 EXPECT_EQ(kInt16Value, dict[kInt16Key].Get<int16_t>()); 640 EXPECT_EQ(kRpcIdentifierValue, 641 dict[kRpcIdentifierKey].Get<dbus::ObjectPath>().value()); 642 EXPECT_EQ(kUint16Value, dict[kUint16Key].Get<uint16_t>()); 643 EXPECT_EQ(kUint8sValue, dict[kUint8sKey].Get<vector<uint8_t>>()); 644 EXPECT_EQ(kUint32sValue, dict[kUint32sKey].Get<vector<uint32_t>>()); 645 brillo::VariantDictionary nested_dict = 646 dict[kKeyValueStoreKey].Get<brillo::VariantDictionary>(); 647 EXPECT_EQ(kNestedInt32Value, nested_dict[kNestedInt32Key].Get<int32_t>()); 648 } 649 650 TEST_F(KeyValueStoreTest, ConvertFromVariantDictionary) { 651 static const char kStringKey[] = "StringKey"; 652 static const char kStringValue[] = "StringValue"; 653 static const char kStringmapKey[] = "StringmapKey"; 654 const map<string, string> kStringmapValue = { { "key", "value" } }; 655 static const char kStringsKey[] = "StringsKey"; 656 const vector<string> kStringsValue = {"StringsValue1", "StringsValue2"}; 657 static const char kBoolKey[] = "BoolKey"; 658 const bool kBoolValue = true; 659 static const char kInt32Key[] = "Int32Key"; 660 const int32_t kInt32Value = 123; 661 static const char kUint32Key[] = "Uint32Key"; 662 const uint32_t kUint32Value = 654; 663 static const char kByteArraysKey[] = "ByteArraysKey"; 664 const vector<vector<uint8_t>> kByteArraysValue{ {1}, {2} }; 665 static const char kInt16Key[] = "Int16Key"; 666 const int16_t kInt16Value = 123; 667 static const char kRpcIdentifierKey[] = "RpcIdentifierKey"; 668 static const char kRpcIdentifierValue[] = "/org/chromium/test"; 669 static const char kUint16Key[] = "Uint16Key"; 670 const uint16_t kUint16Value = 123; 671 static const char kUint8sKey[] = "Uint8sKey"; 672 const vector<uint8_t> kUint8sValue{ 1, 2 }; 673 static const char kUint32sKey[] = "Uint32sKey"; 674 const vector<uint32_t> kUint32sValue{ 1, 2 }; 675 static const char kKeyValueStoreKey[] = "KeyValueStoreKey"; 676 static const char kNestedInt32Key[] = "NestedKey32Key"; 677 const int32_t kNestedInt32Value = 1; 678 679 brillo::VariantDictionary dict; 680 dict[kStringKey] = brillo::Any(string(kStringValue)); 681 dict[kStringmapKey] = brillo::Any(kStringmapValue); 682 dict[kStringsKey] = brillo::Any(kStringsValue); 683 dict[kBoolKey] = brillo::Any(kBoolValue); 684 dict[kInt32Key] = brillo::Any(kInt32Value); 685 dict[kUint32Key] = brillo::Any(kUint32Value); 686 dict[kByteArraysKey] = brillo::Any(kByteArraysValue); 687 dict[kInt16Key] = brillo::Any(kInt16Value); 688 dict[kRpcIdentifierKey] = 689 brillo::Any(dbus::ObjectPath(kRpcIdentifierValue)); 690 dict[kUint16Key] = brillo::Any(kUint16Value); 691 dict[kUint8sKey] = brillo::Any(kUint8sValue); 692 dict[kUint32sKey] = brillo::Any(kUint32sValue); 693 brillo::VariantDictionary nested_dict; 694 nested_dict[kNestedInt32Key] = brillo::Any(kNestedInt32Value); 695 dict[kKeyValueStoreKey] = brillo::Any(nested_dict); 696 697 KeyValueStore store; 698 KeyValueStore::ConvertFromVariantDictionary(dict, &store); 699 EXPECT_TRUE(store.ContainsString(kStringKey)); 700 EXPECT_EQ(kStringValue, store.GetString(kStringKey)); 701 EXPECT_TRUE(store.ContainsStringmap(kStringmapKey)); 702 EXPECT_EQ(kStringmapValue, store.GetStringmap(kStringmapKey)); 703 EXPECT_TRUE(store.ContainsStrings(kStringsKey)); 704 EXPECT_EQ(kStringsValue, store.GetStrings(kStringsKey)); 705 EXPECT_TRUE(store.ContainsBool(kBoolKey)); 706 EXPECT_EQ(kBoolValue, store.GetBool(kBoolKey)); 707 EXPECT_TRUE(store.ContainsInt(kInt32Key)); 708 EXPECT_EQ(kInt32Value, store.GetInt(kInt32Key)); 709 EXPECT_TRUE(store.ContainsUint(kUint32Key)); 710 EXPECT_EQ(kUint32Value, store.GetUint(kUint32Key)); 711 EXPECT_TRUE(store.ContainsByteArrays(kByteArraysKey)); 712 EXPECT_EQ(kByteArraysValue, store.GetByteArrays(kByteArraysKey)); 713 EXPECT_TRUE(store.ContainsInt16(kInt16Key)); 714 EXPECT_EQ(kInt16Value, store.GetInt16(kInt16Key)); 715 EXPECT_TRUE(store.ContainsRpcIdentifier(kRpcIdentifierKey)); 716 EXPECT_EQ(kRpcIdentifierValue, store.GetRpcIdentifier(kRpcIdentifierKey)); 717 EXPECT_TRUE(store.ContainsUint16(kUint16Key)); 718 EXPECT_EQ(kUint16Value, store.GetUint16(kUint16Key)); 719 EXPECT_TRUE(store.ContainsUint8s(kUint8sKey)); 720 EXPECT_EQ(kUint8sValue, store.GetUint8s(kUint8sKey)); 721 EXPECT_TRUE(store.ContainsUint32s(kUint32sKey)); 722 EXPECT_EQ(kUint32sValue, store.GetUint32s(kUint32sKey)); 723 EXPECT_TRUE(store.ContainsKeyValueStore(kKeyValueStoreKey)); 724 KeyValueStore nested_store; 725 nested_store.SetInt(kNestedInt32Key, kNestedInt32Value); 726 EXPECT_EQ(nested_store, store.GetKeyValueStore(kKeyValueStoreKey)); 727 } 728 729 TEST_F(KeyValueStoreTest, ConvertPathsToRpcIdentifiers) { 730 const string kRpcIdentifier1("/test1"); 731 const string kRpcIdentifier2("/test2"); 732 vector<dbus::ObjectPath> paths; 733 paths.push_back(dbus::ObjectPath(kRpcIdentifier1)); 734 paths.push_back(dbus::ObjectPath(kRpcIdentifier2)); 735 vector<string> actual_rpc_identifiers; 736 KeyValueStore::ConvertPathsToRpcIdentifiers(paths, &actual_rpc_identifiers); 737 vector<string> expected_rpc_identifiers; 738 expected_rpc_identifiers.push_back(kRpcIdentifier1); 739 expected_rpc_identifiers.push_back(kRpcIdentifier2); 740 EXPECT_EQ(expected_rpc_identifiers, actual_rpc_identifiers); 741 } 742 743 } // namespace shill 744