blob: 2e707c5bef3f90ecdf23ef506365a272f3d0dbc1 [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/configuration_policy_pref_store_unittest.h"
#include <string>
#include "base/callback.h"
#include "base/files/file_path.h"
#include "base/prefs/pref_store_observer_mock.h"
#include "base/run_loop.h"
#include "chrome/browser/policy/configuration_policy_handler.h"
#include "chrome/browser/policy/configuration_policy_pref_store.h"
#include "chrome/browser/policy/external_data_fetcher.h"
#include "chrome/browser/policy/policy_map.h"
#include "chrome/browser/policy/policy_service_impl.h"
#include "chrome/common/pref_names.h"
#include "components/policy/core/common/policy_pref_names.h"
#include "testing/gmock/include/gmock/gmock.h"
using testing::Mock;
using testing::Return;
using testing::_;
namespace {
const char kTestPolicy[] = "test.policy";
const char kTestPref[] = "test.pref";
} // namespace
namespace policy {
// Holds a set of test parameters, consisting of pref name and policy name.
class PolicyAndPref {
public:
PolicyAndPref(const char* policy_name, const char* pref_name)
: policy_name_(policy_name),
pref_name_(pref_name) {}
const char* policy_name() const { return policy_name_; }
const char* pref_name() const { return pref_name_; }
private:
const char* policy_name_;
const char* pref_name_;
};
ConfigurationPolicyPrefStoreTest::ConfigurationPolicyPrefStoreTest() {
EXPECT_CALL(provider_, IsInitializationComplete(_))
.WillRepeatedly(Return(false));
provider_.Init();
PolicyServiceImpl::Providers providers;
providers.push_back(&provider_);
policy_service_.reset(new PolicyServiceImpl(providers));
store_ = new ConfigurationPolicyPrefStore(
policy_service_.get(), &handler_list_, POLICY_LEVEL_MANDATORY);
}
ConfigurationPolicyPrefStoreTest::~ConfigurationPolicyPrefStoreTest() {}
void ConfigurationPolicyPrefStoreTest::TearDown() {
provider_.Shutdown();
}
void ConfigurationPolicyPrefStoreTest::UpdateProviderPolicy(
const PolicyMap& policy) {
provider_.UpdateChromePolicy(policy);
base::RunLoop loop;
loop.RunUntilIdle();
}
// Test cases for list-valued policy settings.
class ConfigurationPolicyPrefStoreListTest
: public ConfigurationPolicyPrefStoreTest {
virtual void SetUp() OVERRIDE {
handler_list_.AddHandler(
make_scoped_ptr<ConfigurationPolicyHandler>(new SimplePolicyHandler(
kTestPolicy, kTestPref, base::Value::TYPE_LIST)));
}
};
TEST_F(ConfigurationPolicyPrefStoreListTest, GetDefault) {
EXPECT_FALSE(store_->GetValue(kTestPref, NULL));
}
TEST_F(ConfigurationPolicyPrefStoreListTest, SetValue) {
base::ListValue* in_value = new base::ListValue();
in_value->Append(base::Value::CreateStringValue("test1"));
in_value->Append(base::Value::CreateStringValue("test2,"));
PolicyMap policy;
policy.Set(kTestPolicy, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, in_value, NULL);
UpdateProviderPolicy(policy);
const base::Value* value = NULL;
EXPECT_TRUE(store_->GetValue(kTestPref, &value));
ASSERT_TRUE(value);
EXPECT_TRUE(in_value->Equals(value));
}
// Test cases for string-valued policy settings.
class ConfigurationPolicyPrefStoreStringTest
: public ConfigurationPolicyPrefStoreTest {
virtual void SetUp() OVERRIDE {
handler_list_.AddHandler(
make_scoped_ptr<ConfigurationPolicyHandler>(new SimplePolicyHandler(
kTestPolicy, kTestPref, base::Value::TYPE_STRING)));
}
};
TEST_F(ConfigurationPolicyPrefStoreStringTest, GetDefault) {
EXPECT_FALSE(store_->GetValue(kTestPref, NULL));
}
TEST_F(ConfigurationPolicyPrefStoreStringTest, SetValue) {
PolicyMap policy;
policy.Set(kTestPolicy, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER,
base::Value::CreateStringValue("http://chromium.org"), NULL);
UpdateProviderPolicy(policy);
const base::Value* value = NULL;
EXPECT_TRUE(store_->GetValue(kTestPref, &value));
ASSERT_TRUE(value);
EXPECT_TRUE(base::StringValue("http://chromium.org").Equals(value));
}
// Test cases for boolean-valued policy settings.
class ConfigurationPolicyPrefStoreBooleanTest
: public ConfigurationPolicyPrefStoreTest {
virtual void SetUp() OVERRIDE {
handler_list_.AddHandler(
make_scoped_ptr<ConfigurationPolicyHandler>(new SimplePolicyHandler(
kTestPolicy, kTestPref, base::Value::TYPE_BOOLEAN)));
}
};
TEST_F(ConfigurationPolicyPrefStoreBooleanTest, GetDefault) {
EXPECT_FALSE(store_->GetValue(kTestPref, NULL));
}
TEST_F(ConfigurationPolicyPrefStoreBooleanTest, SetValue) {
PolicyMap policy;
policy.Set(kTestPolicy, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, base::Value::CreateBooleanValue(false), NULL);
UpdateProviderPolicy(policy);
const base::Value* value = NULL;
EXPECT_TRUE(store_->GetValue(kTestPref, &value));
ASSERT_TRUE(value);
bool boolean_value = true;
bool result = value->GetAsBoolean(&boolean_value);
ASSERT_TRUE(result);
EXPECT_FALSE(boolean_value);
policy.Set(kTestPolicy, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, base::Value::CreateBooleanValue(true), NULL);
UpdateProviderPolicy(policy);
value = NULL;
EXPECT_TRUE(store_->GetValue(kTestPref, &value));
boolean_value = false;
result = value->GetAsBoolean(&boolean_value);
ASSERT_TRUE(result);
EXPECT_TRUE(boolean_value);
}
// Test cases for integer-valued policy settings.
class ConfigurationPolicyPrefStoreIntegerTest
: public ConfigurationPolicyPrefStoreTest {
virtual void SetUp() OVERRIDE {
handler_list_.AddHandler(
make_scoped_ptr<ConfigurationPolicyHandler>(new SimplePolicyHandler(
kTestPolicy, kTestPref, base::Value::TYPE_INTEGER)));
}
};
TEST_F(ConfigurationPolicyPrefStoreIntegerTest, GetDefault) {
EXPECT_FALSE(store_->GetValue(kTestPref, NULL));
}
TEST_F(ConfigurationPolicyPrefStoreIntegerTest, SetValue) {
PolicyMap policy;
policy.Set(kTestPolicy, POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER, base::Value::CreateIntegerValue(2), NULL);
UpdateProviderPolicy(policy);
const base::Value* value = NULL;
EXPECT_TRUE(store_->GetValue(kTestPref, &value));
EXPECT_TRUE(base::FundamentalValue(2).Equals(value));
}
// Exercises the policy refresh mechanism.
class ConfigurationPolicyPrefStoreRefreshTest
: public ConfigurationPolicyPrefStoreTest {
protected:
virtual void SetUp() OVERRIDE {
ConfigurationPolicyPrefStoreTest::SetUp();
store_->AddObserver(&observer_);
handler_list_.AddHandler(
make_scoped_ptr<ConfigurationPolicyHandler>(new SimplePolicyHandler(
kTestPolicy, kTestPref, base::Value::TYPE_STRING)));
}
virtual void TearDown() OVERRIDE {
store_->RemoveObserver(&observer_);
ConfigurationPolicyPrefStoreTest::TearDown();
}
PrefStoreObserverMock observer_;
};
TEST_F(ConfigurationPolicyPrefStoreRefreshTest, Refresh) {
const base::Value* value = NULL;
EXPECT_FALSE(store_->GetValue(kTestPolicy, NULL));
EXPECT_CALL(observer_, OnPrefValueChanged(kTestPref)).Times(1);
PolicyMap policy;
policy.Set(kTestPolicy,
POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER,
base::Value::CreateStringValue("http://www.chromium.org"),
NULL);
UpdateProviderPolicy(policy);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_TRUE(store_->GetValue(kTestPref, &value));
EXPECT_TRUE(base::StringValue("http://www.chromium.org").Equals(value));
EXPECT_CALL(observer_, OnPrefValueChanged(_)).Times(0);
UpdateProviderPolicy(policy);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_CALL(observer_, OnPrefValueChanged(kTestPref)).Times(1);
policy.Erase(kTestPolicy);
UpdateProviderPolicy(policy);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_FALSE(store_->GetValue(kTestPref, NULL));
}
TEST_F(ConfigurationPolicyPrefStoreRefreshTest, Initialization) {
EXPECT_FALSE(store_->IsInitializationComplete());
EXPECT_CALL(provider_, IsInitializationComplete(POLICY_DOMAIN_CHROME))
.WillRepeatedly(Return(true));
EXPECT_CALL(observer_, OnInitializationCompleted(true)).Times(1);
PolicyMap policy;
UpdateProviderPolicy(policy);
Mock::VerifyAndClearExpectations(&observer_);
EXPECT_TRUE(store_->IsInitializationComplete());
}
} // namespace policy