| Index: chrome/browser/managed_mode/managed_user_shared_settings_service_unittest.cc
|
| diff --git a/chrome/browser/managed_mode/managed_user_shared_settings_service_unittest.cc b/chrome/browser/managed_mode/managed_user_shared_settings_service_unittest.cc
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..393113e531df8f5d6bb34edcc0c999df904e0875
|
| --- /dev/null
|
| +++ b/chrome/browser/managed_mode/managed_user_shared_settings_service_unittest.cc
|
| @@ -0,0 +1,300 @@
|
| +// Copyright 2013 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 "base/bind.h"
|
| +#include "base/json/json_writer.h"
|
| +#include "base/prefs/pref_service.h"
|
| +#include "chrome/browser/managed_mode/managed_user_shared_settings_service.h"
|
| +#include "chrome/common/pref_names.h"
|
| +#include "chrome/test/base/testing_profile.h"
|
| +#include "sync/api/sync_change.h"
|
| +#include "sync/api/sync_error_factory_mock.h"
|
| +#include "sync/protocol/sync.pb.h"
|
| +#include "testing/gtest/include/gtest/gtest.h"
|
| +
|
| +using base::DictionaryValue;
|
| +using base::FundamentalValue;
|
| +using base::StringValue;
|
| +using base::Value;
|
| +using sync_pb::ManagedUserSharedSettingSpecifics;
|
| +using syncer::MANAGED_USER_SHARED_SETTINGS;
|
| +using syncer::SyncChange;
|
| +using syncer::SyncChangeList;
|
| +using syncer::SyncChangeProcessor;
|
| +using syncer::SyncData;
|
| +using syncer::SyncDataList;
|
| +using syncer::SyncError;
|
| +using syncer::SyncErrorFactory;
|
| +using syncer::SyncMergeResult;
|
| +
|
| +namespace {
|
| +
|
| +class MockChangeProcessor : public syncer::SyncChangeProcessor {
|
| + public:
|
| + MockChangeProcessor() {}
|
| + virtual ~MockChangeProcessor() {}
|
| +
|
| + // SyncChangeProcessor implementation:
|
| + virtual syncer::SyncError ProcessSyncChanges(
|
| + const tracked_objects::Location& from_here,
|
| + const syncer::SyncChangeList& change_list) OVERRIDE;
|
| + virtual syncer::SyncDataList GetAllSyncData(syncer::ModelType type) const
|
| + OVERRIDE;
|
| +
|
| + const syncer::SyncChangeList& changes() const { return change_list_; }
|
| +
|
| + private:
|
| + syncer::SyncChangeList change_list_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(MockChangeProcessor);
|
| +};
|
| +
|
| +syncer::SyncError MockChangeProcessor::ProcessSyncChanges(
|
| + const tracked_objects::Location& from_here,
|
| + const syncer::SyncChangeList& change_list) {
|
| + change_list_ = change_list;
|
| + return syncer::SyncError();
|
| +}
|
| +
|
| +syncer::SyncDataList
|
| +MockChangeProcessor::GetAllSyncData(syncer::ModelType type) const {
|
| + return syncer::SyncDataList();
|
| +}
|
| +
|
| +class MockSyncErrorFactory : public syncer::SyncErrorFactory {
|
| + public:
|
| + explicit MockSyncErrorFactory(syncer::ModelType type);
|
| + virtual ~MockSyncErrorFactory();
|
| +
|
| + // SyncErrorFactory implementation:
|
| + virtual syncer::SyncError CreateAndUploadError(
|
| + const tracked_objects::Location& location,
|
| + const std::string& message) OVERRIDE;
|
| +
|
| + private:
|
| + syncer::ModelType type_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(MockSyncErrorFactory);
|
| +};
|
| +
|
| +MockSyncErrorFactory::MockSyncErrorFactory(syncer::ModelType type)
|
| + : type_(type) {}
|
| +
|
| +MockSyncErrorFactory::~MockSyncErrorFactory() {}
|
| +
|
| +syncer::SyncError MockSyncErrorFactory::CreateAndUploadError(
|
| + const tracked_objects::Location& location,
|
| + const std::string& message) {
|
| + return syncer::SyncError(location, SyncError::DATATYPE_ERROR, message, type_);
|
| +}
|
| +
|
| +// Convenience method to allow us to use EXPECT_EQ to compare values.
|
| +std::string ToJson(const Value* value) {
|
| + if (!value)
|
| + return std::string();
|
| +
|
| + std::string json_value;
|
| + base::JSONWriter::Write(value, &json_value);
|
| + return json_value;
|
| +}
|
| +
|
| +} // namespace
|
| +
|
| +class ManagedUserSharedSettingsServiceTest : public ::testing::Test {
|
| + protected:
|
| + typedef base::CallbackList<void(const std::string&, const std::string&)>
|
| + CallbackList;
|
| +
|
| + ManagedUserSharedSettingsServiceTest()
|
| + : settings_service_(profile_.GetPrefs()) {}
|
| + virtual ~ManagedUserSharedSettingsServiceTest() {}
|
| +
|
| + void StartSyncing(const syncer::SyncDataList& initial_sync_data) {
|
| + sync_processor_ = new MockChangeProcessor();
|
| + scoped_ptr<syncer::SyncErrorFactory> error_handler(
|
| + new MockSyncErrorFactory(MANAGED_USER_SHARED_SETTINGS));
|
| + SyncMergeResult result = settings_service_.MergeDataAndStartSyncing(
|
| + MANAGED_USER_SHARED_SETTINGS,
|
| + initial_sync_data,
|
| + scoped_ptr<SyncChangeProcessor>(sync_processor_),
|
| + error_handler.Pass());
|
| + EXPECT_FALSE(result.error().IsSet());
|
| + }
|
| +
|
| + const base::DictionaryValue* GetAllSettings() {
|
| + return profile_.GetPrefs()->GetDictionary(
|
| + prefs::kManagedUserSharedSettings);
|
| + }
|
| +
|
| + void VerifySyncChanges() {
|
| + const SyncChangeList& changes = sync_processor_->changes();
|
| + for (SyncChangeList::const_iterator it = changes.begin();
|
| + it != changes.end();
|
| + ++it) {
|
| + const sync_pb::ManagedUserSharedSettingSpecifics& setting =
|
| + it->sync_data().GetSpecifics().managed_user_shared_setting();
|
| + EXPECT_EQ(
|
| + setting.value(),
|
| + ToJson(settings_service_.GetValue(setting.mu_id(), setting.key())));
|
| + }
|
| + }
|
| +
|
| + // testing::Test overrides:
|
| + virtual void SetUp() OVERRIDE {
|
| + subscription_ = settings_service_.Subscribe(
|
| + base::Bind(&ManagedUserSharedSettingsServiceTest::OnSettingChanged,
|
| + base::Unretained(this)));
|
| + }
|
| +
|
| + virtual void TearDown() OVERRIDE { settings_service_.Shutdown(); }
|
| +
|
| + void OnSettingChanged(const std::string& mu_id, const std::string& key) {
|
| + const Value* value = settings_service_.GetValue(mu_id, key);
|
| + ASSERT_TRUE(value);
|
| + changed_settings_.push_back(
|
| + ManagedUserSharedSettingsService::CreateSyncDataForSetting(
|
| + mu_id, key, *value, true));
|
| + }
|
| +
|
| + TestingProfile profile_;
|
| + ManagedUserSharedSettingsService settings_service_;
|
| + SyncDataList changed_settings_;
|
| +
|
| + scoped_ptr<CallbackList::Subscription> subscription_;
|
| +
|
| + // Owned by the ManagedUserSettingsService.
|
| + MockChangeProcessor* sync_processor_;
|
| +};
|
| +
|
| +TEST_F(ManagedUserSharedSettingsServiceTest, Empty) {
|
| + StartSyncing(SyncDataList());
|
| + EXPECT_EQ(0u, sync_processor_->changes().size());
|
| + EXPECT_EQ(0u, changed_settings_.size());
|
| + EXPECT_EQ(
|
| + 0u,
|
| + settings_service_.GetAllSyncData(MANAGED_USER_SHARED_SETTINGS).size());
|
| + EXPECT_EQ(0u, GetAllSettings()->size());
|
| +}
|
| +
|
| +TEST_F(ManagedUserSharedSettingsServiceTest, SetAndGet) {
|
| + StartSyncing(SyncDataList());
|
| +
|
| + const char kIdA[] = "aaaaaa";
|
| + const char kIdB[] = "bbbbbb";
|
| + const char kIdC[] = "cccccc";
|
| +
|
| + StringValue name("Jack");
|
| + FundamentalValue age(8);
|
| + StringValue bar("bar");
|
| + settings_service_.SetValue(kIdA, "name", name);
|
| + ASSERT_EQ(1u, sync_processor_->changes().size());
|
| + VerifySyncChanges();
|
| + settings_service_.SetValue(kIdA, "age", FundamentalValue(6));
|
| + ASSERT_EQ(1u, sync_processor_->changes().size());
|
| + VerifySyncChanges();
|
| + settings_service_.SetValue(kIdA, "age", age);
|
| + ASSERT_EQ(1u, sync_processor_->changes().size());
|
| + VerifySyncChanges();
|
| + settings_service_.SetValue(kIdB, "foo", bar);
|
| + ASSERT_EQ(1u, sync_processor_->changes().size());
|
| + VerifySyncChanges();
|
| +
|
| + EXPECT_EQ(
|
| + 3u,
|
| + settings_service_.GetAllSyncData(MANAGED_USER_SHARED_SETTINGS).size());
|
| +
|
| + EXPECT_EQ(ToJson(&name), ToJson(settings_service_.GetValue(kIdA, "name")));
|
| + EXPECT_EQ(ToJson(&age), ToJson(settings_service_.GetValue(kIdA, "age")));
|
| + EXPECT_EQ(ToJson(&bar), ToJson(settings_service_.GetValue(kIdB, "foo")));
|
| + EXPECT_FALSE(settings_service_.GetValue(kIdA, "foo"));
|
| + EXPECT_FALSE(settings_service_.GetValue(kIdB, "name"));
|
| + EXPECT_FALSE(settings_service_.GetValue(kIdC, "name"));
|
| +}
|
| +
|
| +TEST_F(ManagedUserSharedSettingsServiceTest, Merge) {
|
| + // Set initial values, then stop syncing so we can restart.
|
| + StartSyncing(SyncDataList());
|
| +
|
| + const char kIdA[] = "aaaaaa";
|
| + const char kIdB[] = "bbbbbb";
|
| + const char kIdC[] = "cccccc";
|
| +
|
| + FundamentalValue age(8);
|
| + StringValue bar("bar");
|
| + settings_service_.SetValue(kIdA, "name", StringValue("Jack"));
|
| + settings_service_.SetValue(kIdA, "age", age);
|
| + settings_service_.SetValue(kIdB, "foo", bar);
|
| +
|
| + settings_service_.StopSyncing(MANAGED_USER_SHARED_SETTINGS);
|
| +
|
| + StringValue name("Jill");
|
| + StringValue blurp("blurp");
|
| + SyncDataList sync_data;
|
| + sync_data.push_back(
|
| + ManagedUserSharedSettingsService::CreateSyncDataForSetting(
|
| + kIdA, "name", name, true));
|
| + sync_data.push_back(
|
| + ManagedUserSharedSettingsService::CreateSyncDataForSetting(
|
| + kIdC, "baz", blurp, true));
|
| +
|
| + StartSyncing(sync_data);
|
| + EXPECT_EQ(2u, sync_processor_->changes().size());
|
| + VerifySyncChanges();
|
| + EXPECT_EQ(2u, changed_settings_.size());
|
| +
|
| + EXPECT_EQ(
|
| + 4u,
|
| + settings_service_.GetAllSyncData(MANAGED_USER_SHARED_SETTINGS).size());
|
| + EXPECT_EQ(ToJson(&name),
|
| + ToJson(settings_service_.GetValue(kIdA, "name")));
|
| + EXPECT_EQ(ToJson(&age), ToJson(settings_service_.GetValue(kIdA, "age")));
|
| + EXPECT_EQ(ToJson(&bar), ToJson(settings_service_.GetValue(kIdB, "foo")));
|
| + EXPECT_EQ(ToJson(&blurp), ToJson(settings_service_.GetValue(kIdC, "baz")));
|
| + EXPECT_FALSE(settings_service_.GetValue(kIdA, "foo"));
|
| + EXPECT_FALSE(settings_service_.GetValue(kIdB, "name"));
|
| + EXPECT_FALSE(settings_service_.GetValue(kIdC, "name"));
|
| +}
|
| +
|
| +TEST_F(ManagedUserSharedSettingsServiceTest, ProcessChanges) {
|
| + StartSyncing(SyncDataList());
|
| +
|
| + const char kIdA[] = "aaaaaa";
|
| + const char kIdB[] = "bbbbbb";
|
| + const char kIdC[] = "cccccc";
|
| +
|
| + FundamentalValue age(8);
|
| + StringValue bar("bar");
|
| + settings_service_.SetValue(kIdA, "name", StringValue("Jack"));
|
| + settings_service_.SetValue(kIdA, "age", age);
|
| + settings_service_.SetValue(kIdB, "foo", bar);
|
| +
|
| + StringValue name("Jill");
|
| + StringValue blurp("blurp");
|
| + SyncChangeList changes;
|
| + changes.push_back(
|
| + SyncChange(FROM_HERE,
|
| + SyncChange::ACTION_UPDATE,
|
| + ManagedUserSharedSettingsService::CreateSyncDataForSetting(
|
| + kIdA, "name", name, true)));
|
| + changes.push_back(
|
| + SyncChange(FROM_HERE,
|
| + SyncChange::ACTION_ADD,
|
| + ManagedUserSharedSettingsService::CreateSyncDataForSetting(
|
| + kIdC, "baz", blurp, true)));
|
| + SyncError error = settings_service_.ProcessSyncChanges(FROM_HERE, changes);
|
| + EXPECT_FALSE(error.IsSet()) << error.ToString();
|
| + EXPECT_EQ(2u, changed_settings_.size());
|
| +
|
| + EXPECT_EQ(
|
| + 4u,
|
| + settings_service_.GetAllSyncData(MANAGED_USER_SHARED_SETTINGS).size());
|
| + EXPECT_EQ(ToJson(&name),
|
| + ToJson(settings_service_.GetValue(kIdA, "name")));
|
| + EXPECT_EQ(ToJson(&age), ToJson(settings_service_.GetValue(kIdA, "age")));
|
| + EXPECT_EQ(ToJson(&bar), ToJson(settings_service_.GetValue(kIdB, "foo")));
|
| + EXPECT_EQ(ToJson(&blurp), ToJson(settings_service_.GetValue(kIdC, "baz")));
|
| + EXPECT_FALSE(settings_service_.GetValue(kIdA, "foo"));
|
| + EXPECT_FALSE(settings_service_.GetValue(kIdB, "name"));
|
| + EXPECT_FALSE(settings_service_.GetValue(kIdC, "name"));
|
| +}
|
|
|