blob: 8435cfedff9daf7c9b48454251eaf47629bcca1d [file] [log] [blame]
// Copyright 2013 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/sync/service/sync_policy_handler.h"
#include <memory>
#include <string>
#include <utility>
#include <vector>
#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/policy_constants.h"
#include "components/prefs/pref_value_map.h"
#include "components/sync/base/pref_names.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace syncer {
namespace {
TEST(SyncPolicyHandlerTest, Default) {
policy::PolicyMap policy;
SyncPolicyHandler handler;
PrefValueMap prefs;
handler.ApplyPolicySettings(policy, &prefs);
EXPECT_FALSE(prefs.GetValue(prefs::internal::kSyncManaged, nullptr));
}
TEST(SyncPolicyHandlerTest, Enabled) {
policy::PolicyMap policy;
policy.Set(policy::key::kSyncDisabled, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(false), nullptr);
SyncPolicyHandler handler;
PrefValueMap prefs;
handler.ApplyPolicySettings(policy, &prefs);
// Enabling Sync should not set the pref.
EXPECT_FALSE(prefs.GetValue(prefs::internal::kSyncManaged, nullptr));
}
TEST(SyncPolicyHandlerTest, Disabled) {
policy::PolicyMap policy;
policy.Set(policy::key::kSyncDisabled, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(true), nullptr);
SyncPolicyHandler handler;
PrefValueMap prefs;
handler.ApplyPolicySettings(policy, &prefs);
// Sync should be flagged as managed.
const base::Value* value = nullptr;
EXPECT_TRUE(prefs.GetValue(prefs::internal::kSyncManaged, &value));
ASSERT_TRUE(value);
EXPECT_TRUE(value->GetBool());
}
TEST(SyncPolicyHandlerTest, SyncTypesListDisabled) {
// Start with prefs enabled so we can sense that they have changed.
PrefValueMap prefs;
prefs.SetBoolean(prefs::internal::kSyncBookmarks, true);
prefs.SetBoolean(prefs::internal::kSyncReadingList, true);
prefs.SetBoolean(prefs::internal::kSyncPreferences, true);
prefs.SetBoolean(prefs::internal::kSyncAutofill, true);
prefs.SetBoolean(prefs::internal::kSyncPayments, true);
prefs.SetBoolean(prefs::internal::kSyncThemes, true);
// Create a policy that disables some types.
policy::PolicyMap policy;
auto disabled_types = base::Value::List()
.Append("bookmarks")
.Append("readingList")
.Append("preferences");
policy.Set(policy::key::kSyncTypesListDisabled,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(disabled_types)), nullptr);
SyncPolicyHandler handler;
handler.ApplyPolicySettings(policy, &prefs);
// Prefs in the policy should be disabled.
bool enabled;
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncBookmarks, &enabled));
EXPECT_FALSE(enabled);
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncReadingList, &enabled));
EXPECT_FALSE(enabled);
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncPreferences, &enabled));
EXPECT_FALSE(enabled);
// Prefs that are not part of the policy are still enabled.
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncAutofill, &enabled));
EXPECT_TRUE(enabled);
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncPayments, &enabled));
EXPECT_TRUE(enabled);
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncThemes, &enabled));
EXPECT_TRUE(enabled);
}
// Same as SyncTypesListDisabled but tests autofill specifically.
TEST(SyncPolicyHandlerTest, SyncTypesListDisabledAutofill) {
// Start with prefs enabled so we can sense that they have changed.
PrefValueMap prefs;
prefs.SetBoolean(prefs::internal::kSyncBookmarks, true);
prefs.SetBoolean(prefs::internal::kSyncReadingList, true);
prefs.SetBoolean(prefs::internal::kSyncPreferences, true);
prefs.SetBoolean(prefs::internal::kSyncAutofill, true);
prefs.SetBoolean(prefs::internal::kSyncPayments, true);
prefs.SetBoolean(prefs::internal::kSyncThemes, true);
// Create a policy that disables autofill.
policy::PolicyMap policy;
auto disabled_types = base::Value::List().Append("autofill");
policy.Set(policy::key::kSyncTypesListDisabled,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(disabled_types)), nullptr);
SyncPolicyHandler handler;
handler.ApplyPolicySettings(policy, &prefs);
// Prefs in the policy should be disabled.
bool enabled;
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncAutofill, &enabled));
EXPECT_FALSE(enabled);
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncPayments, &enabled));
EXPECT_FALSE(enabled);
// Prefs that are not part of the policy are still enabled.
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncBookmarks, &enabled));
EXPECT_TRUE(enabled);
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncReadingList, &enabled));
EXPECT_TRUE(enabled);
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncPreferences, &enabled));
EXPECT_TRUE(enabled);
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncThemes, &enabled));
EXPECT_TRUE(enabled);
}
TEST(SyncPolicyHandlerTest, SyncTypesListDisabledInvalidEntry) {
// Start with prefs enabled so we can sense that they have changed.
PrefValueMap prefs;
prefs.SetBoolean(prefs::internal::kSyncBookmarks, true);
prefs.SetBoolean(prefs::internal::kSyncReadingList, true);
prefs.SetBoolean(prefs::internal::kSyncPreferences, true);
prefs.SetBoolean(prefs::internal::kSyncAutofill, true);
// Create a policy that disables some types, but also contains a non-string
// entry in the list.
policy::PolicyMap policy;
auto disabled_types =
base::Value::List().Append("bookmarks").Append(123).Append("preferences");
policy.Set(policy::key::kSyncTypesListDisabled,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(disabled_types)), nullptr);
SyncPolicyHandler handler;
// The invalid value should have produced a warning message.
policy::PolicyErrorMap errors;
handler.CheckPolicySettings(policy, &errors);
std::vector<policy::PolicyErrorMap::Data> error_data =
errors.GetErrors(policy::key::kSyncTypesListDisabled);
ASSERT_EQ(error_data.size(), 1u);
EXPECT_EQ(error_data[0].level, policy::PolicyMap::MessageType::kWarning);
// But the valid entries should still have been applied.
handler.ApplyPolicySettings(policy, &prefs);
bool enabled;
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncBookmarks, &enabled));
EXPECT_FALSE(enabled);
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncPreferences, &enabled));
EXPECT_FALSE(enabled);
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncAutofill, &enabled));
EXPECT_TRUE(enabled);
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncReadingList, &enabled));
EXPECT_TRUE(enabled);
}
TEST(SyncPolicyHandlerTest, SyncTypesListDisabledUnknownEntry) {
// Start with prefs enabled so we can sense that they have changed.
PrefValueMap prefs;
prefs.SetBoolean(prefs::internal::kSyncBookmarks, true);
prefs.SetBoolean(prefs::internal::kSyncReadingList, true);
prefs.SetBoolean(prefs::internal::kSyncPreferences, true);
prefs.SetBoolean(prefs::internal::kSyncAutofill, true);
// Create a policy that disables some types, but also contains an unrecognized
// value (in practice, this could be a previous data type that was deprecated,
// or a new data type that this version of the browser doesn't know about yet,
// or just a typo in the configuration).
policy::PolicyMap policy;
auto disabled_types = base::Value::List()
.Append("bookmarks")
.Append("nonexistent")
.Append("preferences");
policy.Set(policy::key::kSyncTypesListDisabled,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(disabled_types)), nullptr);
SyncPolicyHandler handler;
// The invalid value should have produced a warning message.
policy::PolicyErrorMap errors;
handler.CheckPolicySettings(policy, &errors);
std::vector<policy::PolicyErrorMap::Data> error_data =
errors.GetErrors(policy::key::kSyncTypesListDisabled);
ASSERT_EQ(error_data.size(), 1u);
EXPECT_NE(error_data[0].message.find(u"nonexistent"), std::string::npos);
EXPECT_EQ(error_data[0].level, policy::PolicyMap::MessageType::kWarning);
// But the valid entries should still have been applied.
handler.ApplyPolicySettings(policy, &prefs);
bool enabled;
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncBookmarks, &enabled));
EXPECT_FALSE(enabled);
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncPreferences, &enabled));
EXPECT_FALSE(enabled);
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncAutofill, &enabled));
EXPECT_TRUE(enabled);
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncReadingList, &enabled));
EXPECT_TRUE(enabled);
}
#if BUILDFLAG(IS_CHROMEOS)
TEST(SyncPolicyHandlerOsTest, SyncTypesListDisabled_OsTypes) {
// Start with prefs enabled so we can sense that they have changed.
PrefValueMap prefs;
prefs.SetBoolean(prefs::internal::kSyncOsApps, true);
prefs.SetBoolean(prefs::internal::kSyncOsPreferences, true);
prefs.SetBoolean(prefs::internal::kSyncWifiConfigurations, true);
// Create a policy that disables the types.
policy::PolicyMap policy;
auto disabled_types = base::Value::List()
.Append("osApps")
.Append("osPreferences")
.Append("osWifiConfigurations");
policy.Set(policy::key::kSyncTypesListDisabled,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(disabled_types)), nullptr);
SyncPolicyHandler handler;
handler.ApplyPolicySettings(policy, &prefs);
// Prefs in the policy are disabled.
bool enabled;
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncOsApps, &enabled));
EXPECT_FALSE(enabled);
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncOsPreferences, &enabled));
EXPECT_FALSE(enabled);
ASSERT_TRUE(
prefs.GetBoolean(prefs::internal::kSyncWifiConfigurations, &enabled));
EXPECT_FALSE(enabled);
}
TEST(SyncPolicyHandlerOsTest, SyncTypesListDisabled_MigratedTypes) {
// Start with prefs enabled so we can sense that they have changed.
PrefValueMap prefs;
prefs.SetBoolean(prefs::internal::kSyncOsApps, true);
prefs.SetBoolean(prefs::internal::kSyncOsPreferences, true);
// Create a policy that disables the types, but using the original browser
// policy names from before the SplitSettingsSync launch.
policy::PolicyMap policy;
auto disabled_types = base::Value::List()
.Append("apps")
.Append("wifiConfigurations")
.Append("preferences");
policy.Set(policy::key::kSyncTypesListDisabled,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(disabled_types)), nullptr);
SyncPolicyHandler handler;
handler.ApplyPolicySettings(policy, &prefs);
// The equivalent OS types are disabled.
bool enabled;
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncOsApps, &enabled));
EXPECT_FALSE(enabled);
ASSERT_TRUE(
prefs.GetBoolean(prefs::internal::kSyncWifiConfigurations, &enabled));
EXPECT_FALSE(enabled);
ASSERT_TRUE(prefs.GetBoolean(prefs::internal::kSyncOsPreferences, &enabled));
EXPECT_FALSE(enabled);
}
#endif // BUILDFLAG(IS_CHROMEOS)
} // namespace
} // namespace syncer