blob: 95fc1a8ee556d8dfd8cb50c9ffb92e0e097bee16 [file] [log] [blame]
// Copyright 2014 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/bookmarks/managed/managed_bookmarks_policy_handler.h"
#include <memory>
#include <utility>
#include "base/json/json_reader.h"
#include "base/memory/ptr_util.h"
#include "components/bookmarks/common/bookmark_pref_names.h"
#include "components/policy/core/browser/configuration_policy_pref_store.h"
#include "components/policy/core/browser/configuration_policy_pref_store_test.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/policy/policy_constants.h"
namespace bookmarks {
using policy::POLICY_LEVEL_MANDATORY;
using policy::POLICY_SCOPE_USER;
using policy::POLICY_SOURCE_CLOUD;
using policy::PolicyMap;
using policy::Schema;
using policy::key::kManagedBookmarks;
class ManagedBookmarksPolicyHandlerTest
: public policy::ConfigurationPolicyPrefStoreTest {
void SetUp() override {
Schema chrome_schema = Schema::Wrap(policy::GetChromeSchemaData());
handler_list_.AddHandler(
base::WrapUnique<policy::ConfigurationPolicyHandler>(
new ManagedBookmarksPolicyHandler(chrome_schema)));
}
};
TEST_F(ManagedBookmarksPolicyHandlerTest, ApplyPolicySettings) {
EXPECT_FALSE(store_->GetValue(prefs::kManagedBookmarks, nullptr));
PolicyMap policy;
policy.Set(kManagedBookmarks, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::JSONReader::Read("["
// The following gets filtered out from
// the JSON string when parsed.
" {"
" \"toplevel_name\": \"abc 123\""
" },"
" {"
" \"name\": \"Google\","
" \"url\": \"google.com\""
" },"
" {"
" \"name\": \"Empty Folder\","
" \"children\": []"
" },"
" {"
" \"name\": \"Big Folder\","
" \"children\": ["
" {"
" \"name\": \"Youtube\","
" \"url\": \"youtube.com\""
" },"
" {"
" \"name\": \"Chromium\","
" \"url\": \"chromium.org\""
" },"
" {"
" \"name\": \"More Stuff\","
" \"children\": ["
" {"
" \"name\": \"Bugs\","
" \"url\": \"crbug.com\""
" }"
" ]"
" }"
" ]"
" }"
"]"),
nullptr);
UpdateProviderPolicy(policy);
const base::Value* pref_value = nullptr;
EXPECT_TRUE(store_->GetValue(prefs::kManagedBookmarks, &pref_value));
ASSERT_TRUE(pref_value);
// Make sure the kManagedBookmarksFolderName pref is set correctly.
const base::Value* folder_value = nullptr;
EXPECT_TRUE(
store_->GetValue(prefs::kManagedBookmarksFolderName, &folder_value));
ASSERT_TRUE(folder_value);
ASSERT_TRUE(folder_value->is_string());
EXPECT_EQ("abc 123", folder_value->GetString());
// Note the protocols and ending slashes added to urls, which were not in the
// value set earlier.
std::optional<base::Value> expected = base::JSONReader::Read(R"(
[
{
"name": "Google",
"url": "http://google.com/"
},
{
"name": "Empty Folder",
"children": []
},
{
"name": "Big Folder",
"children": [
{
"name": "Youtube",
"url": "http://youtube.com/"
},
{
"name": "Chromium",
"url": "http://chromium.org/"
},
{
"name": "More Stuff",
"children": [
{
"name": "Bugs",
"url": "http://crbug.com/"
}
]
}
]
}
]
)");
EXPECT_EQ(expected, *pref_value);
}
TEST_F(ManagedBookmarksPolicyHandlerTest, ApplyPolicySettingsNoTitle) {
EXPECT_FALSE(store_->GetValue(prefs::kManagedBookmarks, nullptr));
PolicyMap policy;
policy.Set(kManagedBookmarks, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::JSONReader::Read("["
" {"
" \"name\": \"Google\","
" \"url\": \"google.com\""
" }"
"]"),
nullptr);
UpdateProviderPolicy(policy);
const base::Value* pref_value = nullptr;
EXPECT_TRUE(store_->GetValue(prefs::kManagedBookmarks, &pref_value));
ASSERT_TRUE(pref_value);
// Make sure the kManagedBookmarksFolderName pref is set correctly.
const base::Value* folder_value = nullptr;
EXPECT_TRUE(
store_->GetValue(prefs::kManagedBookmarksFolderName, &folder_value));
ASSERT_TRUE(folder_value);
ASSERT_TRUE(folder_value->is_string());
EXPECT_EQ("", folder_value->GetString());
// Note the protocol and ending slash added to url, which was not in the value
// set earlier.
std::optional<base::Value> expected = base::JSONReader::Read(R"(
[
{
"name": "Google",
"url": "http://google.com/"
}
]
)");
EXPECT_EQ(expected, *pref_value);
}
TEST_F(ManagedBookmarksPolicyHandlerTest, WrongPolicyType) {
PolicyMap policy;
// The expected type is a list base::Value, but this policy sets it as an
// unparsed base::Value. Any type other than list should fail.
policy.Set(kManagedBookmarks, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, POLICY_SOURCE_CLOUD,
base::Value("["
" {"
" \"name\": \"Google\","
" \"url\": \"google.com\""
" },"
"]"),
nullptr);
UpdateProviderPolicy(policy);
EXPECT_FALSE(store_->GetValue(prefs::kManagedBookmarks, nullptr));
}
TEST_F(ManagedBookmarksPolicyHandlerTest, UnknownKeys) {
PolicyMap policy;
policy.Set(kManagedBookmarks, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::JSONReader::Read("["
" {"
" \"name\": \"Google\","
" \"unknown\": \"should be ignored\","
" \"url\": \"google.com\""
" }"
"]"),
nullptr);
UpdateProviderPolicy(policy);
const base::Value* pref_value = nullptr;
EXPECT_TRUE(store_->GetValue(prefs::kManagedBookmarks, &pref_value));
ASSERT_TRUE(pref_value);
// Note the protocol and ending slash added to url, which was not in the value
// set earlier.
std::optional<base::Value> expected = base::JSONReader::Read(R"(
[
{
"name": "Google",
"url": "http://google.com/"
}
]
)");
EXPECT_EQ(expected, *pref_value);
}
TEST_F(ManagedBookmarksPolicyHandlerTest, BadBookmark) {
PolicyMap policy;
policy.Set(kManagedBookmarks, POLICY_LEVEL_MANDATORY, POLICY_SCOPE_USER,
POLICY_SOURCE_CLOUD,
base::JSONReader::Read("["
" {"
" \"name\": \"Empty\","
" \"url\": \"\""
" },"
" {"
" \"name\": \"Invalid type\","
" \"url\": 4"
" },"
" {"
" \"name\": \"Invalid URL\","
" \"url\": \"?\""
" },"
" {"
" \"name\": \"Google\","
" \"url\": \"google.com\""
" }"
"]"),
nullptr);
UpdateProviderPolicy(policy);
const base::Value* pref_value = nullptr;
// Invalid because SCHEMA_ALLOW_INVALID was replaced by SCHEMA_ALLOW_UNKNOWN
// which has stricter verification rules (see https://www.crbug/969706)
EXPECT_FALSE(store_->GetValue(prefs::kManagedBookmarks, &pref_value));
ASSERT_FALSE(pref_value);
}
} // namespace bookmarks