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/property_store.h" 18 19 #include "shill/property_store_unittest.h" 20 21 #include <map> 22 #include <string> 23 #include <utility> 24 #include <vector> 25 26 #include <base/macros.h> 27 #if defined(__ANDROID__) 28 #include <dbus/service_constants.h> 29 #else 30 #include <chromeos/dbus/service_constants.h> 31 #endif // __ANDROID__ 32 #include <gtest/gtest.h> 33 #include <gmock/gmock.h> 34 35 #include "shill/error.h" 36 #include "shill/event_dispatcher.h" 37 #include "shill/manager.h" 38 #include "shill/mock_control.h" 39 #include "shill/property_accessor.h" 40 41 using base::Bind; 42 using base::Unretained; 43 using std::map; 44 using std::string; 45 using std::vector; 46 using ::testing::_; 47 using ::testing::Return; 48 using ::testing::Values; 49 50 namespace shill { 51 52 // static 53 const brillo::Any PropertyStoreTest::kBoolV = brillo::Any(false); 54 // static 55 const brillo::Any PropertyStoreTest::kByteV = 56 brillo::Any(uint8_t(0)); 57 // static 58 const brillo::Any PropertyStoreTest::kInt16V = brillo::Any(int16_t(0)); 59 // static 60 const brillo::Any PropertyStoreTest::kInt32V = brillo::Any(int32_t(0)); 61 // static 62 const brillo::Any PropertyStoreTest::kKeyValueStoreV = 63 brillo::Any(brillo::VariantDictionary()); 64 // static 65 const brillo::Any PropertyStoreTest::kStringV = brillo::Any(string()); 66 // static 67 const brillo::Any PropertyStoreTest::kStringmapV = brillo::Any(Stringmap()); 68 // static 69 const brillo::Any PropertyStoreTest::kStringmapsV = 70 brillo::Any(Stringmaps()); 71 // static 72 const brillo::Any PropertyStoreTest::kStringsV = brillo::Any(Strings()); 73 // static 74 const brillo::Any PropertyStoreTest::kUint16V = brillo::Any(uint16_t(0)); 75 // static 76 const brillo::Any PropertyStoreTest::kUint16sV = brillo::Any(Uint16s()); 77 // static 78 const brillo::Any PropertyStoreTest::kUint32V = brillo::Any(uint32_t(0)); 79 // static 80 const brillo::Any PropertyStoreTest::kUint64V = brillo::Any(uint64_t(0)); 81 82 PropertyStoreTest::PropertyStoreTest() 83 : internal_error_(kErrorResultInternalError), 84 invalid_args_(kErrorResultInvalidArguments), 85 invalid_prop_(kErrorResultInvalidProperty), 86 path_(dir_.CreateUniqueTempDir() ? dir_.path().value() : ""), 87 metrics_(dispatcher()), 88 default_technology_order_{Technology::kVPN, 89 Technology::kEthernet, 90 Technology::kWifi, 91 Technology::kWiMax, 92 Technology::kCellular}, 93 manager_(control_interface(), 94 dispatcher(), 95 metrics(), 96 run_path(), 97 storage_path(), 98 string()) { 99 } 100 101 PropertyStoreTest::~PropertyStoreTest() {} 102 103 void PropertyStoreTest::SetUp() { 104 ASSERT_FALSE(run_path().empty()); 105 ASSERT_FALSE(storage_path().empty()); 106 } 107 108 TEST_P(PropertyStoreTest, SetPropertyNonexistent) { 109 // Ensure that an attempt to write unknown properties returns 110 // InvalidProperty, and does not yield a PropertyChange callback. 111 PropertyStore store(Bind(&PropertyStoreTest::TestCallback, 112 Unretained(this))); 113 Error error; 114 EXPECT_CALL(*this, TestCallback(_)).Times(0); 115 EXPECT_FALSE(store.SetAnyProperty("", GetParam(), &error)); 116 EXPECT_EQ(Error::kInvalidProperty, error.type()); 117 } 118 119 INSTANTIATE_TEST_CASE_P( 120 PropertyStoreTestInstance, 121 PropertyStoreTest, 122 Values(PropertyStoreTest::kBoolV, 123 PropertyStoreTest::kByteV, 124 PropertyStoreTest::kInt16V, 125 PropertyStoreTest::kInt32V, 126 PropertyStoreTest::kStringV, 127 PropertyStoreTest::kStringmapV, 128 PropertyStoreTest::kStringsV, 129 PropertyStoreTest::kUint16V, 130 PropertyStoreTest::kUint16sV, 131 PropertyStoreTest::kUint32V, 132 PropertyStoreTest::kUint64V)); 133 134 template <typename T> 135 class PropertyStoreTypedTest : public PropertyStoreTest { 136 protected: 137 bool SetProperty( 138 PropertyStore* store, const string& name, Error* error); 139 }; 140 141 TYPED_TEST_CASE(PropertyStoreTypedTest, PropertyStoreTest::PropertyTypes); 142 143 TYPED_TEST(PropertyStoreTypedTest, RegisterProperty) { 144 PropertyStore store(Bind(&PropertyStoreTest::TestCallback, 145 Unretained(this))); 146 Error error; 147 TypeParam property; 148 PropertyStoreTest::RegisterProperty(&store, "some property", &property); 149 EXPECT_TRUE(store.Contains("some property")); 150 } 151 152 TYPED_TEST(PropertyStoreTypedTest, GetProperty) { 153 PropertyStore store(Bind(&PropertyStoreTest::TestCallback, 154 Unretained(this))); 155 Error error; 156 TypeParam property{}; // value-initialize primitives 157 PropertyStoreTest::RegisterProperty(&store, "some property", &property); 158 159 TypeParam read_value; 160 EXPECT_CALL(*this, TestCallback(_)).Times(0); 161 EXPECT_TRUE(PropertyStoreTest::GetProperty( 162 store, "some property", &read_value, &error)); 163 EXPECT_EQ(property, read_value); 164 } 165 166 TYPED_TEST(PropertyStoreTypedTest, ClearProperty) { 167 PropertyStore store(Bind(&PropertyStoreTest::TestCallback, 168 Unretained(this))); 169 Error error; 170 TypeParam property; 171 PropertyStoreTest::RegisterProperty(&store, "some property", &property); 172 EXPECT_CALL(*this, TestCallback(_)); 173 EXPECT_TRUE(store.ClearProperty("some property", &error)); 174 } 175 176 TYPED_TEST(PropertyStoreTypedTest, SetProperty) { 177 PropertyStore store(Bind(&PropertyStoreTest::TestCallback, 178 Unretained(this))); 179 Error error; 180 TypeParam property{}; // value-initialize primitives 181 PropertyStoreTest::RegisterProperty(&store, "some property", &property); 182 183 // Change the value from the default (initialized above). Should 184 // generate a change callback. The second SetProperty, however, 185 // should not. Hence, we should get exactly one callback. 186 EXPECT_CALL(*this, TestCallback(_)).Times(1); 187 EXPECT_TRUE(this->SetProperty(&store, "some property", &error)); 188 EXPECT_FALSE(this->SetProperty(&store, "some property", &error)); 189 } 190 191 template<> bool PropertyStoreTypedTest<bool>::SetProperty( 192 PropertyStore* store, const string& name, Error* error) { 193 bool new_value = true; 194 return store->SetBoolProperty(name, new_value, error); 195 } 196 197 template<> bool PropertyStoreTypedTest<int16_t>::SetProperty( 198 PropertyStore* store, const string& name, Error* error) { 199 int16_t new_value = 1; 200 return store->SetInt16Property(name, new_value, error); 201 } 202 203 template<> bool PropertyStoreTypedTest<int32_t>::SetProperty( 204 PropertyStore* store, const string& name, Error* error) { 205 int32_t new_value = 1; 206 return store->SetInt32Property(name, new_value, error); 207 } 208 209 template<> bool PropertyStoreTypedTest<string>::SetProperty( 210 PropertyStore* store, const string& name, Error* error) { 211 string new_value = "new value"; 212 return store->SetStringProperty(name, new_value, error); 213 } 214 215 template<> bool PropertyStoreTypedTest<Stringmap>::SetProperty( 216 PropertyStore* store, const string& name, Error* error) { 217 Stringmap new_value; 218 new_value["new key"] = "new value"; 219 return store->SetStringmapProperty(name, new_value, error); 220 } 221 222 template<> bool PropertyStoreTypedTest<Stringmaps>::SetProperty( 223 PropertyStore* store, const string& name, Error* error) { 224 Stringmaps new_value(1); 225 new_value[0]["new key"] = "new value"; 226 return store->SetStringmapsProperty(name, new_value, error); 227 } 228 229 template<> bool PropertyStoreTypedTest<Strings>::SetProperty( 230 PropertyStore* store, const string& name, Error* error) { 231 Strings new_value(1); 232 new_value[0] = "new value"; 233 return store->SetStringsProperty(name, new_value, error); 234 } 235 236 template<> bool PropertyStoreTypedTest<uint8_t>::SetProperty( 237 PropertyStore* store, const string& name, Error* error) { 238 uint8_t new_value = 1; 239 return store->SetUint8Property(name, new_value, error); 240 } 241 242 template<> bool PropertyStoreTypedTest<uint16_t>::SetProperty( 243 PropertyStore* store, const string& name, Error* error) { 244 uint16_t new_value = 1; 245 return store->SetUint16Property(name, new_value, error); 246 } 247 248 template<> bool PropertyStoreTypedTest<Uint16s>::SetProperty( 249 PropertyStore* store, const string& name, Error* error) { 250 Uint16s new_value{1}; 251 return store->SetUint16sProperty(name, new_value, error); 252 } 253 254 template<> bool PropertyStoreTypedTest<uint32_t>::SetProperty( 255 PropertyStore* store, const string& name, Error* error) { 256 uint32_t new_value = 1; 257 return store->SetUint32Property(name, new_value, error); 258 } 259 260 TEST_F(PropertyStoreTest, ClearBoolProperty) { 261 // We exercise both possibilities for the default value here, 262 // to ensure that Clear actually resets the property based on 263 // the property's initial value (rather than the language's 264 // default value for the type). 265 static const bool kDefaults[] = {true, false}; 266 for (size_t i = 0; i < arraysize(kDefaults); ++i) { 267 PropertyStore store; 268 Error error; 269 270 const bool default_value = kDefaults[i]; 271 bool flag = default_value; 272 store.RegisterBool("some bool", &flag); 273 274 EXPECT_TRUE(store.ClearProperty("some bool", &error)); 275 EXPECT_EQ(default_value, flag); 276 } 277 } 278 279 TEST_F(PropertyStoreTest, ClearPropertyNonexistent) { 280 PropertyStore store(Bind(&PropertyStoreTest::TestCallback, 281 Unretained(this))); 282 Error error; 283 284 EXPECT_CALL(*this, TestCallback(_)).Times(0); 285 EXPECT_FALSE(store.ClearProperty("", &error)); 286 EXPECT_EQ(Error::kInvalidProperty, error.type()); 287 } 288 289 // Separate from SetPropertyNonexistent, because 290 // SetAnyProperty doesn't support Stringmaps. 291 TEST_F(PropertyStoreTest, SetStringmapsProperty) { 292 PropertyStore store(Bind(&PropertyStoreTest::TestCallback, 293 Unretained(this))); 294 295 Error error; 296 EXPECT_CALL(*this, TestCallback(_)).Times(0); 297 EXPECT_FALSE(store.SetAnyProperty( 298 "", PropertyStoreTest::kStringmapsV, &error)); 299 EXPECT_EQ(Error::kInternalError, error.type()); 300 } 301 302 // KeyValueStoreProperty is only defined for derived types so handle 303 // this case manually here. 304 TEST_F(PropertyStoreTest, KeyValueStorePropertyNonExistent) { 305 PropertyStore store(Bind(&PropertyStoreTest::TestCallback, 306 Unretained(this))); 307 Error error; 308 EXPECT_CALL(*this, TestCallback(_)).Times(0); 309 EXPECT_FALSE(store.SetAnyProperty( 310 "", PropertyStoreTest::kKeyValueStoreV, &error)); 311 EXPECT_EQ(Error::kInvalidProperty, error.type()); 312 } 313 314 TEST_F(PropertyStoreTest, KeyValueStoreProperty) { 315 PropertyStore store(Bind(&PropertyStoreTest::TestCallback, 316 Unretained(this))); 317 const char kKey[] = "key"; 318 EXPECT_CALL(*this, GetKeyValueStoreCallback(_)) 319 .WillOnce(Return(KeyValueStore())); 320 store.RegisterDerivedKeyValueStore( 321 kKey, 322 KeyValueStoreAccessor( 323 new CustomAccessor<PropertyStoreTest, KeyValueStore>( 324 this, &PropertyStoreTest::GetKeyValueStoreCallback, 325 &PropertyStoreTest::SetKeyValueStoreCallback))); 326 EXPECT_CALL(*this, TestCallback(_)); 327 EXPECT_CALL(*this, SetKeyValueStoreCallback(_, _)).WillOnce(Return(true)); 328 Error error; 329 EXPECT_TRUE(store.SetAnyProperty(kKey, kKeyValueStoreV, &error)); 330 } 331 332 TEST_F(PropertyStoreTest, WriteOnlyProperties) { 333 // Test that properties registered as write-only are not returned 334 // when using Get*PropertiesIter(). 335 PropertyStore store; 336 { 337 const string keys[] = {"boolp1", "boolp2"}; 338 bool values[] = {true, true}; 339 store.RegisterWriteOnlyBool(keys[0], &values[0]); 340 store.RegisterBool(keys[1], &values[1]); 341 342 ReadablePropertyConstIterator<bool> it = store.GetBoolPropertiesIter(); 343 EXPECT_FALSE(it.AtEnd()); 344 EXPECT_EQ(keys[1], it.Key()); 345 EXPECT_TRUE(values[1] == it.value()); 346 it.Advance(); 347 EXPECT_TRUE(it.AtEnd()); 348 349 Error errors[2]; 350 EXPECT_FALSE(store.GetBoolProperty(keys[0], nullptr, &errors[0])); 351 EXPECT_EQ(Error::kPermissionDenied, errors[0].type()); 352 bool test_value; 353 EXPECT_TRUE(store.GetBoolProperty(keys[1], &test_value, &errors[1])); 354 EXPECT_TRUE(errors[1].IsSuccess()); 355 EXPECT_EQ(values[1], test_value); 356 } 357 { 358 const string keys[] = {"int16p1", "int16p2"}; 359 int16_t values[] = {127, 128}; 360 store.RegisterWriteOnlyInt16(keys[0], &values[0]); 361 store.RegisterInt16(keys[1], &values[1]); 362 363 ReadablePropertyConstIterator<int16_t> it = store.GetInt16PropertiesIter(); 364 EXPECT_FALSE(it.AtEnd()); 365 EXPECT_EQ(keys[1], it.Key()); 366 EXPECT_EQ(values[1], it.value()); 367 it.Advance(); 368 EXPECT_TRUE(it.AtEnd()); 369 370 Error errors[2]; 371 EXPECT_FALSE(store.GetInt16Property(keys[0], nullptr, &errors[0])); 372 EXPECT_EQ(Error::kPermissionDenied, errors[0].type()); 373 int16_t test_value; 374 EXPECT_TRUE(store.GetInt16Property(keys[1], &test_value, &errors[1])); 375 EXPECT_TRUE(errors[1].IsSuccess()); 376 EXPECT_EQ(values[1], test_value); 377 } 378 { 379 const string keys[] = {"int32p1", "int32p2"}; 380 int32_t values[] = {127, 128}; 381 store.RegisterWriteOnlyInt32(keys[0], &values[0]); 382 store.RegisterInt32(keys[1], &values[1]); 383 384 ReadablePropertyConstIterator<int32_t> it = store.GetInt32PropertiesIter(); 385 EXPECT_FALSE(it.AtEnd()); 386 EXPECT_EQ(keys[1], it.Key()); 387 EXPECT_EQ(values[1], it.value()); 388 it.Advance(); 389 EXPECT_TRUE(it.AtEnd()); 390 391 Error errors[2]; 392 EXPECT_FALSE(store.GetInt32Property(keys[0], nullptr, &errors[0])); 393 EXPECT_EQ(Error::kPermissionDenied, errors[0].type()); 394 int32_t test_value; 395 EXPECT_TRUE(store.GetInt32Property(keys[1], &test_value, &errors[1])); 396 EXPECT_TRUE(errors[1].IsSuccess()); 397 EXPECT_EQ(values[1], test_value); 398 } 399 { 400 const string keys[] = {"stringp1", "stringp2"}; 401 string values[] = {"noooo", "yesss"}; 402 store.RegisterWriteOnlyString(keys[0], &values[0]); 403 store.RegisterString(keys[1], &values[1]); 404 405 ReadablePropertyConstIterator<string> it = store.GetStringPropertiesIter(); 406 EXPECT_FALSE(it.AtEnd()); 407 EXPECT_EQ(keys[1], it.Key()); 408 EXPECT_EQ(values[1], it.value()); 409 it.Advance(); 410 EXPECT_TRUE(it.AtEnd()); 411 412 Error errors[2]; 413 EXPECT_FALSE(store.GetStringProperty(keys[0], nullptr, &errors[0])); 414 EXPECT_EQ(Error::kPermissionDenied, errors[0].type()); 415 string test_value; 416 EXPECT_TRUE(store.GetStringProperty(keys[1], &test_value, &errors[1])); 417 EXPECT_TRUE(errors[1].IsSuccess()); 418 EXPECT_EQ(values[1], test_value); 419 } 420 { 421 const string keys[] = {"stringmapp1", "stringmapp2"}; 422 Stringmap values[2]; 423 values[0]["noooo"] = "yesss"; 424 values[1]["yesss"] = "noooo"; 425 store.RegisterWriteOnlyStringmap(keys[0], &values[0]); 426 store.RegisterStringmap(keys[1], &values[1]); 427 428 ReadablePropertyConstIterator<Stringmap> it = 429 store.GetStringmapPropertiesIter(); 430 EXPECT_FALSE(it.AtEnd()); 431 EXPECT_EQ(keys[1], it.Key()); 432 EXPECT_TRUE(values[1] == it.value()); 433 it.Advance(); 434 EXPECT_TRUE(it.AtEnd()); 435 436 Error errors[2]; 437 EXPECT_FALSE(store.GetStringmapProperty(keys[0], nullptr, &errors[0])); 438 EXPECT_EQ(Error::kPermissionDenied, errors[0].type()); 439 Stringmap test_value; 440 EXPECT_TRUE(store.GetStringmapProperty(keys[1], &test_value, &errors[1])); 441 EXPECT_TRUE(errors[1].IsSuccess()); 442 EXPECT_TRUE(values[1] == test_value); 443 } 444 { 445 const string keys[] = {"stringmapsp1", "stringmapsp2"}; 446 Stringmaps values[2]; 447 Stringmap element; 448 element["noooo"] = "yesss"; 449 values[0].push_back(element); 450 element["yesss"] = "noooo"; 451 values[1].push_back(element); 452 453 store.RegisterWriteOnlyStringmaps(keys[0], &values[0]); 454 store.RegisterStringmaps(keys[1], &values[1]); 455 456 ReadablePropertyConstIterator<Stringmaps> it = 457 store.GetStringmapsPropertiesIter(); 458 EXPECT_FALSE(it.AtEnd()); 459 EXPECT_EQ(keys[1], it.Key()); 460 EXPECT_TRUE(values[1] == it.value()); 461 it.Advance(); 462 EXPECT_TRUE(it.AtEnd()); 463 464 Error errors[2]; 465 EXPECT_FALSE(store.GetStringmapsProperty(keys[0], nullptr, &errors[0])); 466 EXPECT_EQ(Error::kPermissionDenied, errors[0].type()); 467 Stringmaps test_value; 468 EXPECT_TRUE(store.GetStringmapsProperty(keys[1], &test_value, &errors[1])); 469 EXPECT_TRUE(errors[1].IsSuccess()); 470 EXPECT_TRUE(values[1] == test_value); 471 } 472 { 473 const string keys[] = {"stringsp1", "stringsp2"}; 474 Strings values[2]; 475 string element; 476 element = "noooo"; 477 values[0].push_back(element); 478 element = "yesss"; 479 values[1].push_back(element); 480 store.RegisterWriteOnlyStrings(keys[0], &values[0]); 481 store.RegisterStrings(keys[1], &values[1]); 482 483 ReadablePropertyConstIterator<Strings> it = 484 store.GetStringsPropertiesIter(); 485 EXPECT_FALSE(it.AtEnd()); 486 EXPECT_EQ(keys[1], it.Key()); 487 EXPECT_TRUE(values[1] == it.value()); 488 it.Advance(); 489 EXPECT_TRUE(it.AtEnd()); 490 491 Error errors[2]; 492 EXPECT_FALSE(store.GetStringsProperty(keys[0], nullptr, &errors[0])); 493 EXPECT_EQ(Error::kPermissionDenied, errors[0].type()); 494 Strings test_value; 495 EXPECT_TRUE(store.GetStringsProperty(keys[1], &test_value, &errors[1])); 496 EXPECT_TRUE(errors[1].IsSuccess()); 497 EXPECT_TRUE(values[1] == test_value); 498 } 499 { 500 const string keys[] = {"uint8p1", "uint8p2"}; 501 uint8_t values[] = {127, 128}; 502 store.RegisterWriteOnlyUint8(keys[0], &values[0]); 503 store.RegisterUint8(keys[1], &values[1]); 504 505 ReadablePropertyConstIterator<uint8_t> it = store.GetUint8PropertiesIter(); 506 EXPECT_FALSE(it.AtEnd()); 507 EXPECT_EQ(keys[1], it.Key()); 508 EXPECT_EQ(values[1], it.value()); 509 it.Advance(); 510 EXPECT_TRUE(it.AtEnd()); 511 512 Error errors[2]; 513 EXPECT_FALSE(store.GetUint8Property(keys[0], nullptr, &errors[0])); 514 EXPECT_EQ(Error::kPermissionDenied, errors[0].type()); 515 uint8_t test_value; 516 EXPECT_TRUE(store.GetUint8Property(keys[1], &test_value, &errors[1])); 517 EXPECT_TRUE(errors[1].IsSuccess()); 518 EXPECT_EQ(values[1], test_value); 519 } 520 { 521 const string keys[] = {"uint16p", "uint16p1"}; 522 uint16_t values[] = {127, 128}; 523 store.RegisterWriteOnlyUint16(keys[0], &values[0]); 524 store.RegisterUint16(keys[1], &values[1]); 525 526 ReadablePropertyConstIterator<uint16_t> it = 527 store.GetUint16PropertiesIter(); 528 EXPECT_FALSE(it.AtEnd()); 529 EXPECT_EQ(keys[1], it.Key()); 530 EXPECT_EQ(values[1], it.value()); 531 it.Advance(); 532 EXPECT_TRUE(it.AtEnd()); 533 534 Error errors[2]; 535 EXPECT_FALSE(store.GetUint16Property(keys[0], nullptr, &errors[0])); 536 EXPECT_EQ(Error::kPermissionDenied, errors[0].type()); 537 uint16_t test_value; 538 EXPECT_TRUE(store.GetUint16Property(keys[1], &test_value, &errors[1])); 539 EXPECT_TRUE(errors[1].IsSuccess()); 540 EXPECT_EQ(values[1], test_value); 541 } 542 } 543 544 TEST_F(PropertyStoreTest, SetAnyProperty) { 545 // Test that registered properties can be set using brillo::Any variant 546 // type. 547 PropertyStore store; 548 { 549 // Register property value. 550 const string key = "boolp"; 551 bool value = true; 552 store.RegisterBool(key, &value); 553 554 // Verify property value. 555 bool test_value; 556 Error error; 557 EXPECT_TRUE(store.GetBoolProperty(key, &test_value, &error)); 558 EXPECT_EQ(value, test_value); 559 560 // Set property using brillo::Any variant type. 561 bool new_value = false; 562 EXPECT_TRUE(store.SetAnyProperty(key, brillo::Any(new_value), &error)); 563 EXPECT_TRUE(store.GetBoolProperty(key, &test_value, &error)); 564 EXPECT_EQ(new_value, test_value); 565 } 566 { 567 // Register property value. 568 const string key = "int16p"; 569 int16_t value = 127; 570 store.RegisterInt16(key, &value); 571 572 // Verify property value. 573 int16_t test_value; 574 Error error; 575 EXPECT_TRUE(store.GetInt16Property(key, &test_value, &error)); 576 EXPECT_EQ(value, test_value); 577 578 // Set property using brillo::Any variant type. 579 int16_t new_value = 128; 580 EXPECT_TRUE(store.SetAnyProperty(key, brillo::Any(new_value), &error)); 581 EXPECT_TRUE(store.GetInt16Property(key, &test_value, &error)); 582 EXPECT_EQ(new_value, test_value); 583 } 584 { 585 // Register property value. 586 const string key = "int32p"; 587 int32_t value = 127; 588 store.RegisterInt32(key, &value); 589 590 // Verify property value. 591 int32_t test_value; 592 Error error; 593 EXPECT_TRUE(store.GetInt32Property(key, &test_value, &error)); 594 EXPECT_EQ(value, test_value); 595 596 // Set property using brillo::Any variant type. 597 int32_t new_value = 128; 598 EXPECT_TRUE(store.SetAnyProperty(key, brillo::Any(new_value), &error)); 599 EXPECT_TRUE(store.GetInt32Property(key, &test_value, &error)); 600 EXPECT_EQ(new_value, test_value); 601 } 602 { 603 // Register property value. 604 const string key = "stringp"; 605 string value = "noooo"; 606 store.RegisterString(key, &value); 607 608 // Verify property value. 609 string test_value; 610 Error error; 611 EXPECT_TRUE(store.GetStringProperty(key, &test_value, &error)); 612 EXPECT_EQ(value, test_value); 613 614 // Set property using brillo::Any variant type. 615 string new_value = "yesss"; 616 EXPECT_TRUE(store.SetAnyProperty(key, brillo::Any(new_value), &error)); 617 EXPECT_TRUE(store.GetStringProperty(key, &test_value, &error)); 618 EXPECT_EQ(new_value, test_value); 619 } 620 { 621 // Register property value. 622 const string key = "stringmapp"; 623 Stringmap value; 624 value["noooo"] = "yesss"; 625 store.RegisterStringmap(key, &value); 626 627 // Verify property value. 628 Stringmap test_value; 629 Error error; 630 EXPECT_TRUE(store.GetStringmapProperty(key, &test_value, &error)); 631 EXPECT_TRUE(value == test_value); 632 633 // Set property using brillo::Any variant type. 634 Stringmap new_value; 635 new_value["yesss"] = "noooo"; 636 EXPECT_TRUE(store.SetAnyProperty(key, brillo::Any(new_value), &error)); 637 EXPECT_TRUE(store.GetStringmapProperty(key, &test_value, &error)); 638 EXPECT_TRUE(new_value == test_value); 639 } 640 { 641 // Register property value. 642 const string key = "stringsp"; 643 Strings value; 644 string element; 645 element = "noooo"; 646 value.push_back(element); 647 store.RegisterStrings(key, &value); 648 649 // Verify property value. 650 Strings test_value; 651 Error error; 652 EXPECT_TRUE(store.GetStringsProperty(key, &test_value, &error)); 653 EXPECT_TRUE(value == test_value); 654 655 // Set property using brillo::Any variant type. 656 Strings new_value; 657 string new_element; 658 new_element = "yesss"; 659 new_value.push_back(new_element); 660 EXPECT_TRUE(store.SetAnyProperty(key, brillo::Any(new_value), &error)); 661 EXPECT_TRUE(store.GetStringsProperty(key, &test_value, &error)); 662 EXPECT_TRUE(new_value == test_value); 663 } 664 { 665 // Register property value. 666 const string key = "uint8p"; 667 uint8_t value = 127; 668 store.RegisterUint8(key, &value); 669 670 // Verify property value. 671 uint8_t test_value; 672 Error error; 673 EXPECT_TRUE(store.GetUint8Property(key, &test_value, &error)); 674 EXPECT_EQ(value, test_value); 675 676 // Set property using brillo::Any variant type. 677 uint8_t new_value = 128; 678 EXPECT_TRUE(store.SetAnyProperty(key, brillo::Any(new_value), &error)); 679 EXPECT_TRUE(store.GetUint8Property(key, &test_value, &error)); 680 EXPECT_EQ(new_value, test_value); 681 } 682 { 683 // Register property value. 684 const string key = "uint16p"; 685 uint16_t value = 127; 686 store.RegisterUint16(key, &value); 687 688 // Verify property value. 689 uint16_t test_value; 690 Error error; 691 EXPECT_TRUE(store.GetUint16Property(key, &test_value, &error)); 692 EXPECT_EQ(value, test_value); 693 694 // Set property using brillo::Any variant type. 695 uint16_t new_value = 128; 696 EXPECT_TRUE(store.SetAnyProperty(key, brillo::Any(new_value), &error)); 697 EXPECT_TRUE(store.GetUint16Property(key, &test_value, &error)); 698 EXPECT_EQ(new_value, test_value); 699 } 700 { 701 // Register property value. 702 const string key = "uint32p"; 703 uint32_t value = 127; 704 store.RegisterUint32(key, &value); 705 706 // Verify property value. 707 uint32_t test_value; 708 Error error; 709 EXPECT_TRUE(store.GetUint32Property(key, &test_value, &error)); 710 EXPECT_EQ(value, test_value); 711 712 // Set property using brillo::Any variant type. 713 uint32_t new_value = 128; 714 EXPECT_TRUE(store.SetAnyProperty(key, brillo::Any(new_value), &error)); 715 EXPECT_TRUE(store.GetUint32Property(key, &test_value, &error)); 716 EXPECT_EQ(new_value, test_value); 717 } 718 { 719 // KeyValueStoreProperty is only defined for derived types so handle 720 // this case manually here. 721 const string key = "keyvaluestorep"; 722 EXPECT_CALL(*this, GetKeyValueStoreCallback(_)) 723 .WillOnce(Return(KeyValueStore())); 724 store.RegisterDerivedKeyValueStore( 725 key, 726 KeyValueStoreAccessor( 727 new CustomAccessor<PropertyStoreTest, KeyValueStore>( 728 this, &PropertyStoreTest::GetKeyValueStoreCallback, 729 &PropertyStoreTest::SetKeyValueStoreCallback))); 730 731 brillo::VariantDictionary value; 732 EXPECT_CALL(*this, SetKeyValueStoreCallback(_, _)).WillOnce(Return(true)); 733 Error error; 734 EXPECT_TRUE(store.SetAnyProperty(key, brillo::Any(value), &error)); 735 } 736 } 737 738 TEST_F(PropertyStoreTest, SetAndGetProperties) { 739 PropertyStore store; 740 741 // Register properties. 742 const string kBoolKey = "boolp"; 743 const string kKeyValueStoreKey = "keyvaluestorep"; 744 const string kInt16Key = "int16p"; 745 const string kInt32Key = "int32p"; 746 const string kStringKey = "stringp"; 747 const string kStringsKey = "stringsp"; 748 const string kStringmapKey = "stringmapp"; 749 const string kUint8Key = "uint8p"; 750 const string kUint16Key = "uint16p"; 751 const string kUint32Key = "uint32p"; 752 bool bool_value = true; 753 int16_t int16_value = 16; 754 int32_t int32_value = 32; 755 string string_value = "string"; 756 Stringmap stringmap_value; 757 stringmap_value["noooo"] = "yesss"; 758 Strings strings_value; 759 strings_value.push_back("yesss"); 760 uint8_t uint8_value = 8; 761 uint16_t uint16_value = 16; 762 uint32_t uint32_value = 32; 763 764 store.RegisterBool(kBoolKey, &bool_value); 765 store.RegisterInt16(kInt16Key, &int16_value); 766 store.RegisterInt32(kInt32Key, &int32_value); 767 store.RegisterString(kStringKey, &string_value); 768 store.RegisterStrings(kStringsKey, &strings_value); 769 store.RegisterStringmap(kStringmapKey, &stringmap_value); 770 store.RegisterUint8(kUint8Key, &uint8_value); 771 store.RegisterUint16(kUint16Key, &uint16_value); 772 store.RegisterUint32(kUint32Key, &uint32_value); 773 774 // Special handling for KeyValueStore property. 775 EXPECT_CALL(*this, GetKeyValueStoreCallback(_)) 776 .WillOnce(Return(KeyValueStore())); 777 store.RegisterDerivedKeyValueStore( 778 kKeyValueStoreKey, 779 KeyValueStoreAccessor( 780 new CustomAccessor<PropertyStoreTest, KeyValueStore>( 781 this, &PropertyStoreTest::GetKeyValueStoreCallback, 782 &PropertyStoreTest::SetKeyValueStoreCallback))); 783 784 // Update properties. 785 bool new_bool_value = false; 786 brillo::VariantDictionary new_key_value_store_value; 787 int16_t new_int16_value = 17; 788 int32_t new_int32_value = 33; 789 string new_string_value = "strings"; 790 Stringmap new_stringmap_value; 791 new_stringmap_value["yesss"] = "noooo"; 792 Strings new_strings_value; 793 new_strings_value.push_back("noooo"); 794 uint8_t new_uint8_value = 9; 795 uint16_t new_uint16_value = 17; 796 uint32_t new_uint32_value = 33; 797 798 brillo::VariantDictionary dict; 799 dict.insert(std::make_pair(kBoolKey, brillo::Any(new_bool_value))); 800 dict.insert(std::make_pair(kKeyValueStoreKey, 801 brillo::Any(new_key_value_store_value))); 802 dict.insert(std::make_pair(kInt16Key, brillo::Any(new_int16_value))); 803 dict.insert(std::make_pair(kInt32Key, brillo::Any(new_int32_value))); 804 dict.insert(std::make_pair(kStringKey, brillo::Any(new_string_value))); 805 dict.insert(std::make_pair(kStringmapKey, 806 brillo::Any(new_stringmap_value))); 807 dict.insert(std::make_pair(kStringsKey, brillo::Any(new_strings_value))); 808 dict.insert(std::make_pair(kUint8Key, brillo::Any(new_uint8_value))); 809 dict.insert(std::make_pair(kUint16Key, brillo::Any(new_uint16_value))); 810 dict.insert(std::make_pair(kUint32Key, brillo::Any(new_uint32_value))); 811 812 EXPECT_CALL(*this, SetKeyValueStoreCallback(_, _)).WillOnce(Return(true)); 813 Error error; 814 EXPECT_TRUE(store.SetProperties(dict, &error)); 815 816 // Retrieve properties. 817 EXPECT_CALL(*this, GetKeyValueStoreCallback(_)) 818 .WillOnce(Return(KeyValueStore())); 819 brillo::VariantDictionary result_dict; 820 EXPECT_TRUE(store.GetProperties(&result_dict, &error)); 821 822 // Verify property values. 823 EXPECT_EQ(new_bool_value, result_dict[kBoolKey].Get<bool>()); 824 EXPECT_EQ(new_int16_value, result_dict[kInt16Key].Get<int16_t>()); 825 EXPECT_EQ(new_int32_value, result_dict[kInt32Key].Get<int32_t>()); 826 EXPECT_EQ(new_string_value, result_dict[kStringKey].Get<string>()); 827 EXPECT_TRUE( 828 new_stringmap_value == result_dict[kStringmapKey].Get<Stringmap>()); 829 EXPECT_TRUE(new_strings_value == result_dict[kStringsKey].Get<Strings>()); 830 EXPECT_EQ(new_uint8_value, result_dict[kUint8Key].Get<uint8_t>()); 831 EXPECT_EQ(new_uint16_value, result_dict[kUint16Key].Get<uint16_t>()); 832 EXPECT_EQ(new_uint32_value, result_dict[kUint32Key].Get<uint32_t>()); 833 } 834 835 } // namespace shill 836