1a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved. 2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file. 4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 5f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "components/policy/core/common/registry_dict_win.h" 6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 7a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <string> 8a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 9a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/values.h" 10a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/policy/core/common/schema.h" 11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 13a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace policy { 14a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace { 15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST(RegistryDictTest, SetAndGetValue) { 17a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict test_dict; 18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FundamentalValue int_value(42); 20a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringValue string_value("fortytwo"); 21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 22116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_dict.SetValue("one", scoped_ptr<base::Value>(int_value.DeepCopy())); 23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, test_dict.values().size()); 24a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&int_value, test_dict.GetValue("one"))); 25a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(test_dict.GetValue("two")); 26a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 27116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_dict.SetValue("two", scoped_ptr<base::Value>(string_value.DeepCopy())); 28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2, test_dict.values().size()); 29a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&int_value, test_dict.GetValue("one"))); 30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&string_value, test_dict.GetValue("two"))); 31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<base::Value> one(test_dict.RemoveValue("one")); 33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, test_dict.values().size()); 34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&int_value, one.get())); 35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(test_dict.GetValue("one")); 36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&string_value, test_dict.GetValue("two"))); 37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_dict.ClearValues(); 39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(test_dict.GetValue("one")); 40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(test_dict.GetValue("two")); 41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(test_dict.values().empty()); 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST(RegistryDictTest, CaseInsensitiveButPreservingValueNames) { 45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict test_dict; 46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FundamentalValue int_value(42); 48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringValue string_value("fortytwo"); 49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 50116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_dict.SetValue("One", scoped_ptr<base::Value>(int_value.DeepCopy())); 51a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, test_dict.values().size()); 52a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&int_value, test_dict.GetValue("oNe"))); 53a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 54a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict::ValueMap::const_iterator entry = test_dict.values().begin(); 55a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_NE(entry, test_dict.values().end()); 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ("One", entry->first); 57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 58116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_dict.SetValue("ONE", scoped_ptr<base::Value>(string_value.DeepCopy())); 59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, test_dict.values().size()); 60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&string_value, test_dict.GetValue("one"))); 61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<base::Value> removed_value(test_dict.RemoveValue("onE")); 63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&string_value, removed_value.get())); 64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(test_dict.values().empty()); 65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST(RegistryDictTest, SetAndGetKeys) { 68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict test_dict; 69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FundamentalValue int_value(42); 71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringValue string_value("fortytwo"); 72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<RegistryDict> subdict(new RegistryDict()); 74116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch subdict->SetValue("one", scoped_ptr<base::Value>(int_value.DeepCopy())); 75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_dict.SetKey("two", subdict.Pass()); 76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, test_dict.keys().size()); 77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict* actual_subdict = test_dict.GetKey("two"); 78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(actual_subdict); 79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&int_value, actual_subdict->GetValue("one"))); 80a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 81a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) subdict.reset(new RegistryDict()); 82116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch subdict->SetValue("three", scoped_ptr<base::Value>(string_value.DeepCopy())); 83a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_dict.SetKey("four", subdict.Pass()); 84a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(2, test_dict.keys().size()); 85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) actual_subdict = test_dict.GetKey("two"); 86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(actual_subdict); 87a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&int_value, actual_subdict->GetValue("one"))); 88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) actual_subdict = test_dict.GetKey("four"); 89a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(actual_subdict); 90a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&string_value, 91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) actual_subdict->GetValue("three"))); 92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_dict.ClearKeys(); 94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(test_dict.GetKey("one")); 95a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(test_dict.GetKey("three")); 96a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(test_dict.keys().empty()); 97a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST(RegistryDictTest, CaseInsensitiveButPreservingKeyNames) { 100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict test_dict; 101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FundamentalValue int_value(42); 103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 104116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_dict.SetKey("One", make_scoped_ptr(new RegistryDict()).Pass()); 105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, test_dict.keys().size()); 106a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict* actual_subdict = test_dict.GetKey("One"); 107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(actual_subdict); 108a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(actual_subdict->values().empty()); 109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict::KeyMap::const_iterator entry = test_dict.keys().begin(); 111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_NE(entry, test_dict.keys().end()); 112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ("One", entry->first); 113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<RegistryDict> subdict(new RegistryDict()); 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch subdict->SetValue("two", scoped_ptr<base::Value>(int_value.DeepCopy())); 116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_dict.SetKey("ONE", subdict.Pass()); 117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_EQ(1, test_dict.keys().size()); 118a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) actual_subdict = test_dict.GetKey("One"); 119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(actual_subdict); 120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&int_value, 121a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) actual_subdict->GetValue("two"))); 122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<RegistryDict> removed_key(test_dict.RemoveKey("one")); 124a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(removed_key); 125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&int_value, 126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) removed_key->GetValue("two"))); 127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(test_dict.keys().empty()); 128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST(RegistryDictTest, Merge) { 131a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict dict_a; 132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict dict_b; 133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FundamentalValue int_value(42); 135a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringValue string_value("fortytwo"); 136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 137116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dict_a.SetValue("one", scoped_ptr<base::Value>(int_value.DeepCopy())); 138a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<RegistryDict> subdict(new RegistryDict()); 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch subdict->SetValue("two", scoped_ptr<base::Value>(string_value.DeepCopy())); 140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dict_a.SetKey("three", subdict.Pass()); 141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 142116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dict_b.SetValue("four", scoped_ptr<base::Value>(string_value.DeepCopy())); 143a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) subdict.reset(new RegistryDict()); 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch subdict->SetValue("two", scoped_ptr<base::Value>(int_value.DeepCopy())); 145a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dict_b.SetKey("three", subdict.Pass()); 146a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) subdict.reset(new RegistryDict()); 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch subdict->SetValue("five", scoped_ptr<base::Value>(int_value.DeepCopy())); 148a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dict_b.SetKey("six", subdict.Pass()); 149a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 150a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dict_a.Merge(dict_b); 151a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&int_value, dict_a.GetValue("one"))); 153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&string_value, dict_b.GetValue("four"))); 154a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict* actual_subdict = dict_a.GetKey("three"); 155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(actual_subdict); 156a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&int_value, actual_subdict->GetValue("two"))); 157a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) actual_subdict = dict_a.GetKey("six"); 158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(actual_subdict); 159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&int_value, 160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) actual_subdict->GetValue("five"))); 161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST(RegistryDictTest, Swap) { 164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict dict_a; 165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict dict_b; 166a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FundamentalValue int_value(42); 168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringValue string_value("fortytwo"); 169a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dict_a.SetValue("one", scoped_ptr<base::Value>(int_value.DeepCopy())); 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dict_a.SetKey("two", make_scoped_ptr(new RegistryDict()).Pass()); 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dict_b.SetValue("three", scoped_ptr<base::Value>(string_value.DeepCopy())); 173a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) dict_a.Swap(&dict_b); 175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 176a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&int_value, dict_b.GetValue("one"))); 177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(dict_b.GetKey("two")); 178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(dict_b.GetValue("two")); 179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&string_value, dict_a.GetValue("three"))); 181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(dict_a.GetValue("one")); 182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_FALSE(dict_a.GetKey("two")); 183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST(RegistryDictTest, ConvertToJSON) { 186a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict test_dict; 187a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 188a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FundamentalValue int_value(42); 189a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringValue string_value("fortytwo"); 190a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::StringValue string_zero("0"); 191a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::StringValue string_dict("{ \"key\": [ \"value\" ] }"); 192a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_dict.SetValue("one", scoped_ptr<base::Value>(int_value.DeepCopy())); 194a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<RegistryDict> subdict(new RegistryDict()); 195116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch subdict->SetValue("two", scoped_ptr<base::Value>(string_value.DeepCopy())); 196a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_dict.SetKey("three", subdict.Pass()); 197a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<RegistryDict> list(new RegistryDict()); 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch list->SetValue("1", scoped_ptr<base::Value>(string_value.DeepCopy())); 199a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) test_dict.SetKey("dict-to-list", list.Pass()); 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_dict.SetValue("int-to-bool", 201116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<base::Value>(int_value.DeepCopy())); 202116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_dict.SetValue("int-to-double", 203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<base::Value>(int_value.DeepCopy())); 204116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_dict.SetValue("string-to-bool", 205116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<base::Value>(string_zero.DeepCopy())); 206a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) test_dict.SetValue("string-to-double", 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<base::Value>(string_zero.DeepCopy())); 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_dict.SetValue("string-to-int", 209116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<base::Value>(string_zero.DeepCopy())); 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_dict.SetValue("string-to-dict", 211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<base::Value>(string_dict.DeepCopy())); 212a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 213a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) std::string error; 214a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Schema schema = Schema::Parse( 215a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "{" 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " \"type\": \"object\"," 217a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " \"properties\": {" 218a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " \"dict-to-list\": {" 219a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " \"type\": \"array\"," 220a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " \"items\": { \"type\": \"string\" }" 221a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " }," 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " \"int-to-bool\": { \"type\": \"boolean\" }," 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " \"int-to-double\": { \"type\": \"number\" }," 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " \"string-to-bool\": { \"type\": \"boolean\" }," 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " \"string-to-double\": { \"type\": \"number\" }," 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " \"string-to-int\": { \"type\": \"integer\" }," 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " \"string-to-dict\": { \"type\": \"object\" }" 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) " }" 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) "}", &error); 230a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ASSERT_TRUE(schema.valid()) << error; 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) scoped_ptr<base::Value> actual(test_dict.ConvertToJSON(schema)); 233a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::DictionaryValue expected; 235a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) expected.Set("one", int_value.DeepCopy()); 236a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<base::DictionaryValue> expected_subdict( 237a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) new base::DictionaryValue()); 238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) expected_subdict->Set("two", string_value.DeepCopy()); 239a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) expected.Set("three", expected_subdict.release()); 240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<base::ListValue> expected_list(new base::ListValue()); 241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) expected_list->Append(string_value.DeepCopy()); 242a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.Set("dict-to-list", expected_list.release()); 243a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.Set("int-to-bool", new base::FundamentalValue(true)); 244a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.Set("int-to-double", new base::FundamentalValue(42.0)); 245a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.Set("string-to-bool", new base::FundamentalValue(false)); 246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.Set("string-to-double", new base::FundamentalValue(0.0)); 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.Set("string-to-int", new base::FundamentalValue((int) 0)); 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected_list.reset(new base::ListValue()); 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected_list->Append(new base::StringValue("value")); 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected_subdict.reset(new base::DictionaryValue()); 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected_subdict->Set("key", expected_list.release()); 252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) expected.Set("string-to-dict", expected_subdict.release()); 253a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(actual.get(), &expected)); 255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 256a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)TEST(RegistryDictTest, KeyValueNameClashes) { 258a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict test_dict; 259a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 260a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::FundamentalValue int_value(42); 261a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) base::StringValue string_value("fortytwo"); 262a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 263116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch test_dict.SetValue("one", scoped_ptr<base::Value>(int_value.DeepCopy())); 264a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) scoped_ptr<RegistryDict> subdict(new RegistryDict()); 265116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch subdict->SetValue("two", scoped_ptr<base::Value>(string_value.DeepCopy())); 266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) test_dict.SetKey("one", subdict.Pass()); 267a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 268a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&int_value, test_dict.GetValue("one"))); 269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) RegistryDict* actual_subdict = test_dict.GetKey("one"); 270a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) ASSERT_TRUE(actual_subdict); 271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) EXPECT_TRUE(base::Value::Equals(&string_value, 272a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) actual_subdict->GetValue("two"))); 273a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} 274a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace 276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)} // namespace policy 277