blob: 4044def25c7077bfd3435a1d50a7d778bb830b2d [file] [log] [blame]
// Copyright 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 <set>
#include <string>
#include "base/memory/ref_counted.h"
#include "base/values.h"
#include "chrome/browser/supervised_user/supervised_user_constants.h"
#include "chrome/browser/supervised_user/supervised_user_pref_store.h"
#include "chrome/browser/supervised_user/supervised_user_settings_service.h"
#include "chrome/common/net/safe_search_util.h"
#include "chrome/common/pref_names.h"
#include "components/prefs/testing_pref_store.h"
#include "testing/gtest/include/gtest/gtest.h"
using base::DictionaryValue;
using base::Value;
namespace {
class SupervisedUserPrefStoreFixture : public PrefStore::Observer {
public:
explicit SupervisedUserPrefStoreFixture(
SupervisedUserSettingsService* settings_service);
~SupervisedUserPrefStoreFixture() override;
base::DictionaryValue* changed_prefs() {
return &changed_prefs_;
}
bool initialization_completed() const {
return initialization_completed_;
}
// PrefStore::Observer implementation:
void OnPrefValueChanged(const std::string& key) override;
void OnInitializationCompleted(bool succeeded) override;
private:
scoped_refptr<SupervisedUserPrefStore> pref_store_;
base::DictionaryValue changed_prefs_;
bool initialization_completed_;
};
SupervisedUserPrefStoreFixture::SupervisedUserPrefStoreFixture(
SupervisedUserSettingsService* settings_service)
: pref_store_(new SupervisedUserPrefStore(settings_service)),
initialization_completed_(pref_store_->IsInitializationComplete()) {
pref_store_->AddObserver(this);
}
SupervisedUserPrefStoreFixture::~SupervisedUserPrefStoreFixture() {
pref_store_->RemoveObserver(this);
}
void SupervisedUserPrefStoreFixture::OnPrefValueChanged(
const std::string& key) {
const base::Value* value = NULL;
ASSERT_TRUE(pref_store_->GetValue(key, &value));
changed_prefs_.Set(key, std::make_unique<base::Value>(value->Clone()));
}
void SupervisedUserPrefStoreFixture::OnInitializationCompleted(bool succeeded) {
EXPECT_FALSE(initialization_completed_);
EXPECT_TRUE(succeeded);
EXPECT_TRUE(pref_store_->IsInitializationComplete());
initialization_completed_ = true;
}
} // namespace
class SupervisedUserPrefStoreTest : public ::testing::Test {
public:
SupervisedUserPrefStoreTest() : service_(nullptr) {}
void SetUp() override;
void TearDown() override;
protected:
SupervisedUserSettingsService service_;
scoped_refptr<TestingPrefStore> pref_store_;
};
void SupervisedUserPrefStoreTest::SetUp() {
pref_store_ = new TestingPrefStore();
service_.Init(pref_store_);
}
void SupervisedUserPrefStoreTest::TearDown() {
service_.Shutdown();
}
TEST_F(SupervisedUserPrefStoreTest, ConfigureSettings) {
SupervisedUserPrefStoreFixture fixture(&service_);
EXPECT_FALSE(fixture.initialization_completed());
// Prefs should not change yet when the service is ready, but not
// activated yet.
pref_store_->SetInitializationCompleted();
EXPECT_TRUE(fixture.initialization_completed());
EXPECT_EQ(0u, fixture.changed_prefs()->size());
service_.SetActive(true);
// kAllowDeletingBrowserHistory is hardcoded to false for supervised users.
bool allow_deleting_browser_history = true;
EXPECT_TRUE(fixture.changed_prefs()->GetBoolean(
prefs::kAllowDeletingBrowserHistory, &allow_deleting_browser_history));
EXPECT_FALSE(allow_deleting_browser_history);
// kSupervisedModeManualHosts does not have a hardcoded value.
base::DictionaryValue* manual_hosts = NULL;
EXPECT_FALSE(fixture.changed_prefs()->GetDictionary(
prefs::kSupervisedUserManualHosts, &manual_hosts));
// kForceGoogleSafeSearch defaults to true and kForceYouTubeRestrict defaults
// to Moderate for supervised users.
bool force_google_safesearch = false;
int force_youtube_restrict = safe_search_util::YOUTUBE_RESTRICT_OFF;
EXPECT_TRUE(fixture.changed_prefs()->GetBoolean(prefs::kForceGoogleSafeSearch,
&force_google_safesearch));
EXPECT_TRUE(fixture.changed_prefs()->GetInteger(prefs::kForceYouTubeRestrict,
&force_youtube_restrict));
EXPECT_TRUE(force_google_safesearch);
EXPECT_EQ(force_youtube_restrict,
safe_search_util::YOUTUBE_RESTRICT_MODERATE);
// Activating the service again should not change anything.
fixture.changed_prefs()->Clear();
service_.SetActive(true);
EXPECT_EQ(0u, fixture.changed_prefs()->size());
// kSupervisedModeManualHosts can be configured by the custodian.
std::unique_ptr<base::DictionaryValue> dict(new base::DictionaryValue);
dict->SetBoolean("example.com", true);
dict->SetBoolean("moose.org", false);
service_.SetLocalSetting(supervised_users::kContentPackManualBehaviorHosts,
std::unique_ptr<base::Value>(dict->DeepCopy()));
EXPECT_EQ(1u, fixture.changed_prefs()->size());
ASSERT_TRUE(fixture.changed_prefs()->GetDictionary(
prefs::kSupervisedUserManualHosts, &manual_hosts));
EXPECT_TRUE(manual_hosts->Equals(dict.get()));
// kForceGoogleSafeSearch and kForceYouTubeRestrict can be configured by the
// custodian, overriding the hardcoded default.
fixture.changed_prefs()->Clear();
service_.SetLocalSetting(
supervised_users::kForceSafeSearch,
std::unique_ptr<base::Value>(new base::Value(false)));
EXPECT_EQ(1u, fixture.changed_prefs()->size());
EXPECT_TRUE(fixture.changed_prefs()->GetBoolean(prefs::kForceGoogleSafeSearch,
&force_google_safesearch));
EXPECT_TRUE(fixture.changed_prefs()->GetInteger(prefs::kForceYouTubeRestrict,
&force_youtube_restrict));
EXPECT_FALSE(force_google_safesearch);
EXPECT_EQ(force_youtube_restrict, safe_search_util::YOUTUBE_RESTRICT_OFF);
}
TEST_F(SupervisedUserPrefStoreTest, ActivateSettingsBeforeInitialization) {
SupervisedUserPrefStoreFixture fixture(&service_);
EXPECT_FALSE(fixture.initialization_completed());
service_.SetActive(true);
EXPECT_FALSE(fixture.initialization_completed());
EXPECT_EQ(0u, fixture.changed_prefs()->size());
pref_store_->SetInitializationCompleted();
EXPECT_TRUE(fixture.initialization_completed());
EXPECT_EQ(0u, fixture.changed_prefs()->size());
}
TEST_F(SupervisedUserPrefStoreTest, CreatePrefStoreAfterInitialization) {
pref_store_->SetInitializationCompleted();
service_.SetActive(true);
SupervisedUserPrefStoreFixture fixture(&service_);
EXPECT_TRUE(fixture.initialization_completed());
EXPECT_EQ(0u, fixture.changed_prefs()->size());
}