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 |