Index: chrome/browser/policy/policy_service_impl_unittest.cc |
diff --git a/chrome/browser/policy/policy_service_unittest.cc b/chrome/browser/policy/policy_service_impl_unittest.cc |
similarity index 62% |
rename from chrome/browser/policy/policy_service_unittest.cc |
rename to chrome/browser/policy/policy_service_impl_unittest.cc |
index 27cf3b3435c4ee37b1636665988e29761eb98759..2f5ee2c5cfa37dcf0c5d9fd9e6dc84dd2d93a9f8 100644 |
--- a/chrome/browser/policy/policy_service_unittest.cc |
+++ b/chrome/browser/policy/policy_service_impl_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,23 @@ 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) { |
+ 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 +73,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 +82,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 +100,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 +140,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 +158,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 +168,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,18 +181,88 @@ 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)); |
policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, "", &observer); |
} |
+TEST_F(PolicyServiceTest, NotifyObserversInMultipleNamespaces) { |
+ const std::string kExtension0("extension-0"); |
+ const std::string kExtension1("extension-1"); |
+ const std::string kExtension2("extension-2"); |
+ MockPolicyServiceObserver chrome_observer; |
+ MockPolicyServiceObserver extension0_observer; |
+ MockPolicyServiceObserver extension1_observer; |
+ MockPolicyServiceObserver extension2_observer; |
+ policy_service_->AddObserver(POLICY_DOMAIN_CHROME, "", &chrome_observer); |
+ policy_service_->AddObserver( |
+ POLICY_DOMAIN_EXTENSIONS, kExtension0, &extension0_observer); |
Mattias Nissler (ping if slow)
2012/05/15 09:40:33
I think this would become more readable if you put
Joao da Silva
2012/05/15 13:06:31
Done.
|
+ policy_service_->AddObserver( |
+ POLICY_DOMAIN_EXTENSIONS, kExtension1, &extension1_observer); |
+ policy_service_->AddObserver( |
+ POLICY_DOMAIN_EXTENSIONS, kExtension2, &extension2_observer); |
+ |
+ PolicyMap policy_map; |
+ policy_map.Set("policy", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
+ base::Value::CreateStringValue("value")); |
+ |
+ scoped_ptr<PolicyBundle> bundle(new PolicyBundle()); |
+ // The initial setup includes a policy for chrome that is now changing. |
+ bundle->Get(POLICY_DOMAIN_CHROME, "").CopyFrom(policy_map); |
+ bundle->Get(POLICY_DOMAIN_EXTENSIONS, kExtension0).CopyFrom(policy_map); |
+ bundle->Get(POLICY_DOMAIN_EXTENSIONS, kExtension1).CopyFrom(policy_map); |
+ |
+ EXPECT_CALL(chrome_observer, |
+ OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", _, _)); |
Mattias Nissler (ping if slow)
2012/05/15 09:40:33
add a matcher for checking the correct PolicyMap g
Joao da Silva
2012/05/15 13:06:31
Done.
|
+ EXPECT_CALL(extension0_observer, |
+ OnPolicyUpdated(POLICY_DOMAIN_EXTENSIONS, kExtension0, _, _)); |
+ EXPECT_CALL(extension1_observer, |
+ OnPolicyUpdated(POLICY_DOMAIN_EXTENSIONS, kExtension1, _, _)); |
+ EXPECT_CALL(extension2_observer, OnPolicyUpdated(_, _, _, _)).Times(0); |
+ provider0_.UpdatePolicy(bundle.Pass()); |
+ Mock::VerifyAndClearExpectations(&chrome_observer); |
+ Mock::VerifyAndClearExpectations(&extension0_observer); |
+ Mock::VerifyAndClearExpectations(&extension1_observer); |
+ Mock::VerifyAndClearExpectations(&extension2_observer); |
+ |
+ // Chrome policy stays the same, kExtension0 is gone, kExtension1 changes, |
+ // and kExtension2 is new. |
+ bundle.reset(new PolicyBundle()); |
+ bundle->Get(POLICY_DOMAIN_CHROME, "").CopyFrom(policy_map); |
+ policy_map.Set("policy", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
+ base::Value::CreateStringValue("another value")); |
+ bundle->Get(POLICY_DOMAIN_EXTENSIONS, kExtension1).CopyFrom(policy_map); |
+ bundle->Get(POLICY_DOMAIN_EXTENSIONS, kExtension2).CopyFrom(policy_map); |
+ |
+ EXPECT_CALL(chrome_observer, OnPolicyUpdated(_, _, _, _)).Times(0); |
+ EXPECT_CALL(extension0_observer, |
+ OnPolicyUpdated(POLICY_DOMAIN_EXTENSIONS, kExtension0, _, _)); |
+ EXPECT_CALL(extension1_observer, |
+ OnPolicyUpdated(POLICY_DOMAIN_EXTENSIONS, kExtension1, _, _)); |
+ EXPECT_CALL(extension2_observer, |
+ OnPolicyUpdated(POLICY_DOMAIN_EXTENSIONS, kExtension2, _, _)); |
+ provider0_.UpdatePolicy(bundle.Pass()); |
+ Mock::VerifyAndClearExpectations(&chrome_observer); |
+ Mock::VerifyAndClearExpectations(&extension0_observer); |
+ Mock::VerifyAndClearExpectations(&extension1_observer); |
+ Mock::VerifyAndClearExpectations(&extension2_observer); |
+ |
+ policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, "", &chrome_observer); |
+ policy_service_->RemoveObserver( |
Mattias Nissler (ping if slow)
2012/05/15 09:40:33
same comment regarding line breaking.
Joao da Silva
2012/05/15 13:06:31
Done.
|
+ POLICY_DOMAIN_EXTENSIONS, kExtension0, &extension0_observer); |
+ policy_service_->RemoveObserver( |
+ POLICY_DOMAIN_EXTENSIONS, kExtension1, &extension1_observer); |
+ policy_service_->RemoveObserver( |
+ POLICY_DOMAIN_EXTENSIONS, kExtension2, &extension2_observer); |
+} |
+ |
TEST_F(PolicyServiceTest, Priorities) { |
PolicyMap expected; |
expected.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
@@ -192,22 +275,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 +314,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 +330,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 +346,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 +371,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 +379,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 +389,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 +405,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 +414,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); |
Mattias Nissler (ping if slow)
2012/05/15 09:40:33
break line after second parameter?
Joao da Silva
2012/05/15 13:06:31
Done.
|
+ 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 |