OLD | NEW |
1 // Copyright 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 "components/policy/core/common/schema_map.h" | 5 #include "components/policy/core/common/schema_map.h" |
6 | 6 |
| 7 #include "base/memory/ptr_util.h" |
7 #include "base/memory/weak_ptr.h" | 8 #include "base/memory/weak_ptr.h" |
8 #include "base/values.h" | 9 #include "base/values.h" |
9 #include "components/policy/core/common/external_data_fetcher.h" | 10 #include "components/policy/core/common/external_data_fetcher.h" |
10 #include "components/policy/core/common/external_data_manager.h" | 11 #include "components/policy/core/common/external_data_manager.h" |
11 #include "components/policy/core/common/policy_bundle.h" | 12 #include "components/policy/core/common/policy_bundle.h" |
12 #include "components/policy/core/common/policy_map.h" | 13 #include "components/policy/core/common/policy_map.h" |
13 #include "components/policy/core/common/policy_types.h" | 14 #include "components/policy/core/common/policy_types.h" |
14 #include "components/policy/core/common/schema.h" | 15 #include "components/policy/core/common/schema.h" |
15 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
16 | 17 |
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
132 scoped_refptr<SchemaMap> schema_map = new SchemaMap(domain_map); | 133 scoped_refptr<SchemaMap> schema_map = new SchemaMap(domain_map); |
133 | 134 |
134 PolicyBundle bundle; | 135 PolicyBundle bundle; |
135 schema_map->FilterBundle(&bundle); | 136 schema_map->FilterBundle(&bundle); |
136 const PolicyBundle empty_bundle; | 137 const PolicyBundle empty_bundle; |
137 EXPECT_TRUE(bundle.Equals(empty_bundle)); | 138 EXPECT_TRUE(bundle.Equals(empty_bundle)); |
138 | 139 |
139 // The Chrome namespace isn't filtered. | 140 // The Chrome namespace isn't filtered. |
140 PolicyBundle expected_bundle; | 141 PolicyBundle expected_bundle; |
141 PolicyNamespace chrome_ns(POLICY_DOMAIN_CHROME, ""); | 142 PolicyNamespace chrome_ns(POLICY_DOMAIN_CHROME, ""); |
142 expected_bundle.Get(chrome_ns).Set("ChromePolicy", | 143 expected_bundle.Get(chrome_ns).Set( |
143 POLICY_LEVEL_MANDATORY, | 144 "ChromePolicy", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
144 POLICY_SCOPE_USER, | 145 POLICY_SOURCE_CLOUD, base::WrapUnique(new base::StringValue("value")), |
145 POLICY_SOURCE_CLOUD, | 146 nullptr); |
146 new base::StringValue("value"), | |
147 NULL); | |
148 bundle.CopyFrom(expected_bundle); | 147 bundle.CopyFrom(expected_bundle); |
149 | 148 |
150 // Unknown components are filtered out. | 149 // Unknown components are filtered out. |
151 PolicyNamespace another_extension_ns(POLICY_DOMAIN_EXTENSIONS, "xyz"); | 150 PolicyNamespace another_extension_ns(POLICY_DOMAIN_EXTENSIONS, "xyz"); |
152 bundle.Get(another_extension_ns).Set("AnotherExtensionPolicy", | 151 bundle.Get(another_extension_ns) |
153 POLICY_LEVEL_MANDATORY, | 152 .Set("AnotherExtensionPolicy", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
154 POLICY_SCOPE_USER, | 153 POLICY_SOURCE_CLOUD, |
155 POLICY_SOURCE_CLOUD, | 154 base::WrapUnique(new base::StringValue("value")), nullptr); |
156 new base::StringValue("value"), | |
157 NULL); | |
158 schema_map->FilterBundle(&bundle); | 155 schema_map->FilterBundle(&bundle); |
159 EXPECT_TRUE(bundle.Equals(expected_bundle)); | 156 EXPECT_TRUE(bundle.Equals(expected_bundle)); |
160 | 157 |
161 PolicyNamespace extension_ns(POLICY_DOMAIN_EXTENSIONS, "abc"); | 158 PolicyNamespace extension_ns(POLICY_DOMAIN_EXTENSIONS, "abc"); |
162 PolicyMap& map = expected_bundle.Get(extension_ns); | 159 PolicyMap& map = expected_bundle.Get(extension_ns); |
163 base::ListValue list; | 160 base::ListValue list; |
164 list.AppendString("a"); | 161 list.AppendString("a"); |
165 list.AppendString("b"); | 162 list.AppendString("b"); |
166 map.Set("list", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 163 map.Set("list", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
167 POLICY_SOURCE_CLOUD, list.DeepCopy(), nullptr); | 164 POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr); |
168 map.Set("boolean", | 165 map.Set("boolean", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
169 POLICY_LEVEL_MANDATORY, | |
170 POLICY_SCOPE_USER, | |
171 POLICY_SOURCE_CLOUD, | 166 POLICY_SOURCE_CLOUD, |
172 new base::FundamentalValue(true), | 167 base::WrapUnique(new base::FundamentalValue(true)), nullptr); |
173 NULL); | 168 map.Set("integer", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
174 map.Set("integer", | 169 POLICY_SOURCE_CLOUD, base::WrapUnique(new base::FundamentalValue(1)), |
175 POLICY_LEVEL_MANDATORY, | 170 nullptr); |
176 POLICY_SCOPE_USER, | 171 map.Set("null", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 172 POLICY_SOURCE_CLOUD, base::Value::CreateNullValue(), nullptr); |
| 173 map.Set("double", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
177 POLICY_SOURCE_CLOUD, | 174 POLICY_SOURCE_CLOUD, |
178 new base::FundamentalValue(1), | 175 base::WrapUnique(new base::FundamentalValue(1.2)), nullptr); |
179 NULL); | |
180 map.Set("null", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | |
181 POLICY_SOURCE_CLOUD, base::Value::CreateNullValue().release(), | |
182 nullptr); | |
183 map.Set("double", | |
184 POLICY_LEVEL_MANDATORY, | |
185 POLICY_SCOPE_USER, | |
186 POLICY_SOURCE_CLOUD, | |
187 new base::FundamentalValue(1.2), | |
188 NULL); | |
189 base::DictionaryValue dict; | 176 base::DictionaryValue dict; |
190 dict.SetString("a", "b"); | 177 dict.SetString("a", "b"); |
191 dict.SetInteger("b", 2); | 178 dict.SetInteger("b", 2); |
192 map.Set("object", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 179 map.Set("object", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
193 POLICY_SOURCE_CLOUD, dict.DeepCopy(), nullptr); | 180 POLICY_SOURCE_CLOUD, dict.CreateDeepCopy(), nullptr); |
194 map.Set("string", | 181 map.Set("string", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
195 POLICY_LEVEL_MANDATORY, | 182 POLICY_SOURCE_CLOUD, base::WrapUnique(new base::StringValue("value")), |
196 POLICY_SCOPE_USER, | 183 nullptr); |
197 POLICY_SOURCE_CLOUD, | |
198 new base::StringValue("value"), | |
199 NULL); | |
200 | 184 |
201 bundle.MergeFrom(expected_bundle); | 185 bundle.MergeFrom(expected_bundle); |
202 bundle.Get(extension_ns).Set("Unexpected", | 186 bundle.Get(extension_ns) |
203 POLICY_LEVEL_MANDATORY, | 187 .Set("Unexpected", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
204 POLICY_SCOPE_USER, | 188 POLICY_SOURCE_CLOUD, |
205 POLICY_SOURCE_CLOUD, | 189 base::WrapUnique(new base::StringValue("to-be-removed")), nullptr); |
206 new base::StringValue("to-be-removed"), | |
207 NULL); | |
208 | 190 |
209 schema_map->FilterBundle(&bundle); | 191 schema_map->FilterBundle(&bundle); |
210 EXPECT_TRUE(bundle.Equals(expected_bundle)); | 192 EXPECT_TRUE(bundle.Equals(expected_bundle)); |
211 | 193 |
212 // Mismatched types are also removed. | 194 // Mismatched types are also removed. |
213 bundle.Clear(); | 195 bundle.Clear(); |
214 PolicyMap& badmap = bundle.Get(extension_ns); | 196 PolicyMap& badmap = bundle.Get(extension_ns); |
215 badmap.Set("list", | 197 badmap.Set("list", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
216 POLICY_LEVEL_MANDATORY, | |
217 POLICY_SCOPE_USER, | |
218 POLICY_SOURCE_CLOUD, | 198 POLICY_SOURCE_CLOUD, |
219 new base::FundamentalValue(false), | 199 base::WrapUnique(new base::FundamentalValue(false)), nullptr); |
220 NULL); | 200 badmap.Set("boolean", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
221 badmap.Set("boolean", | |
222 POLICY_LEVEL_MANDATORY, | |
223 POLICY_SCOPE_USER, | |
224 POLICY_SOURCE_CLOUD, | 201 POLICY_SOURCE_CLOUD, |
225 new base::FundamentalValue(0), | 202 base::WrapUnique(new base::FundamentalValue(0)), nullptr); |
226 NULL); | 203 badmap.Set("integer", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
227 badmap.Set("integer", | |
228 POLICY_LEVEL_MANDATORY, | |
229 POLICY_SCOPE_USER, | |
230 POLICY_SOURCE_CLOUD, | 204 POLICY_SOURCE_CLOUD, |
231 new base::FundamentalValue(false), | 205 base::WrapUnique(new base::FundamentalValue(false)), nullptr); |
232 NULL); | 206 badmap.Set("null", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
233 badmap.Set("null", | |
234 POLICY_LEVEL_MANDATORY, | |
235 POLICY_SCOPE_USER, | |
236 POLICY_SOURCE_CLOUD, | 207 POLICY_SOURCE_CLOUD, |
237 new base::FundamentalValue(false), | 208 base::WrapUnique(new base::FundamentalValue(false)), nullptr); |
238 NULL); | 209 badmap.Set("double", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
239 badmap.Set("double", | |
240 POLICY_LEVEL_MANDATORY, | |
241 POLICY_SCOPE_USER, | |
242 POLICY_SOURCE_CLOUD, | 210 POLICY_SOURCE_CLOUD, |
243 new base::FundamentalValue(false), | 211 base::WrapUnique(new base::FundamentalValue(false)), nullptr); |
244 NULL); | 212 badmap.Set("object", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
245 badmap.Set("object", | |
246 POLICY_LEVEL_MANDATORY, | |
247 POLICY_SCOPE_USER, | |
248 POLICY_SOURCE_CLOUD, | 213 POLICY_SOURCE_CLOUD, |
249 new base::FundamentalValue(false), | 214 base::WrapUnique(new base::FundamentalValue(false)), nullptr); |
250 NULL); | |
251 badmap.Set("string", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 215 badmap.Set("string", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
252 POLICY_SOURCE_CLOUD, nullptr, | 216 POLICY_SOURCE_CLOUD, nullptr, |
253 new ExternalDataFetcher(base::WeakPtr<ExternalDataManager>(), | 217 base::WrapUnique(new ExternalDataFetcher(nullptr, std::string()))); |
254 std::string())); | |
255 | 218 |
256 schema_map->FilterBundle(&bundle); | 219 schema_map->FilterBundle(&bundle); |
257 EXPECT_TRUE(bundle.Equals(empty_bundle)); | 220 EXPECT_TRUE(bundle.Equals(empty_bundle)); |
258 } | 221 } |
259 | 222 |
260 TEST_F(SchemaMapTest, LegacyComponents) { | 223 TEST_F(SchemaMapTest, LegacyComponents) { |
261 std::string error; | 224 std::string error; |
262 Schema schema = Schema::Parse( | 225 Schema schema = Schema::Parse( |
263 "{" | 226 "{" |
264 " \"type\":\"object\"," | 227 " \"type\":\"object\"," |
265 " \"properties\": {" | 228 " \"properties\": {" |
266 " \"String\": { \"type\": \"string\" }" | 229 " \"String\": { \"type\": \"string\" }" |
267 " }" | 230 " }" |
268 "}", &error); | 231 "}", &error); |
269 ASSERT_TRUE(schema.valid()) << error; | 232 ASSERT_TRUE(schema.valid()) << error; |
270 | 233 |
271 DomainMap domain_map; | 234 DomainMap domain_map; |
272 domain_map[POLICY_DOMAIN_EXTENSIONS]["with-schema"] = schema; | 235 domain_map[POLICY_DOMAIN_EXTENSIONS]["with-schema"] = schema; |
273 domain_map[POLICY_DOMAIN_EXTENSIONS]["without-schema"] = Schema(); | 236 domain_map[POLICY_DOMAIN_EXTENSIONS]["without-schema"] = Schema(); |
274 scoped_refptr<SchemaMap> schema_map = new SchemaMap(domain_map); | 237 scoped_refptr<SchemaMap> schema_map = new SchemaMap(domain_map); |
275 | 238 |
276 // |bundle| contains policies loaded by a policy provider. | 239 // |bundle| contains policies loaded by a policy provider. |
277 PolicyBundle bundle; | 240 PolicyBundle bundle; |
278 | 241 |
279 // Known components with schemas are filtered. | 242 // Known components with schemas are filtered. |
280 PolicyNamespace extension_ns(POLICY_DOMAIN_EXTENSIONS, "with-schema"); | 243 PolicyNamespace extension_ns(POLICY_DOMAIN_EXTENSIONS, "with-schema"); |
281 bundle.Get(extension_ns).Set("String", | 244 bundle.Get(extension_ns) |
282 POLICY_LEVEL_MANDATORY, | 245 .Set("String", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
283 POLICY_SCOPE_USER, | 246 POLICY_SOURCE_CLOUD, |
284 POLICY_SOURCE_CLOUD, | 247 base::WrapUnique(new base::StringValue("value 1")), nullptr); |
285 new base::StringValue("value 1"), | |
286 NULL); | |
287 | 248 |
288 // The Chrome namespace isn't filtered. | 249 // The Chrome namespace isn't filtered. |
289 PolicyNamespace chrome_ns(POLICY_DOMAIN_CHROME, ""); | 250 PolicyNamespace chrome_ns(POLICY_DOMAIN_CHROME, ""); |
290 bundle.Get(chrome_ns).Set("ChromePolicy", | 251 bundle.Get(chrome_ns).Set("ChromePolicy", POLICY_LEVEL_MANDATORY, |
291 POLICY_LEVEL_MANDATORY, | 252 POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, |
292 POLICY_SCOPE_USER, | 253 base::WrapUnique(new base::StringValue("value 3")), |
293 POLICY_SOURCE_CLOUD, | 254 nullptr); |
294 new base::StringValue("value 3"), | |
295 NULL); | |
296 | 255 |
297 PolicyBundle expected_bundle; | 256 PolicyBundle expected_bundle; |
298 expected_bundle.MergeFrom(bundle); | 257 expected_bundle.MergeFrom(bundle); |
299 | 258 |
300 // Known components without a schema are filtered out completely. | 259 // Known components without a schema are filtered out completely. |
301 PolicyNamespace without_schema_ns(POLICY_DOMAIN_EXTENSIONS, "without-schema"); | 260 PolicyNamespace without_schema_ns(POLICY_DOMAIN_EXTENSIONS, "without-schema"); |
302 bundle.Get(without_schema_ns).Set("Schemaless", | 261 bundle.Get(without_schema_ns) |
303 POLICY_LEVEL_MANDATORY, | 262 .Set("Schemaless", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
304 POLICY_SCOPE_USER, | 263 POLICY_SOURCE_CLOUD, |
305 POLICY_SOURCE_CLOUD, | 264 base::WrapUnique(new base::StringValue("value 2")), nullptr); |
306 new base::StringValue("value 2"), | |
307 NULL); | |
308 | 265 |
309 // Unknown policies of known components with a schema are removed. | 266 // Unknown policies of known components with a schema are removed. |
310 bundle.Get(extension_ns).Set("Surprise", | 267 bundle.Get(extension_ns) |
311 POLICY_LEVEL_MANDATORY, | 268 .Set("Surprise", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
312 POLICY_SCOPE_USER, | 269 POLICY_SOURCE_CLOUD, |
313 POLICY_SOURCE_CLOUD, | 270 base::WrapUnique(new base::StringValue("value 4")), nullptr); |
314 new base::StringValue("value 4"), | |
315 NULL); | |
316 | 271 |
317 // Unknown components are removed. | 272 // Unknown components are removed. |
318 PolicyNamespace unknown_ns(POLICY_DOMAIN_EXTENSIONS, "unknown"); | 273 PolicyNamespace unknown_ns(POLICY_DOMAIN_EXTENSIONS, "unknown"); |
319 bundle.Get(unknown_ns).Set("Surprise", | 274 bundle.Get(unknown_ns) |
320 POLICY_LEVEL_MANDATORY, | 275 .Set("Surprise", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
321 POLICY_SCOPE_USER, | 276 POLICY_SOURCE_CLOUD, |
322 POLICY_SOURCE_CLOUD, | 277 base::WrapUnique(new base::StringValue("value 5")), nullptr); |
323 new base::StringValue("value 5"), | |
324 NULL); | |
325 | 278 |
326 schema_map->FilterBundle(&bundle); | 279 schema_map->FilterBundle(&bundle); |
327 EXPECT_TRUE(bundle.Equals(expected_bundle)); | 280 EXPECT_TRUE(bundle.Equals(expected_bundle)); |
328 } | 281 } |
329 | 282 |
330 TEST_F(SchemaMapTest, GetChanges) { | 283 TEST_F(SchemaMapTest, GetChanges) { |
331 DomainMap map; | 284 DomainMap map; |
332 map[POLICY_DOMAIN_CHROME][""] = Schema(); | 285 map[POLICY_DOMAIN_CHROME][""] = Schema(); |
333 scoped_refptr<SchemaMap> older = new SchemaMap(map); | 286 scoped_refptr<SchemaMap> older = new SchemaMap(map); |
334 map[POLICY_DOMAIN_CHROME][""] = Schema(); | 287 map[POLICY_DOMAIN_CHROME][""] = Schema(); |
(...skipping 18 matching lines...) Expand all Loading... |
353 newer = new SchemaMap(map); | 306 newer = new SchemaMap(map); |
354 newer->GetChanges(older, &removed, &added); | 307 newer->GetChanges(older, &removed, &added); |
355 ASSERT_EQ(2u, removed.size()); | 308 ASSERT_EQ(2u, removed.size()); |
356 EXPECT_EQ(PolicyNamespace(POLICY_DOMAIN_CHROME, ""), removed[0]); | 309 EXPECT_EQ(PolicyNamespace(POLICY_DOMAIN_CHROME, ""), removed[0]); |
357 EXPECT_EQ(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "xyz"), removed[1]); | 310 EXPECT_EQ(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "xyz"), removed[1]); |
358 ASSERT_EQ(1u, added.size()); | 311 ASSERT_EQ(1u, added.size()); |
359 EXPECT_EQ(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "abc"), added[0]); | 312 EXPECT_EQ(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "abc"), added[0]); |
360 } | 313 } |
361 | 314 |
362 } // namespace policy | 315 } // namespace policy |
OLD | NEW |