blob: fd0a49c1aa8b6b0a81cd5cd956b254786c2e937a [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_provider_test.h"
#include "base/bind.h"
#include "base/values.h"
#include "chrome/browser/policy/asynchronous_policy_loader.h"
#include "chrome/browser/policy/asynchronous_policy_provider.h"
#include "chrome/browser/policy/configuration_policy_provider.h"
#include "chrome/browser/policy/mock_configuration_policy_provider.h"
#include "chrome/browser/policy/policy_map.h"
#include "policy/policy_constants.h"
#include "testing/gmock/include/gmock/gmock.h"
using ::testing::Mock;
using ::testing::_;
namespace policy {
namespace test_policy_definitions {
const char kKeyString[] = "StringPolicy";
const char kKeyBoolean[] = "BooleanPolicy";
const char kKeyInteger[] = "IntegerPolicy";
const char kKeyStringList[] = "StringListPolicy";
static const PolicyDefinitionList::Entry kEntries[] = {
{ kKeyString, base::Value::TYPE_STRING },
{ kKeyBoolean, base::Value::TYPE_BOOLEAN },
{ kKeyInteger, base::Value::TYPE_INTEGER },
{ kKeyStringList, base::Value::TYPE_LIST },
};
const PolicyDefinitionList kList = {
kEntries, kEntries + arraysize(kEntries)
};
} // namespace test_policy_definitions
PolicyProviderTestHarness::PolicyProviderTestHarness() {}
PolicyProviderTestHarness::~PolicyProviderTestHarness() {}
ConfigurationPolicyProviderTest::ConfigurationPolicyProviderTest() {}
ConfigurationPolicyProviderTest::~ConfigurationPolicyProviderTest() {}
void ConfigurationPolicyProviderTest::SetUp() {
AsynchronousPolicyTestBase::SetUp();
test_harness_.reset((*GetParam())());
test_harness_->SetUp();
provider_.reset(
test_harness_->CreateProvider(&test_policy_definitions::kList));
// Some providers do a reload on init. Make sure any notifications generated
// are fired now.
loop_.RunAllPending();
PolicyMap policy_map;
EXPECT_TRUE(provider_->Provide(&policy_map));
EXPECT_TRUE(policy_map.empty());
}
void ConfigurationPolicyProviderTest::TearDown() {
// Give providers the chance to clean up after themselves on the file thread.
provider_.reset();
AsynchronousPolicyTestBase::TearDown();
}
void ConfigurationPolicyProviderTest::CheckValue(
const char* policy_name,
const base::Value& expected_value,
base::Closure install_value) {
// Install the value, reload policy and check the provider for the value.
install_value.Run();
provider_->RefreshPolicies();
loop_.RunAllPending();
PolicyMap policy_map;
EXPECT_TRUE(provider_->Provide(&policy_map));
EXPECT_EQ(1U, policy_map.size());
EXPECT_TRUE(base::Value::Equals(&expected_value,
policy_map.GetValue(policy_name)));
}
TEST_P(ConfigurationPolicyProviderTest, Empty) {
provider_->RefreshPolicies();
loop_.RunAllPending();
PolicyMap policy_map;
EXPECT_TRUE(provider_->Provide(&policy_map));
EXPECT_TRUE(policy_map.empty());
}
TEST_P(ConfigurationPolicyProviderTest, StringValue) {
const char kTestString[] = "string_value";
StringValue expected_value(kTestString);
CheckValue(test_policy_definitions::kKeyString,
expected_value,
base::Bind(&PolicyProviderTestHarness::InstallStringPolicy,
base::Unretained(test_harness_.get()),
test_policy_definitions::kKeyString,
kTestString));
}
TEST_P(ConfigurationPolicyProviderTest, BooleanValue) {
base::FundamentalValue expected_value(true);
CheckValue(test_policy_definitions::kKeyBoolean,
expected_value,
base::Bind(&PolicyProviderTestHarness::InstallBooleanPolicy,
base::Unretained(test_harness_.get()),
test_policy_definitions::kKeyBoolean,
true));
}
TEST_P(ConfigurationPolicyProviderTest, IntegerValue) {
base::FundamentalValue expected_value(42);
CheckValue(test_policy_definitions::kKeyInteger,
expected_value,
base::Bind(&PolicyProviderTestHarness::InstallIntegerPolicy,
base::Unretained(test_harness_.get()),
test_policy_definitions::kKeyInteger,
42));
}
TEST_P(ConfigurationPolicyProviderTest, StringListValue) {
base::ListValue expected_value;
expected_value.Set(0U, base::Value::CreateStringValue("first"));
expected_value.Set(1U, base::Value::CreateStringValue("second"));
CheckValue(test_policy_definitions::kKeyStringList,
expected_value,
base::Bind(&PolicyProviderTestHarness::InstallStringListPolicy,
base::Unretained(test_harness_.get()),
test_policy_definitions::kKeyStringList,
&expected_value));
}
TEST_P(ConfigurationPolicyProviderTest, RefreshPolicies) {
PolicyMap policy_map;
EXPECT_TRUE(provider_->Provide(&policy_map));
EXPECT_EQ(0U, policy_map.size());
// OnUpdatePolicy is called even when there are no changes.
MockConfigurationPolicyObserver observer;
ConfigurationPolicyObserverRegistrar registrar;
registrar.Init(provider_.get(), &observer);
EXPECT_CALL(observer, OnUpdatePolicy(provider_.get())).Times(1);
provider_->RefreshPolicies();
loop_.RunAllPending();
Mock::VerifyAndClearExpectations(&observer);
EXPECT_TRUE(provider_->Provide(&policy_map));
EXPECT_EQ(0U, policy_map.size());
// OnUpdatePolicy is called when there are changes.
test_harness_->InstallStringPolicy(test_policy_definitions::kKeyString,
"value");
EXPECT_CALL(observer, OnUpdatePolicy(provider_.get())).Times(1);
provider_->RefreshPolicies();
loop_.RunAllPending();
Mock::VerifyAndClearExpectations(&observer);
policy_map.Clear();
EXPECT_TRUE(provider_->Provide(&policy_map));
EXPECT_EQ(1U, policy_map.size());
}
TEST(ConfigurationPolicyProviderTest, FixDeprecatedPolicies) {
PolicyMap policy_map;
policy_map.Set(key::kProxyServerMode,
POLICY_LEVEL_MANDATORY,
POLICY_SCOPE_USER,
Value::CreateIntegerValue(3));
// Both these policies should be ignored, since there's a higher priority
// policy available.
policy_map.Set(key::kProxyMode,
POLICY_LEVEL_RECOMMENDED,
POLICY_SCOPE_USER,
Value::CreateStringValue("pac_script"));
policy_map.Set(key::kProxyPacUrl,
POLICY_LEVEL_RECOMMENDED,
POLICY_SCOPE_USER,
Value::CreateStringValue("http://proxy.example.com/wpad.dat"));
ConfigurationPolicyProvider::FixDeprecatedPolicies(&policy_map);
DictionaryValue expected;
expected.SetInteger(key::kProxyServerMode, 3);
EXPECT_EQ(1U, policy_map.size());
EXPECT_TRUE(Value::Equals(&expected,
policy_map.GetValue(key::kProxySettings)));
}
} // namespace policy