OLD | NEW |
---|---|
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "chrome/browser/policy/policy_domain_descriptor.h" | 5 #include "chrome/browser/policy/schema_map.h" |
6 | 6 |
7 #include <string> | |
8 | |
9 #include "base/callback.h" | |
10 #include "base/memory/weak_ptr.h" | 7 #include "base/memory/weak_ptr.h" |
11 #include "base/values.h" | 8 #include "base/values.h" |
12 #include "chrome/browser/policy/external_data_fetcher.h" | 9 #include "chrome/browser/policy/external_data_fetcher.h" |
13 #include "chrome/browser/policy/external_data_manager.h" | 10 #include "chrome/browser/policy/external_data_manager.h" |
14 #include "chrome/browser/policy/policy_bundle.h" | 11 #include "chrome/browser/policy/policy_bundle.h" |
15 #include "chrome/browser/policy/policy_map.h" | 12 #include "chrome/browser/policy/policy_map.h" |
13 #include "components/policy/core/common/schema.h" | |
16 #include "testing/gtest/include/gtest/gtest.h" | 14 #include "testing/gtest/include/gtest/gtest.h" |
17 | 15 |
18 namespace policy { | 16 namespace policy { |
19 | 17 |
20 class PolicyDomainDescriptorTest : public testing::Test { | 18 namespace { |
19 | |
20 const char kTestSchema[] = | |
21 "{" | |
22 " \"type\": \"object\"," | |
23 " \"properties\": {" | |
24 " \"string\": { \"type\": \"string\" }," | |
25 " \"integer\": { \"type\": \"integer\" }," | |
26 " \"boolean\": { \"type\": \"boolean\" }," | |
27 " \"null\": { \"type\": \"null\" }," | |
28 " \"double\": { \"type\": \"number\" }," | |
29 " \"list\": {" | |
30 " \"type\": \"array\"," | |
31 " \"items\": { \"type\": \"string\" }" | |
32 " }," | |
33 " \"object\": {" | |
34 " \"type\": \"object\"," | |
35 " \"properties\": {" | |
36 " \"a\": { \"type\": \"string\" }," | |
37 " \"b\": { \"type\": \"integer\" }" | |
38 " }" | |
39 " }" | |
40 " }" | |
41 "}"; | |
42 | |
43 } // namespace | |
44 | |
45 class SchemaMapTest : public testing::Test { | |
21 protected: | 46 protected: |
22 scoped_ptr<ExternalDataFetcher> CreateExternalDataFetcher() const; | 47 scoped_refptr<SchemaMap> CreateTestMap() { |
48 std::string error; | |
49 Schema schema = Schema::Parse(kTestSchema, &error); | |
50 if (!schema.valid()) { | |
51 ADD_FAILURE() << error; | |
52 return NULL; | |
dconnelly
2013/10/31 10:04:16
this shouldn't ever happen, right? why not ASSERT_
Joao da Silva
2013/10/31 13:34:56
Because ASSERT_* is a glorified return, and doesn'
| |
53 } | |
54 | |
55 ComponentMap component_map; | |
56 component_map["extension-1"] = schema; | |
57 component_map["extension-2"] = schema; | |
58 component_map["legacy-extension"] = Schema(); | |
59 | |
60 DomainMap domain_map; | |
61 domain_map[POLICY_DOMAIN_EXTENSIONS] = component_map; | |
62 | |
63 return new SchemaMap(domain_map); | |
64 } | |
23 }; | 65 }; |
24 | 66 |
25 scoped_ptr<ExternalDataFetcher> | 67 TEST_F(SchemaMapTest, Empty) { |
26 PolicyDomainDescriptorTest::CreateExternalDataFetcher() const { | 68 scoped_refptr<SchemaMap> map = new SchemaMap(); |
27 return make_scoped_ptr( | 69 EXPECT_TRUE(map->GetDomains().empty()); |
28 new ExternalDataFetcher(base::WeakPtr<ExternalDataManager>(), | 70 EXPECT_TRUE(map->GetComponents(POLICY_DOMAIN_CHROME).empty()); |
29 std::string())); | 71 EXPECT_TRUE(map->GetComponents(POLICY_DOMAIN_EXTENSIONS).empty()); |
72 EXPECT_TRUE(map->GetSchema(POLICY_DOMAIN_CHROME, "") == NULL); | |
bartfab (slow)
2013/10/30 12:34:49
Why not:
EXPECT_FALSE(map->GetSchema(POLICY_DOMAI
Joao da Silva
2013/10/31 13:34:56
Done.
| |
30 } | 73 } |
31 | 74 |
32 TEST_F(PolicyDomainDescriptorTest, FilterBundle) { | 75 TEST_F(SchemaMapTest, Lookups) { |
33 scoped_refptr<PolicyDomainDescriptor> descriptor = | 76 scoped_refptr<SchemaMap> map = CreateTestMap(); |
34 new PolicyDomainDescriptor(POLICY_DOMAIN_EXTENSIONS); | 77 ASSERT_TRUE(map); |
35 EXPECT_EQ(POLICY_DOMAIN_EXTENSIONS, descriptor->domain()); | |
36 EXPECT_TRUE(descriptor->components().empty()); | |
37 | 78 |
79 EXPECT_FALSE(map->GetSchema(POLICY_DOMAIN_CHROME, "")); | |
80 EXPECT_FALSE(map->GetSchema(POLICY_DOMAIN_CHROME, "extension-1")); | |
81 EXPECT_FALSE(map->GetSchema(POLICY_DOMAIN_CHROME, "legacy-extension")); | |
82 EXPECT_FALSE(map->GetSchema(POLICY_DOMAIN_EXTENSIONS, "")); | |
83 EXPECT_FALSE(map->GetSchema(POLICY_DOMAIN_EXTENSIONS, "extension-3")); | |
84 | |
85 const Schema* schema = | |
86 map->GetSchema(POLICY_DOMAIN_EXTENSIONS, "extension-1"); | |
87 ASSERT_TRUE(schema); | |
88 EXPECT_TRUE(schema->valid()); | |
89 | |
90 schema = map->GetSchema(POLICY_DOMAIN_EXTENSIONS, "legacy-extension"); | |
91 ASSERT_TRUE(schema); | |
92 EXPECT_FALSE(schema->valid()); | |
93 } | |
94 | |
95 TEST_F(SchemaMapTest, FilterBundle) { | |
38 std::string error; | 96 std::string error; |
39 Schema schema = Schema::Parse( | 97 Schema schema = Schema::Parse(kTestSchema, &error); |
40 "{" | |
41 " \"type\":\"object\"," | |
42 " \"properties\": {" | |
43 " \"Array\": {" | |
44 " \"type\": \"array\"," | |
45 " \"items\": { \"type\": \"string\" }" | |
46 " }," | |
47 " \"Boolean\": { \"type\": \"boolean\" }," | |
48 " \"Integer\": { \"type\": \"integer\" }," | |
49 " \"Null\": { \"type\": \"null\" }," | |
50 " \"Number\": { \"type\": \"number\" }," | |
51 " \"Object\": {" | |
52 " \"type\": \"object\"," | |
53 " \"properties\": {" | |
54 " \"a\": { \"type\": \"string\" }," | |
55 " \"b\": { \"type\": \"integer\" }" | |
56 " }" | |
57 " }," | |
58 " \"String\": { \"type\": \"string\" }" | |
59 " }" | |
60 "}", &error); | |
61 ASSERT_TRUE(schema.valid()) << error; | 98 ASSERT_TRUE(schema.valid()) << error; |
62 | 99 |
63 descriptor->RegisterComponent("abc", schema); | 100 DomainMap domain_map; |
64 | 101 domain_map[POLICY_DOMAIN_EXTENSIONS]["abc"] = schema; |
65 EXPECT_EQ(1u, descriptor->components().size()); | 102 scoped_refptr<SchemaMap> schema_map = new SchemaMap(domain_map); |
66 EXPECT_EQ(1u, descriptor->components().count("abc")); | |
67 | 103 |
68 PolicyBundle bundle; | 104 PolicyBundle bundle; |
69 descriptor->FilterBundle(&bundle); | 105 schema_map->FilterBundle(&bundle); |
70 const PolicyBundle empty_bundle; | 106 const PolicyBundle empty_bundle; |
71 EXPECT_TRUE(bundle.Equals(empty_bundle)); | 107 EXPECT_TRUE(bundle.Equals(empty_bundle)); |
72 | 108 |
73 // Other namespaces aren't filtered. | 109 // The Chrome namespace isn't filtered. |
74 PolicyBundle expected_bundle; | 110 PolicyBundle expected_bundle; |
75 PolicyNamespace chrome_ns(POLICY_DOMAIN_CHROME, ""); | 111 PolicyNamespace chrome_ns(POLICY_DOMAIN_CHROME, ""); |
76 expected_bundle.Get(chrome_ns).Set("ChromePolicy", | 112 expected_bundle.Get(chrome_ns).Set("ChromePolicy", |
77 POLICY_LEVEL_MANDATORY, | 113 POLICY_LEVEL_MANDATORY, |
78 POLICY_SCOPE_USER, | 114 POLICY_SCOPE_USER, |
79 base::Value::CreateStringValue("value"), | 115 base::Value::CreateStringValue("value"), |
80 NULL); | 116 NULL); |
81 bundle.CopyFrom(expected_bundle); | 117 bundle.CopyFrom(expected_bundle); |
82 // Unknown components of the domain are filtered out. | 118 |
119 // Unknown components are filtered out. | |
83 PolicyNamespace another_extension_ns(POLICY_DOMAIN_EXTENSIONS, "xyz"); | 120 PolicyNamespace another_extension_ns(POLICY_DOMAIN_EXTENSIONS, "xyz"); |
84 bundle.Get(another_extension_ns).Set( | 121 bundle.Get(another_extension_ns).Set( |
85 "AnotherExtensionPolicy", | 122 "AnotherExtensionPolicy", |
86 POLICY_LEVEL_MANDATORY, | 123 POLICY_LEVEL_MANDATORY, |
87 POLICY_SCOPE_USER, | 124 POLICY_SCOPE_USER, |
88 base::Value::CreateStringValue("value"), | 125 base::Value::CreateStringValue("value"), |
89 NULL); | 126 NULL); |
90 descriptor->FilterBundle(&bundle); | 127 schema_map->FilterBundle(&bundle); |
91 EXPECT_TRUE(bundle.Equals(expected_bundle)); | 128 EXPECT_TRUE(bundle.Equals(expected_bundle)); |
92 | 129 |
93 PolicyNamespace extension_ns(POLICY_DOMAIN_EXTENSIONS, "abc"); | 130 PolicyNamespace extension_ns(POLICY_DOMAIN_EXTENSIONS, "abc"); |
94 PolicyMap& map = expected_bundle.Get(extension_ns); | 131 PolicyMap& map = expected_bundle.Get(extension_ns); |
95 base::ListValue list; | 132 base::ListValue list; |
96 list.AppendString("a"); | 133 list.AppendString("a"); |
97 list.AppendString("b"); | 134 list.AppendString("b"); |
98 map.Set("Array", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 135 map.Set("list", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
99 list.DeepCopy(), NULL); | 136 list.DeepCopy(), NULL); |
100 map.Set("Boolean", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 137 map.Set("boolean", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
101 base::Value::CreateBooleanValue(true), NULL); | 138 base::Value::CreateBooleanValue(true), NULL); |
102 map.Set("Integer", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 139 map.Set("integer", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
103 base::Value::CreateIntegerValue(1), NULL); | 140 base::Value::CreateIntegerValue(1), NULL); |
104 map.Set("Null", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 141 map.Set("null", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
105 base::Value::CreateNullValue(), NULL); | 142 base::Value::CreateNullValue(), NULL); |
106 map.Set("Number", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 143 map.Set("double", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
107 base::Value::CreateDoubleValue(1.2), NULL); | 144 base::Value::CreateDoubleValue(1.2), NULL); |
108 base::DictionaryValue dict; | 145 base::DictionaryValue dict; |
109 dict.SetString("a", "b"); | 146 dict.SetString("a", "b"); |
110 dict.SetInteger("b", 2); | 147 dict.SetInteger("b", 2); |
111 map.Set("Object", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 148 map.Set("object", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
112 dict.DeepCopy(), NULL); | 149 dict.DeepCopy(), NULL); |
113 map.Set("String", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 150 map.Set("string", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
114 base::Value::CreateStringValue("value"), NULL); | 151 base::Value::CreateStringValue("value"), NULL); |
115 | 152 |
116 bundle.MergeFrom(expected_bundle); | 153 bundle.MergeFrom(expected_bundle); |
117 bundle.Get(extension_ns).Set("Unexpected", | 154 bundle.Get(extension_ns).Set("Unexpected", |
118 POLICY_LEVEL_MANDATORY, | 155 POLICY_LEVEL_MANDATORY, |
119 POLICY_SCOPE_USER, | 156 POLICY_SCOPE_USER, |
120 base::Value::CreateStringValue("to-be-removed"), | 157 base::Value::CreateStringValue("to-be-removed"), |
121 NULL); | 158 NULL); |
122 | 159 |
123 descriptor->FilterBundle(&bundle); | 160 schema_map->FilterBundle(&bundle); |
124 EXPECT_TRUE(bundle.Equals(expected_bundle)); | 161 EXPECT_TRUE(bundle.Equals(expected_bundle)); |
125 | 162 |
126 // Mismatched types are also removed. | 163 // Mismatched types are also removed. |
127 bundle.Clear(); | 164 bundle.Clear(); |
128 PolicyMap& badmap = bundle.Get(extension_ns); | 165 PolicyMap& badmap = bundle.Get(extension_ns); |
129 badmap.Set("Array", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 166 badmap.Set("list", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
130 base::Value::CreateBooleanValue(false), NULL); | 167 base::Value::CreateBooleanValue(false), NULL); |
131 badmap.Set("Boolean", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 168 badmap.Set("boolean", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
132 base::Value::CreateIntegerValue(0), NULL); | 169 base::Value::CreateIntegerValue(0), NULL); |
133 badmap.Set("Integer", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 170 badmap.Set("integer", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
134 base::Value::CreateBooleanValue(false), NULL); | 171 base::Value::CreateBooleanValue(false), NULL); |
135 badmap.Set("Null", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 172 badmap.Set("null", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
136 base::Value::CreateBooleanValue(false), NULL); | 173 base::Value::CreateBooleanValue(false), NULL); |
137 badmap.Set("Number", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 174 badmap.Set("double", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
138 base::Value::CreateBooleanValue(false), NULL); | 175 base::Value::CreateBooleanValue(false), NULL); |
139 badmap.Set("Object", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 176 badmap.Set("object", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
140 base::Value::CreateBooleanValue(false), NULL); | 177 base::Value::CreateBooleanValue(false), NULL); |
141 badmap.Set("String", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 178 badmap.Set("string", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
142 NULL, CreateExternalDataFetcher().release()); | 179 NULL, |
180 new ExternalDataFetcher(base::WeakPtr<ExternalDataManager>(), | |
181 std::string())); | |
143 | 182 |
144 descriptor->FilterBundle(&bundle); | 183 schema_map->FilterBundle(&bundle); |
145 EXPECT_TRUE(bundle.Equals(empty_bundle)); | 184 EXPECT_TRUE(bundle.Equals(empty_bundle)); |
146 } | 185 } |
147 | 186 |
148 TEST_F(PolicyDomainDescriptorTest, LegacyComponents) { | 187 TEST_F(SchemaMapTest, LegacyComponents) { |
149 scoped_refptr<PolicyDomainDescriptor> descriptor = | |
150 new PolicyDomainDescriptor(POLICY_DOMAIN_EXTENSIONS); | |
151 EXPECT_EQ(POLICY_DOMAIN_EXTENSIONS, descriptor->domain()); | |
152 EXPECT_TRUE(descriptor->components().empty()); | |
153 | |
154 std::string error; | 188 std::string error; |
155 Schema schema = Schema::Parse( | 189 Schema schema = Schema::Parse( |
156 "{" | 190 "{" |
157 " \"type\":\"object\"," | 191 " \"type\":\"object\"," |
158 " \"properties\": {" | 192 " \"properties\": {" |
159 " \"String\": { \"type\": \"string\" }" | 193 " \"String\": { \"type\": \"string\" }" |
160 " }" | 194 " }" |
161 "}", &error); | 195 "}", &error); |
162 ASSERT_TRUE(schema.valid()) << error; | 196 ASSERT_TRUE(schema.valid()) << error; |
163 | 197 |
164 descriptor->RegisterComponent("with-schema", schema); | 198 DomainMap domain_map; |
165 descriptor->RegisterComponent("without-schema", Schema()); | 199 domain_map[POLICY_DOMAIN_EXTENSIONS]["with-schema"] = schema; |
166 | 200 domain_map[POLICY_DOMAIN_EXTENSIONS]["without-schema"] = Schema(); |
167 EXPECT_EQ(2u, descriptor->components().size()); | 201 scoped_refptr<SchemaMap> schema_map = new SchemaMap(domain_map); |
168 | 202 |
169 // |bundle| contains policies loaded by a policy provider. | 203 // |bundle| contains policies loaded by a policy provider. |
170 PolicyBundle bundle; | 204 PolicyBundle bundle; |
171 | 205 |
172 // Known components with schemas are filtered. | 206 // Known components with schemas are filtered. |
173 PolicyNamespace extension_ns(POLICY_DOMAIN_EXTENSIONS, "with-schema"); | 207 PolicyNamespace extension_ns(POLICY_DOMAIN_EXTENSIONS, "with-schema"); |
174 bundle.Get(extension_ns).Set("String", | 208 bundle.Get(extension_ns).Set("String", |
175 POLICY_LEVEL_MANDATORY, | 209 POLICY_LEVEL_MANDATORY, |
176 POLICY_SCOPE_USER, | 210 POLICY_SCOPE_USER, |
177 base::Value::CreateStringValue("value 1"), | 211 base::Value::CreateStringValue("value 1"), |
178 NULL); | 212 NULL); |
179 | 213 |
180 // Known components without a schema are not filtered. | 214 // Known components without a schema are not filtered. |
181 PolicyNamespace without_schema_ns(POLICY_DOMAIN_EXTENSIONS, "without-schema"); | 215 PolicyNamespace without_schema_ns(POLICY_DOMAIN_EXTENSIONS, "without-schema"); |
182 bundle.Get(without_schema_ns).Set("Schemaless", | 216 bundle.Get(without_schema_ns).Set("Schemaless", |
183 POLICY_LEVEL_MANDATORY, | 217 POLICY_LEVEL_MANDATORY, |
184 POLICY_SCOPE_USER, | 218 POLICY_SCOPE_USER, |
185 base::Value::CreateStringValue("value 2"), | 219 base::Value::CreateStringValue("value 2"), |
186 NULL); | 220 NULL); |
187 | 221 |
188 // Other namespaces aren't filtered. | 222 // The Chrome namespace isn't filtered. |
189 PolicyNamespace chrome_ns(POLICY_DOMAIN_CHROME, ""); | 223 PolicyNamespace chrome_ns(POLICY_DOMAIN_CHROME, ""); |
190 bundle.Get(chrome_ns).Set("ChromePolicy", | 224 bundle.Get(chrome_ns).Set("ChromePolicy", |
191 POLICY_LEVEL_MANDATORY, | 225 POLICY_LEVEL_MANDATORY, |
192 POLICY_SCOPE_USER, | 226 POLICY_SCOPE_USER, |
193 base::Value::CreateStringValue("value 3"), | 227 base::Value::CreateStringValue("value 3"), |
194 NULL); | 228 NULL); |
195 | 229 |
196 PolicyBundle expected_bundle; | 230 PolicyBundle expected_bundle; |
197 expected_bundle.MergeFrom(bundle); | 231 expected_bundle.MergeFrom(bundle); |
198 | 232 |
199 // Unknown policies of known components with a schema are removed. | 233 // Unknown policies of known components with a schema are removed. |
200 bundle.Get(extension_ns).Set("Surprise", | 234 bundle.Get(extension_ns).Set("Surprise", |
201 POLICY_LEVEL_MANDATORY, | 235 POLICY_LEVEL_MANDATORY, |
202 POLICY_SCOPE_USER, | 236 POLICY_SCOPE_USER, |
203 base::Value::CreateStringValue("value 4"), | 237 base::Value::CreateStringValue("value 4"), |
204 NULL); | 238 NULL); |
205 | 239 |
206 // Unknown components are removed. | 240 // Unknown components are removed. |
207 PolicyNamespace unknown_ns(POLICY_DOMAIN_EXTENSIONS, "unknown"); | 241 PolicyNamespace unknown_ns(POLICY_DOMAIN_EXTENSIONS, "unknown"); |
208 bundle.Get(unknown_ns).Set("Surprise", | 242 bundle.Get(unknown_ns).Set("Surprise", |
209 POLICY_LEVEL_MANDATORY, | 243 POLICY_LEVEL_MANDATORY, |
210 POLICY_SCOPE_USER, | 244 POLICY_SCOPE_USER, |
211 base::Value::CreateStringValue("value 5"), | 245 base::Value::CreateStringValue("value 5"), |
212 NULL); | 246 NULL); |
213 | 247 |
214 descriptor->FilterBundle(&bundle); | 248 schema_map->FilterBundle(&bundle); |
215 EXPECT_TRUE(bundle.Equals(expected_bundle)); | 249 EXPECT_TRUE(bundle.Equals(expected_bundle)); |
216 } | 250 } |
217 | 251 |
218 } // namespace policy | 252 } // namespace policy |
OLD | NEW |