1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
2a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
3a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)// found in the LICENSE file.
4a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include <string>
6a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
7a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/bind.h"
8a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "base/message_loop/message_loop.h"
91e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h"
105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/strings/stringprintf.h"
11a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
12a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "base/threading/sequenced_worker_pool.h"
13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_sync_service.h"
14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_sync_service_factory.h"
15a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/common/pref_names.h"
16a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "chrome/test/base/testing_profile.h"
17a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#include "sync/api/attachments/attachment_id.h"
18a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "sync/api/sync_change.h"
19a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "sync/api/sync_error_factory_mock.h"
205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "sync/internal_api/public/attachments/attachment_service_proxy_for_test.h"
21a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "sync/protocol/sync.pb.h"
22a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
23a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS)
255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "components/user_manager/user_image/default_user_images.h"
265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
28a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using sync_pb::ManagedUserSpecifics;
29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)using syncer::SUPERVISED_USERS;
30a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using syncer::SyncChange;
31a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using syncer::SyncChangeList;
32a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using syncer::SyncChangeProcessor;
33a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using syncer::SyncData;
34a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using syncer::SyncDataList;
35a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using syncer::SyncError;
36a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using syncer::SyncErrorFactory;
37a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)using syncer::SyncMergeResult;
38a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
39a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)namespace {
40a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
41a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)class MockChangeProcessor : public SyncChangeProcessor {
42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockChangeProcessor() {}
44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual ~MockChangeProcessor() {}
45a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
46a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // SyncChangeProcessor implementation:
47a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  virtual SyncError ProcessSyncChanges(
48a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const tracked_objects::Location& from_here,
49a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      const SyncChangeList& change_list) OVERRIDE;
50a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
5158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  virtual SyncDataList GetAllSyncData(syncer::ModelType type) const
5258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)      OVERRIDE {
5358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    return SyncDataList();
5458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  }
5558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const SyncChangeList& changes() const { return change_list_; }
57a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SyncChange GetChange(const std::string& id) const;
58a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
59a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
60a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SyncChangeList change_list_;
61a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
62a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
63a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SyncError MockChangeProcessor::ProcessSyncChanges(
64a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const tracked_objects::Location& from_here,
65a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const SyncChangeList& change_list) {
66a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  change_list_ = change_list;
67a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return SyncError();
68a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
69a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
70a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)SyncChange MockChangeProcessor::GetChange(const std::string& id) const {
71a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  for (SyncChangeList::const_iterator it = change_list_.begin();
72a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)       it != change_list_.end(); ++it) {
73a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    if (it->sync_data().GetSpecifics().managed_user().id() == id)
74a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      return *it;
75a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
76a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return SyncChange();
77a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Callback for SupervisedUserSyncService::GetSupervisedUsersAsync().
80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void GetSupervisedUsersCallback(const base::DictionaryValue** dict,
81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                const base::DictionaryValue* supervised_users) {
82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  *dict = supervised_users;
8358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
8458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
85a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}  // namespace
86a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)class SupervisedUserSyncServiceTest : public ::testing::Test {
88a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) public:
89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SupervisedUserSyncServiceTest();
90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  virtual ~SupervisedUserSyncServiceTest();
91a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
92a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) protected:
93a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<SyncChangeProcessor> CreateChangeProcessor();
94a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  scoped_ptr<SyncErrorFactory> CreateErrorFactory();
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  SyncData CreateRemoteData(const std::string& id,
9658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            const std::string& name,
9758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                            const std::string& avatar);
98a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
99a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  PrefService* prefs() { return profile_.GetPrefs(); }
100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SupervisedUserSyncService* service() { return service_; }
101a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockChangeProcessor* change_processor() { return change_processor_; }
102a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
103a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) private:
104a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  base::MessageLoop message_loop;
105a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  TestingProfile profile_;
106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  SupervisedUserSyncService* service_;
107a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Owned by the SupervisedUserSyncService.
109a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  MockChangeProcessor* change_processor_;
110a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
111a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  // A unique ID for creating "remote" Sync data.
112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  int64 sync_data_id_;
113a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)};
114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SupervisedUserSyncServiceTest::SupervisedUserSyncServiceTest()
116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    : change_processor_(NULL),
117a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      sync_data_id_(0) {
118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service_ = SupervisedUserSyncServiceFactory::GetForProfile(&profile_);
119a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
120a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SupervisedUserSyncServiceTest::~SupervisedUserSyncServiceTest() {}
122a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
123a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)scoped_ptr<SyncChangeProcessor>
124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SupervisedUserSyncServiceTest::CreateChangeProcessor() {
125a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(change_processor_);
126a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  change_processor_ = new MockChangeProcessor();
127a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return scoped_ptr<SyncChangeProcessor>(change_processor_);
128a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
129a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
130a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)scoped_ptr<SyncErrorFactory>
131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SupervisedUserSyncServiceTest::CreateErrorFactory() {
132a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  return scoped_ptr<SyncErrorFactory>(new syncer::SyncErrorFactoryMock());
133a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
134a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)SyncData SupervisedUserSyncServiceTest::CreateRemoteData(
136a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    const std::string& id,
13758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::string& name,
13858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    const std::string& chrome_avatar) {
139a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  ::sync_pb::EntitySpecifics specifics;
140a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  specifics.mutable_managed_user()->set_id(id);
141a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  specifics.mutable_managed_user()->set_name(name);
142a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  specifics.mutable_managed_user()->set_acknowledged(true);
14358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  if (!chrome_avatar.empty())
14458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    specifics.mutable_managed_user()->set_chrome_avatar(chrome_avatar);
14558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
146a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return SyncData::CreateRemoteData(
147a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      ++sync_data_id_,
148a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      specifics,
149a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      base::Time(),
150a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      syncer::AttachmentIdList(),
151a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch      syncer::AttachmentServiceProxyForTest::Create());
152a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
153a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserSyncServiceTest, MergeEmpty) {
155a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SyncMergeResult result =
156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service()->MergeDataAndStartSyncing(SUPERVISED_USERS,
15758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                                          SyncDataList(),
158a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                          CreateChangeProcessor(),
159a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                          CreateErrorFactory());
160a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(result.error().IsSet());
161a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0, result.num_items_added());
162a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0, result.num_items_modified());
163a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0, result.num_items_deleted());
164a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0, result.num_items_before_association());
165a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0, result.num_items_after_association());
166f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(0u, service()->GetSupervisedUsers()->size());
167a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0u, change_processor()->changes().size());
168a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
169f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->StopSyncing(SUPERVISED_USERS);
17058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  service()->Shutdown();
171a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
172a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserSyncServiceTest, MergeExisting) {
174a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const char kNameKey[] = "name";
175a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const char kAcknowledgedKey[] = "acknowledged";
17658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const char kChromeAvatarKey[] = "chromeAvatar";
177a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
178a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const char kUserId1[] = "aaaaa";
179a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const char kUserId2[] = "bbbbb";
180a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const char kUserId3[] = "ccccc";
181a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const char kUserId4[] = "ddddd";
182a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const char kName1[] = "Anchor";
183a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const char kName2[] = "Buzz";
184a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const char kName3[] = "Crush";
185a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  const char kName4[] = "Dory";
18658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const char kAvatar1[] = "";
1878bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_CHROMEOS)
1888bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const char kAvatar2[] = "chromeos-avatar-index:0";
1898bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  const char kAvatar3[] = "chromeos-avatar-index:20";
1908bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#else
19158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const char kAvatar2[] = "chrome-avatar-index:0";
19258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const char kAvatar3[] = "chrome-avatar-index:20";
1938bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
19458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  const char kAvatar4[] = "";
195a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
196f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    DictionaryPrefUpdate update(prefs(), prefs::kSupervisedUsers);
197f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    base::DictionaryValue* supervised_users = update.Get();
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    base::DictionaryValue* dict = new base::DictionaryValue;
199a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    dict->SetString(kNameKey, kName1);
200f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    supervised_users->Set(kUserId1, dict);
2015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    dict = new base::DictionaryValue;
202a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    dict->SetString(kNameKey, kName2);
203a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    dict->SetBoolean(kAcknowledgedKey, true);
204f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    supervised_users->Set(kUserId2, dict);
205a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
207f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const base::DictionaryValue* async_supervised_users = NULL;
208f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  service()->GetSupervisedUsersAsync(
209f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      base::Bind(&GetSupervisedUsersCallback, &async_supervised_users));
21058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
211a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SyncDataList initial_sync_data;
21258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  initial_sync_data.push_back(CreateRemoteData(kUserId2, kName2, kAvatar2));
21358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  initial_sync_data.push_back(CreateRemoteData(kUserId3, kName3, kAvatar3));
21458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  initial_sync_data.push_back(CreateRemoteData(kUserId4, kName4, kAvatar4));
215a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
216a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  SyncMergeResult result =
217f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service()->MergeDataAndStartSyncing(SUPERVISED_USERS,
218a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                          initial_sync_data,
219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                          CreateChangeProcessor(),
220a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)                                          CreateErrorFactory());
221a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_FALSE(result.error().IsSet());
222a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(2, result.num_items_added());
223a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1, result.num_items_modified());
224a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(0, result.num_items_deleted());
225a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(2, result.num_items_before_association());
226a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(4, result.num_items_after_association());
227a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
228f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  const base::DictionaryValue* supervised_users =
229f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      service()->GetSupervisedUsers();
230f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(4u, supervised_users->size());
231f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(async_supervised_users);
232f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(supervised_users->Equals(async_supervised_users));
23358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
234a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
235f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const base::DictionaryValue* supervised_user = NULL;
236f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ASSERT_TRUE(supervised_users->GetDictionary(kUserId2, &supervised_user));
237f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ASSERT_TRUE(supervised_user);
238a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    std::string name;
239f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(supervised_user->GetString(kNameKey, &name));
240a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_EQ(kName2, name);
241a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool acknowledged = false;
242f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(supervised_user->GetBoolean(kAcknowledgedKey, &acknowledged));
243a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_TRUE(acknowledged);
24458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::string avatar;
245f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(supervised_user->GetString(kChromeAvatarKey, &avatar));
24658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(kAvatar2, avatar);
247a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
248a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
249f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const base::DictionaryValue* supervised_user = NULL;
250f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ASSERT_TRUE(supervised_users->GetDictionary(kUserId3, &supervised_user));
251f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ASSERT_TRUE(supervised_user);
252a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    std::string name;
253f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(supervised_user->GetString(kNameKey, &name));
254a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_EQ(kName3, name);
255a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool acknowledged = false;
256f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(supervised_user->GetBoolean(kAcknowledgedKey, &acknowledged));
257a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_TRUE(acknowledged);
25858537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::string avatar;
259f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(supervised_user->GetString(kChromeAvatarKey, &avatar));
26058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(kAvatar3, avatar);
261a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
262a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
263f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const base::DictionaryValue* supervised_user = NULL;
264f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ASSERT_TRUE(supervised_users->GetDictionary(kUserId4, &supervised_user));
265f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    ASSERT_TRUE(supervised_user);
266a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    std::string name;
267f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(supervised_user->GetString(kNameKey, &name));
268a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_EQ(kName4, name);
269a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    bool acknowledged = false;
270f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(supervised_user->GetBoolean(kAcknowledgedKey, &acknowledged));
271a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_TRUE(acknowledged);
27258537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    std::string avatar;
273f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_TRUE(supervised_user->GetString(kChromeAvatarKey, &avatar));
27458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    EXPECT_EQ(kAvatar4, avatar);
275a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
276a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)
277a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  EXPECT_EQ(1u, change_processor()->changes().size());
278a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  {
279a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    SyncChange change = change_processor()->GetChange(kUserId1);
280a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    ASSERT_TRUE(change.IsValid());
281a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)    EXPECT_EQ(SyncChange::ACTION_ADD, change.change_type());
282f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    const ManagedUserSpecifics& supervised_user =
283a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)        change.sync_data().GetSpecifics().managed_user();
284f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(kName1, supervised_user.name());
285f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_FALSE(supervised_user.acknowledged());
286f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)    EXPECT_EQ(kAvatar1, supervised_user.chrome_avatar());
287a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  }
288a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)}
28958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
290f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)TEST_F(SupervisedUserSyncServiceTest, GetAvatarIndex) {
29158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)  int avatar = 100;
292f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(SupervisedUserSyncService::GetAvatarIndex(std::string(),
293f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                        &avatar));
294f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_EQ(SupervisedUserSyncService::kNoAvatar, avatar);
29558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
2965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  int avatar_index = 4;
2978bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_CHROMEOS)
2985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  avatar_index += user_manager::kFirstDefaultImageIndex;
2995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  std::string avatar_str =
301f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      SupervisedUserSyncService::BuildAvatarString(avatar_index);
3025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS)
3035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::StringPrintf("chromeos-avatar-index:%d", avatar_index),
3045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            avatar_str);
3058bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#else
3065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::StringPrintf("chrome-avatar-index:%d", avatar_index),
3075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            avatar_str);
3088bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
309f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(SupervisedUserSyncService::GetAvatarIndex(avatar_str, &avatar));
3105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(avatar_index, avatar);
31158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  avatar_index = 0;
3135d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS)
3145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  avatar_index += user_manager::kFirstDefaultImageIndex;
3155d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
316f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  avatar_str = SupervisedUserSyncService::BuildAvatarString(avatar_index);
3178bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_CHROMEOS)
3185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::StringPrintf("chromeos-avatar-index:%d", avatar_index),
3195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            avatar_str);
3208bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#else
3215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(base::StringPrintf("chrome-avatar-index:%d", avatar_index),
3225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)            avatar_str);
3238bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
324f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_TRUE(SupervisedUserSyncService::GetAvatarIndex(avatar_str, &avatar));
3255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  EXPECT_EQ(avatar_index, avatar);
32658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
327f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(SupervisedUserSyncService::GetAvatarIndex("wrong-prefix:5",
328f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                         &avatar));
3298bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#if defined(OS_CHROMEOS)
330f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(SupervisedUserSyncService::GetAvatarIndex(
331f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "chromeos-avatar-indes:2",
332f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      &avatar));
3338bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
3348bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  EXPECT_FALSE(
335f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      SupervisedUserSyncService::GetAvatarIndex("chromeos-avatar-indexxx:2",
336f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                                &avatar));
33758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
338f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(SupervisedUserSyncService::GetAvatarIndex(
339f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "chromeos-avatar-index:",
340f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      &avatar));
3418bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
342f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(SupervisedUserSyncService::GetAvatarIndex(
343f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "chromeos-avatar-index:x",
344f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      &avatar));
3458bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
346f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(SupervisedUserSyncService::GetAvatarIndex(
347f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "chrome-avatar-index:5",
348f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      &avatar));
3498bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#else
350f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(SupervisedUserSyncService::GetAvatarIndex(
351f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "chrome-avatar-indes:2",
352f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      &avatar));
35358537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
354f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(SupervisedUserSyncService::GetAvatarIndex(
355f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "chrome-avatar-indexxx:2",
356f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      &avatar));
35758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
358f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(SupervisedUserSyncService::GetAvatarIndex(
359f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "chrome-avatar-index:",
360f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      &avatar));
36158537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
362f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(SupervisedUserSyncService::GetAvatarIndex(
363f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "chrome-avatar-index:x",
364f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      &avatar));
3658bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
366f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  EXPECT_FALSE(SupervisedUserSyncService::GetAvatarIndex(
367f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      "chromeos-avatar-index:5",
368f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)      &avatar));
3698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)#endif
37058537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)}
371