| 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/policy_bundle.h" | 5 #include "components/policy/core/common/policy_bundle.h" |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 #include <utility> |
| 8 | 9 |
| 9 #include "base/callback.h" | 10 #include "base/callback.h" |
| 11 #include "base/memory/ptr_util.h" |
| 10 #include "base/values.h" | 12 #include "base/values.h" |
| 11 #include "components/policy/core/common/external_data_fetcher.h" | 13 #include "components/policy/core/common/external_data_fetcher.h" |
| 12 #include "components/policy/core/common/policy_map.h" | 14 #include "components/policy/core/common/policy_map.h" |
| 13 #include "components/policy/core/common/policy_types.h" | 15 #include "components/policy/core/common/policy_types.h" |
| 14 #include "testing/gtest/include/gtest/gtest.h" | 16 #include "testing/gtest/include/gtest/gtest.h" |
| 15 | 17 |
| 16 namespace policy { | 18 namespace policy { |
| 17 | 19 |
| 18 namespace { | 20 namespace { |
| 19 | 21 |
| 20 const char kPolicyClashing0[] = "policy-clashing-0"; | 22 const char kPolicyClashing0[] = "policy-clashing-0"; |
| 21 const char kPolicyClashing1[] = "policy-clashing-1"; | 23 const char kPolicyClashing1[] = "policy-clashing-1"; |
| 22 const char kPolicy0[] = "policy-0"; | 24 const char kPolicy0[] = "policy-0"; |
| 23 const char kPolicy1[] = "policy-1"; | 25 const char kPolicy1[] = "policy-1"; |
| 24 const char kPolicy2[] = "policy-2"; | 26 const char kPolicy2[] = "policy-2"; |
| 25 const char kExtension0[] = "extension-0"; | 27 const char kExtension0[] = "extension-0"; |
| 26 const char kExtension1[] = "extension-1"; | 28 const char kExtension1[] = "extension-1"; |
| 27 const char kExtension2[] = "extension-2"; | 29 const char kExtension2[] = "extension-2"; |
| 28 const char kExtension3[] = "extension-3"; | 30 const char kExtension3[] = "extension-3"; |
| 29 | 31 |
| 30 // Adds test policies to |policy|. | 32 // Adds test policies to |policy|. |
| 31 void AddTestPolicies(PolicyMap* policy) { | 33 void AddTestPolicies(PolicyMap* policy) { |
| 32 policy->Set("mandatory-user", | 34 policy->Set("mandatory-user", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 33 POLICY_LEVEL_MANDATORY, | |
| 34 POLICY_SCOPE_USER, | |
| 35 POLICY_SOURCE_CLOUD, | 35 POLICY_SOURCE_CLOUD, |
| 36 new base::FundamentalValue(123), | 36 base::WrapUnique(new base::FundamentalValue(123)), nullptr); |
| 37 NULL); | 37 policy->Set("mandatory-machine", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, |
| 38 policy->Set("mandatory-machine", | |
| 39 POLICY_LEVEL_MANDATORY, | |
| 40 POLICY_SCOPE_MACHINE, | |
| 41 POLICY_SOURCE_CLOUD, | 38 POLICY_SOURCE_CLOUD, |
| 42 new base::StringValue("omg"), | 39 base::WrapUnique(new base::StringValue("omg")), nullptr); |
| 43 NULL); | 40 policy->Set("recommended-user", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, |
| 44 policy->Set("recommended-user", | |
| 45 POLICY_LEVEL_RECOMMENDED, | |
| 46 POLICY_SCOPE_USER, | |
| 47 POLICY_SOURCE_CLOUD, | 41 POLICY_SOURCE_CLOUD, |
| 48 new base::FundamentalValue(true), | 42 base::WrapUnique(new base::FundamentalValue(true)), nullptr); |
| 49 NULL); | 43 std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); |
| 50 base::DictionaryValue* dict = new base::DictionaryValue(); | |
| 51 dict->SetBoolean("false", false); | 44 dict->SetBoolean("false", false); |
| 52 dict->SetInteger("int", 456); | 45 dict->SetInteger("int", 456); |
| 53 dict->SetString("str", "bbq"); | 46 dict->SetString("str", "bbq"); |
| 54 policy->Set("recommended-machine", POLICY_LEVEL_RECOMMENDED, | 47 policy->Set("recommended-machine", POLICY_LEVEL_RECOMMENDED, |
| 55 POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, dict, nullptr); | 48 POLICY_SCOPE_MACHINE, POLICY_SOURCE_CLOUD, std::move(dict), |
| 49 nullptr); |
| 56 } | 50 } |
| 57 | 51 |
| 58 // Adds test policies to |policy| based on the parameters: | 52 // Adds test policies to |policy| based on the parameters: |
| 59 // - kPolicyClashing0 mapped to |value|, user mandatory | 53 // - kPolicyClashing0 mapped to |value|, user mandatory |
| 60 // - kPolicyClashing1 mapped to |value|, with |level| and |scope| | 54 // - kPolicyClashing1 mapped to |value|, with |level| and |scope| |
| 61 // - |name| mapped to |value|, user mandatory | 55 // - |name| mapped to |value|, user mandatory |
| 62 void AddTestPoliciesWithParams(PolicyMap *policy, | 56 void AddTestPoliciesWithParams(PolicyMap *policy, |
| 63 const char* name, | 57 const char* name, |
| 64 int value, | 58 int value, |
| 65 PolicyLevel level, | 59 PolicyLevel level, |
| 66 PolicyScope scope) { | 60 PolicyScope scope) { |
| 67 policy->Set(kPolicyClashing0, | 61 policy->Set(kPolicyClashing0, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 68 POLICY_LEVEL_MANDATORY, | |
| 69 POLICY_SCOPE_USER, | |
| 70 POLICY_SOURCE_CLOUD, | 62 POLICY_SOURCE_CLOUD, |
| 71 new base::FundamentalValue(value), | 63 base::WrapUnique(new base::FundamentalValue(value)), nullptr); |
| 72 NULL); | |
| 73 policy->Set(kPolicyClashing1, level, scope, POLICY_SOURCE_CLOUD, | 64 policy->Set(kPolicyClashing1, level, scope, POLICY_SOURCE_CLOUD, |
| 74 new base::FundamentalValue(value), nullptr); | 65 base::WrapUnique(new base::FundamentalValue(value)), nullptr); |
| 75 policy->Set(name, | 66 policy->Set(name, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 76 POLICY_LEVEL_MANDATORY, | |
| 77 POLICY_SCOPE_USER, | |
| 78 POLICY_SOURCE_CLOUD, | 67 POLICY_SOURCE_CLOUD, |
| 79 new base::FundamentalValue(value), | 68 base::WrapUnique(new base::FundamentalValue(value)), nullptr); |
| 80 NULL); | |
| 81 } | 69 } |
| 82 | 70 |
| 83 // Returns true if |bundle| is empty. | 71 // Returns true if |bundle| is empty. |
| 84 bool IsEmpty(const PolicyBundle& bundle) { | 72 bool IsEmpty(const PolicyBundle& bundle) { |
| 85 return bundle.begin() == bundle.end(); | 73 return bundle.begin() == bundle.end(); |
| 86 } | 74 } |
| 87 | 75 |
| 88 } // namespace | 76 } // namespace |
| 89 | 77 |
| 90 TEST(PolicyBundleTest, Get) { | 78 TEST(PolicyBundleTest, Get) { |
| (...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 197 merged.MergeFrom(bundle2); | 185 merged.MergeFrom(bundle2); |
| 198 PolicyBundle empty_bundle; | 186 PolicyBundle empty_bundle; |
| 199 merged.MergeFrom(empty_bundle); | 187 merged.MergeFrom(empty_bundle); |
| 200 | 188 |
| 201 // chrome and kExtension3 policies are merged: | 189 // chrome and kExtension3 policies are merged: |
| 202 // - kPolicyClashing0 comes from bundle0, which has the highest priority; | 190 // - kPolicyClashing0 comes from bundle0, which has the highest priority; |
| 203 // - kPolicyClashing1 comes from bundle1, which has the highest level/scope | 191 // - kPolicyClashing1 comes from bundle1, which has the highest level/scope |
| 204 // combination; | 192 // combination; |
| 205 // - kPolicyN are merged from each bundle. | 193 // - kPolicyN are merged from each bundle. |
| 206 PolicyMap expected; | 194 PolicyMap expected; |
| 207 expected.Set(kPolicyClashing0, | 195 expected.Set(kPolicyClashing0, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 208 POLICY_LEVEL_MANDATORY, | |
| 209 POLICY_SCOPE_USER, | |
| 210 POLICY_SOURCE_CLOUD, | 196 POLICY_SOURCE_CLOUD, |
| 211 new base::FundamentalValue(0), | 197 base::WrapUnique(new base::FundamentalValue(0)), nullptr); |
| 212 NULL); | 198 expected.Set(kPolicyClashing1, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, |
| 213 expected.Set(kPolicyClashing1, | |
| 214 POLICY_LEVEL_MANDATORY, | |
| 215 POLICY_SCOPE_MACHINE, | |
| 216 POLICY_SOURCE_CLOUD, | 199 POLICY_SOURCE_CLOUD, |
| 217 new base::FundamentalValue(1), | 200 base::WrapUnique(new base::FundamentalValue(1)), nullptr); |
| 218 NULL); | 201 expected.Set(kPolicy0, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 219 expected.Set(kPolicy0, | |
| 220 POLICY_LEVEL_MANDATORY, | |
| 221 POLICY_SCOPE_USER, | |
| 222 POLICY_SOURCE_CLOUD, | 202 POLICY_SOURCE_CLOUD, |
| 223 new base::FundamentalValue(0), | 203 base::WrapUnique(new base::FundamentalValue(0)), nullptr); |
| 224 NULL); | 204 expected.Set(kPolicy1, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 225 expected.Set(kPolicy1, | |
| 226 POLICY_LEVEL_MANDATORY, | |
| 227 POLICY_SCOPE_USER, | |
| 228 POLICY_SOURCE_CLOUD, | 205 POLICY_SOURCE_CLOUD, |
| 229 new base::FundamentalValue(1), | 206 base::WrapUnique(new base::FundamentalValue(1)), nullptr); |
| 230 NULL); | 207 expected.Set(kPolicy2, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 231 expected.Set(kPolicy2, | |
| 232 POLICY_LEVEL_MANDATORY, | |
| 233 POLICY_SCOPE_USER, | |
| 234 POLICY_SOURCE_CLOUD, | 208 POLICY_SOURCE_CLOUD, |
| 235 new base::FundamentalValue(2), | 209 base::WrapUnique(new base::FundamentalValue(2)), nullptr); |
| 236 NULL); | |
| 237 EXPECT_TRUE(merged.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, | 210 EXPECT_TRUE(merged.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, |
| 238 std::string())).Equals(expected)); | 211 std::string())).Equals(expected)); |
| 239 EXPECT_TRUE(merged.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, | 212 EXPECT_TRUE(merged.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, |
| 240 kExtension3)).Equals(expected)); | 213 kExtension3)).Equals(expected)); |
| 241 // extension0 comes only from bundle0. | 214 // extension0 comes only from bundle0. |
| 242 EXPECT_TRUE(merged.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, | 215 EXPECT_TRUE(merged.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, |
| 243 kExtension0)).Equals(policy0)); | 216 kExtension0)).Equals(policy0)); |
| 244 // extension1 comes only from bundle1. | 217 // extension1 comes only from bundle1. |
| 245 EXPECT_TRUE(merged.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, | 218 EXPECT_TRUE(merged.Get(PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, |
| 246 kExtension1)).Equals(policy1)); | 219 kExtension1)).Equals(policy1)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 265 PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension1))); | 238 PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension1))); |
| 266 EXPECT_FALSE(bundle.Equals(other)); | 239 EXPECT_FALSE(bundle.Equals(other)); |
| 267 other.CopyFrom(bundle); | 240 other.CopyFrom(bundle); |
| 268 EXPECT_TRUE(bundle.Equals(other)); | 241 EXPECT_TRUE(bundle.Equals(other)); |
| 269 AddTestPolicies(&other.Get( | 242 AddTestPolicies(&other.Get( |
| 270 PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension2))); | 243 PolicyNamespace(POLICY_DOMAIN_EXTENSIONS, kExtension2))); |
| 271 EXPECT_FALSE(bundle.Equals(other)); | 244 EXPECT_FALSE(bundle.Equals(other)); |
| 272 | 245 |
| 273 other.CopyFrom(bundle); | 246 other.CopyFrom(bundle); |
| 274 bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) | 247 bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) |
| 275 .Set(kPolicy0, | 248 .Set(kPolicy0, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 276 POLICY_LEVEL_MANDATORY, | |
| 277 POLICY_SCOPE_USER, | |
| 278 POLICY_SOURCE_CLOUD, | 249 POLICY_SOURCE_CLOUD, |
| 279 new base::FundamentalValue(123), | 250 base::WrapUnique(new base::FundamentalValue(123)), nullptr); |
| 280 NULL); | |
| 281 EXPECT_FALSE(bundle.Equals(other)); | 251 EXPECT_FALSE(bundle.Equals(other)); |
| 282 other.CopyFrom(bundle); | 252 other.CopyFrom(bundle); |
| 283 EXPECT_TRUE(bundle.Equals(other)); | 253 EXPECT_TRUE(bundle.Equals(other)); |
| 284 bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) | 254 bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())) |
| 285 .Set(kPolicy0, | 255 .Set(kPolicy0, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, |
| 286 POLICY_LEVEL_MANDATORY, | |
| 287 POLICY_SCOPE_MACHINE, | |
| 288 POLICY_SOURCE_CLOUD, | 256 POLICY_SOURCE_CLOUD, |
| 289 new base::FundamentalValue(123), | 257 base::WrapUnique(new base::FundamentalValue(123)), nullptr); |
| 290 NULL); | |
| 291 EXPECT_FALSE(bundle.Equals(other)); | 258 EXPECT_FALSE(bundle.Equals(other)); |
| 292 | 259 |
| 293 // Test non-const Get(). | 260 // Test non-const Get(). |
| 294 bundle.Clear(); | 261 bundle.Clear(); |
| 295 other.Clear(); | 262 other.Clear(); |
| 296 PolicyMap& policy_map = | 263 PolicyMap& policy_map = |
| 297 bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())); | 264 bundle.Get(PolicyNamespace(POLICY_DOMAIN_CHROME, std::string())); |
| 298 EXPECT_TRUE(bundle.Equals(other)); | 265 EXPECT_TRUE(bundle.Equals(other)); |
| 299 policy_map.Set(kPolicy0, | 266 policy_map.Set(kPolicy0, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| 300 POLICY_LEVEL_MANDATORY, | |
| 301 POLICY_SCOPE_USER, | |
| 302 POLICY_SOURCE_CLOUD, | 267 POLICY_SOURCE_CLOUD, |
| 303 new base::FundamentalValue(123), | 268 base::WrapUnique(new base::FundamentalValue(123)), nullptr); |
| 304 NULL); | |
| 305 EXPECT_FALSE(bundle.Equals(other)); | 269 EXPECT_FALSE(bundle.Equals(other)); |
| 306 } | 270 } |
| 307 | 271 |
| 308 } // namespace policy | 272 } // namespace policy |
| OLD | NEW |