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