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 9fa0de5991ac795e5f00de52f2feaaa5ca169dd0..b29952a272d197f314eae32c97d045289a76aa84 100644 |
--- a/chrome/browser/policy/policy_service_unittest.cc |
+++ b/chrome/browser/policy/policy_service_unittest.cc |
@@ -27,12 +27,28 @@ class MockPolicyServiceObserver : public PolicyService::Observer { |
const PolicyMap& current)); |
}; |
+class MockPolicyValueObserver : public PolicyChangeRegistrar::Observer { |
+ public: |
+ virtual ~MockPolicyValueObserver() {} |
+ MOCK_METHOD5(OnPolicyValueUpdated, void(PolicyDomain, |
+ const std::string&, |
+ const std::string&, |
+ const Value*, |
+ const Value*)); |
+}; |
+ |
// Helper to compare the arguments to an EXPECT_CALL of OnPolicyUpdated() with |
// their expected values. |
MATCHER_P(PolicyEquals, expected, "") { |
return arg.Equals(*expected); |
} |
+// Helper to compare the arguments to an EXPECT_CALL of OnPolicyValueUpdated() |
+// with their expected values. |
+MATCHER_P(ValueEquals, expected, "") { |
+ return base::Value::Equals(arg, expected); |
+} |
+ |
} // namespace |
class PolicyServiceTest : public testing::Test { |
@@ -49,11 +65,6 @@ class PolicyServiceTest : public testing::Test { |
providers.push_back(&provider1_); |
providers.push_back(&provider2_); |
policy_service_.reset(new PolicyServiceImpl(providers)); |
- policy_service_->AddObserver(POLICY_DOMAIN_CHROME, "", &observer_); |
- } |
- |
- void TearDown() OVERRIDE { |
- policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, "", &observer_); |
} |
// Returns true if the policies for |domain|, |component_id| match |expected|. |
@@ -70,7 +81,6 @@ class PolicyServiceTest : public testing::Test { |
MockConfigurationPolicyProvider provider1_; |
MockConfigurationPolicyProvider provider2_; |
scoped_ptr<PolicyServiceImpl> policy_service_; |
- MockPolicyServiceObserver observer_; |
private: |
DISALLOW_COPY_AND_ASSIGN(PolicyServiceTest); |
@@ -84,6 +94,9 @@ TEST_F(PolicyServiceTest, LoadsPoliciesBeforeProvidersRefresh) { |
} |
TEST_F(PolicyServiceTest, NotifyObservers) { |
+ MockPolicyServiceObserver observer; |
+ policy_service_->AddObserver(POLICY_DOMAIN_CHROME, "", &observer); |
+ |
PolicyMap expectedPrevious; |
expectedPrevious.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
base::Value::CreateIntegerValue(13)); |
@@ -93,16 +106,16 @@ TEST_F(PolicyServiceTest, NotifyObservers) { |
expectedCurrent.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
base::Value::CreateIntegerValue(123)); |
provider0_.AddMandatoryPolicy("aaa", base::Value::CreateIntegerValue(123)); |
- EXPECT_CALL(observer_, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", |
- PolicyEquals(&expectedPrevious), |
- PolicyEquals(&expectedCurrent))); |
+ EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", |
+ PolicyEquals(&expectedPrevious), |
+ PolicyEquals(&expectedCurrent))); |
provider0_.RefreshPolicies(); |
- Mock::VerifyAndClearExpectations(&observer_); |
+ Mock::VerifyAndClearExpectations(&observer); |
// No changes. |
- EXPECT_CALL(observer_, OnPolicyUpdated(_, _, _, _)).Times(0); |
+ EXPECT_CALL(observer, OnPolicyUpdated(_, _, _, _)).Times(0); |
provider0_.RefreshPolicies(); |
- Mock::VerifyAndClearExpectations(&observer_); |
+ Mock::VerifyAndClearExpectations(&observer); |
EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expectedCurrent)); |
// New policy. |
@@ -110,46 +123,46 @@ TEST_F(PolicyServiceTest, NotifyObservers) { |
expectedCurrent.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
base::Value::CreateIntegerValue(456)); |
provider0_.AddMandatoryPolicy("bbb", base::Value::CreateIntegerValue(456)); |
- EXPECT_CALL(observer_, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", |
- PolicyEquals(&expectedPrevious), |
- PolicyEquals(&expectedCurrent))); |
+ EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", |
+ PolicyEquals(&expectedPrevious), |
+ PolicyEquals(&expectedCurrent))); |
provider0_.RefreshPolicies(); |
- Mock::VerifyAndClearExpectations(&observer_); |
+ Mock::VerifyAndClearExpectations(&observer); |
// Removed policy. |
expectedPrevious.CopyFrom(expectedCurrent); |
expectedCurrent.Erase("bbb"); |
provider0_.RemovePolicy("bbb"); |
- EXPECT_CALL(observer_, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", |
- PolicyEquals(&expectedPrevious), |
- PolicyEquals(&expectedCurrent))); |
+ EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", |
+ PolicyEquals(&expectedPrevious), |
+ PolicyEquals(&expectedCurrent))); |
provider0_.RefreshPolicies(); |
- Mock::VerifyAndClearExpectations(&observer_); |
+ Mock::VerifyAndClearExpectations(&observer); |
// Changed policy. |
expectedPrevious.CopyFrom(expectedCurrent); |
expectedCurrent.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
base::Value::CreateIntegerValue(789)); |
provider0_.AddMandatoryPolicy("aaa", base::Value::CreateIntegerValue(789)); |
- EXPECT_CALL(observer_, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", |
- PolicyEquals(&expectedPrevious), |
- PolicyEquals(&expectedCurrent))); |
+ EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "", |
+ PolicyEquals(&expectedPrevious), |
+ PolicyEquals(&expectedCurrent))); |
provider0_.RefreshPolicies(); |
- Mock::VerifyAndClearExpectations(&observer_); |
+ Mock::VerifyAndClearExpectations(&observer); |
// No changes again. |
- EXPECT_CALL(observer_, OnPolicyUpdated(_, _, _, _)).Times(0); |
+ EXPECT_CALL(observer, OnPolicyUpdated(_, _, _, _)).Times(0); |
provider0_.RefreshPolicies(); |
- Mock::VerifyAndClearExpectations(&observer_); |
+ Mock::VerifyAndClearExpectations(&observer); |
EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expectedCurrent)); |
+ |
+ policy_service_->RemoveObserver(POLICY_DOMAIN_CHROME, "", &observer); |
} |
TEST_F(PolicyServiceTest, Priorities) { |
PolicyMap expected; |
expected.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
base::Value::CreateIntegerValue(13)); |
- EXPECT_CALL(observer_, OnPolicyUpdated(_, _, _, _)).Times(AnyNumber()); |
- |
expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, |
base::Value::CreateIntegerValue(0)); |
provider0_.AddMandatoryPolicy("aaa", base::Value::CreateIntegerValue(0)); |
@@ -173,4 +186,62 @@ TEST_F(PolicyServiceTest, Priorities) { |
EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); |
} |
+TEST_F(PolicyServiceTest, PolicyChangeRegistrar) { |
+ MockPolicyValueObserver observer; |
+ scoped_ptr<PolicyChangeRegistrar> registrar( |
+ new PolicyChangeRegistrar( |
+ policy_service_.get(), POLICY_DOMAIN_CHROME, "", &observer)); |
+ |
+ // Not observing any policy yet. |
+ EXPECT_CALL(observer, OnPolicyValueUpdated(_, _, _, _, _)).Times(0); |
+ const base::FundamentalValue kValue0(0); |
+ provider0_.AddMandatoryPolicy("aaa", kValue0.DeepCopy()); |
+ provider0_.RefreshPolicies(); |
+ Mock::VerifyAndClearExpectations(&observer); |
+ |
+ // Starting to observe existing policies doesn't trigger notification. |
+ EXPECT_CALL(observer, OnPolicyValueUpdated(_, _, _, _, _)).Times(0); |
+ registrar->Add("aaa"); |
+ Mock::VerifyAndClearExpectations(&observer); |
+ |
+ // Changing it now triggers a notification. |
+ base::FundamentalValue kValue1(1); |
+ EXPECT_CALL(observer, OnPolicyValueUpdated(POLICY_DOMAIN_CHROME, "", "aaa", |
+ ValueEquals(&kValue0), |
+ ValueEquals(&kValue1))); |
+ provider0_.AddMandatoryPolicy("aaa", kValue1.DeepCopy()); |
+ provider0_.RefreshPolicies(); |
+ Mock::VerifyAndClearExpectations(&observer); |
+ |
+ // Changing other values doesn't trigger a notification. |
+ EXPECT_CALL(observer, OnPolicyValueUpdated(_, _, _, _, _)).Times(0); |
+ provider0_.AddMandatoryPolicy("bbb", kValue0.DeepCopy()); |
+ provider0_.RefreshPolicies(); |
+ Mock::VerifyAndClearExpectations(&observer); |
+ |
+ // Modifying the value triggers a notification. |
+ base::FundamentalValue kValue2(2); |
+ EXPECT_CALL(observer, OnPolicyValueUpdated(POLICY_DOMAIN_CHROME, "", "aaa", |
+ ValueEquals(&kValue1), |
+ ValueEquals(&kValue2))); |
+ provider0_.AddMandatoryPolicy("aaa", kValue2.DeepCopy()); |
+ provider0_.RefreshPolicies(); |
+ Mock::VerifyAndClearExpectations(&observer); |
+ |
+ // Removing the value triggers a notification. |
+ EXPECT_CALL(observer, OnPolicyValueUpdated(POLICY_DOMAIN_CHROME, "", "aaa", |
+ ValueEquals(&kValue2), |
+ NULL)); |
+ provider0_.RemovePolicy("aaa"); |
+ provider0_.RefreshPolicies(); |
+ Mock::VerifyAndClearExpectations(&observer); |
+ |
+ // No more notifications after destroying the registrar. |
+ EXPECT_CALL(observer, OnPolicyValueUpdated(_, _, _, _, _)).Times(0); |
+ registrar.reset(); |
+ provider0_.AddMandatoryPolicy("aaa", kValue1.DeepCopy()); |
+ provider0_.RefreshPolicies(); |
+ Mock::VerifyAndClearExpectations(&observer); |
+} |
+ |
} // namespace policy |