// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/policy/policy_service_impl.h" #include "base/memory/scoped_ptr.h" #include "base/values.h" #include "chrome/browser/policy/mock_configuration_policy_provider.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" using ::testing::AnyNumber; using ::testing::Mock; using ::testing::_; namespace policy { namespace { class MockPolicyServiceObserver : public PolicyService::Observer { public: virtual ~MockPolicyServiceObserver() {} MOCK_METHOD2(OnPolicyUpdated, void(PolicyDomain, const std::string&)); }; class PolicyServiceTest : public testing::Test { public: PolicyServiceTest() {} void SetUp() OVERRIDE { provider0_.AddMandatoryPolicy("pre", base::Value::CreateIntegerValue(13)); provider0_.SetInitializationComplete(true); provider1_.SetInitializationComplete(true); provider2_.SetInitializationComplete(true); PolicyServiceImpl::Providers providers; providers.push_back(&provider0_); 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|. 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); } protected: MockConfigurationPolicyProvider provider0_; MockConfigurationPolicyProvider provider1_; MockConfigurationPolicyProvider provider2_; scoped_ptr policy_service_; MockPolicyServiceObserver observer_; private: DISALLOW_COPY_AND_ASSIGN(PolicyServiceTest); }; TEST_F(PolicyServiceTest, LoadsPoliciesBeforeProvidersRefresh) { PolicyMap expected; expected.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, base::Value::CreateIntegerValue(13)); EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); } TEST_F(PolicyServiceTest, NotifyObservers) { PolicyMap expected; expected.Set("pre", POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER, base::Value::CreateIntegerValue(13)); expected.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, "")).Times(1); provider0_.RefreshPolicies(); Mock::VerifyAndClearExpectations(&observer_); EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); // No changes. EXPECT_CALL(observer_, OnPolicyUpdated(_, _)).Times(0); provider0_.RefreshPolicies(); Mock::VerifyAndClearExpectations(&observer_); EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); // New policy. expected.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, "")).Times(1); provider0_.RefreshPolicies(); Mock::VerifyAndClearExpectations(&observer_); EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); // Removed policy. expected.Erase("bbb"); provider0_.RemovePolicy("bbb"); EXPECT_CALL(observer_, OnPolicyUpdated(POLICY_DOMAIN_CHROME, "")).Times(1); provider0_.RefreshPolicies(); Mock::VerifyAndClearExpectations(&observer_); EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); // Changed policy. expected.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, "")).Times(1); provider0_.RefreshPolicies(); Mock::VerifyAndClearExpectations(&observer_); EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); // No changes again. EXPECT_CALL(observer_, OnPolicyUpdated(_, _)).Times(0); provider0_.RefreshPolicies(); Mock::VerifyAndClearExpectations(&observer_); EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); } 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)); provider1_.AddMandatoryPolicy("aaa", base::Value::CreateIntegerValue(1)); provider2_.AddMandatoryPolicy("aaa", base::Value::CreateIntegerValue(2)); provider0_.RefreshPolicies(); provider1_.RefreshPolicies(); provider2_.RefreshPolicies(); 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(); 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(); EXPECT_TRUE(VerifyPolicies(POLICY_DOMAIN_CHROME, "", expected)); } } // namespace } // namespace policy