| 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 1c9baf16b97cfee76b0c708a517409a1c00d2ea7..27cf3b3435c4ee37b1636665988e29761eb98759 100644
|
| --- a/chrome/browser/policy/policy_service_unittest.cc
|
| +++ b/chrome/browser/policy/policy_service_unittest.cc
|
| @@ -7,13 +7,17 @@
|
| #include "base/bind.h"
|
| #include "base/bind_helpers.h"
|
| #include "base/memory/scoped_ptr.h"
|
| +#include "base/message_loop.h"
|
| #include "base/values.h"
|
| #include "chrome/browser/policy/mock_configuration_policy_provider.h"
|
| +#include "content/public/browser/browser_thread.h"
|
| +#include "content/test/test_browser_thread.h"
|
| #include "testing/gmock/include/gmock/gmock.h"
|
| #include "testing/gtest/include/gtest/gtest.h"
|
|
|
| using ::testing::AnyNumber;
|
| using ::testing::Mock;
|
| +using ::testing::Return;
|
| using ::testing::_;
|
|
|
| namespace policy {
|
| @@ -48,10 +52,23 @@ class PolicyServiceTest : public testing::Test {
|
| PolicyServiceTest() {}
|
|
|
| void SetUp() OVERRIDE {
|
| - provider0_.AddMandatoryPolicy("pre", base::Value::CreateIntegerValue(13));
|
| - provider0_.SetInitializationComplete(true);
|
| - provider1_.SetInitializationComplete(true);
|
| - provider2_.SetInitializationComplete(true);
|
| + 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())
|
| + .WillRepeatedly(Return(true));
|
| + EXPECT_CALL(provider2_, IsInitializationComplete())
|
| + .WillRepeatedly(Return(true));
|
| +
|
| + policy0_.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + base::Value::CreateIntegerValue(13));
|
| +
|
| PolicyServiceImpl::Providers providers;
|
| providers.push_back(&provider0_);
|
| providers.push_back(&provider1_);
|
| @@ -62,6 +79,8 @@ class PolicyServiceTest : public testing::Test {
|
| MOCK_METHOD2(OnPolicyValueUpdated, void(const base::Value*,
|
| const base::Value*));
|
|
|
| + MOCK_METHOD0(OnPolicyRefresh, void());
|
| +
|
| // Returns true if the policies for |domain|, |component_id| match |expected|.
|
| bool VerifyPolicies(PolicyDomain domain,
|
| const std::string& component_id,
|
| @@ -75,6 +94,9 @@ class PolicyServiceTest : public testing::Test {
|
| MockConfigurationPolicyProvider provider0_;
|
| MockConfigurationPolicyProvider provider1_;
|
| MockConfigurationPolicyProvider provider2_;
|
| + PolicyMap policy0_;
|
| + PolicyMap policy1_;
|
| + PolicyMap policy2_;
|
| scoped_ptr<PolicyServiceImpl> policy_service_;
|
|
|
| private:
|
| @@ -100,16 +122,17 @@ TEST_F(PolicyServiceTest, NotifyObservers) {
|
| expectedCurrent.CopyFrom(expectedPrevious);
|
| expectedCurrent.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| base::Value::CreateIntegerValue(123));
|
| - provider0_.AddMandatoryPolicy("aaa", base::Value::CreateIntegerValue(123));
|
| + policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + base::Value::CreateIntegerValue(123));
|
| EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "",
|
| PolicyEquals(&expectedPrevious),
|
| PolicyEquals(&expectedCurrent)));
|
| - provider0_.RefreshPolicies();
|
| + provider0_.NotifyPolicyUpdated();
|
| Mock::VerifyAndClearExpectations(&observer);
|
|
|
| // No changes.
|
| EXPECT_CALL(observer, OnPolicyUpdated(_, _, _, _)).Times(0);
|
| - provider0_.RefreshPolicies();
|
| + provider0_.NotifyPolicyUpdated();
|
| Mock::VerifyAndClearExpectations(&observer);
|
| EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expectedCurrent));
|
|
|
| @@ -117,37 +140,40 @@ TEST_F(PolicyServiceTest, NotifyObservers) {
|
| expectedPrevious.CopyFrom(expectedCurrent);
|
| expectedCurrent.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| base::Value::CreateIntegerValue(456));
|
| - provider0_.AddMandatoryPolicy("bbb", base::Value::CreateIntegerValue(456));
|
| + policy0_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + base::Value::CreateIntegerValue(456));
|
| EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "",
|
| PolicyEquals(&expectedPrevious),
|
| PolicyEquals(&expectedCurrent)));
|
| - provider0_.RefreshPolicies();
|
| + provider0_.NotifyPolicyUpdated();
|
| Mock::VerifyAndClearExpectations(&observer);
|
|
|
| // Removed policy.
|
| expectedPrevious.CopyFrom(expectedCurrent);
|
| expectedCurrent.Erase("bbb");
|
| - provider0_.RemovePolicy("bbb");
|
| + policy0_.Erase("bbb");
|
| EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "",
|
| PolicyEquals(&expectedPrevious),
|
| PolicyEquals(&expectedCurrent)));
|
| - provider0_.RefreshPolicies();
|
| + provider0_.NotifyPolicyUpdated();
|
| 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));
|
| + policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + base::Value::CreateIntegerValue(789));
|
| +
|
| EXPECT_CALL(observer, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "",
|
| PolicyEquals(&expectedPrevious),
|
| PolicyEquals(&expectedCurrent)));
|
| - provider0_.RefreshPolicies();
|
| + provider0_.NotifyPolicyUpdated();
|
| Mock::VerifyAndClearExpectations(&observer);
|
|
|
| // No changes again.
|
| EXPECT_CALL(observer, OnPolicyUpdated(_, _, _, _)).Times(0);
|
| - provider0_.RefreshPolicies();
|
| + provider0_.NotifyPolicyUpdated();
|
| Mock::VerifyAndClearExpectations(&observer);
|
| EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expectedCurrent));
|
|
|
| @@ -160,24 +186,28 @@ TEST_F(PolicyServiceTest, Priorities) {
|
| base::Value::CreateIntegerValue(13));
|
| expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| base::Value::CreateIntegerValue(0));
|
| - provider0_.AddMandatoryPolicy("aaa", base::Value::CreateIntegerValue(0));
|
| - provider1_.AddMandatoryPolicy("aaa", base::Value::CreateIntegerValue(1));
|
| - provider2_.AddMandatoryPolicy("aaa", base::Value::CreateIntegerValue(2));
|
| - provider0_.RefreshPolicies();
|
| - provider1_.RefreshPolicies();
|
| - provider2_.RefreshPolicies();
|
| + policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + base::Value::CreateIntegerValue(0));
|
| + policy1_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + base::Value::CreateIntegerValue(1));
|
| + policy2_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + base::Value::CreateIntegerValue(2));
|
| + provider0_.NotifyPolicyUpdated();
|
| + provider1_.NotifyPolicyUpdated();
|
| + provider2_.NotifyPolicyUpdated();
|
| EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected));
|
|
|
| expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| base::Value::CreateIntegerValue(1));
|
| - provider0_.RemovePolicy("aaa");
|
| - provider0_.RefreshPolicies();
|
| + policy0_.Erase("aaa");
|
| + provider0_.NotifyPolicyUpdated();
|
| EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected));
|
|
|
| expected.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| base::Value::CreateIntegerValue(2));
|
| - provider1_.AddRecommendedPolicy("aaa", base::Value::CreateIntegerValue(1));
|
| - provider1_.RefreshPolicies();
|
| + policy1_.Set("aaa", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
|
| + base::Value::CreateIntegerValue(1));
|
| + provider1_.NotifyPolicyUpdated();
|
| EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected));
|
| }
|
|
|
| @@ -199,37 +229,118 @@ TEST_F(PolicyServiceTest, PolicyChangeRegistrar) {
|
| // Changing it now triggers a notification.
|
| base::FundamentalValue kValue0(0);
|
| EXPECT_CALL(*this, OnPolicyValueUpdated(NULL, ValueEquals(&kValue0)));
|
| - provider0_.AddMandatoryPolicy("aaa", kValue0.DeepCopy());
|
| - provider0_.RefreshPolicies();
|
| + policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + kValue0.DeepCopy());
|
| + provider0_.NotifyPolicyUpdated();
|
| Mock::VerifyAndClearExpectations(this);
|
|
|
| // Changing other values doesn't trigger a notification.
|
| EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0);
|
| - provider0_.AddMandatoryPolicy("bbb", kValue0.DeepCopy());
|
| - provider0_.RefreshPolicies();
|
| + policy0_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + kValue0.DeepCopy());
|
| + provider0_.NotifyPolicyUpdated();
|
| Mock::VerifyAndClearExpectations(this);
|
|
|
| // Modifying the value triggers a notification.
|
| base::FundamentalValue kValue1(1);
|
| EXPECT_CALL(*this, OnPolicyValueUpdated(ValueEquals(&kValue0),
|
| ValueEquals(&kValue1)));
|
| - provider0_.AddMandatoryPolicy("aaa", kValue1.DeepCopy());
|
| - provider0_.RefreshPolicies();
|
| + policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + kValue1.DeepCopy());
|
| + provider0_.NotifyPolicyUpdated();
|
| Mock::VerifyAndClearExpectations(this);
|
|
|
| // Removing the value triggers a notification.
|
| EXPECT_CALL(*this, OnPolicyValueUpdated(ValueEquals(&kValue1), NULL));
|
| - provider0_.RemovePolicy("aaa");
|
| - provider0_.RefreshPolicies();
|
| + policy0_.Erase("aaa");
|
| + provider0_.NotifyPolicyUpdated();
|
| Mock::VerifyAndClearExpectations(this);
|
|
|
| // No more notifications after destroying the registrar.
|
| EXPECT_CALL(*this, OnPolicyValueUpdated(_, _)).Times(0);
|
| registrar.reset();
|
| - provider0_.AddMandatoryPolicy("aaa", kValue1.DeepCopy());
|
| - provider0_.AddMandatoryPolicy("pre", kValue1.DeepCopy());
|
| - provider0_.RefreshPolicies();
|
| + policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + kValue1.DeepCopy());
|
| + policy0_.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + kValue1.DeepCopy());
|
| + provider0_.NotifyPolicyUpdated();
|
| Mock::VerifyAndClearExpectations(this);
|
| }
|
|
|
| +TEST_F(PolicyServiceTest, RefreshPolicies) {
|
| + MessageLoop loop;
|
| + content::TestBrowserThread ui_thread(content::BrowserThread::UI, &loop);
|
| + content::TestBrowserThread file_thread(content::BrowserThread::FILE, &loop);
|
| + content::TestBrowserThread io_thread(content::BrowserThread::IO, &loop);
|
| +
|
| + EXPECT_CALL(provider0_, RefreshPolicies()).Times(AnyNumber());
|
| + EXPECT_CALL(provider1_, RefreshPolicies()).Times(AnyNumber());
|
| + EXPECT_CALL(provider2_, RefreshPolicies()).Times(AnyNumber());
|
| +
|
| + EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
|
| + policy_service_->RefreshPolicies(base::Bind(
|
| + &PolicyServiceTest::OnPolicyRefresh,
|
| + base::Unretained(this)));
|
| + loop.RunAllPending();
|
| + Mock::VerifyAndClearExpectations(this);
|
| +
|
| + EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
|
| + base::FundamentalValue kValue0(0);
|
| + policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + kValue0.DeepCopy());
|
| + provider0_.NotifyPolicyUpdated();
|
| + loop.RunAllPending();
|
| + Mock::VerifyAndClearExpectations(this);
|
| +
|
| + EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
|
| + base::FundamentalValue kValue1(1);
|
| + policy1_.Set("aaa", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
|
| + kValue1.DeepCopy());
|
| + provider1_.NotifyPolicyUpdated();
|
| + loop.RunAllPending();
|
| + Mock::VerifyAndClearExpectations(this);
|
| +
|
| + // A provider can refresh more than once after a RefreshPolicies call, but
|
| + // OnPolicyRefresh should be triggered only after all providers are
|
| + // refreshed.
|
| + EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
|
| + policy1_.Set("bbb", POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
|
| + kValue1.DeepCopy());
|
| + provider1_.NotifyPolicyUpdated();
|
| + loop.RunAllPending();
|
| + Mock::VerifyAndClearExpectations(this);
|
| +
|
| + // If another RefreshPolicies() call happens while waiting for a previous
|
| + // one to complete, then all providers must refresh again.
|
| + EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
|
| + policy_service_->RefreshPolicies(base::Bind(
|
| + &PolicyServiceTest::OnPolicyRefresh,
|
| + base::Unretained(this)));
|
| + loop.RunAllPending();
|
| + Mock::VerifyAndClearExpectations(this);
|
| +
|
| + EXPECT_CALL(*this, OnPolicyRefresh()).Times(0);
|
| + policy2_.Set("bbb", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + kValue0.DeepCopy());
|
| + provider2_.NotifyPolicyUpdated();
|
| + loop.RunAllPending();
|
| + Mock::VerifyAndClearExpectations(this);
|
| +
|
| + // Providers 0 and 1 must reload again.
|
| + EXPECT_CALL(*this, OnPolicyRefresh()).Times(2);
|
| + base::FundamentalValue kValue2(2);
|
| + policy0_.Set("aaa", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
|
| + kValue2.DeepCopy());
|
| + provider0_.NotifyPolicyUpdated();
|
| + provider1_.NotifyPolicyUpdated();
|
| + loop.RunAllPending();
|
| + Mock::VerifyAndClearExpectations(this);
|
| +
|
| + 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")));
|
| +}
|
| +
|
| } // namespace policy
|
|
|