1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// found in the LICENSE file. 458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/bind.h" 658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/callback.h" 758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/json/json_reader.h" 858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/prefs/testing_pref_store.h" 958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "base/strings/string_util.h" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_settings_service.h" 11a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "sync/api/fake_sync_change_processor.h" 1258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "sync/api/sync_change.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "sync/api/sync_change_processor_wrapper_for_test.h" 1458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "sync/api/sync_error_factory_mock.h" 1558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "sync/protocol/sync.pb.h" 1658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 1758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)namespace { 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)class MockSyncErrorFactory : public syncer::SyncErrorFactory { 2158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) public: 2258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) explicit MockSyncErrorFactory(syncer::ModelType type); 2358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual ~MockSyncErrorFactory(); 2458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 2558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // SyncErrorFactory implementation: 2658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual syncer::SyncError CreateAndUploadError( 2758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const tracked_objects::Location& location, 2858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& message) OVERRIDE; 2958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) private: 3158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::ModelType type_; 3258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(MockSyncErrorFactory); 3458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 3558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MockSyncErrorFactory::MockSyncErrorFactory(syncer::ModelType type) 3758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) : type_(type) {} 3858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 3958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)MockSyncErrorFactory::~MockSyncErrorFactory() {} 4058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 4158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)syncer::SyncError MockSyncErrorFactory::CreateAndUploadError( 4258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const tracked_objects::Location& location, 4358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const std::string& message) { 4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) return syncer::SyncError(location, 4558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::SyncError::DATATYPE_ERROR, 4658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) message, 4758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) type_); 4858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 4958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} // namespace 5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kAtomicItemName[] = "X-Wombat"; 5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kSettingsName[] = "TestingSetting"; 5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kSettingsValue[] = "SettingsValue"; 5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)const char kSplitItemName[] = "X-SuperMoosePowers"; 5658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class SupervisedUserSettingsServiceTest : public ::testing::Test { 5858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) protected: 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsServiceTest() {} 60f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual ~SupervisedUserSettingsServiceTest() {} 6158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<syncer::SyncChangeProcessor> CreateSyncProcessor() { 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_processor_.reset(new syncer::FakeSyncChangeProcessor); 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return scoped_ptr<syncer::SyncChangeProcessor>( 65a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new syncer::SyncChangeProcessorWrapperForTest(sync_processor_.get())); 6658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 6758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 6858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void StartSyncing(const syncer::SyncDataList& initial_sync_data) { 6958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<syncer::SyncErrorFactory> error_handler( 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new MockSyncErrorFactory(syncer::SUPERVISED_USER_SETTINGS)); 7158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::SyncMergeResult result = settings_service_.MergeDataAndStartSyncing( 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) syncer::SUPERVISED_USER_SETTINGS, 7358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) initial_sync_data, 7458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) CreateSyncProcessor(), 7558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) error_handler.Pass()); 7658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(result.error().IsSet()); 7758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 7858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 7958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void UploadSplitItem(const std::string& key, const std::string& value) { 8058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) split_items_.SetStringWithoutPathExpansion(key, value); 8158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings_service_.UploadItem( 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsService::MakeSplitSettingKey(kSplitItemName, 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) key), 8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<base::Value>(new base::StringValue(value))); 8558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 8658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 8758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void UploadAtomicItem(const std::string& value) { 8858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) atomic_setting_value_.reset(new base::StringValue(value)); 8958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings_service_.UploadItem( 9058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kAtomicItemName, 9158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<base::Value>(new base::StringValue(value))); 9258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 9358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 9458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void VerifySyncDataItem(syncer::SyncData sync_data) { 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const sync_pb::ManagedUserSettingSpecifics& supervised_user_setting = 9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) sync_data.GetSpecifics().managed_user_setting(); 9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Value* expected_value = NULL; 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (supervised_user_setting.name() == kAtomicItemName) { 9958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) expected_value = atomic_setting_value_.get(); 10058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } else { 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_TRUE(StartsWithASCII(supervised_user_setting.name(), 10258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string(kSplitItemName) + ':', 10358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) true)); 10458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string key = 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) supervised_user_setting.name().substr(strlen(kSplitItemName) + 1); 10658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(split_items_.GetWithoutPathExpansion(key, &expected_value)); 10758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 10858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) scoped_ptr<base::Value> value( 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::JSONReader::Read(supervised_user_setting.value())); 11158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(expected_value->Equals(value.get())); 11258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 11358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 11458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) void OnNewSettingsAvailable(const base::DictionaryValue* settings) { 11558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) if (!settings) 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings_.reset(); 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) else 11858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings_.reset(settings->DeepCopy()); 11958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 12058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 12158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // testing::Test overrides: 12258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void SetUp() OVERRIDE { 12358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) TestingPrefStore* pref_store = new TestingPrefStore; 12458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings_service_.Init(pref_store); 12558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings_service_.Subscribe( 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&SupervisedUserSettingsServiceTest::OnNewSettingsAvailable, 12758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::Unretained(this))); 12858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) pref_store->SetInitializationCompleted(); 12958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_FALSE(settings_); 130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) settings_service_.SetActive(true); 13158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(settings_); 13258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 13358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) virtual void TearDown() OVERRIDE { 13558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings_service_.Shutdown(); 13658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::DictionaryValue split_items_; 13958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<base::Value> atomic_setting_value_; 140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsService settings_service_; 14158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<base::DictionaryValue> settings_; 14258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 143a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) scoped_ptr<syncer::FakeSyncChangeProcessor> sync_processor_; 14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}; 14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserSettingsServiceTest, ProcessAtomicSetting) { 14758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartSyncing(syncer::SyncDataList()); 14858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(settings_); 14958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::Value* value = NULL; 15058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(settings_->GetWithoutPathExpansion(kSettingsName, &value)); 15158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 15258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings_.reset(); 15358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::SyncData data = 154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsService::CreateSyncDataForSetting( 15558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kSettingsName, base::StringValue(kSettingsValue)); 15658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::SyncChangeList change_list; 15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) change_list.push_back( 15858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::SyncChange(FROM_HERE, syncer::SyncChange::ACTION_ADD, data)); 15958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::SyncError error = 16058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings_service_.ProcessSyncChanges(FROM_HERE, change_list); 16158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(error.IsSet()) << error.ToString(); 16258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(settings_); 16358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(settings_->GetWithoutPathExpansion(kSettingsName, &value)); 16458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string string_value; 16558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&string_value)); 16658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(kSettingsValue, string_value); 16758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 16858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserSettingsServiceTest, ProcessSplitSetting) { 17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartSyncing(syncer::SyncDataList()); 17158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(settings_); 17258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::Value* value = NULL; 17358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(settings_->GetWithoutPathExpansion(kSettingsName, &value)); 17458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 17558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) base::DictionaryValue dict; 17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) dict.SetString("foo", "bar"); 17758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) dict.SetBoolean("awesomesauce", true); 17858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) dict.SetInteger("eaudecologne", 4711); 17958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 18058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings_.reset(); 18158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::SyncChangeList change_list; 18258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (base::DictionaryValue::Iterator it(dict); !it.IsAtEnd(); it.Advance()) { 18358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::SyncData data = 184f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsService::CreateSyncDataForSetting( 185f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SupervisedUserSettingsService::MakeSplitSettingKey(kSettingsName, 186f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) it.key()), 18758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) it.value()); 18858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) change_list.push_back( 18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::SyncChange(FROM_HERE, syncer::SyncChange::ACTION_ADD, data)); 19058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::SyncError error = 19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings_service_.ProcessSyncChanges(FROM_HERE, change_list); 19358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(error.IsSet()) << error.ToString(); 19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(settings_); 19558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(settings_->GetWithoutPathExpansion(kSettingsName, &value)); 19658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::DictionaryValue* dict_value = NULL; 19758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(value->GetAsDictionary(&dict_value)); 19858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(dict_value->Equals(&dict)); 19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 20058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 201f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserSettingsServiceTest, SetLocalSetting) { 20258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::Value* value = NULL; 20358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(settings_->GetWithoutPathExpansion(kSettingsName, &value)); 20458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 20558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings_.reset(); 20658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) settings_service_.SetLocalSettingForTesting( 20758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) kSettingsName, 20858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) scoped_ptr<base::Value>(new base::StringValue(kSettingsValue))); 20958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(settings_); 21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(settings_->GetWithoutPathExpansion(kSettingsName, &value)); 21158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) std::string string_value; 21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_TRUE(value->GetAsString(&string_value)); 21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(kSettingsValue, string_value); 21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 21558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 216f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserSettingsServiceTest, UploadItem) { 21758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UploadSplitItem("foo", "bar"); 21858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UploadSplitItem("blurp", "baz"); 21958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UploadAtomicItem("hurdle"); 22058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 22158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Uploading should produce changes when we start syncing. 22258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartSyncing(syncer::SyncDataList()); 223a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ASSERT_EQ(3u, sync_processor_->changes().size()); 224a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) for (syncer::SyncChangeList::const_iterator it = 225a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_processor_->changes().begin(); 226a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) it != sync_processor_->changes().end(); 227a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) ++it) { 22858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(it->IsValid()); 22958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(syncer::SyncChange::ACTION_ADD, it->change_type()); 23058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) VerifySyncDataItem(it->sync_data()); 23158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 23258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // It should also show up in local Sync data. 23458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::SyncDataList sync_data = 235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) settings_service_.GetAllSyncData(syncer::SUPERVISED_USER_SETTINGS); 23658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(3u, sync_data.size()); 23758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (syncer::SyncDataList::const_iterator it = sync_data.begin(); 23858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) it != sync_data.end(); ++it) { 23958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) VerifySyncDataItem(*it); 24058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 24158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 24258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Uploading after we have started syncing should work too. 243a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_processor_->changes().clear(); 24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UploadSplitItem("froodle", "narf"); 24558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(1u, sync_processor_->changes().size()); 24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) syncer::SyncChange change = sync_processor_->changes()[0]; 24758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(change.IsValid()); 24858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(syncer::SyncChange::ACTION_ADD, change.change_type()); 24958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) VerifySyncDataItem(change.sync_data()); 25058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) sync_data = settings_service_.GetAllSyncData( 252f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) syncer::SUPERVISED_USER_SETTINGS); 25358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(4u, sync_data.size()); 25458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (syncer::SyncDataList::const_iterator it = sync_data.begin(); 25558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) it != sync_data.end(); ++it) { 25658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) VerifySyncDataItem(*it); 25758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 25958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Uploading an item with a previously seen key should create an UPDATE 26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // action. 261a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_processor_->changes().clear(); 26258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UploadSplitItem("blurp", "snarl"); 26358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(1u, sync_processor_->changes().size()); 26458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) change = sync_processor_->changes()[0]; 26558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(change.IsValid()); 26658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(syncer::SyncChange::ACTION_UPDATE, change.change_type()); 26758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) VerifySyncDataItem(change.sync_data()); 26858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 269f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) sync_data = settings_service_.GetAllSyncData( 270f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) syncer::SUPERVISED_USER_SETTINGS); 27158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(4u, sync_data.size()); 27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (syncer::SyncDataList::const_iterator it = sync_data.begin(); 27358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) it != sync_data.end(); ++it) { 27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) VerifySyncDataItem(*it); 27558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 27658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 277a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) sync_processor_->changes().clear(); 27858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) UploadAtomicItem("fjord"); 27958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(1u, sync_processor_->changes().size()); 28058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) change = sync_processor_->changes()[0]; 28158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_TRUE(change.IsValid()); 28258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(syncer::SyncChange::ACTION_UPDATE, change.change_type()); 28358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) VerifySyncDataItem(change.sync_data()); 28458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 285f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) sync_data = settings_service_.GetAllSyncData( 286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) syncer::SUPERVISED_USER_SETTINGS); 28758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_EQ(4u, sync_data.size()); 28858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) for (syncer::SyncDataList::const_iterator it = sync_data.begin(); 28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) it != sync_data.end(); ++it) { 29058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) VerifySyncDataItem(*it); 29158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) } 29258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 29358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // The uploaded items should not show up as settings. 29458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) const base::Value* value = NULL; 29558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(settings_->GetWithoutPathExpansion(kAtomicItemName, &value)); 29658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) EXPECT_FALSE(settings_->GetWithoutPathExpansion(kSplitItemName, &value)); 29758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 29858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) // Restarting sync should not create any new changes. 299f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) settings_service_.StopSyncing(syncer::SUPERVISED_USER_SETTINGS); 30058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) StartSyncing(sync_data); 30158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) ASSERT_EQ(0u, sync_processor_->changes().size()); 30258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)} 303