blob: cec667a7e3e6cb31ce6be5672a2c1462618c430c [file] [log] [blame]
// Copyright 2023 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/search_engines/enterprise/site_search_policy_handler.h"
#include <optional>
#include "base/compiler_specific.h"
#include "base/strings/string_number_conversions.h"
#include "base/strings/stringprintf.h"
#include "base/strings/utf_string_conversions.h"
#include "base/test/scoped_feature_list.h"
#include "components/omnibox/common/omnibox_features.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/browser/policy_error_map.h"
#include "components/policy/core/common/field_validation_test_utils.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"
#include "components/prefs/pref_value_map.h"
#include "components/search_engines/default_search_manager.h"
#include "components/search_engines/enterprise/enterprise_search_manager.h"
#include "components/search_engines/enterprise/search_aggregator_policy_handler.h"
#include "components/search_engines/template_url_data.h"
#include "components/strings/grit/components_strings.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "ui/base/l10n/l10n_util.h"
using testing::AllOf;
using testing::ElementsAre;
namespace policy {
namespace {
// Represents field values for SiteSearchSettings policy, used for generating
// policy value entries.
struct TestProvider {
std::optional<std::string> name;
std::optional<std::string> shortcut;
std::optional<std::string> url;
bool featured_by_policy = false;
std::optional<std::string> favicon;
std::optional<bool> allow_user_override;
};
// Represents field values for EnterpriseSearchAggregatorSettings policy, used
// for generating policy value entries. Fields set as nullptr will not be added
// to the entry dictionary.
struct TestSearchAggregator {
const char* name;
const char* shortcut;
const char* search_url;
const char* suggest_url;
const char* icon_url;
// If not-zero, the ID of the error message expected in the policy error map.
const int expected_error_msg_id;
};
// Used for tests that require a list of valid providers.
TestProvider kValidTestProviders[] = {
{.name = "work name",
.shortcut = "work",
.url = "https://work.com/{searchTerms}",
.featured_by_policy = false,
.favicon = "https://work.com/favicon.ico"},
{.name = "docs name",
.shortcut = "docs",
.url = "https://docs.com/{searchTerms}",
.favicon = "https://docs.com/favicon.ico"},
};
// Used for tests that require a list of valid providers.
TestProvider kValidTestProvidersWithAllowUserOverride[] = {
{.name = "work name",
.shortcut = "work",
.url = "https://work.com/{searchTerms}",
.favicon = "https://work.com/favicon.ico",
.allow_user_override = true},
{.name = "docs name",
.shortcut = "docs",
.url = "https://docs.com/{searchTerms}",
.favicon = "https://docs.com/favicon.ico",
.allow_user_override = false},
{.name = "mail name",
.shortcut = "mail",
.url = "https://mail.com/{searchTerms}",
.favicon = "https://mail.com/favicon.ico",
.allow_user_override = std::nullopt},
};
// Used for tests that require providers with missing required fields.
TestProvider kMissingRequiredFieldsTestProviders[] = {
{.shortcut = "missing_name",
.url = "https://missing_name.com/{searchTerms}"},
{.name = "missing_shortcut name",
.url = "https://missing_shortcut.com/{searchTerms}"},
{.name = "missing_url name", .shortcut = "missing_url"},
};
// Used for tests that require providers with empty required fields.
TestProvider kEmptyFieldTestProviders[] = {
{.name = "",
.shortcut = "empty_name",
.url = "https://empty_name.com/{searchTerms}"},
{.name = "empty_shortcut name",
.shortcut = "",
.url = "https://empty_shortcut.com/{searchTerms}"},
{.name = "empty_url name", .shortcut = "empty_url", .url = ""},
};
// Used for tests that require a provider with unknown field.
TestProvider kUnknownFieldTestProviders[] = {
{.name = "work name",
.shortcut = "work",
.url = "https://work.com/{searchTerms}",
.favicon = "https://work.com/favicon.ico"},
};
// Used for tests that require a list of providers with a duplicated shortcut,
// but at least one valid entry.
TestProvider kShortcutNotUniqueTestProviders[] = {
{.name = "work name",
.shortcut = "work",
.url = "https://work.com/q={searchTerms}&x"},
{.name = "also work name",
.shortcut = "work",
.url = "https://work.com/q={searchTerms}&y"},
{.name = "docs name",
.shortcut = "docs",
.url = "https://docs.com/{searchTerms}",
.favicon = "https://docs.com/favicon.ico"},
};
// Used for tests that require a list of providers with a duplicated shortcut
// and no valid entry.
TestProvider kNoUniqueShortcutTestProviders[] = {
{.name = "work name",
.shortcut = "work",
.url = "https://work.com/q={searchTerms}&x"},
{.name = "also work name",
.shortcut = "work",
.url = "https://work.com/q={searchTerms}&y"},
};
// Used for tests that require a provider shortcut containing a space
// and no valid entry.
TestProvider kShortcutWithSpacesTestProviders[] = {
{.name = "work name 1",
.shortcut = " shortcut",
.url = "https://work1.com/q={searchTerms}&x"},
{.name = "work name 2",
.shortcut = "shortcut ",
.url = "https://work2.com/q={searchTerms}&x"},
{.name = "work name 3",
.shortcut = "short cut",
.url = "https://work3.com/q={searchTerms}&x"},
};
// Used for tests that require a provider shortcut that stars with @.
TestProvider kShortcutStartsWithAtTestProviders[] = {
{.name = "invalid",
.shortcut = "@work",
.url = "https://work.com/q={searchTerms}&x"},
{.name = "valid",
.shortcut = "wo@rk",
.url = "https://work.com/q={searchTerms}&y",
.favicon = "https://work.com/favicon.ico"},
};
// Used for tests that require a provider with invalid non-empty URLs.
TestProvider kInvalidUrlTestProviders[] = {
{.name = "invalid1 name",
.shortcut = "invalid1",
.url = "https://work.com/q=searchTerms"},
{.name = "invalid2 name",
.shortcut = "invalid2",
.url = "https://work.com/q=%s"},
{.name = "invalid3 name",
.shortcut = "invalid3",
.url = "https://work.com"},
};
constexpr char kDSPKeyword[] = "dsp_keyword";
// Used for tests that require a provider with invalid non-empty URLs.
TestProvider kShortcutSameAsDSPKeywordTestProviders[] = {
{.name = "same as keyword",
.shortcut = kDSPKeyword,
.url = "https://work.com/q={searchTerms}&x",
.favicon = "https://work.com/favicon.ico"},
{.name = "something else",
.shortcut = "something_else",
.url = "https://work.com/q={searchTerms}&y",
.favicon = "https://work.com/favicon.ico"},
};
// Used for tests that require a provider with non-HTTPS URL.
TestProvider kNonHttpsUrlTestProviders[] = {
{.name = "work name",
.shortcut = "work",
.url = "http://work.com/q={searchTerms}",
.favicon = "http://work.com/favicon.ico"},
};
// Used for tests that require a list of featured providers.
TestProvider kTestProvidersWithFeaturedEntries[] = {
{.name = "work name",
.shortcut = "work",
.url = "https://work.com/{searchTerms}",
.featured_by_policy = true,
.favicon = "https://work.com/favicon.ico"},
{.name = "non-featured name",
.shortcut = "non-featured",
.url = "https://non-featured.com/{searchTerms}",
.featured_by_policy = false,
.favicon = "https://non-featured.com/favicon.ico"},
{.name = "docs name",
.shortcut = "docs",
.url = "https://docs.com/{searchTerms}",
.featured_by_policy = true,
.favicon = "https://docs.com/favicon.ico"},
};
constexpr char kSiteSearchKeyword[] = "ss_keyword";
TestSearchAggregator kSearchAggregatorShortcutSameAsSiteSearch = {
.name = "work name",
.shortcut = kSiteSearchKeyword,
.search_url = "https://work.com/q={searchTerms}&x",
.suggest_url = "https://work.com/suggest",
.icon_url = "https://work.com/favicon.ico"};
TestProvider kSiteSearchShortcutSameAsSearchAggregator = {
.name = "same as keyword",
.shortcut = kSiteSearchKeyword,
.url = "https://work.com/q={searchTerms}&x",
.favicon = "https://work.com/favicon.ico"};
bool kMismatchedSearchAggregatorSettingsType = true;
TestSearchAggregator kSearchAggregatorWithoutShortcut = {
.name = "work name",
.search_url = "https://work.com/q={searchTerms}&x",
.suggest_url = "https://work.com/suggest",
.icon_url = "https://work.com/favicon.ico"};
TestSearchAggregator kSearchAggregatorSettingWithShortcut = {
.name = "work name",
.shortcut = "search_aggregator_shortcut",
.search_url = "https://work.com/q={searchTerms}&x",
.suggest_url = "https://work.com/suggest",
.icon_url = "https://work.com/favicon.ico"};
// Creates a simple list item for the site search policy.
base::Value::Dict GenerateSiteSearchPolicyEntry(const std::string& name,
const std::string& shortcut,
const std::string& url,
bool featured_by_policy) {
base::Value::Dict entry;
entry.Set(SiteSearchPolicyHandler::kName, name);
entry.Set(SiteSearchPolicyHandler::kShortcut, shortcut);
entry.Set(SiteSearchPolicyHandler::kUrl, url);
entry.Set(SiteSearchPolicyHandler::kFeatured, featured_by_policy);
return entry;
}
base::Value::Dict GenerateSiteSearchPolicyEntry(TestProvider test_case) {
base::Value::Dict entry;
if (test_case.name.has_value()) {
entry.Set(SiteSearchPolicyHandler::kName, test_case.name.value());
}
if (test_case.shortcut.has_value()) {
entry.Set(SiteSearchPolicyHandler::kShortcut, test_case.shortcut.value());
}
if (test_case.url.has_value()) {
entry.Set(SiteSearchPolicyHandler::kUrl, test_case.url.value());
}
entry.Set(SiteSearchPolicyHandler::kFeatured, test_case.featured_by_policy);
if (test_case.allow_user_override.has_value()) {
entry.Set(SiteSearchPolicyHandler::kAllowUserOverride,
test_case.allow_user_override.value());
}
return entry;
}
void SetFieldIfNotEmpty(const std::string& field,
const char* value,
base::Value::Dict* dict) {
if (value) {
dict->Set(field, value);
}
}
base::Value::Dict GenerateSearchAggregatorPolicyEntry(
TestSearchAggregator test_case) {
base::Value::Dict entry;
SetFieldIfNotEmpty(SearchAggregatorPolicyHandler::kIconUrl,
test_case.icon_url, &entry);
SetFieldIfNotEmpty(SearchAggregatorPolicyHandler::kName, test_case.name,
&entry);
SetFieldIfNotEmpty(SearchAggregatorPolicyHandler::kSearchUrl,
test_case.search_url, &entry);
SetFieldIfNotEmpty(SearchAggregatorPolicyHandler::kShortcut,
test_case.shortcut, &entry);
SetFieldIfNotEmpty(SearchAggregatorPolicyHandler::kSuggestUrl,
test_case.suggest_url, &entry);
return entry;
}
// Returns a matcher that accepts entries for the pref corresponding to the
// site search policy. Field values are obtained from |test_case|.
testing::Matcher<const base::Value&> IsSiteSearchEntry(
TestProvider test_case,
bool featured,
bool enforced_by_policy) {
std::string expected_keyword = base::StringPrintf(
"%s%s", (featured ? "@" : ""), test_case.shortcut.value());
return AllOf(
HasStringField(DefaultSearchManager::kShortName, test_case.name.value()),
HasStringField(DefaultSearchManager::kKeyword, expected_keyword),
HasStringField(DefaultSearchManager::kURL, test_case.url.value()),
HasBooleanField(DefaultSearchManager::kFeaturedByPolicy, featured),
HasIntegerField(
DefaultSearchManager::kPolicyOrigin,
static_cast<int>(TemplateURLData::PolicyOrigin::kSiteSearch)),
HasBooleanField(DefaultSearchManager::kEnforcedByPolicy,
enforced_by_policy),
HasIntegerField(DefaultSearchManager::kIsActive,
static_cast<int>(TemplateURLData::ActiveStatus::kTrue)),
HasStringField(DefaultSearchManager::kFaviconURL,
test_case.favicon.value()),
HasBooleanField(DefaultSearchManager::kSafeForAutoReplace, false),
HasDoubleField(DefaultSearchManager::kDateCreated),
HasDoubleField(DefaultSearchManager::kLastModified));
}
testing::Matcher<const base::Value&> IsNonFeaturedSiteSearchEntry(
TestProvider test_case) {
return IsSiteSearchEntry(test_case, /*featured=*/false,
/*enforced_by_policy=*/true);
}
testing::Matcher<const base::Value&> IsFeaturedSiteSearchEntry(
TestProvider test_case) {
return IsSiteSearchEntry(test_case, /*featured=*/true,
/*enforced_by_policy=*/true);
}
testing::Matcher<const base::Value&> IsOverridableNonFeaturedSiteSearchEntry(
TestProvider test_case) {
return IsSiteSearchEntry(test_case, /*featured=*/false,
/*enforced_by_policy=*/false);
}
MATCHER_P(HasValidationError,
expected_str,
base::StringPrintf("%s error message `%s` for `SiteSearchSettings`",
negation ? "does not contain" : "contains",
base::UTF16ToUTF8(expected_str).c_str())) {
return arg->HasError(key::kSiteSearchSettings) &&
arg->GetErrorMessages(key::kSiteSearchSettings).find(expected_str) !=
std::wstring::npos;
}
} // namespace
TEST(SiteSearchPolicyHandlerTest, PolicyNotSet) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
ASSERT_TRUE(handler.CheckPolicySettings(policies, &errors));
EXPECT_TRUE(errors.empty());
handler.ApplyPolicySettings(policies, &prefs);
base::Value* providers = nullptr;
ASSERT_TRUE(prefs.GetValue(
EnterpriseSearchManager::kSiteSearchSettingsPrefName, &providers));
ASSERT_NE(providers, nullptr);
ASSERT_TRUE(providers->is_list());
EXPECT_TRUE(providers->GetList().empty());
}
TEST(SiteSearchPolicyHandlerTest, ValidSiteSearchEntries) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
policy_value.Append(GenerateSiteSearchPolicyEntry(kValidTestProviders[0]));
policy_value.Append(GenerateSiteSearchPolicyEntry(kValidTestProviders[1]));
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_TRUE(handler.CheckPolicySettings(policies, &errors));
EXPECT_TRUE(errors.empty());
handler.ApplyPolicySettings(policies, &prefs);
base::Value* providers = nullptr;
ASSERT_TRUE(prefs.GetValue(
EnterpriseSearchManager::kSiteSearchSettingsPrefName, &providers));
ASSERT_NE(providers, nullptr);
ASSERT_TRUE(providers->is_list());
EXPECT_THAT(
providers->GetList(),
ElementsAre(IsNonFeaturedSiteSearchEntry(kValidTestProviders[0]),
IsNonFeaturedSiteSearchEntry(kValidTestProviders[1])));
}
TEST(SiteSearchPolicyHandlerTest,
ValidSiteSearchEntriesWithAllowUserOverride_FeatureDisabled) {
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitAndDisableFeature(
omnibox::kEnableSiteSearchAllowUserOverridePolicy);
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
policy_value.Append(GenerateSiteSearchPolicyEntry(
kValidTestProvidersWithAllowUserOverride[0]));
policy_value.Append(GenerateSiteSearchPolicyEntry(
kValidTestProvidersWithAllowUserOverride[1]));
policy_value.Append(GenerateSiteSearchPolicyEntry(
kValidTestProvidersWithAllowUserOverride[2]));
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_TRUE(handler.CheckPolicySettings(policies, &errors));
ASSERT_FALSE(errors.HasError(key::kSiteSearchSettings));
handler.ApplyPolicySettings(policies, &prefs);
base::Value* providers = nullptr;
ASSERT_TRUE(prefs.GetValue(
EnterpriseSearchManager::kSiteSearchSettingsPrefName, &providers));
ASSERT_NE(providers, nullptr);
ASSERT_TRUE(providers->is_list());
EXPECT_THAT(providers->GetList(),
ElementsAre(IsNonFeaturedSiteSearchEntry(
kValidTestProvidersWithAllowUserOverride[0]),
IsNonFeaturedSiteSearchEntry(
kValidTestProvidersWithAllowUserOverride[1]),
IsNonFeaturedSiteSearchEntry(
kValidTestProvidersWithAllowUserOverride[2])));
}
TEST(SiteSearchPolicyHandlerTest,
ValidSiteSearchEntriesWithAllowUserOverride_FeatureEnabled) {
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitAndEnableFeature(
omnibox::kEnableSiteSearchAllowUserOverridePolicy);
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
policy_value.Append(GenerateSiteSearchPolicyEntry(
kValidTestProvidersWithAllowUserOverride[0]));
policy_value.Append(GenerateSiteSearchPolicyEntry(
kValidTestProvidersWithAllowUserOverride[1]));
policy_value.Append(GenerateSiteSearchPolicyEntry(
kValidTestProvidersWithAllowUserOverride[2]));
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_TRUE(handler.CheckPolicySettings(policies, &errors));
ASSERT_FALSE(errors.HasError(key::kSiteSearchSettings));
handler.ApplyPolicySettings(policies, &prefs);
base::Value* providers = nullptr;
ASSERT_TRUE(prefs.GetValue(
EnterpriseSearchManager::kSiteSearchSettingsPrefName, &providers));
ASSERT_NE(providers, nullptr);
ASSERT_TRUE(providers->is_list());
EXPECT_THAT(providers->GetList(),
ElementsAre(IsOverridableNonFeaturedSiteSearchEntry(
kValidTestProvidersWithAllowUserOverride[0]),
IsNonFeaturedSiteSearchEntry(
kValidTestProvidersWithAllowUserOverride[1]),
IsNonFeaturedSiteSearchEntry(
kValidTestProvidersWithAllowUserOverride[2])));
}
TEST(SiteSearchPolicyHandlerTest, InvalidFormat) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(false), nullptr);
ASSERT_FALSE(handler.CheckPolicySettings(policies, &errors));
EXPECT_TRUE(errors.HasError(key::kSiteSearchSettings));
}
TEST(SiteSearchPolicyHandlerTest, TooManySiteSearchEntries) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
// Policy value has one list entry over the max allowed.
base::Value::List policy_value;
for (int i = 0; i <= SiteSearchPolicyHandler::kMaxSiteSearchProviders; ++i) {
policy_value.Append(GenerateSiteSearchPolicyEntry(
base::StringPrintf("shortcut_%d", i), base::StringPrintf("name %d", i),
base::StringPrintf("https://site_%d.com/q={searchTerms}", i),
/*featured_by_policy=*/false));
}
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_FALSE(handler.CheckPolicySettings(policies, &errors));
EXPECT_THAT(&errors,
HasValidationError(l10n_util::GetStringFUTF16(
IDS_POLICY_SITE_SEARCH_SETTINGS_MAX_PROVIDERS_LIMIT_ERROR,
base::NumberToString16(
SiteSearchPolicyHandler::kMaxSiteSearchProviders))));
}
TEST(SiteSearchPolicyHandlerTest, TooManyFeaturedSiteSearchEntries) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
// Policy value has one featured list entry over the max allowed.
base::Value::List policy_value;
for (int i = 0; i <= SiteSearchPolicyHandler::kMaxFeaturedProviders; ++i) {
policy_value.Append(GenerateSiteSearchPolicyEntry(
base::StringPrintf("shortcut_%d", i), base::StringPrintf("name %d", i),
base::StringPrintf("https://site_%d.com/q={searchTerms}", i),
/*featured_by_policy=*/true));
}
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_FALSE(handler.CheckPolicySettings(policies, &errors));
EXPECT_THAT(
&errors,
HasValidationError(l10n_util::GetStringFUTF16(
IDS_POLICY_SITE_SEARCH_SETTINGS_MAX_FEATURED_PROVIDERS_LIMIT_ERROR,
base::NumberToString16(
SiteSearchPolicyHandler::kMaxFeaturedProviders))));
}
TEST(SiteSearchPolicyHandlerTest, MissingRequiredField) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
for (const auto& test_case : kMissingRequiredFieldsTestProviders) {
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
policy_value.Append(GenerateSiteSearchPolicyEntry(test_case));
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_FALSE(handler.CheckPolicySettings(policies, &errors));
EXPECT_TRUE(errors.HasError(key::kSiteSearchSettings));
}
}
TEST(SiteSearchPolicyHandlerTest, ShortcutNotUnique) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
for (const auto& test_case : kShortcutNotUniqueTestProviders) {
policy_value.Append(GenerateSiteSearchPolicyEntry(test_case));
}
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_TRUE(handler.CheckPolicySettings(policies, &errors));
EXPECT_THAT(&errors, HasValidationError(l10n_util::GetStringFUTF16(
IDS_POLICY_SITE_SEARCH_SETTINGS_DUPLICATED_SHORTCUT,
u"work")));
handler.ApplyPolicySettings(policies, &prefs);
base::Value* providers = nullptr;
ASSERT_TRUE(prefs.GetValue(
EnterpriseSearchManager::kSiteSearchSettingsPrefName, &providers));
ASSERT_NE(providers, nullptr);
ASSERT_TRUE(providers->is_list());
EXPECT_THAT(providers->GetList(), ElementsAre(IsNonFeaturedSiteSearchEntry(
kShortcutNotUniqueTestProviders[2])));
}
TEST(SiteSearchPolicyHandlerTest, NoUniqueShortcut) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
for (const auto& test_case : kNoUniqueShortcutTestProviders) {
policy_value.Append(GenerateSiteSearchPolicyEntry(test_case));
}
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_FALSE(handler.CheckPolicySettings(policies, &errors));
EXPECT_THAT(&errors, HasValidationError(l10n_util::GetStringFUTF16(
IDS_POLICY_SITE_SEARCH_SETTINGS_DUPLICATED_SHORTCUT,
u"work")));
}
TEST(SiteSearchPolicyHandlerTest, EmptyRequiredField) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
for (const auto& test_case : kEmptyFieldTestProviders) {
policy_value.Append(GenerateSiteSearchPolicyEntry(test_case));
}
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_FALSE(handler.CheckPolicySettings(policies, &errors));
EXPECT_THAT(&errors, HasValidationError(l10n_util::GetStringUTF16(
IDS_SEARCH_POLICY_SETTINGS_SHORTCUT_IS_EMPTY)));
EXPECT_THAT(&errors, HasValidationError(l10n_util::GetStringUTF16(
IDS_SEARCH_POLICY_SETTINGS_NAME_IS_EMPTY)));
EXPECT_THAT(&errors, HasValidationError(l10n_util::GetStringUTF16(
IDS_SEARCH_POLICY_SETTINGS_URL_IS_EMPTY)));
}
TEST(SiteSearchPolicyHandlerTest, UnknownField) {
constexpr char kUnknownFieldName[] = "unknown_field";
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::Dict entry =
GenerateSiteSearchPolicyEntry(kUnknownFieldTestProviders[0]);
entry.Set(kUnknownFieldName, true);
base::Value::List policy_value;
policy_value.Append(std::move(entry));
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
// A warning is registered during policy validation, but valid fields are
// still used for building a new template URL.
ASSERT_TRUE(handler.CheckPolicySettings(policies, &errors));
EXPECT_FALSE(errors.empty());
handler.ApplyPolicySettings(policies, &prefs);
base::Value* providers = nullptr;
ASSERT_TRUE(prefs.GetValue(
EnterpriseSearchManager::kSiteSearchSettingsPrefName, &providers));
ASSERT_NE(providers, nullptr);
ASSERT_TRUE(providers->is_list());
EXPECT_THAT(
providers->GetList(),
ElementsAre(IsNonFeaturedSiteSearchEntry(kUnknownFieldTestProviders[0])));
}
TEST(SiteSearchPolicyHandlerTest, ShortcutWithSpace) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
for (const auto& test_case : kShortcutWithSpacesTestProviders) {
policy_value.Append(GenerateSiteSearchPolicyEntry(test_case));
}
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_FALSE(handler.CheckPolicySettings(policies, &errors));
for (const auto& test_case : kShortcutWithSpacesTestProviders) {
EXPECT_THAT(&errors, HasValidationError(l10n_util::GetStringFUTF16(
IDS_SEARCH_POLICY_SETTINGS_SHORTCUT_CONTAINS_SPACE,
base::UTF8ToUTF16(test_case.shortcut.value()))));
}
}
TEST(SiteSearchPolicyHandlerTest, ShortcutStartsWithAt) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
for (const auto& test_case : kShortcutStartsWithAtTestProviders) {
policy_value.Append(GenerateSiteSearchPolicyEntry(test_case));
}
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_TRUE(handler.CheckPolicySettings(policies, &errors));
EXPECT_THAT(
&errors,
HasValidationError(l10n_util::GetStringFUTF16(
IDS_SEARCH_POLICY_SETTINGS_SHORTCUT_STARTS_WITH_AT,
base::UTF8ToUTF16(
kShortcutStartsWithAtTestProviders[0].shortcut.value()))));
handler.ApplyPolicySettings(policies, &prefs);
base::Value* providers = nullptr;
ASSERT_TRUE(prefs.GetValue(
EnterpriseSearchManager::kSiteSearchSettingsPrefName, &providers));
ASSERT_NE(providers, nullptr);
ASSERT_TRUE(providers->is_list());
EXPECT_THAT(providers->GetList(),
ElementsAre(IsNonFeaturedSiteSearchEntry(
kShortcutStartsWithAtTestProviders[1])));
}
TEST(SiteSearchPolicyHandlerTest, InvalidUrl) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
for (const auto& test_case : kInvalidUrlTestProviders) {
policy_value.Append(GenerateSiteSearchPolicyEntry(test_case));
}
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_FALSE(handler.CheckPolicySettings(policies, &errors));
for (const auto& test_case : kInvalidUrlTestProviders) {
EXPECT_THAT(&errors,
HasValidationError(l10n_util::GetStringFUTF16(
IDS_SEARCH_POLICY_SETTINGS_URL_DOESNT_SUPPORT_REPLACEMENT,
base::UTF8ToUTF16(test_case.url.value()))));
}
}
TEST(SiteSearchPolicyHandlerTest, ShortcutSameAsDSPKeyword_DSPEnabledNotSet) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
for (const auto& test_case : kShortcutSameAsDSPKeywordTestProviders) {
policy_value.Append(GenerateSiteSearchPolicyEntry(test_case));
}
policies.Set(key::kDefaultSearchProviderKeyword,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_CLOUD, base::Value(kDSPKeyword), nullptr);
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_TRUE(handler.CheckPolicySettings(policies, &errors));
EXPECT_TRUE(errors.empty());
handler.ApplyPolicySettings(policies, &prefs);
base::Value* providers = nullptr;
ASSERT_TRUE(prefs.GetValue(
EnterpriseSearchManager::kSiteSearchSettingsPrefName, &providers));
ASSERT_NE(providers, nullptr);
ASSERT_TRUE(providers->is_list());
EXPECT_THAT(providers->GetList(),
ElementsAre(IsNonFeaturedSiteSearchEntry(
kShortcutSameAsDSPKeywordTestProviders[0]),
IsNonFeaturedSiteSearchEntry(
kShortcutSameAsDSPKeywordTestProviders[1])));
}
TEST(SiteSearchPolicyHandlerTest, ShortcutSameAsDSPKeyword_DSPDisabled) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
for (const auto& test_case : kShortcutSameAsDSPKeywordTestProviders) {
policy_value.Append(GenerateSiteSearchPolicyEntry(test_case));
}
policies.Set(key::kDefaultSearchProviderEnabled,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_CLOUD, base::Value(false), nullptr);
policies.Set(key::kDefaultSearchProviderKeyword,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_CLOUD, base::Value(kDSPKeyword), nullptr);
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_TRUE(handler.CheckPolicySettings(policies, &errors));
EXPECT_TRUE(errors.empty());
handler.ApplyPolicySettings(policies, &prefs);
base::Value* providers = nullptr;
ASSERT_TRUE(prefs.GetValue(
EnterpriseSearchManager::kSiteSearchSettingsPrefName, &providers));
ASSERT_NE(providers, nullptr);
ASSERT_TRUE(providers->is_list());
EXPECT_THAT(providers->GetList(),
ElementsAre(IsNonFeaturedSiteSearchEntry(
kShortcutSameAsDSPKeywordTestProviders[0]),
IsNonFeaturedSiteSearchEntry(
kShortcutSameAsDSPKeywordTestProviders[1])));
}
TEST(SiteSearchPolicyHandlerTest, ShortcutSameAsDSPKeyword_DSPEnabled) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
for (const auto& test_case : kShortcutSameAsDSPKeywordTestProviders) {
policy_value.Append(GenerateSiteSearchPolicyEntry(test_case));
}
policies.Set(key::kDefaultSearchProviderEnabled,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_CLOUD, base::Value(true), nullptr);
policies.Set(key::kDefaultSearchProviderKeyword,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_CLOUD, base::Value(kDSPKeyword), nullptr);
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_TRUE(handler.CheckPolicySettings(policies, &errors));
EXPECT_THAT(
&errors,
HasValidationError(l10n_util::GetStringFUTF16(
IDS_SEARCH_POLICY_SETTINGS_SHORTCUT_EQUALS_DSP_KEYWORD,
base::UTF8ToUTF16(
kShortcutSameAsDSPKeywordTestProviders[0].shortcut.value()))));
handler.ApplyPolicySettings(policies, &prefs);
base::Value* providers = nullptr;
ASSERT_TRUE(prefs.GetValue(
EnterpriseSearchManager::kSiteSearchSettingsPrefName, &providers));
ASSERT_NE(providers, nullptr);
ASSERT_TRUE(providers->is_list());
EXPECT_THAT(providers->GetList(),
ElementsAre(IsNonFeaturedSiteSearchEntry(
kShortcutSameAsDSPKeywordTestProviders[1])));
}
TEST(SiteSearchPolicyHandlerTest, NonHttpsUrl) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
policy_value.Append(
GenerateSiteSearchPolicyEntry(kNonHttpsUrlTestProviders[0]));
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_TRUE(handler.CheckPolicySettings(policies, &errors));
EXPECT_THAT(
&errors,
HasValidationError(l10n_util::GetStringFUTF16(
IDS_SEARCH_POLICY_SETTINGS_URL_NOT_HTTPS,
base::UTF8ToUTF16(kNonHttpsUrlTestProviders[0].url.value()))));
handler.ApplyPolicySettings(policies, &prefs);
base::Value* providers = nullptr;
ASSERT_TRUE(prefs.GetValue(
EnterpriseSearchManager::kSiteSearchSettingsPrefName, &providers));
ASSERT_NE(providers, nullptr);
ASSERT_TRUE(providers->is_list());
EXPECT_THAT(
providers->GetList(),
ElementsAre(IsNonFeaturedSiteSearchEntry(kNonHttpsUrlTestProviders[0])));
}
TEST(SiteSearchPolicyHandlerTest, NoValidEntry) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(base::Value::List()), nullptr);
ASSERT_FALSE(handler.CheckPolicySettings(policies, &errors));
EXPECT_THAT(&errors, HasValidationError(l10n_util::GetStringUTF16(
IDS_SEARCH_POLICY_SETTINGS_NO_VALID_PROVIDER)));
}
TEST(SiteSearchPolicyHandlerTest, FeaturedSiteSearchEntries) {
SiteSearchPolicyHandler handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
for (const auto& test_case : kTestProvidersWithFeaturedEntries) {
policy_value.Append(GenerateSiteSearchPolicyEntry(test_case));
}
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
ASSERT_TRUE(handler.CheckPolicySettings(policies, &errors));
EXPECT_TRUE(errors.empty());
handler.ApplyPolicySettings(policies, &prefs);
base::Value* providers = nullptr;
ASSERT_TRUE(prefs.GetValue(
EnterpriseSearchManager::kSiteSearchSettingsPrefName, &providers));
ASSERT_NE(providers, nullptr);
ASSERT_TRUE(providers->is_list());
EXPECT_THAT(
providers->GetList(),
ElementsAre(
IsNonFeaturedSiteSearchEntry(kTestProvidersWithFeaturedEntries[0]),
IsFeaturedSiteSearchEntry(kTestProvidersWithFeaturedEntries[0]),
IsNonFeaturedSiteSearchEntry(kTestProvidersWithFeaturedEntries[1]),
IsNonFeaturedSiteSearchEntry(kTestProvidersWithFeaturedEntries[2]),
IsFeaturedSiteSearchEntry(kTestProvidersWithFeaturedEntries[2])));
}
TEST(SiteSearchPolicyHandlerTest, ShortcutSameAsSearchAggregatorKeyword) {
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitAndEnableFeature(
omnibox::kEnableSearchAggregatorPolicy);
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
policy_value.Append(
GenerateSiteSearchPolicyEntry(kSiteSearchShortcutSameAsSearchAggregator));
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
policies.Set(key::kEnterpriseSearchAggregatorSettings,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_CLOUD,
base::Value(GenerateSearchAggregatorPolicyEntry(
kSearchAggregatorShortcutSameAsSiteSearch)),
nullptr);
SearchAggregatorPolicyHandler sap_handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
sap_handler.ApplyPolicySettings(policies, &prefs);
ASSERT_TRUE(sap_handler.CheckPolicySettings(policies, &errors));
SiteSearchPolicyHandler ssp_handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
ASSERT_FALSE(ssp_handler.CheckPolicySettings(policies, &errors));
EXPECT_THAT(
&errors,
HasValidationError(l10n_util::GetStringFUTF16(
IDS_POLICY_SITE_SEARCH_SETTINGS_SHORTCUT_EQUALS_SEARCH_AGGREGATOR_KEYWORD,
base::UTF8ToUTF16(
kSiteSearchShortcutSameAsSearchAggregator.shortcut.value()))));
}
TEST(SiteSearchPolicyHandlerTest,
ShortcutDifferentThanSearchAggregatorKeyword) {
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitAndEnableFeature(
omnibox::kEnableSearchAggregatorPolicy);
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
policy_value.Append(GenerateSiteSearchPolicyEntry(kValidTestProviders[0]));
policy_value.Append(GenerateSiteSearchPolicyEntry(kValidTestProviders[1]));
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
policies.Set(key::kEnterpriseSearchAggregatorSettings,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_CLOUD,
base::Value(GenerateSearchAggregatorPolicyEntry(
kSearchAggregatorSettingWithShortcut)),
nullptr);
SearchAggregatorPolicyHandler sap_handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
sap_handler.ApplyPolicySettings(policies, &prefs);
ASSERT_TRUE(sap_handler.CheckPolicySettings(policies, &errors));
SiteSearchPolicyHandler ssp_handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
ssp_handler.ApplyPolicySettings(policies, &prefs);
ASSERT_TRUE(ssp_handler.CheckPolicySettings(policies, &errors));
}
TEST(SiteSearchPolicyHandlerTest, SearchAggregatorPolicyTypeMismatch) {
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitAndEnableFeature(
omnibox::kEnableSearchAggregatorPolicy);
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
policy_value.Append(
GenerateSiteSearchPolicyEntry(kSiteSearchShortcutSameAsSearchAggregator));
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
policies.Set(key::kEnterpriseSearchAggregatorSettings,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_CLOUD,
base::Value(kMismatchedSearchAggregatorSettingsType), nullptr);
SearchAggregatorPolicyHandler sap_handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
sap_handler.ApplyPolicySettings(policies, &prefs);
ASSERT_FALSE(sap_handler.CheckPolicySettings(policies, &errors));
SiteSearchPolicyHandler ssp_handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
ASSERT_TRUE(ssp_handler.CheckPolicySettings(policies, &errors));
}
TEST(SiteSearchPolicyHandlerTest, SearchAggregatorPolicyMissingShortcut) {
base::test::ScopedFeatureList scoped_feature_list;
scoped_feature_list.InitAndEnableFeature(
omnibox::kEnableSearchAggregatorPolicy);
policy::PolicyMap policies;
PolicyErrorMap errors;
PrefValueMap prefs;
base::Value::List policy_value;
policy_value.Append(
GenerateSiteSearchPolicyEntry(kSiteSearchShortcutSameAsSearchAggregator));
policies.Set(key::kSiteSearchSettings, policy::POLICY_LEVEL_MANDATORY,
policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD,
base::Value(std::move(policy_value)), nullptr);
policies.Set(key::kEnterpriseSearchAggregatorSettings,
policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER,
policy::POLICY_SOURCE_CLOUD,
base::Value(GenerateSearchAggregatorPolicyEntry(
kSearchAggregatorWithoutShortcut)),
nullptr);
SearchAggregatorPolicyHandler sap_handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
ASSERT_FALSE(sap_handler.CheckPolicySettings(policies, &errors));
SiteSearchPolicyHandler ssp_handler(
policy::Schema::Wrap(policy::GetChromeSchemaData()));
ASSERT_TRUE(ssp_handler.CheckPolicySettings(policies, &errors));
}
} // namespace policy