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