blob: ad99a7b22b47d710deaf9d0b504d639b76fec4b4 [file] [log] [blame]
// 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<PolicyServiceImpl> 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