| 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/ptr_util.h" |
| 8 #include "base/memory/weak_ptr.h" | 8 #include "base/memory/weak_ptr.h" |
| 9 #include "base/values.h" | 9 #include "base/values.h" |
| 10 #include "components/policy/core/common/external_data_fetcher.h" | 10 #include "components/policy/core/common/external_data_fetcher.h" |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 135 PolicyBundle bundle; | 135 PolicyBundle bundle; |
| 136 schema_map->FilterBundle(&bundle); | 136 schema_map->FilterBundle(&bundle); |
| 137 const PolicyBundle empty_bundle; | 137 const PolicyBundle empty_bundle; |
| 138 EXPECT_TRUE(bundle.Equals(empty_bundle)); | 138 EXPECT_TRUE(bundle.Equals(empty_bundle)); |
| 139 | 139 |
| 140 // The Chrome namespace isn't filtered. | 140 // The Chrome namespace isn't filtered. |
| 141 PolicyBundle expected_bundle; | 141 PolicyBundle expected_bundle; |
| 142 PolicyNamespace chrome_ns(POLICY_DOMAIN_CHROME, ""); | 142 PolicyNamespace chrome_ns(POLICY_DOMAIN_CHROME, ""); |
| 143 expected_bundle.Get(chrome_ns).Set( | 143 expected_bundle.Get(chrome_ns).Set( |
| 144 "ChromePolicy", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 144 "ChromePolicy", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 145 POLICY_SOURCE_CLOUD, base::MakeUnique<base::StringValue>("value"), | 145 POLICY_SOURCE_CLOUD, base::MakeUnique<base::Value>("value"), nullptr); |
| 146 nullptr); | |
| 147 bundle.CopyFrom(expected_bundle); | 146 bundle.CopyFrom(expected_bundle); |
| 148 | 147 |
| 149 // Unknown components are filtered out. | 148 // Unknown components are filtered out. |
| 150 PolicyNamespace another_extension_ns(POLICY_DOMAIN_EXTENSIONS, "xyz"); | 149 PolicyNamespace another_extension_ns(POLICY_DOMAIN_EXTENSIONS, "xyz"); |
| 151 bundle.Get(another_extension_ns) | 150 bundle.Get(another_extension_ns) |
| 152 .Set("AnotherExtensionPolicy", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 151 .Set("AnotherExtensionPolicy", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 153 POLICY_SOURCE_CLOUD, base::MakeUnique<base::StringValue>("value"), | 152 POLICY_SOURCE_CLOUD, base::MakeUnique<base::Value>("value"), |
| 154 nullptr); | 153 nullptr); |
| 155 schema_map->FilterBundle(&bundle); | 154 schema_map->FilterBundle(&bundle); |
| 156 EXPECT_TRUE(bundle.Equals(expected_bundle)); | 155 EXPECT_TRUE(bundle.Equals(expected_bundle)); |
| 157 | 156 |
| 158 PolicyNamespace extension_ns(POLICY_DOMAIN_EXTENSIONS, "abc"); | 157 PolicyNamespace extension_ns(POLICY_DOMAIN_EXTENSIONS, "abc"); |
| 159 PolicyMap& map = expected_bundle.Get(extension_ns); | 158 PolicyMap& map = expected_bundle.Get(extension_ns); |
| 160 base::ListValue list; | 159 base::ListValue list; |
| 161 list.AppendString("a"); | 160 list.AppendString("a"); |
| 162 list.AppendString("b"); | 161 list.AppendString("b"); |
| 163 map.Set("list", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 162 map.Set("list", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 164 POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr); | 163 POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr); |
| 165 map.Set("boolean", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 164 map.Set("boolean", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 166 POLICY_SOURCE_CLOUD, base::MakeUnique<base::Value>(true), nullptr); | 165 POLICY_SOURCE_CLOUD, base::MakeUnique<base::Value>(true), nullptr); |
| 167 map.Set("integer", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 166 map.Set("integer", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 168 POLICY_SOURCE_CLOUD, base::MakeUnique<base::Value>(1), nullptr); | 167 POLICY_SOURCE_CLOUD, base::MakeUnique<base::Value>(1), nullptr); |
| 169 map.Set("null", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 168 map.Set("null", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 170 POLICY_SOURCE_CLOUD, base::Value::CreateNullValue(), nullptr); | 169 POLICY_SOURCE_CLOUD, base::Value::CreateNullValue(), nullptr); |
| 171 map.Set("double", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 170 map.Set("double", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 172 POLICY_SOURCE_CLOUD, base::MakeUnique<base::Value>(1.2), nullptr); | 171 POLICY_SOURCE_CLOUD, base::MakeUnique<base::Value>(1.2), nullptr); |
| 173 base::DictionaryValue dict; | 172 base::DictionaryValue dict; |
| 174 dict.SetString("a", "b"); | 173 dict.SetString("a", "b"); |
| 175 dict.SetInteger("b", 2); | 174 dict.SetInteger("b", 2); |
| 176 map.Set("object", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 175 map.Set("object", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 177 POLICY_SOURCE_CLOUD, dict.CreateDeepCopy(), nullptr); | 176 POLICY_SOURCE_CLOUD, dict.CreateDeepCopy(), nullptr); |
| 178 map.Set("string", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 177 map.Set("string", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 179 POLICY_SOURCE_CLOUD, base::MakeUnique<base::StringValue>("value"), | 178 POLICY_SOURCE_CLOUD, base::MakeUnique<base::Value>("value"), nullptr); |
| 180 nullptr); | |
| 181 | 179 |
| 182 bundle.MergeFrom(expected_bundle); | 180 bundle.MergeFrom(expected_bundle); |
| 183 bundle.Get(extension_ns) | 181 bundle.Get(extension_ns) |
| 184 .Set("Unexpected", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 182 .Set("Unexpected", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 185 POLICY_SOURCE_CLOUD, | 183 POLICY_SOURCE_CLOUD, base::MakeUnique<base::Value>("to-be-removed"), |
| 186 base::MakeUnique<base::StringValue>("to-be-removed"), nullptr); | 184 nullptr); |
| 187 | 185 |
| 188 schema_map->FilterBundle(&bundle); | 186 schema_map->FilterBundle(&bundle); |
| 189 EXPECT_TRUE(bundle.Equals(expected_bundle)); | 187 EXPECT_TRUE(bundle.Equals(expected_bundle)); |
| 190 | 188 |
| 191 // Mismatched types are also removed. | 189 // Mismatched types are also removed. |
| 192 bundle.Clear(); | 190 bundle.Clear(); |
| 193 PolicyMap& badmap = bundle.Get(extension_ns); | 191 PolicyMap& badmap = bundle.Get(extension_ns); |
| 194 badmap.Set("list", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 192 badmap.Set("list", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 195 POLICY_SOURCE_CLOUD, base::MakeUnique<base::Value>(false), | 193 POLICY_SOURCE_CLOUD, base::MakeUnique<base::Value>(false), |
| 196 nullptr); | 194 nullptr); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 232 domain_map[POLICY_DOMAIN_EXTENSIONS]["without-schema"] = Schema(); | 230 domain_map[POLICY_DOMAIN_EXTENSIONS]["without-schema"] = Schema(); |
| 233 scoped_refptr<SchemaMap> schema_map = new SchemaMap(domain_map); | 231 scoped_refptr<SchemaMap> schema_map = new SchemaMap(domain_map); |
| 234 | 232 |
| 235 // |bundle| contains policies loaded by a policy provider. | 233 // |bundle| contains policies loaded by a policy provider. |
| 236 PolicyBundle bundle; | 234 PolicyBundle bundle; |
| 237 | 235 |
| 238 // Known components with schemas are filtered. | 236 // Known components with schemas are filtered. |
| 239 PolicyNamespace extension_ns(POLICY_DOMAIN_EXTENSIONS, "with-schema"); | 237 PolicyNamespace extension_ns(POLICY_DOMAIN_EXTENSIONS, "with-schema"); |
| 240 bundle.Get(extension_ns) | 238 bundle.Get(extension_ns) |
| 241 .Set("String", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 239 .Set("String", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 242 POLICY_SOURCE_CLOUD, base::MakeUnique<base::StringValue>("value 1"), | 240 POLICY_SOURCE_CLOUD, base::MakeUnique<base::Value>("value 1"), |
| 243 nullptr); | 241 nullptr); |
| 244 | 242 |
| 245 // The Chrome namespace isn't filtered. | 243 // The Chrome namespace isn't filtered. |
| 246 PolicyNamespace chrome_ns(POLICY_DOMAIN_CHROME, ""); | 244 PolicyNamespace chrome_ns(POLICY_DOMAIN_CHROME, ""); |
| 247 bundle.Get(chrome_ns).Set("ChromePolicy", POLICY_LEVEL_MANDATORY, | 245 bundle.Get(chrome_ns).Set("ChromePolicy", POLICY_LEVEL_MANDATORY, |
| 248 POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, | 246 POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD, |
| 249 base::MakeUnique<base::StringValue>("value 3"), | 247 base::MakeUnique<base::Value>("value 3"), nullptr); |
| 250 nullptr); | |
| 251 | 248 |
| 252 PolicyBundle expected_bundle; | 249 PolicyBundle expected_bundle; |
| 253 expected_bundle.MergeFrom(bundle); | 250 expected_bundle.MergeFrom(bundle); |
| 254 | 251 |
| 255 // Known components without a schema are filtered out completely. | 252 // Known components without a schema are filtered out completely. |
| 256 PolicyNamespace without_schema_ns(POLICY_DOMAIN_EXTENSIONS, "without-schema"); | 253 PolicyNamespace without_schema_ns(POLICY_DOMAIN_EXTENSIONS, "without-schema"); |
| 257 bundle.Get(without_schema_ns) | 254 bundle.Get(without_schema_ns) |
| 258 .Set("Schemaless", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 255 .Set("Schemaless", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 259 POLICY_SOURCE_CLOUD, base::MakeUnique<base::StringValue>("value 2"), | 256 POLICY_SOURCE_CLOUD, base::MakeUnique<base::Value>("value 2"), |
| 260 nullptr); | 257 nullptr); |
| 261 | 258 |
| 262 // Unknown policies of known components with a schema are removed. | 259 // Unknown policies of known components with a schema are removed. |
| 263 bundle.Get(extension_ns) | 260 bundle.Get(extension_ns) |
| 264 .Set("Surprise", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 261 .Set("Surprise", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 265 POLICY_SOURCE_CLOUD, base::MakeUnique<base::StringValue>("value 4"), | 262 POLICY_SOURCE_CLOUD, base::MakeUnique<base::Value>("value 4"), |
| 266 nullptr); | 263 nullptr); |
| 267 | 264 |
| 268 // Unknown components are removed. | 265 // Unknown components are removed. |
| 269 PolicyNamespace unknown_ns(POLICY_DOMAIN_EXTENSIONS, "unknown"); | 266 PolicyNamespace unknown_ns(POLICY_DOMAIN_EXTENSIONS, "unknown"); |
| 270 bundle.Get(unknown_ns) | 267 bundle.Get(unknown_ns) |
| 271 .Set("Surprise", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, | 268 .Set("Surprise", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 272 POLICY_SOURCE_CLOUD, base::MakeUnique<base::StringValue>("value 5"), | 269 POLICY_SOURCE_CLOUD, base::MakeUnique<base::Value>("value 5"), |
| 273 nullptr); | 270 nullptr); |
| 274 | 271 |
| 275 schema_map->FilterBundle(&bundle); | 272 schema_map->FilterBundle(&bundle); |
| 276 EXPECT_TRUE(bundle.Equals(expected_bundle)); | 273 EXPECT_TRUE(bundle.Equals(expected_bundle)); |
| 277 } | 274 } |
| 278 | 275 |
| 279 TEST_F(SchemaMapTest, GetChanges) { | 276 TEST_F(SchemaMapTest, GetChanges) { |
| 280 DomainMap map; | 277 DomainMap map; |
| 281 map[POLICY_DOMAIN_CHROME][""] = Schema(); | 278 map[POLICY_DOMAIN_CHROME][""] = Schema(); |
| 282 scoped_refptr<SchemaMap> older = new SchemaMap(map); | 279 scoped_refptr<SchemaMap> older = new SchemaMap(map); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 302 newer = new SchemaMap(map); | 299 newer = new SchemaMap(map); |
| 303 newer->GetChanges(older, &removed, &added); | 300 newer->GetChanges(older, &removed, &added); |
| 304 ASSERT_EQ(2u, removed.size()); | 301 ASSERT_EQ(2u, removed.size()); |
| 305 EXPECT_EQ(PolicyNamespace(POLICY_DOMAIN_CHROME, ""), removed[0]); | 302 EXPECT_EQ(PolicyNamespace(POLICY_DOMAIN_CHROME, ""), removed[0]); |
| 306 EXPECT_EQ(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "xyz"), removed[1]); | 303 EXPECT_EQ(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "xyz"), removed[1]); |
| 307 ASSERT_EQ(1u, added.size()); | 304 ASSERT_EQ(1u, added.size()); |
| 308 EXPECT_EQ(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "abc"), added[0]); | 305 EXPECT_EQ(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, "abc"), added[0]); |
| 309 } | 306 } |
| 310 | 307 |
| 311 } // namespace policy | 308 } // namespace policy |
| OLD | NEW |