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 9fa0de5991ac795e5f00de52f2feaaa5ca169dd0..43caec0fd8cd24a06010756564070f39d7e03e5e 100644 |
| --- a/chrome/browser/policy/policy_service_unittest.cc |
| +++ b/chrome/browser/policy/policy_service_unittest.cc |
| @@ -4,6 +4,8 @@ |
| #include "chrome/browser/policy/policy_service_impl.h" |
| +#include "base/bind.h" |
| +#include "base/bind_helpers.h" |
| #include "base/memory/scoped_ptr.h" |
| #include "base/values.h" |
| #include "chrome/browser/policy/mock_configuration_policy_provider.h" |
| @@ -27,12 +29,25 @@ class MockPolicyServiceObserver : public PolicyService::Observer { |
| const PolicyMap& current)); |
| }; |
| +class MockPolicyValueObserver { |
| + public: |
| + ~MockPolicyValueObserver() {} |
| + MOCK_METHOD2(OnPolicyValueUpdated, void(const base::Value*, |
|
Mattias Nissler (ping if slow)
2012/04/23 17:14:18
You could put that mock method on the Test class f
Joao da Silva
2012/04/23 17:29:26
Done.
|
| + const base::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 +64,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 +80,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 +93,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 +105,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 +122,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 +185,56 @@ 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, "")); |
| + |
| + // Starting to observe existing policies doesn't trigger a notification. |
| + EXPECT_CALL(observer, OnPolicyValueUpdated(_, _)).Times(0); |
| + registrar->Observe("pre", base::Bind( |
| + &MockPolicyValueObserver::OnPolicyValueUpdated, |
| + base::Unretained(&observer))); |
| + registrar->Observe("aaa", base::Bind( |
| + &MockPolicyValueObserver::OnPolicyValueUpdated, |
| + base::Unretained(&observer))); |
| + Mock::VerifyAndClearExpectations(&observer); |
| + |
| + // Changing it now triggers a notification. |
| + base::FundamentalValue kValue0(0); |
| + EXPECT_CALL(observer, OnPolicyValueUpdated(NULL, ValueEquals(&kValue0))); |
| + provider0_.AddMandatoryPolicy("aaa", kValue0.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 kValue1(1); |
| + EXPECT_CALL(observer, OnPolicyValueUpdated(ValueEquals(&kValue0), |
| + ValueEquals(&kValue1))); |
| + provider0_.AddMandatoryPolicy("aaa", kValue1.DeepCopy()); |
| + provider0_.RefreshPolicies(); |
| + Mock::VerifyAndClearExpectations(&observer); |
| + |
| + // Removing the value triggers a notification. |
| + EXPECT_CALL(observer, OnPolicyValueUpdated(ValueEquals(&kValue1), 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_.AddMandatoryPolicy("pre", kValue1.DeepCopy()); |
| + provider0_.RefreshPolicies(); |
| + Mock::VerifyAndClearExpectations(&observer); |
| +} |
| + |
| } // namespace policy |