Chromium Code Reviews| Index: chrome/browser/policy/policy_service_unittest.cc |
| diff --git a/chrome/browser/policy/policy_service_unittest.cc b/chrome/browser/policy/policy_service_unittest.cc |
| index 27cf3b3435c4ee37b1636665988e29761eb98759..db68c1de6a00f4347d558132aa1fd4ae7520a92d 100644 |
| --- a/chrome/browser/policy/policy_service_unittest.cc |
| +++ b/chrome/browser/policy/policy_service_unittest.cc |
| @@ -24,6 +24,10 @@ namespace policy { |
| namespace { |
| +const char kExtension[] = "extension-id"; |
| +const char kSameLevelPolicy[] = "policy-same-level-and-scope"; |
| +const char kDiffLevelPolicy[] = "chrome-diff-level-and-scope"; |
| + |
| class MockPolicyServiceObserver : public PolicyService::Observer { |
| public: |
| virtual ~MockPolicyServiceObserver() {} |
| @@ -45,6 +49,21 @@ MATCHER_P(ValueEquals, expected, "") { |
| return base::Value::Equals(arg, expected); |
| } |
| +// Helper that fills |bundle| with test policies. |
| +void AddTestPolicies(PolicyBundle* bundle, const char* value, |
| + PolicyLevel level, PolicyScope scope) { |
|
Mattias Nissler (ping if slow)
2012/05/14 13:59:37
Individual lines for parameter declarations. bundl
Joao da Silva
2012/05/14 15:26:51
Done.
|
| + PolicyMap* policy_map = &bundle->Get(POLICY_DOMAIN_CHROME, ""); |
| + policy_map->Set(kSameLevelPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| + base::Value::CreateStringValue(value)); |
| + policy_map->Set(kDiffLevelPolicy, level, scope, |
| + base::Value::CreateStringValue(value)); |
| + policy_map = &bundle->Get(POLICY_DOMAIN_EXTENSIONS, kExtension); |
| + policy_map->Set(kSameLevelPolicy, POLICY_LEVEL_MANDATORY, |
| + POLICY_SCOPE_USER, base::Value::CreateStringValue(value)); |
| + policy_map->Set(kDiffLevelPolicy, level, scope, |
| + base::Value::CreateStringValue(value)); |
| +} |
| + |
| } // namespace |
| class PolicyServiceTest : public testing::Test { |
| @@ -52,13 +71,6 @@ class PolicyServiceTest : public testing::Test { |
| PolicyServiceTest() {} |
| void SetUp() OVERRIDE { |
| - EXPECT_CALL(provider0_, ProvideInternal(_)) |
| - .WillRepeatedly(CopyPolicyMap(&policy0_)); |
| - EXPECT_CALL(provider1_, ProvideInternal(_)) |
| - .WillRepeatedly(CopyPolicyMap(&policy1_)); |
| - EXPECT_CALL(provider2_, ProvideInternal(_)) |
| - .WillRepeatedly(CopyPolicyMap(&policy2_)); |
| - |
| EXPECT_CALL(provider0_, IsInitializationComplete()) |
| .WillRepeatedly(Return(true)); |
| EXPECT_CALL(provider1_, IsInitializationComplete()) |
| @@ -68,6 +80,7 @@ class PolicyServiceTest : public testing::Test { |
| policy0_.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| base::Value::CreateIntegerValue(13)); |
| + provider0_.UpdateChromePolicy(policy0_); |
| PolicyServiceImpl::Providers providers; |
| providers.push_back(&provider0_); |
| @@ -85,9 +98,7 @@ class PolicyServiceTest : public testing::Test { |
| bool VerifyPolicies(PolicyDomain domain, |
| const std::string& component_id, |
| const PolicyMap& expected) { |
| - const PolicyMap* policies = |
| - policy_service_->GetPolicies(domain, component_id); |
| - return policies && policies->Equals(expected); |
| + return policy_service_->GetPolicies(domain, component_id).Equals(expected); |
| } |
| protected: |
| @@ -127,12 +138,12 @@ TEST_F(PolicyServiceTest, NotifyObservers) { |
| EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", |
| PolicyEquals(&expectedPrevious), |
| PolicyEquals(&expectedCurrent))); |
| - provider0_.NotifyPolicyUpdated(); |
| + provider0_.UpdateChromePolicy(policy0_); |
| Mock::VerifyAndClearExpectations(&observer); |
| // No changes. |
| EXPECT_CALL(observer, OnPolicyUpdated(_, _, _, _)).Times(0); |
| - provider0_.NotifyPolicyUpdated(); |
| + provider0_.UpdateChromePolicy(policy0_); |
| Mock::VerifyAndClearExpectations(&observer); |
| EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expectedCurrent)); |
| @@ -145,7 +156,7 @@ TEST_F(PolicyServiceTest, NotifyObservers) { |
| EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", |
| PolicyEquals(&expectedPrevious), |
| PolicyEquals(&expectedCurrent))); |
| - provider0_.NotifyPolicyUpdated(); |
| + provider0_.UpdateChromePolicy(policy0_); |
| Mock::VerifyAndClearExpectations(&observer); |
| // Removed policy. |
| @@ -155,7 +166,7 @@ TEST_F(PolicyServiceTest, NotifyObservers) { |
| EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", |
| PolicyEquals(&expectedPrevious), |
| PolicyEquals(&expectedCurrent))); |
| - provider0_.NotifyPolicyUpdated(); |
| + provider0_.UpdateChromePolicy(policy0_); |
| Mock::VerifyAndClearExpectations(&observer); |
| // Changed policy. |
| @@ -168,12 +179,12 @@ TEST_F(PolicyServiceTest, NotifyObservers) { |
| EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", |
| PolicyEquals(&expectedPrevious), |
| PolicyEquals(&expectedCurrent))); |
| - provider0_.NotifyPolicyUpdated(); |
| + provider0_.UpdateChromePolicy(policy0_); |
| Mock::VerifyAndClearExpectations(&observer); |
| // No changes again. |
| EXPECT_CALL(observer, OnPolicyUpdated(_, _, _, _)).Times(0); |
| - provider0_.NotifyPolicyUpdated(); |
| + provider0_.UpdateChromePolicy(policy0_); |
| Mock::VerifyAndClearExpectations(&observer); |
| EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expectedCurrent)); |
| @@ -192,22 +203,22 @@ TEST_F(PolicyServiceTest, Priorities) { |
| base::Value::CreateIntegerValue(1)); |
| policy2_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| base::Value::CreateIntegerValue(2)); |
| - provider0_.NotifyPolicyUpdated(); |
| - provider1_.NotifyPolicyUpdated(); |
| - provider2_.NotifyPolicyUpdated(); |
| + provider0_.UpdateChromePolicy(policy0_); |
| + provider1_.UpdateChromePolicy(policy1_); |
| + provider2_.UpdateChromePolicy(policy2_); |
| EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); |
| expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| base::Value::CreateIntegerValue(1)); |
| policy0_.Erase("aaa"); |
| - provider0_.NotifyPolicyUpdated(); |
| + provider0_.UpdateChromePolicy(policy0_); |
| EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); |
| expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| base::Value::CreateIntegerValue(2)); |
| policy1_.Set("aaa", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, |
| base::Value::CreateIntegerValue(1)); |
| - provider1_.NotifyPolicyUpdated(); |
| + provider1_.UpdateChromePolicy(policy1_); |
| EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); |
| } |
| @@ -231,14 +242,14 @@ TEST_F(PolicyServiceTest, PolicyChangeRegistrar) { |
| EXPECT_CALL(*this, OnPolicyValueUpdated(NULL, ValueEquals(&kValue0))); |
| policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| kValue0.DeepCopy()); |
| - provider0_.NotifyPolicyUpdated(); |
| + provider0_.UpdateChromePolicy(policy0_); |
| Mock::VerifyAndClearExpectations(this); |
| // Changing other values doesn't trigger a notification. |
| EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0); |
| policy0_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| kValue0.DeepCopy()); |
| - provider0_.NotifyPolicyUpdated(); |
| + provider0_.UpdateChromePolicy(policy0_); |
| Mock::VerifyAndClearExpectations(this); |
| // Modifying the value triggers a notification. |
| @@ -247,13 +258,13 @@ TEST_F(PolicyServiceTest, PolicyChangeRegistrar) { |
| ValueEquals(&kValue1))); |
| policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| kValue1.DeepCopy()); |
| - provider0_.NotifyPolicyUpdated(); |
| + provider0_.UpdateChromePolicy(policy0_); |
| Mock::VerifyAndClearExpectations(this); |
| // Removing the value triggers a notification. |
| EXPECT_CALL(*this, OnPolicyValueUpdated(ValueEquals(&kValue1), NULL)); |
| policy0_.Erase("aaa"); |
| - provider0_.NotifyPolicyUpdated(); |
| + provider0_.UpdateChromePolicy(policy0_); |
| Mock::VerifyAndClearExpectations(this); |
| // No more notifications after destroying the registrar. |
| @@ -263,7 +274,7 @@ TEST_F(PolicyServiceTest, PolicyChangeRegistrar) { |
| kValue1.DeepCopy()); |
| policy0_.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| kValue1.DeepCopy()); |
| - provider0_.NotifyPolicyUpdated(); |
| + provider0_.UpdateChromePolicy(policy0_); |
| Mock::VerifyAndClearExpectations(this); |
| } |
| @@ -288,7 +299,7 @@ TEST_F(PolicyServiceTest, RefreshPolicies) { |
| base::FundamentalValue kValue0(0); |
| policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| kValue0.DeepCopy()); |
| - provider0_.NotifyPolicyUpdated(); |
| + provider0_.UpdateChromePolicy(policy0_); |
| loop.RunAllPending(); |
| Mock::VerifyAndClearExpectations(this); |
| @@ -296,7 +307,7 @@ TEST_F(PolicyServiceTest, RefreshPolicies) { |
| base::FundamentalValue kValue1(1); |
| policy1_.Set("aaa", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, |
| kValue1.DeepCopy()); |
| - provider1_.NotifyPolicyUpdated(); |
| + provider1_.UpdateChromePolicy(policy1_); |
| loop.RunAllPending(); |
| Mock::VerifyAndClearExpectations(this); |
| @@ -306,7 +317,7 @@ TEST_F(PolicyServiceTest, RefreshPolicies) { |
| EXPECT_CALL(*this, OnPolicyRefresh()).Times(0); |
| policy1_.Set("bbb", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER, |
| kValue1.DeepCopy()); |
| - provider1_.NotifyPolicyUpdated(); |
| + provider1_.UpdateChromePolicy(policy1_); |
| loop.RunAllPending(); |
| Mock::VerifyAndClearExpectations(this); |
| @@ -322,7 +333,7 @@ TEST_F(PolicyServiceTest, RefreshPolicies) { |
| EXPECT_CALL(*this, OnPolicyRefresh()).Times(0); |
| policy2_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| kValue0.DeepCopy()); |
| - provider2_.NotifyPolicyUpdated(); |
| + provider2_.UpdateChromePolicy(policy2_); |
| loop.RunAllPending(); |
| Mock::VerifyAndClearExpectations(this); |
| @@ -331,16 +342,46 @@ TEST_F(PolicyServiceTest, RefreshPolicies) { |
| base::FundamentalValue kValue2(2); |
| policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| kValue2.DeepCopy()); |
| - provider0_.NotifyPolicyUpdated(); |
| - provider1_.NotifyPolicyUpdated(); |
| + provider0_.UpdateChromePolicy(policy0_); |
| + provider1_.UpdateChromePolicy(policy1_); |
| loop.RunAllPending(); |
| Mock::VerifyAndClearExpectations(this); |
| - const PolicyMap* policies = policy_service_->GetPolicies( |
| + const PolicyMap& policies = policy_service_->GetPolicies( |
| POLICY_DOMAIN_CHROME, ""); |
| - ASSERT_TRUE(policies); |
| - EXPECT_TRUE(base::Value::Equals(&kValue2, policies->GetValue("aaa"))); |
| - EXPECT_TRUE(base::Value::Equals(&kValue0, policies->GetValue("bbb"))); |
| + EXPECT_TRUE(base::Value::Equals(&kValue2, policies.GetValue("aaa"))); |
| + EXPECT_TRUE(base::Value::Equals(&kValue0, policies.GetValue("bbb"))); |
| +} |
| + |
| +TEST_F(PolicyServiceTest, NamespaceMerge) { |
| + scoped_ptr<PolicyBundle> bundle0(new PolicyBundle()); |
| + scoped_ptr<PolicyBundle> bundle1(new PolicyBundle()); |
| + scoped_ptr<PolicyBundle> bundle2(new PolicyBundle()); |
| + |
| + AddTestPolicies( |
| + bundle0.get(), "bundle0", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER); |
| + AddTestPolicies( |
| + bundle1.get(), "bundle1", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER); |
| + AddTestPolicies( |
| + bundle2.get(), "bundle2", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE); |
| + |
| + provider0_.UpdatePolicy(bundle0.Pass()); |
| + provider1_.UpdatePolicy(bundle1.Pass()); |
| + provider2_.UpdatePolicy(bundle2.Pass()); |
| + |
| + PolicyMap expected; |
| + // For policies of the same level and scope, the first provider takes |
| + // precedence, on every namespace. |
| + expected.Set(kSameLevelPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
| + base::Value::CreateStringValue("bundle0")); |
| + // For policies with different levels and scopes, the highest priority |
| + // level/scope combination takes precedence, on every namespace. |
| + expected.Set(kDiffLevelPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_MACHINE, |
| + base::Value::CreateStringValue("bundle2")); |
| + EXPECT_TRUE(policy_service_->GetPolicies(POLICY_DOMAIN_CHROME, "") |
| + .Equals(expected)); |
| + EXPECT_TRUE(policy_service_->GetPolicies(POLICY_DOMAIN_EXTENSIONS, kExtension) |
| + .Equals(expected)); |
| } |
| } // namespace policy |