// // Copyright (C) 2012 The Android Open Source Project // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // #include "shill/key_value_store.h" #if defined(ENABLE_BINDER) #include #include #endif // ENABLE_BINDER #include #if defined(ENABLE_BINDER) using android::os::PersistableBundle; using android::String16; #endif // ENABLE_BINDER using std::map; using std::string; using std::vector; using testing::Test; namespace { const char kBoolKey[] = "BoolKey"; const char kBoolsKey[] = "BoolsKey"; const char kByteArraysKey[] = "ByteArraysKey"; const char kIntKey[] = "IntKey"; const char kIntsKey[] = "IntsKey"; const char kInt16Key[] = "Int16Key"; const char kInt64Key[] = "Int64Key"; const char kInt64sKey[] = "Int64sKey"; const char kDoubleKey[] = "DoubleKey"; const char kDoublesKey[] = "DoublesKey"; const char kKeyValueStoreKey[] = "KeyValueStoreKey"; const char kRpcIdentifierKey[] = "RpcIdentifierKey"; const char kRpcIdentifiersKey[] = "RpcIdentifiersKey"; const char kStringKey[] = "StringKey"; const char kStringmapKey[] = "StringmapKey"; const char kStringsKey[] = "StringsKey"; const char kUintKey[] = "UintKey"; const char kUint16Key[] = "Uint16Key"; const char kUint8Key[] = "Uint8Key"; const char kUint8sKey[] = "Uint8sKey"; const char kUint32sKey[] = "Uint32sKey"; const char kNestedInt32Key[] = "NestedInt32Key"; const bool kBoolValue = true; const vector kBoolsValue{true, false, false}; const vector> kByteArraysValue{{1}, {2}}; const int32_t kIntValue = 123; const vector kIntsValue{123, 456, 789}; const int16_t kInt16Value = 123; const int64_t kInt64Value = 0x1234000000000000; const vector kInt64sValue{0x2345000000000000, 0x6789000000000000}; const double kDoubleValue = 1.1; const vector kDoublesValue{2.2, 3.3}; const size_t kDoublesValueSize = kDoublesValue.size(); const string kRpcIdentifierValue("/org/chromium/test"); const vector kRpcIdentifiersValue{ "/org/chromium/test0", "/org/chromium/test1", "/org/chromium/test2"}; const string kStringValue("StringValue"); const map kStringmapValue = {{"key", "value"}}; const vector kStringsValue = {"StringsValue1", "StringsValue2"}; const uint32_t kUintValue = 654; const uint16_t kUint16Value = 123; const uint8_t kUint8Value = 3; const vector kUint8sValue{1, 2}; const vector kUint32sValue{1, 2}; const int32_t kNestedInt32Value = 1; } namespace shill { class KeyValueStoreTest : public Test { public: KeyValueStoreTest() {} void SetOneOfEachType(KeyValueStore* store, const KeyValueStore& nested_key_value_store_value) { store->SetBool(kBoolKey, kBoolValue); store->SetBools(kBoolsKey, kBoolsValue); store->SetByteArrays(kByteArraysKey, kByteArraysValue); store->SetInt(kIntKey, kIntValue); store->SetInts(kIntsKey, kIntsValue); store->SetInt16(kInt16Key, kInt16Value); store->SetInt64(kInt64Key, kInt64Value); store->SetInt64s(kInt64sKey, kInt64sValue); store->SetDouble(kDoubleKey, kDoubleValue); store->SetDoubles(kDoublesKey, kDoublesValue); store->SetKeyValueStore(kKeyValueStoreKey, nested_key_value_store_value); store->SetRpcIdentifier(kRpcIdentifierKey, kRpcIdentifierValue); store->SetRpcIdentifiers(kRpcIdentifiersKey, kRpcIdentifiersValue); store->SetString(kStringKey, kStringValue); store->SetStringmap(kStringmapKey, kStringmapValue); store->SetStrings(kStringsKey, kStringsValue); store->SetUint(kUintKey, kUintValue); store->SetUint16(kUint16Key, kUint16Value); store->SetUint8(kUint8Key, kUint8Value); store->SetUint8s(kUint8sKey, kUint8sValue); store->SetUint32s(kUint32sKey, kUint32sValue); } protected: KeyValueStore store_; }; TEST_F(KeyValueStoreTest, Any) { EXPECT_FALSE(store_.Contains(kStringKey)); store_.Set(kStringKey, brillo::Any(kStringValue)); EXPECT_TRUE(store_.Contains(kStringKey)); EXPECT_EQ(kStringValue, store_.Get(kStringKey).Get()); store_.Remove(kStringKey); EXPECT_FALSE(store_.Contains(kStringKey)); } TEST_F(KeyValueStoreTest, Bool) { const bool kDefaultValue = true; const bool kValue = false; EXPECT_FALSE(store_.ContainsBool(kBoolKey)); EXPECT_EQ(kDefaultValue, store_.LookupBool(kBoolKey, kDefaultValue)); store_.SetBool(kBoolKey, kValue); EXPECT_TRUE(store_.ContainsBool(kBoolKey)); // TODO(shenhan): investigate if a newer version of gtest handles EXPECT_EQ // for bools in a manner that gcc 4.7 is happy with. (Improper conversion from // "false" to "NULL"). EXPECT_EQ(static_cast(kValue), static_cast(store_.LookupBool(kBoolKey, kDefaultValue))); EXPECT_EQ(static_cast(kValue), static_cast(store_.GetBool(kBoolKey))); } TEST_F(KeyValueStoreTest, Bools) { EXPECT_FALSE(store_.ContainsBools(kBoolsKey)); store_.SetBools(kBoolsKey, kBoolsValue); EXPECT_TRUE(store_.ContainsBools(kBoolsKey)); EXPECT_EQ(kBoolsValue, store_.GetBools(kBoolsKey)); } TEST_F(KeyValueStoreTest, ByteArrays) { EXPECT_FALSE(store_.ContainsByteArrays(kByteArraysKey)); store_.SetByteArrays(kByteArraysKey, kByteArraysValue); EXPECT_TRUE(store_.ContainsByteArrays(kByteArraysKey)); EXPECT_EQ(kByteArraysValue, store_.GetByteArrays(kByteArraysKey)); store_.RemoveByteArrays(kByteArraysKey); EXPECT_FALSE(store_.ContainsByteArrays(kByteArraysKey)); } TEST_F(KeyValueStoreTest, Int) { EXPECT_FALSE(store_.ContainsInt(kIntKey)); const int kDefaultValue = 789; const int kValue = 456; EXPECT_EQ(kDefaultValue, store_.LookupInt(kIntKey, kDefaultValue)); store_.SetInt(kIntKey, kValue); EXPECT_TRUE(store_.ContainsInt(kIntKey)); EXPECT_EQ(kValue, store_.GetInt(kIntKey)); EXPECT_EQ(kValue, store_.LookupInt(kIntKey, kDefaultValue)); store_.RemoveInt(kIntKey); EXPECT_FALSE(store_.ContainsInt(kIntKey)); } TEST_F(KeyValueStoreTest, Ints) { EXPECT_FALSE(store_.ContainsInts(kIntsKey)); store_.SetInts(kIntsKey, kIntsValue); EXPECT_TRUE(store_.ContainsInts(kIntsKey)); EXPECT_EQ(kIntsValue, store_.GetInts(kIntsKey)); } TEST_F(KeyValueStoreTest, Int16) { EXPECT_FALSE(store_.ContainsInt16(kInt16Key)); store_.SetInt16(kInt16Key, kInt16Value); EXPECT_TRUE(store_.ContainsInt16(kInt16Key)); EXPECT_EQ(kInt16Value, store_.GetInt16(kInt16Key)); store_.RemoveInt16(kInt16Key); EXPECT_FALSE(store_.ContainsInt16(kInt16Key)); } TEST_F(KeyValueStoreTest, Int64) { EXPECT_FALSE(store_.ContainsInt64(kInt64Key)); store_.SetInt64(kInt64Key, kInt64Value); EXPECT_TRUE(store_.ContainsInt64(kInt64Key)); EXPECT_EQ(kInt64Value, store_.GetInt64(kInt64Key)); } TEST_F(KeyValueStoreTest, Int64s) { EXPECT_FALSE(store_.ContainsInt64s(kInt64sKey)); store_.SetInt64s(kInt64sKey, kInt64sValue); EXPECT_TRUE(store_.ContainsInt64s(kInt64sKey)); EXPECT_EQ(kInt64sValue, store_.GetInt64s(kInt64sKey)); } TEST_F(KeyValueStoreTest, Double) { EXPECT_FALSE(store_.ContainsDouble(kDoubleKey)); store_.SetDouble(kDoubleKey, kDoubleValue); EXPECT_TRUE(store_.ContainsDouble(kDoubleKey)); EXPECT_DOUBLE_EQ(kDoubleValue, store_.GetDouble(kDoubleKey)); } TEST_F(KeyValueStoreTest, Doubles) { EXPECT_FALSE(store_.ContainsDoubles(kDoublesKey)); store_.SetDoubles(kDoublesKey, kDoublesValue); EXPECT_TRUE(store_.ContainsDoubles(kDoublesKey)); vector ret = store_.GetDoubles(kDoublesKey); EXPECT_EQ(kDoublesValueSize, ret.size()); for (size_t i = 0; i < kDoublesValueSize; ++i) { EXPECT_DOUBLE_EQ(kDoublesValue[i], ret[i]); } } TEST_F(KeyValueStoreTest, KeyValueStore) { KeyValueStore value; value.SetStringmap(kStringmapKey, kStringmapValue); EXPECT_FALSE(store_.ContainsKeyValueStore(kKeyValueStoreKey)); store_.SetKeyValueStore(kKeyValueStoreKey, value); EXPECT_TRUE(store_.ContainsKeyValueStore(kKeyValueStoreKey)); EXPECT_EQ(value, store_.GetKeyValueStore(kKeyValueStoreKey)); store_.RemoveKeyValueStore(kKeyValueStoreKey); EXPECT_FALSE(store_.ContainsKeyValueStore(kKeyValueStoreKey)); } TEST_F(KeyValueStoreTest, RpcIdentifier) { EXPECT_FALSE(store_.ContainsRpcIdentifier(kRpcIdentifierKey)); store_.SetRpcIdentifier(kRpcIdentifierKey, kRpcIdentifierValue); EXPECT_TRUE(store_.ContainsRpcIdentifier(kRpcIdentifierKey)); EXPECT_EQ(kRpcIdentifierValue, store_.GetRpcIdentifier(kRpcIdentifierKey)); store_.RemoveRpcIdentifier(kRpcIdentifierKey); EXPECT_FALSE(store_.ContainsRpcIdentifier(kRpcIdentifierKey)); } TEST_F(KeyValueStoreTest, RpcIdentifiers) { EXPECT_FALSE(store_.ContainsRpcIdentifiers(kRpcIdentifiersKey)); store_.SetRpcIdentifiers(kRpcIdentifiersKey, kRpcIdentifiersValue); EXPECT_TRUE(store_.ContainsRpcIdentifiers(kRpcIdentifiersKey)); EXPECT_EQ(kRpcIdentifiersValue, store_.GetRpcIdentifiers(kRpcIdentifiersKey)); store_.Remove(kRpcIdentifiersKey); EXPECT_FALSE(store_.ContainsRpcIdentifiers(kRpcIdentifiersKey)); } TEST_F(KeyValueStoreTest, String) { const string kDefaultValue("bar"); const string kValue("baz"); EXPECT_FALSE(store_.ContainsString(kStringKey)); EXPECT_EQ(kDefaultValue, store_.LookupString(kStringKey, kDefaultValue)); store_.SetString(kStringKey, kValue); EXPECT_TRUE(store_.ContainsString(kStringKey)); EXPECT_EQ(kValue, store_.LookupString(kStringKey, kDefaultValue)); EXPECT_EQ(kValue, store_.GetString(kStringKey)); store_.RemoveString(kStringKey); EXPECT_FALSE(store_.ContainsString(kStringKey)); EXPECT_EQ(kDefaultValue, store_.LookupString(kStringKey, kDefaultValue)); } TEST_F(KeyValueStoreTest, Stringmap) { EXPECT_FALSE(store_.ContainsStringmap(kStringmapKey)); store_.SetStringmap(kStringmapKey, kStringmapValue); EXPECT_TRUE(store_.ContainsStringmap(kStringmapKey)); EXPECT_EQ(kStringmapValue, store_.GetStringmap(kStringmapKey)); store_.RemoveStringmap(kStringmapKey); EXPECT_FALSE(store_.ContainsStringmap(kStringmapKey)); } TEST_F(KeyValueStoreTest, Strings) { EXPECT_FALSE(store_.ContainsStrings(kStringsKey)); store_.SetStrings(kStringsKey, kStringsValue); EXPECT_TRUE(store_.ContainsStrings(kStringsKey)); EXPECT_EQ(kStringsValue, store_.GetStrings(kStringsKey)); store_.RemoveStrings(kStringsKey); EXPECT_FALSE(store_.ContainsStrings(kStringsKey)); } TEST_F(KeyValueStoreTest, Uint) { EXPECT_FALSE(store_.ContainsUint(kUintKey)); store_.SetUint(kUintKey, kUintValue); EXPECT_TRUE(store_.ContainsUint(kUintKey)); EXPECT_EQ(kUintValue, store_.GetUint(kUintKey)); } TEST_F(KeyValueStoreTest, Uint16) { EXPECT_FALSE(store_.ContainsUint16(kUint16Key)); store_.SetUint16(kUint16Key, kUint16Value); EXPECT_TRUE(store_.ContainsUint16(kUint16Key)); EXPECT_EQ(kUint16Value, store_.GetUint16(kUint16Key)); } TEST_F(KeyValueStoreTest, Uint8) { EXPECT_FALSE(store_.ContainsUint8(kUint8Key)); store_.SetUint8(kUint8Key, kUint8Value); EXPECT_TRUE(store_.ContainsUint8(kUint8Key)); EXPECT_EQ(kUint8Value, store_.GetUint8(kUint8Key)); store_.RemoveUint8(kUint8Key); EXPECT_FALSE(store_.ContainsUint8(kUint8Key)); } TEST_F(KeyValueStoreTest, Uint8s) { EXPECT_FALSE(store_.ContainsUint8s(kUint8sKey)); store_.SetUint8s(kUint8sKey, kUint8sValue); EXPECT_TRUE(store_.ContainsUint8s(kUint8sKey)); EXPECT_EQ(kUint8sValue, store_.GetUint8s(kUint8sKey)); store_.RemoveUint8s(kUint8sKey); EXPECT_FALSE(store_.ContainsUint8s(kUint8sKey)); } TEST_F(KeyValueStoreTest, Uint32s) { EXPECT_FALSE(store_.ContainsUint32s(kUint32sKey)); store_.SetUint32s(kUint32sKey, kUint32sValue); EXPECT_TRUE(store_.ContainsUint32s(kUint32sKey)); EXPECT_EQ(kUint32sValue, store_.GetUint32s(kUint32sKey)); store_.RemoveUint32s(kUint32sKey); EXPECT_FALSE(store_.ContainsUint32s(kUint32sKey)); } TEST_F(KeyValueStoreTest, DoubleRemove) { const string kKey("foo"); // Make sure we don't get an exception/infinite loop if we do a // "Remove()" when the key does not exist. store_.RemoveInt(kKey); store_.RemoveInt(kKey); store_.RemoveString(kKey); store_.RemoveString(kKey); } TEST_F(KeyValueStoreTest, Clear) { EXPECT_TRUE(store_.IsEmpty()); SetOneOfEachType(&store_, KeyValueStore()); EXPECT_TRUE(store_.ContainsBool(kBoolKey)); EXPECT_TRUE(store_.ContainsBools(kBoolsKey)); EXPECT_TRUE(store_.ContainsByteArrays(kByteArraysKey)); EXPECT_TRUE(store_.ContainsInt(kIntKey)); EXPECT_TRUE(store_.ContainsInts(kIntsKey)); EXPECT_TRUE(store_.ContainsInt16(kInt16Key)); EXPECT_TRUE(store_.ContainsInt64(kInt64Key)); EXPECT_TRUE(store_.ContainsInt64s(kInt64sKey)); EXPECT_TRUE(store_.ContainsDouble(kDoubleKey)); EXPECT_TRUE(store_.ContainsDoubles(kDoublesKey)); EXPECT_TRUE(store_.ContainsKeyValueStore(kKeyValueStoreKey)); EXPECT_TRUE(store_.ContainsRpcIdentifier(kRpcIdentifierKey)); EXPECT_TRUE(store_.ContainsString(kStringKey)); EXPECT_TRUE(store_.ContainsStringmap(kStringmapKey)); EXPECT_TRUE(store_.ContainsStrings(kStringsKey)); EXPECT_TRUE(store_.ContainsUint(kUintKey)); EXPECT_TRUE(store_.ContainsUint16(kUint16Key)); EXPECT_TRUE(store_.ContainsUint8s(kUint8sKey)); EXPECT_TRUE(store_.ContainsUint32s(kUint32sKey)); EXPECT_FALSE(store_.IsEmpty()); store_.Clear(); EXPECT_TRUE(store_.IsEmpty()); EXPECT_FALSE(store_.ContainsBool(kBoolKey)); EXPECT_FALSE(store_.ContainsBools(kBoolsKey)); EXPECT_FALSE(store_.ContainsByteArrays(kByteArraysKey)); EXPECT_FALSE(store_.ContainsInt(kIntKey)); EXPECT_FALSE(store_.ContainsInts(kIntsKey)); EXPECT_FALSE(store_.ContainsInt16(kInt16Key)); EXPECT_FALSE(store_.ContainsInt64(kInt64Key)); EXPECT_FALSE(store_.ContainsInt64s(kInt64sKey)); EXPECT_FALSE(store_.ContainsDouble(kDoubleKey)); EXPECT_FALSE(store_.ContainsDoubles(kDoublesKey)); EXPECT_FALSE(store_.ContainsKeyValueStore(kKeyValueStoreKey)); EXPECT_FALSE(store_.ContainsRpcIdentifier(kRpcIdentifierKey)); EXPECT_FALSE(store_.ContainsString(kStringKey)); EXPECT_FALSE(store_.ContainsStringmap(kStringmapKey)); EXPECT_FALSE(store_.ContainsStrings(kStringsKey)); EXPECT_FALSE(store_.ContainsUint(kUintKey)); EXPECT_FALSE(store_.ContainsUint16(kUint16Key)); EXPECT_FALSE(store_.ContainsUint8s(kUint8sKey)); EXPECT_FALSE(store_.ContainsUint32s(kUint32sKey)); } TEST_F(KeyValueStoreTest, Equals) { KeyValueStore first, second; first.SetBool("boolKey", true); EXPECT_NE(first, second); first.Clear(); second.Clear(); second.SetBool("boolKey", true); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetBool("boolKey", true); second.SetBool("boolOtherKey", true); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetBool("boolKey", true); second.SetBool("boolKey", false); EXPECT_NE(first, second); const vector kBools1{true, false}; const vector kBools2{false, true}; first.Clear(); second.Clear(); first.SetBools("boolsKey", kBools1); second.SetBools("boolsOtherKey", kBools1); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetBools("boolsKey", kBools1); second.SetBools("boolsKey", kBools2); EXPECT_NE(first, second); const vector> kByteArrays1{ {1, 2} }; const vector> kByteArrays2{ {3, 4} }; first.Clear(); second.Clear(); first.SetByteArrays("byteArraysKey", kByteArrays1); second.SetByteArrays("byteArraysOtherKey", kByteArrays1); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetByteArrays("byteArraysKey", kByteArrays1); second.SetByteArrays("byteArraysKey", kByteArrays2); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetInt("intKey", 123); second.SetInt("intOtherKey", 123); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetInt("intKey", 123); second.SetInt("intKey", 456); EXPECT_NE(first, second); const vector kInts1{1, 2}; const vector kInts2{3, 4}; first.Clear(); second.Clear(); first.SetInts("intsKey", kInts1); second.SetInts("intsOtherKey", kInts1); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetInts("intsKey", kInts1); second.SetInts("intsKey", kInts2); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetInt16("int16Key", 123); second.SetInt16("int16OtherKey", 123); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetInt16("int16Key", 123); second.SetInt16("int16Key", 456); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetInt64("int64Key", 0x1234000000000000); second.SetInt64("int64OtherKey", 0x1234000000000000); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetInt64("int64Key", 0x6789000000000000); second.SetInt64("int64Key", 0x2345000000000000); EXPECT_NE(first, second); const vector kInt64s1{0x1000000000000000, 0x2000000000000000}; const vector kInt64s2{0x3000000000000000, 0x4000000000000000}; first.Clear(); second.Clear(); first.SetInt64s("int64sKey", kInt64s1); second.SetInt64s("int64sOtherKey", kInt64s1); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetInt64s("int64sKey", kInt64s1); second.SetInt64s("int64sKey", kInt64s2); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetDouble("doubleKey", 1.1); second.SetDouble("doubleOtherKey", 1.1); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetDouble("doubleKey", 2.3); second.SetDouble("doubleKey", 4.5); EXPECT_NE(first, second); const vector kDoubles1{1.1, 2.2}; const vector kDoubles2{3.3, 4.4}; first.Clear(); second.Clear(); first.SetDoubles("doublesKey", kDoubles1); second.SetDoubles("doublesOtherKey", kDoubles1); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetDoubles("doublesKey", kDoubles1); second.SetDoubles("doublesKey", kDoubles2); EXPECT_NE(first, second); KeyValueStore key_value0; key_value0.SetInt("intKey", 123); KeyValueStore key_value1; key_value1.SetInt("intOtherKey", 123); first.Clear(); second.Clear(); first.SetKeyValueStore("keyValueKey", key_value0); second.SetKeyValueStore("keyValueKey", key_value1); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetKeyValueStore("keyValueKey", key_value0); second.SetKeyValueStore("keyValueOtherKey", key_value0); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetRpcIdentifier("rpcIdentifierKey", "rpcIdentifier"); second.SetRpcIdentifier("rpcIdentifierOtherKey", "rpcIdentifier"); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetRpcIdentifier("rpcIdentifierKey", "rpcIdentifier"); second.SetRpcIdentifier("rpcIdentifierKey", "otherRpcIdentifier"); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetString("stringKey", "string"); second.SetString("stringOtherKey", "string"); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetString("stringKey", "string"); second.SetString("stringKey", "otherString"); EXPECT_NE(first, second); const map kStringmap1{{"key", "value"}}; const map kStringmap2{{"otherKey", "value"}}; const map kStringmap3{{"key", "otherValue"}}; first.Clear(); second.Clear(); first.SetStringmap("stringmapKey", kStringmap1); second.SetStringmap("stringmapOtherKey", kStringmap1); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetStringmap("stringmapKey", kStringmap1); second.SetStringmap("stringmapKey", kStringmap2); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetStringmap("stringmapKey", kStringmap1); second.SetStringmap("stringmapKey", kStringmap3); EXPECT_NE(first, second); const vector kStrings1{"value"}; const vector kStrings2{"otherValue"}; first.Clear(); second.Clear(); first.SetStrings("stringsKey", kStrings1); second.SetStrings("stringsOtherKey", kStrings1); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetStrings("stringsKey", kStrings1); second.SetStrings("stringsKey", kStrings2); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetUint("uintKey", 1); second.SetUint("uintOtherKey", 1); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetUint("uintKey", 1); second.SetUint("uintKey", 2); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetUint16("uint16Key", 1); second.SetUint16("uint16OtherKey", 1); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetUint16("uint16Key", 1); second.SetUint16("uint16Key", 2); EXPECT_NE(first, second); const vector kUint8s1{1}; const vector kUint8s2{2}; first.Clear(); second.Clear(); first.SetUint8s("uint8sKey", kUint8s1); second.SetUint8s("uint8sOtherKey", kUint8s1); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetUint8s("uint8sKey", kUint8s1); second.SetUint8s("uint8sKey", kUint8s2); EXPECT_NE(first, second); const vector kUint32s1{1}; const vector kUint32s2{2}; first.Clear(); second.Clear(); first.SetUint32s("uint32sKey", kUint32s1); second.SetUint32s("uint32sOtherKey", kUint32s1); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetUint32s("uint32sKey", kUint32s1); second.SetUint32s("uint32sKey", kUint32s2); EXPECT_NE(first, second); first.Clear(); second.Clear(); first.SetBool("boolKey", true); first.SetBools("boolsKey", kBools1); first.SetByteArrays("byteArraysKey", kByteArrays1); first.SetInt("intKey", 123); first.SetInts("intsKey", kInts1); first.SetInt16("int16Key", 123); first.SetInt64("int64Key", 0x1234000000000000); first.SetInt64s("int64sKey", kInt64s1); first.SetDouble("doubleKey", 1.1); first.SetDoubles("doublesKey", kDoubles1); first.SetRpcIdentifier("rpcIdentifierKey", "rpcid"); first.SetString("stringKey", "value"); first.SetStringmap("stringmapKey", kStringmap1); first.SetStrings("stringsKey", kStrings1); first.SetUint("uintKey", 1); first.SetUint16("uint16Key", 1); first.SetUint8s("uint8sKey", kUint8s1); first.SetUint32s("uint32sKey", kUint32s1); second.SetBool("boolKey", true); second.SetBools("boolsKey", kBools1); second.SetByteArrays("byteArraysKey", kByteArrays1); second.SetInt("intKey", 123); second.SetInts("intsKey", kInts1); second.SetInt16("int16Key", 123); second.SetInt64("int64Key", 0x1234000000000000); second.SetInt64s("int64sKey", kInt64s1); second.SetDouble("doubleKey", 1.1); second.SetDoubles("doublesKey", kDoubles1); second.SetRpcIdentifier("rpcIdentifierKey", "rpcid"); second.SetString("stringKey", "value"); second.SetStringmap("stringmapKey", kStringmap1); second.SetStrings("stringsKey", kStrings1); second.SetUint("uintKey", 1); second.SetUint16("uint16Key", 1); second.SetUint8s("uint8sKey", kUint8s1); second.SetUint32s("uint32sKey", kUint32s1); EXPECT_EQ(first, second); } TEST_F(KeyValueStoreTest, CopyFrom) { KeyValueStore donor; KeyValueStore keyValueStoreValue; keyValueStoreValue.SetInt(kIntKey, kIntValue); SetOneOfEachType(&donor, keyValueStoreValue); EXPECT_TRUE(store_.IsEmpty()); store_.CopyFrom(donor); EXPECT_FALSE(store_.IsEmpty()); EXPECT_EQ(donor, store_); } TEST_F(KeyValueStoreTest, ConvertToVariantDictionary) { KeyValueStore store; KeyValueStore nested_store; nested_store.SetInt(kNestedInt32Key, kNestedInt32Value); SetOneOfEachType(&store, nested_store); brillo::VariantDictionary dict; KeyValueStore::ConvertToVariantDictionary(store, &dict); EXPECT_EQ(21, dict.size()); EXPECT_EQ(kStringValue, dict[kStringKey].Get()); map stringmap_value = dict[kStringmapKey].Get>(); EXPECT_EQ(kStringmapValue, stringmap_value); EXPECT_EQ(kStringsValue, dict[kStringsKey].Get>()); EXPECT_EQ(kBoolValue, dict[kBoolKey].Get()); EXPECT_EQ(kBoolsValue, dict[kBoolsKey].Get>()); EXPECT_EQ(kIntValue, dict[kIntKey].Get()); EXPECT_EQ(kIntsValue, dict[kIntsKey].Get>()); EXPECT_EQ(kUintValue, dict[kUintKey].Get()); EXPECT_EQ(kByteArraysValue, dict[kByteArraysKey].Get>>()); EXPECT_EQ(kInt16Value, dict[kInt16Key].Get()); EXPECT_EQ(kRpcIdentifierValue, dict[kRpcIdentifierKey].Get().value()); EXPECT_EQ(kUint16Value, dict[kUint16Key].Get()); EXPECT_EQ(kInt64Value, dict[kInt64Key].Get()); EXPECT_EQ(kInt64sValue, dict[kInt64sKey].Get>()); EXPECT_DOUBLE_EQ(kDoubleValue, dict[kDoubleKey].Get()); vector doubles_value = dict[kDoublesKey].Get>(); EXPECT_EQ(kDoublesValueSize, doubles_value.size()); for (size_t i = 0; i < kDoublesValueSize; ++i) { EXPECT_DOUBLE_EQ(kDoublesValue[i], doubles_value[i]); } EXPECT_EQ(kUint8sValue, dict[kUint8sKey].Get>()); EXPECT_EQ(kUint32sValue, dict[kUint32sKey].Get>()); brillo::VariantDictionary nested_dict = dict[kKeyValueStoreKey].Get(); EXPECT_EQ(kNestedInt32Value, nested_dict[kNestedInt32Key].Get()); } TEST_F(KeyValueStoreTest, ConvertFromVariantDictionary) { brillo::VariantDictionary dict; dict[kStringKey] = brillo::Any(string(kStringValue)); dict[kStringmapKey] = brillo::Any(kStringmapValue); dict[kStringsKey] = brillo::Any(kStringsValue); dict[kBoolKey] = brillo::Any(kBoolValue); dict[kBoolsKey] = brillo::Any(kBoolsValue); dict[kIntKey] = brillo::Any(kIntValue); dict[kIntsKey] = brillo::Any(kIntsValue); dict[kUintKey] = brillo::Any(kUintValue); dict[kByteArraysKey] = brillo::Any(kByteArraysValue); dict[kInt16Key] = brillo::Any(kInt16Value); dict[kInt64Key] = brillo::Any(kInt64Value); dict[kInt64sKey] = brillo::Any(kInt64sValue); dict[kDoubleKey] = brillo::Any(kDoubleValue); dict[kDoublesKey] = brillo::Any(kDoublesValue); dict[kRpcIdentifierKey] = brillo::Any(dbus::ObjectPath(kRpcIdentifierValue)); dict[kUint16Key] = brillo::Any(kUint16Value); dict[kUint8sKey] = brillo::Any(kUint8sValue); dict[kUint32sKey] = brillo::Any(kUint32sValue); brillo::VariantDictionary nested_dict; nested_dict[kNestedInt32Key] = brillo::Any(kNestedInt32Value); dict[kKeyValueStoreKey] = brillo::Any(nested_dict); KeyValueStore store; KeyValueStore::ConvertFromVariantDictionary(dict, &store); EXPECT_TRUE(store.ContainsString(kStringKey)); EXPECT_EQ(kStringValue, store.GetString(kStringKey)); EXPECT_TRUE(store.ContainsStringmap(kStringmapKey)); EXPECT_EQ(kStringmapValue, store.GetStringmap(kStringmapKey)); EXPECT_TRUE(store.ContainsStrings(kStringsKey)); EXPECT_EQ(kStringsValue, store.GetStrings(kStringsKey)); EXPECT_TRUE(store.ContainsBool(kBoolKey)); EXPECT_EQ(kBoolValue, store.GetBool(kBoolKey)); EXPECT_TRUE(store.ContainsBools(kBoolsKey)); EXPECT_EQ(kBoolsValue, store.GetBools(kBoolsKey)); EXPECT_TRUE(store.ContainsInt(kIntKey)); EXPECT_EQ(kIntValue, store.GetInt(kIntKey)); EXPECT_TRUE(store.ContainsInts(kIntsKey)); EXPECT_EQ(kIntsValue, store.GetInts(kIntsKey)); EXPECT_TRUE(store.ContainsUint(kUintKey)); EXPECT_EQ(kUintValue, store.GetUint(kUintKey)); EXPECT_TRUE(store.ContainsByteArrays(kByteArraysKey)); EXPECT_EQ(kByteArraysValue, store.GetByteArrays(kByteArraysKey)); EXPECT_TRUE(store.ContainsInt16(kInt16Key)); EXPECT_EQ(kInt16Value, store.GetInt16(kInt16Key)); EXPECT_TRUE(store.ContainsInt64(kInt64Key)); EXPECT_EQ(kInt64Value, store.GetInt64(kInt64Key)); EXPECT_TRUE(store.ContainsInt64s(kInt64sKey)); EXPECT_EQ(kInt64sValue, store.GetInt64s(kInt64sKey)); EXPECT_TRUE(store.ContainsDouble(kDoubleKey)); EXPECT_DOUBLE_EQ(kDoubleValue, store.GetDouble(kDoubleKey)); EXPECT_TRUE(store.ContainsDoubles(kDoublesKey)); vector doubles_value = store.GetDoubles(kDoublesKey); EXPECT_EQ(kDoublesValueSize, doubles_value.size()); for (size_t i = 0; i < kDoublesValueSize; ++i) { EXPECT_DOUBLE_EQ(kDoublesValue[i], doubles_value[i]); } EXPECT_TRUE(store.ContainsRpcIdentifier(kRpcIdentifierKey)); EXPECT_EQ(kRpcIdentifierValue, store.GetRpcIdentifier(kRpcIdentifierKey)); EXPECT_TRUE(store.ContainsUint16(kUint16Key)); EXPECT_EQ(kUint16Value, store.GetUint16(kUint16Key)); EXPECT_TRUE(store.ContainsUint8s(kUint8sKey)); EXPECT_EQ(kUint8sValue, store.GetUint8s(kUint8sKey)); EXPECT_TRUE(store.ContainsUint32s(kUint32sKey)); EXPECT_EQ(kUint32sValue, store.GetUint32s(kUint32sKey)); EXPECT_TRUE(store.ContainsKeyValueStore(kKeyValueStoreKey)); KeyValueStore nested_store; nested_store.SetInt(kNestedInt32Key, kNestedInt32Value); EXPECT_EQ(nested_store, store.GetKeyValueStore(kKeyValueStoreKey)); } #if defined(ENABLE_BINDER) TEST_F(KeyValueStoreTest, ConvertToPersistableBundle) { KeyValueStore store; KeyValueStore nested_store; nested_store.SetInt(kNestedInt32Key, kNestedInt32Value); SetOneOfEachType(&store, nested_store); PersistableBundle bundle; KeyValueStore::ConvertToPersistableBundle(store, &bundle); // Only a subset of the values added to |store| in SetOneOfEachType() are // supported. EXPECT_EQ(11, bundle.size()); bool bool_value; EXPECT_TRUE(bundle.getBoolean(String16(kBoolKey), &bool_value)); EXPECT_EQ(kBoolValue, bool_value); int int_value; EXPECT_TRUE(bundle.getInt(String16(kIntKey), &int_value)); EXPECT_EQ(kIntValue, int_value); int64_t int64_value; EXPECT_TRUE(bundle.getLong(String16(kInt64Key), &int64_value)); EXPECT_EQ(kInt64Value, int64_value); double double_value; EXPECT_TRUE(bundle.getDouble(String16(kDoubleKey), &double_value)); EXPECT_EQ(kDoubleValue, double_value); String16 string16_value; EXPECT_TRUE(bundle.getString(String16(kStringKey), &string16_value)); EXPECT_EQ(kStringValue, String16::std_string(string16_value)); vector bools_value; EXPECT_TRUE(bundle.getBooleanVector(String16(kBoolsKey), &bools_value)); EXPECT_EQ(kBoolsValue, bools_value); vector ints_value; EXPECT_TRUE(bundle.getIntVector(String16(kIntsKey), &ints_value)); EXPECT_EQ(kIntsValue, ints_value); vector int64s_value; EXPECT_TRUE(bundle.getLongVector(String16(kInt64sKey), &int64s_value)); EXPECT_EQ(kInt64sValue, int64s_value); vector doubles_value; EXPECT_TRUE(bundle.getDoubleVector(String16(kDoublesKey), &doubles_value)); EXPECT_EQ(kDoublesValue, doubles_value); vector string16_vector_value; vector strings_value; EXPECT_TRUE( bundle.getStringVector(String16(kStringsKey), &string16_vector_value)); for (const auto& str : string16_vector_value) { strings_value.push_back(String16::std_string(str)); } EXPECT_EQ(kStringsValue, strings_value); PersistableBundle nested_bundle; EXPECT_TRUE( bundle.getPersistableBundle(String16(kKeyValueStoreKey), &nested_bundle)); EXPECT_EQ(1, nested_bundle.size()); int nested_int_value; EXPECT_TRUE( nested_bundle.getInt(String16(kNestedInt32Key), &nested_int_value)); EXPECT_EQ(kNestedInt32Value, nested_int_value); } TEST_F(KeyValueStoreTest, ConvertFromPersistableBundle) { PersistableBundle bundle; bundle.putBoolean(String16(kBoolKey), kBoolValue); bundle.putInt(String16(kIntKey), kIntValue); bundle.putLong(String16(kInt64Key), kInt64Value); bundle.putDouble(String16(kDoubleKey), kDoubleValue); bundle.putString(String16(kStringKey), String16(kStringValue.c_str())); bundle.putBooleanVector(String16(kBoolsKey), kBoolsValue); bundle.putIntVector(String16(kIntsKey), kIntsValue); bundle.putLongVector(String16(kInt64sKey), kInt64sValue); bundle.putDoubleVector(String16(kDoublesKey), kDoublesValue); vector string16_vector_value; for (const auto& str : kStringsValue) { string16_vector_value.push_back(String16(str.c_str())); } bundle.putStringVector(String16(kStringsKey), string16_vector_value); PersistableBundle nested_bundle; nested_bundle.putInt(String16(kNestedInt32Key), kNestedInt32Value); bundle.putPersistableBundle(String16(kKeyValueStoreKey), nested_bundle); KeyValueStore store; KeyValueStore::ConvertFromPersistableBundle(bundle, &store); EXPECT_TRUE(store.ContainsBool(kBoolKey)); EXPECT_EQ(kBoolValue, store.GetBool(kBoolKey)); EXPECT_TRUE(store.ContainsInt(kIntKey)); EXPECT_EQ(kIntValue, store.GetInt(kIntKey)); EXPECT_TRUE(store.ContainsInt64(kInt64Key)); EXPECT_EQ(kInt64Value, store.GetInt64(kInt64Key)); EXPECT_TRUE(store.ContainsDouble(kDoubleKey)); EXPECT_DOUBLE_EQ(kDoubleValue, store.GetDouble(kDoubleKey)); EXPECT_TRUE(store.ContainsString(kStringKey)); EXPECT_EQ(kStringValue, store.GetString(kStringKey)); EXPECT_TRUE(store.ContainsBools(kBoolsKey)); EXPECT_EQ(kBoolsValue, store.GetBools(kBoolsKey)); EXPECT_TRUE(store.ContainsInts(kIntsKey)); EXPECT_EQ(kIntsValue, store.GetInts(kIntsKey)); EXPECT_TRUE(store.ContainsInt64s(kInt64sKey)); EXPECT_EQ(kInt64sValue, store.GetInt64s(kInt64sKey)); EXPECT_TRUE(store.ContainsDoubles(kDoublesKey)); vector doubles_value = store.GetDoubles(kDoublesKey); EXPECT_EQ(kDoublesValueSize, doubles_value.size()); for (size_t i = 0; i < kDoublesValueSize; ++i) { EXPECT_DOUBLE_EQ(kDoublesValue[i], doubles_value[i]); } EXPECT_TRUE(store.ContainsStrings(kStringsKey)); EXPECT_EQ(kStringsValue, store.GetStrings(kStringsKey)); EXPECT_TRUE(store.ContainsKeyValueStore(kKeyValueStoreKey)); KeyValueStore nested_store; nested_store.SetInt(kNestedInt32Key, kNestedInt32Value); EXPECT_EQ(nested_store, store.GetKeyValueStore(kKeyValueStoreKey)); } #endif // ENABLE_BINDER TEST_F(KeyValueStoreTest, ConvertPathsToRpcIdentifiers) { const string kRpcIdentifier1("/test1"); const string kRpcIdentifier2("/test2"); vector paths; paths.push_back(dbus::ObjectPath(kRpcIdentifier1)); paths.push_back(dbus::ObjectPath(kRpcIdentifier2)); vector actual_rpc_identifiers; KeyValueStore::ConvertPathsToRpcIdentifiers(paths, &actual_rpc_identifiers); vector expected_rpc_identifiers; expected_rpc_identifiers.push_back(kRpcIdentifier1); expected_rpc_identifiers.push_back(kRpcIdentifier2); EXPECT_EQ(expected_rpc_identifiers, actual_rpc_identifiers); } } // namespace shill