blob: ba9c73f4fb586c14843730e6b95a6c08452d47a5 [file] [log] [blame]
// Copyright (c) 2014 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 "components/policy/core/browser/configuration_policy_handler.h"
#include <memory>
#include "base/bind.h"
#include "base/callback.h"
#include "base/json/json_reader.h"
#include "base/memory/ptr_util.h"
#include "base/values.h"
#include "components/policy/core/browser/policy_error_map.h"
#include "components/policy/core/common/policy_map.h"
#include "components/policy/core/common/policy_types.h"
#include "components/policy/core/common/schema.h"
#include "components/prefs/pref_value_map.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace policy {
namespace {
void GetIntegerTypeMap(
ScopedVector<StringMappingListPolicyHandler::MappingEntry>* result) {
result->push_back(new StringMappingListPolicyHandler::MappingEntry(
"one", std::unique_ptr<base::Value>(new base::FundamentalValue(1))));
result->push_back(new StringMappingListPolicyHandler::MappingEntry(
"two", std::unique_ptr<base::Value>(new base::FundamentalValue(2))));
}
const char kTestPolicy[] = "unit_test.test_policy";
const char kTestPref[] = "unit_test.test_pref";
class TestSchemaValidatingPolicyHandler : public SchemaValidatingPolicyHandler {
public:
TestSchemaValidatingPolicyHandler(const Schema& schema,
SchemaOnErrorStrategy strategy)
: SchemaValidatingPolicyHandler("PolicyForTesting", schema, strategy) {}
~TestSchemaValidatingPolicyHandler() override {}
void ApplyPolicySettings(const policy::PolicyMap&, PrefValueMap*) override {}
bool CheckAndGetValueForTest(const PolicyMap& policies,
std::unique_ptr<base::Value>* value) {
return SchemaValidatingPolicyHandler::CheckAndGetValue(
policies, NULL, value);
}
};
} // namespace
TEST(StringToIntEnumListPolicyHandlerTest, CheckPolicySettings) {
base::ListValue list;
PolicyMap policy_map;
PolicyErrorMap errors;
StringMappingListPolicyHandler handler(
kTestPolicy,
kTestPref,
base::Bind(GetIntegerTypeMap));
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_TRUE(errors.empty());
list.AppendString("one");
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_TRUE(errors.empty());
list.AppendString("invalid");
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_FALSE(errors.empty());
EXPECT_FALSE(errors.GetErrors(kTestPolicy).empty());
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::StringValue("no list")), NULL);
errors.Clear();
EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_FALSE(errors.empty());
EXPECT_FALSE(errors.GetErrors(kTestPolicy).empty());
}
TEST(StringMappingListPolicyHandlerTest, ApplyPolicySettings) {
base::ListValue list;
base::ListValue expected;
PolicyMap policy_map;
PrefValueMap prefs;
base::Value* value;
StringMappingListPolicyHandler handler(
kTestPolicy,
kTestPref,
base::Bind(GetIntegerTypeMap));
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
handler.ApplyPolicySettings(policy_map, &prefs);
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(&expected, value));
list.AppendString("two");
expected.AppendInteger(2);
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
handler.ApplyPolicySettings(policy_map, &prefs);
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(&expected, value));
list.AppendString("invalid");
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD, list.CreateDeepCopy(), nullptr);
handler.ApplyPolicySettings(policy_map, &prefs);
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(&expected, value));
}
TEST(IntRangePolicyHandler, CheckPolicySettingsClamp) {
PolicyMap policy_map;
PolicyErrorMap errors;
// This tests needs to modify an int policy. The exact policy used and its
// semantics outside the test are irrelevant.
IntRangePolicyHandler handler(kTestPolicy, kTestPref, 0, 10, true);
// Check that values lying in the accepted range are not rejected.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(0)), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_TRUE(errors.empty());
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(5)), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_TRUE(errors.empty());
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(10)), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_TRUE(errors.empty());
// Check that values lying outside the accepted range are not rejected
// (because clamping is enabled) but do yield a warning message.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(-5)), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_FALSE(errors.empty());
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(15)), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_FALSE(errors.empty());
// Check that an entirely invalid value is rejected and yields an error
// message.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::StringValue("invalid")), nullptr);
errors.Clear();
EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_FALSE(errors.empty());
}
TEST(IntRangePolicyHandler, CheckPolicySettingsDontClamp) {
PolicyMap policy_map;
PolicyErrorMap errors;
// This tests needs to modify an int policy. The exact policy used and its
// semantics outside the test are irrelevant.
IntRangePolicyHandler handler(kTestPolicy, kTestPref, 0, 10, false);
// Check that values lying in the accepted range are not rejected.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(0)), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_TRUE(errors.empty());
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(5)), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_TRUE(errors.empty());
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(10)), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_TRUE(errors.empty());
// Check that values lying outside the accepted range are rejected and yield
// an error message.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(-5)), nullptr);
errors.Clear();
EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_FALSE(errors.empty());
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(15)), nullptr);
errors.Clear();
EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_FALSE(errors.empty());
// Check that an entirely invalid value is rejected and yields an error
// message.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::StringValue("invalid")), nullptr);
errors.Clear();
EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_FALSE(errors.empty());
}
TEST(IntRangePolicyHandler, ApplyPolicySettingsClamp) {
PolicyMap policy_map;
PrefValueMap prefs;
std::unique_ptr<base::Value> expected;
const base::Value* value;
// This tests needs to modify an int policy. The exact policy used and its
// semantics outside the test are irrelevant.
IntRangePolicyHandler handler(kTestPolicy, kTestPref, 0, 10, true);
// Check that values lying in the accepted range are written to the pref.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(0)), nullptr);
prefs.Clear();
handler.ApplyPolicySettings(policy_map, &prefs);
expected.reset(new base::FundamentalValue(0));
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(expected.get(), value));
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(5)), nullptr);
prefs.Clear();
handler.ApplyPolicySettings(policy_map, &prefs);
expected.reset(new base::FundamentalValue(5));
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(expected.get(), value));
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(10)), nullptr);
prefs.Clear();
handler.ApplyPolicySettings(policy_map, &prefs);
expected.reset(new base::FundamentalValue(10));
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(expected.get(), value));
// Check that values lying outside the accepted range are clamped and written
// to the pref.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(-5)), nullptr);
prefs.Clear();
handler.ApplyPolicySettings(policy_map, &prefs);
expected.reset(new base::FundamentalValue(0));
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(expected.get(), value));
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(15)), nullptr);
prefs.Clear();
handler.ApplyPolicySettings(policy_map, &prefs);
expected.reset(new base::FundamentalValue(10));
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(expected.get(), value));
}
TEST(IntRangePolicyHandler, ApplyPolicySettingsDontClamp) {
PolicyMap policy_map;
PrefValueMap prefs;
std::unique_ptr<base::Value> expected;
const base::Value* value;
// This tests needs to modify an int policy. The exact policy used and its
// semantics outside the test are irrelevant.
IntRangePolicyHandler handler(kTestPolicy, kTestPref, 0, 10, true);
// Check that values lying in the accepted range are written to the pref.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(0)), nullptr);
prefs.Clear();
handler.ApplyPolicySettings(policy_map, &prefs);
expected.reset(new base::FundamentalValue(0));
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(expected.get(), value));
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(5)), nullptr);
prefs.Clear();
handler.ApplyPolicySettings(policy_map, &prefs);
expected.reset(new base::FundamentalValue(5));
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(expected.get(), value));
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(10)), nullptr);
prefs.Clear();
handler.ApplyPolicySettings(policy_map, &prefs);
expected.reset(new base::FundamentalValue(10));
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(expected.get(), value));
}
TEST(IntPercentageToDoublePolicyHandler, CheckPolicySettingsClamp) {
PolicyMap policy_map;
PolicyErrorMap errors;
// This tests needs to modify an int policy. The exact policy used and its
// semantics outside the test are irrelevant.
IntPercentageToDoublePolicyHandler handler(
kTestPolicy, kTestPref, 0, 10, true);
// Check that values lying in the accepted range are not rejected.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(0)), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_TRUE(errors.empty());
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(5)), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_TRUE(errors.empty());
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(10)), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_TRUE(errors.empty());
// Check that values lying outside the accepted range are not rejected
// (because clamping is enabled) but do yield a warning message.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(-5)), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_FALSE(errors.empty());
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(15)), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_FALSE(errors.empty());
// Check that an entirely invalid value is rejected and yields an error
// message.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::StringValue("invalid")), nullptr);
errors.Clear();
EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_FALSE(errors.empty());
}
TEST(IntPercentageToDoublePolicyHandler, CheckPolicySettingsDontClamp) {
PolicyMap policy_map;
PolicyErrorMap errors;
// This tests needs to modify an int policy. The exact policy used and its
// semantics outside the test are irrelevant.
IntPercentageToDoublePolicyHandler handler(
kTestPolicy, kTestPref, 0, 10, false);
// Check that values lying in the accepted range are not rejected.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(0)), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_TRUE(errors.empty());
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(5)), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_TRUE(errors.empty());
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(10)), nullptr);
errors.Clear();
EXPECT_TRUE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_TRUE(errors.empty());
// Check that values lying outside the accepted range are rejected and yield
// an error message.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(-5)), nullptr);
errors.Clear();
EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_FALSE(errors.empty());
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(15)), nullptr);
errors.Clear();
EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_FALSE(errors.empty());
// Check that an entirely invalid value is rejected and yields an error
// message.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::StringValue("invalid")), nullptr);
errors.Clear();
EXPECT_FALSE(handler.CheckPolicySettings(policy_map, &errors));
EXPECT_FALSE(errors.empty());
}
TEST(IntPercentageToDoublePolicyHandler, ApplyPolicySettingsClamp) {
PolicyMap policy_map;
PrefValueMap prefs;
std::unique_ptr<base::Value> expected;
const base::Value* value;
// This tests needs to modify an int policy. The exact policy used and its
// semantics outside the test are irrelevant.
IntPercentageToDoublePolicyHandler handler(
kTestPolicy, kTestPref, 0, 10, true);
// Check that values lying in the accepted range are written to the pref.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(0)), nullptr);
prefs.Clear();
handler.ApplyPolicySettings(policy_map, &prefs);
expected.reset(new base::FundamentalValue(0.0));
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(expected.get(), value));
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(5)), nullptr);
prefs.Clear();
handler.ApplyPolicySettings(policy_map, &prefs);
expected.reset(new base::FundamentalValue(0.05));
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(expected.get(), value));
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(10)), nullptr);
prefs.Clear();
handler.ApplyPolicySettings(policy_map, &prefs);
expected.reset(new base::FundamentalValue(0.1));
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(expected.get(), value));
// Check that values lying outside the accepted range are clamped and written
// to the pref.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(-5)), nullptr);
prefs.Clear();
handler.ApplyPolicySettings(policy_map, &prefs);
expected.reset(new base::FundamentalValue(0.0));
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(expected.get(), value));
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(15)), nullptr);
prefs.Clear();
handler.ApplyPolicySettings(policy_map, &prefs);
expected.reset(new base::FundamentalValue(0.1));
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(expected.get(), value));
}
TEST(IntPercentageToDoublePolicyHandler, ApplyPolicySettingsDontClamp) {
PolicyMap policy_map;
PrefValueMap prefs;
std::unique_ptr<base::Value> expected;
const base::Value* value;
// This tests needs to modify an int policy. The exact policy used and its
// semantics outside the test are irrelevant.
IntPercentageToDoublePolicyHandler handler(
kTestPolicy, kTestPref, 0, 10, true);
// Check that values lying in the accepted range are written to the pref.
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(0)), nullptr);
prefs.Clear();
handler.ApplyPolicySettings(policy_map, &prefs);
expected.reset(new base::FundamentalValue(0.0));
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(expected.get(), value));
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(5)), nullptr);
prefs.Clear();
handler.ApplyPolicySettings(policy_map, &prefs);
expected.reset(new base::FundamentalValue(0.05));
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(expected.get(), value));
policy_map.Set(kTestPolicy, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::WrapUnique(new base::FundamentalValue(10)), nullptr);
prefs.Clear();
handler.ApplyPolicySettings(policy_map, &prefs);
expected.reset(new base::FundamentalValue(0.1));
EXPECT_TRUE(prefs.GetValue(kTestPref, &value));
EXPECT_TRUE(base::Value::Equals(expected.get(), value));
}
TEST(SchemaValidatingPolicyHandlerTest, CheckAndGetValue) {
std::string error;
static const char kSchemaJson[] =
"{"
" \"type\": \"object\","
" \"properties\": {"
" \"OneToThree\": {"
" \"type\": \"integer\","
" \"minimum\": 1,"
" \"maximum\": 3"
" },"
" \"Colors\": {"
" \"type\": \"string\","
" \"enum\": [ \"Red\", \"Green\", \"Blue\" ]"
" }"
" }"
"}";
Schema schema = Schema::Parse(kSchemaJson, &error);
ASSERT_TRUE(schema.valid()) << error;
static const char kPolicyMapJson[] =
"{"
" \"PolicyForTesting\": {"
" \"OneToThree\": 2,"
" \"Colors\": \"White\""
" }"
"}";
std::unique_ptr<base::Value> policy_map_value =
base::JSONReader::ReadAndReturnError(kPolicyMapJson, base::JSON_PARSE_RFC,
NULL, &error);
ASSERT_TRUE(policy_map_value) << error;
const base::DictionaryValue* policy_map_dict = NULL;
ASSERT_TRUE(policy_map_value->GetAsDictionary(&policy_map_dict));
PolicyMap policy_map;
policy_map.LoadFrom(policy_map_dict, POLICY_LEVEL_RECOMMENDED,
POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD);
TestSchemaValidatingPolicyHandler handler(schema, SCHEMA_ALLOW_INVALID);
std::unique_ptr<base::Value> output_value;
ASSERT_TRUE(handler.CheckAndGetValueForTest(policy_map, &output_value));
ASSERT_TRUE(output_value);
base::DictionaryValue* dict = NULL;
ASSERT_TRUE(output_value->GetAsDictionary(&dict));
// Test that CheckAndGetValue() actually dropped invalid properties.
int int_value = -1;
EXPECT_TRUE(dict->GetInteger("OneToThree", &int_value));
EXPECT_EQ(2, int_value);
EXPECT_FALSE(dict->HasKey("Colors"));
}
TEST(SimpleSchemaValidatingPolicyHandlerTest, CheckAndGetValue) {
const char policy_name[] = "PolicyForTesting";
static const char kSchemaJson[] =
"{"
" \"type\": \"object\","
" \"properties\": {"
" \"PolicyForTesting\": {"
" \"type\": \"object\","
" \"properties\": {"
" \"OneToThree\": {"
" \"type\": \"integer\","
" \"minimum\": 1,"
" \"maximum\": 3"
" },"
" \"Colors\": {"
" \"type\": \"string\","
" \"enum\": [ \"Red\", \"Green\", \"Blue\" ]"
" }"
" }"
" }"
" }"
"}";
std::string error;
Schema schema = Schema::Parse(kSchemaJson, &error);
ASSERT_TRUE(schema.valid()) << error;
static const char kPolicyMapJson[] =
"{"
" \"PolicyForTesting\": {"
" \"OneToThree\": 2,"
" \"Colors\": \"Green\""
" }"
"}";
std::unique_ptr<base::Value> policy_map_value =
base::JSONReader::ReadAndReturnError(kPolicyMapJson, base::JSON_PARSE_RFC,
NULL, &error);
ASSERT_TRUE(policy_map_value) << error;
const base::DictionaryValue* policy_map_dict = NULL;
ASSERT_TRUE(policy_map_value->GetAsDictionary(&policy_map_dict));
PolicyMap policy_map_recommended;
policy_map_recommended.LoadFrom(
policy_map_dict, POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD);
PolicyMap policy_map_mandatory;
policy_map_mandatory.LoadFrom(
policy_map_dict, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD);
SimpleSchemaValidatingPolicyHandler handler_all(
policy_name,
kTestPref,
schema,
SCHEMA_STRICT,
SimpleSchemaValidatingPolicyHandler::RECOMMENDED_ALLOWED,
SimpleSchemaValidatingPolicyHandler::MANDATORY_ALLOWED);
SimpleSchemaValidatingPolicyHandler handler_recommended(
policy_name,
kTestPref,
schema,
SCHEMA_STRICT,
SimpleSchemaValidatingPolicyHandler::RECOMMENDED_ALLOWED,
SimpleSchemaValidatingPolicyHandler::MANDATORY_PROHIBITED);
SimpleSchemaValidatingPolicyHandler handler_mandatory(
policy_name,
kTestPref,
schema,
SCHEMA_STRICT,
SimpleSchemaValidatingPolicyHandler::RECOMMENDED_PROHIBITED,
SimpleSchemaValidatingPolicyHandler::MANDATORY_ALLOWED);
SimpleSchemaValidatingPolicyHandler handler_none(
policy_name,
kTestPref,
schema,
SCHEMA_STRICT,
SimpleSchemaValidatingPolicyHandler::RECOMMENDED_PROHIBITED,
SimpleSchemaValidatingPolicyHandler::MANDATORY_PROHIBITED);
const base::Value* value_expected_in_pref;
policy_map_dict->Get(policy_name, &value_expected_in_pref);
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value* value_set_in_pref;
EXPECT_TRUE(handler_all.CheckPolicySettings(policy_map_mandatory, &errors));
EXPECT_TRUE(errors.empty());
prefs.Clear();
handler_all.ApplyPolicySettings(policy_map_mandatory, &prefs);
EXPECT_TRUE(prefs.GetValue(kTestPref, &value_set_in_pref));
EXPECT_TRUE(value_expected_in_pref->Equals(value_set_in_pref));
EXPECT_FALSE(
handler_recommended.CheckPolicySettings(policy_map_mandatory, &errors));
EXPECT_FALSE(errors.empty());
errors.Clear();
EXPECT_TRUE(
handler_mandatory.CheckPolicySettings(policy_map_mandatory, &errors));
EXPECT_TRUE(errors.empty());
prefs.Clear();
handler_mandatory.ApplyPolicySettings(policy_map_mandatory, &prefs);
EXPECT_TRUE(prefs.GetValue(kTestPref, &value_set_in_pref));
EXPECT_TRUE(value_expected_in_pref->Equals(value_set_in_pref));
EXPECT_FALSE(handler_none.CheckPolicySettings(policy_map_mandatory, &errors));
EXPECT_FALSE(errors.empty());
errors.Clear();
EXPECT_TRUE(handler_all.CheckPolicySettings(policy_map_recommended, &errors));
EXPECT_TRUE(errors.empty());
prefs.Clear();
handler_all.ApplyPolicySettings(policy_map_mandatory, &prefs);
EXPECT_TRUE(prefs.GetValue(kTestPref, &value_set_in_pref));
EXPECT_TRUE(value_expected_in_pref->Equals(value_set_in_pref));
EXPECT_FALSE(
handler_mandatory.CheckPolicySettings(policy_map_recommended, &errors));
EXPECT_FALSE(errors.empty());
errors.Clear();
EXPECT_TRUE(
handler_recommended.CheckPolicySettings(policy_map_recommended, &errors));
EXPECT_TRUE(errors.empty());
prefs.Clear();
handler_recommended.ApplyPolicySettings(policy_map_mandatory, &prefs);
EXPECT_TRUE(prefs.GetValue(kTestPref, &value_set_in_pref));
EXPECT_TRUE(value_expected_in_pref->Equals(value_set_in_pref));
EXPECT_FALSE(
handler_none.CheckPolicySettings(policy_map_recommended, &errors));
EXPECT_FALSE(errors.empty());
}
} // namespace policy