OLD | NEW |
| (Empty) |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include <string> | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/message_loop/message_loop.h" | |
9 #include "base/prefs/scoped_user_pref_update.h" | |
10 #include "base/strings/stringprintf.h" | |
11 #include "base/strings/utf_string_conversions.h" | |
12 #include "base/threading/sequenced_worker_pool.h" | |
13 #include "chrome/browser/managed_mode/managed_user_sync_service.h" | |
14 #include "chrome/browser/managed_mode/managed_user_sync_service_factory.h" | |
15 #include "chrome/common/pref_names.h" | |
16 #include "chrome/test/base/testing_profile.h" | |
17 #include "sync/api/attachments/attachment_id.h" | |
18 #include "sync/api/attachments/attachment_service_proxy_for_test.h" | |
19 #include "sync/api/sync_change.h" | |
20 #include "sync/api/sync_error_factory_mock.h" | |
21 #include "sync/protocol/sync.pb.h" | |
22 #include "testing/gtest/include/gtest/gtest.h" | |
23 | |
24 #if defined(OS_CHROMEOS) | |
25 #include "chrome/browser/chromeos/login/users/avatar/default_user_images.h" | |
26 #endif | |
27 | |
28 using sync_pb::ManagedUserSpecifics; | |
29 using syncer::SUPERVISED_USERS; | |
30 using syncer::SyncChange; | |
31 using syncer::SyncChangeList; | |
32 using syncer::SyncChangeProcessor; | |
33 using syncer::SyncData; | |
34 using syncer::SyncDataList; | |
35 using syncer::SyncError; | |
36 using syncer::SyncErrorFactory; | |
37 using syncer::SyncMergeResult; | |
38 | |
39 namespace { | |
40 | |
41 class MockChangeProcessor : public SyncChangeProcessor { | |
42 public: | |
43 MockChangeProcessor() {} | |
44 virtual ~MockChangeProcessor() {} | |
45 | |
46 // SyncChangeProcessor implementation: | |
47 virtual SyncError ProcessSyncChanges( | |
48 const tracked_objects::Location& from_here, | |
49 const SyncChangeList& change_list) OVERRIDE; | |
50 | |
51 virtual SyncDataList GetAllSyncData(syncer::ModelType type) const | |
52 OVERRIDE { | |
53 return SyncDataList(); | |
54 } | |
55 | |
56 const SyncChangeList& changes() const { return change_list_; } | |
57 SyncChange GetChange(const std::string& id) const; | |
58 | |
59 private: | |
60 SyncChangeList change_list_; | |
61 }; | |
62 | |
63 SyncError MockChangeProcessor::ProcessSyncChanges( | |
64 const tracked_objects::Location& from_here, | |
65 const SyncChangeList& change_list) { | |
66 change_list_ = change_list; | |
67 return SyncError(); | |
68 } | |
69 | |
70 SyncChange MockChangeProcessor::GetChange(const std::string& id) const { | |
71 for (SyncChangeList::const_iterator it = change_list_.begin(); | |
72 it != change_list_.end(); ++it) { | |
73 if (it->sync_data().GetSpecifics().managed_user().id() == id) | |
74 return *it; | |
75 } | |
76 return SyncChange(); | |
77 } | |
78 | |
79 // Callback for ManagedUserSyncService::GetManagedUsersAsync(). | |
80 void GetManagedUsersCallback(const base::DictionaryValue** dict, | |
81 const base::DictionaryValue* managed_users) { | |
82 *dict = managed_users; | |
83 } | |
84 | |
85 } // namespace | |
86 | |
87 class ManagedUserSyncServiceTest : public ::testing::Test { | |
88 public: | |
89 ManagedUserSyncServiceTest(); | |
90 virtual ~ManagedUserSyncServiceTest(); | |
91 | |
92 protected: | |
93 scoped_ptr<SyncChangeProcessor> CreateChangeProcessor(); | |
94 scoped_ptr<SyncErrorFactory> CreateErrorFactory(); | |
95 SyncData CreateRemoteData(const std::string& id, | |
96 const std::string& name, | |
97 const std::string& avatar); | |
98 | |
99 PrefService* prefs() { return profile_.GetPrefs(); } | |
100 ManagedUserSyncService* service() { return service_; } | |
101 MockChangeProcessor* change_processor() { return change_processor_; } | |
102 | |
103 private: | |
104 base::MessageLoop message_loop; | |
105 TestingProfile profile_; | |
106 ManagedUserSyncService* service_; | |
107 | |
108 // Owned by the ManagedUserSyncService. | |
109 MockChangeProcessor* change_processor_; | |
110 | |
111 // A unique ID for creating "remote" Sync data. | |
112 int64 sync_data_id_; | |
113 }; | |
114 | |
115 ManagedUserSyncServiceTest::ManagedUserSyncServiceTest() | |
116 : change_processor_(NULL), | |
117 sync_data_id_(0) { | |
118 service_ = ManagedUserSyncServiceFactory::GetForProfile(&profile_); | |
119 } | |
120 | |
121 ManagedUserSyncServiceTest::~ManagedUserSyncServiceTest() {} | |
122 | |
123 scoped_ptr<SyncChangeProcessor> | |
124 ManagedUserSyncServiceTest::CreateChangeProcessor() { | |
125 EXPECT_FALSE(change_processor_); | |
126 change_processor_ = new MockChangeProcessor(); | |
127 return scoped_ptr<SyncChangeProcessor>(change_processor_); | |
128 } | |
129 | |
130 scoped_ptr<SyncErrorFactory> | |
131 ManagedUserSyncServiceTest::CreateErrorFactory() { | |
132 return scoped_ptr<SyncErrorFactory>(new syncer::SyncErrorFactoryMock()); | |
133 } | |
134 | |
135 SyncData ManagedUserSyncServiceTest::CreateRemoteData( | |
136 const std::string& id, | |
137 const std::string& name, | |
138 const std::string& chrome_avatar) { | |
139 ::sync_pb::EntitySpecifics specifics; | |
140 specifics.mutable_managed_user()->set_id(id); | |
141 specifics.mutable_managed_user()->set_name(name); | |
142 specifics.mutable_managed_user()->set_acknowledged(true); | |
143 if (!chrome_avatar.empty()) | |
144 specifics.mutable_managed_user()->set_chrome_avatar(chrome_avatar); | |
145 | |
146 return SyncData::CreateRemoteData( | |
147 ++sync_data_id_, | |
148 specifics, | |
149 base::Time(), | |
150 syncer::AttachmentIdList(), | |
151 syncer::AttachmentServiceProxyForTest::Create()); | |
152 } | |
153 | |
154 TEST_F(ManagedUserSyncServiceTest, MergeEmpty) { | |
155 SyncMergeResult result = | |
156 service()->MergeDataAndStartSyncing(SUPERVISED_USERS, | |
157 SyncDataList(), | |
158 CreateChangeProcessor(), | |
159 CreateErrorFactory()); | |
160 EXPECT_FALSE(result.error().IsSet()); | |
161 EXPECT_EQ(0, result.num_items_added()); | |
162 EXPECT_EQ(0, result.num_items_modified()); | |
163 EXPECT_EQ(0, result.num_items_deleted()); | |
164 EXPECT_EQ(0, result.num_items_before_association()); | |
165 EXPECT_EQ(0, result.num_items_after_association()); | |
166 EXPECT_EQ(0u, service()->GetManagedUsers()->size()); | |
167 EXPECT_EQ(0u, change_processor()->changes().size()); | |
168 | |
169 service()->StopSyncing(SUPERVISED_USERS); | |
170 service()->Shutdown(); | |
171 } | |
172 | |
173 TEST_F(ManagedUserSyncServiceTest, MergeExisting) { | |
174 const char kNameKey[] = "name"; | |
175 const char kAcknowledgedKey[] = "acknowledged"; | |
176 const char kChromeAvatarKey[] = "chromeAvatar"; | |
177 | |
178 const char kUserId1[] = "aaaaa"; | |
179 const char kUserId2[] = "bbbbb"; | |
180 const char kUserId3[] = "ccccc"; | |
181 const char kUserId4[] = "ddddd"; | |
182 const char kName1[] = "Anchor"; | |
183 const char kName2[] = "Buzz"; | |
184 const char kName3[] = "Crush"; | |
185 const char kName4[] = "Dory"; | |
186 const char kAvatar1[] = ""; | |
187 #if defined(OS_CHROMEOS) | |
188 const char kAvatar2[] = "chromeos-avatar-index:0"; | |
189 const char kAvatar3[] = "chromeos-avatar-index:20"; | |
190 #else | |
191 const char kAvatar2[] = "chrome-avatar-index:0"; | |
192 const char kAvatar3[] = "chrome-avatar-index:20"; | |
193 #endif | |
194 const char kAvatar4[] = ""; | |
195 { | |
196 DictionaryPrefUpdate update(prefs(), prefs::kSupervisedUsers); | |
197 base::DictionaryValue* managed_users = update.Get(); | |
198 base::DictionaryValue* dict = new base::DictionaryValue; | |
199 dict->SetString(kNameKey, kName1); | |
200 managed_users->Set(kUserId1, dict); | |
201 dict = new base::DictionaryValue; | |
202 dict->SetString(kNameKey, kName2); | |
203 dict->SetBoolean(kAcknowledgedKey, true); | |
204 managed_users->Set(kUserId2, dict); | |
205 } | |
206 | |
207 const base::DictionaryValue* async_managed_users = NULL; | |
208 service()->GetManagedUsersAsync( | |
209 base::Bind(&GetManagedUsersCallback, &async_managed_users)); | |
210 | |
211 SyncDataList initial_sync_data; | |
212 initial_sync_data.push_back(CreateRemoteData(kUserId2, kName2, kAvatar2)); | |
213 initial_sync_data.push_back(CreateRemoteData(kUserId3, kName3, kAvatar3)); | |
214 initial_sync_data.push_back(CreateRemoteData(kUserId4, kName4, kAvatar4)); | |
215 | |
216 SyncMergeResult result = | |
217 service()->MergeDataAndStartSyncing(SUPERVISED_USERS, | |
218 initial_sync_data, | |
219 CreateChangeProcessor(), | |
220 CreateErrorFactory()); | |
221 EXPECT_FALSE(result.error().IsSet()); | |
222 EXPECT_EQ(2, result.num_items_added()); | |
223 EXPECT_EQ(1, result.num_items_modified()); | |
224 EXPECT_EQ(0, result.num_items_deleted()); | |
225 EXPECT_EQ(2, result.num_items_before_association()); | |
226 EXPECT_EQ(4, result.num_items_after_association()); | |
227 | |
228 const base::DictionaryValue* managed_users = service()->GetManagedUsers(); | |
229 EXPECT_EQ(4u, managed_users->size()); | |
230 EXPECT_TRUE(async_managed_users); | |
231 EXPECT_TRUE(managed_users->Equals(async_managed_users)); | |
232 | |
233 { | |
234 const base::DictionaryValue* managed_user = NULL; | |
235 ASSERT_TRUE(managed_users->GetDictionary(kUserId2, &managed_user)); | |
236 ASSERT_TRUE(managed_user); | |
237 std::string name; | |
238 EXPECT_TRUE(managed_user->GetString(kNameKey, &name)); | |
239 EXPECT_EQ(kName2, name); | |
240 bool acknowledged = false; | |
241 EXPECT_TRUE(managed_user->GetBoolean(kAcknowledgedKey, &acknowledged)); | |
242 EXPECT_TRUE(acknowledged); | |
243 std::string avatar; | |
244 EXPECT_TRUE(managed_user->GetString(kChromeAvatarKey, &avatar)); | |
245 EXPECT_EQ(kAvatar2, avatar); | |
246 } | |
247 { | |
248 const base::DictionaryValue* managed_user = NULL; | |
249 ASSERT_TRUE(managed_users->GetDictionary(kUserId3, &managed_user)); | |
250 ASSERT_TRUE(managed_user); | |
251 std::string name; | |
252 EXPECT_TRUE(managed_user->GetString(kNameKey, &name)); | |
253 EXPECT_EQ(kName3, name); | |
254 bool acknowledged = false; | |
255 EXPECT_TRUE(managed_user->GetBoolean(kAcknowledgedKey, &acknowledged)); | |
256 EXPECT_TRUE(acknowledged); | |
257 std::string avatar; | |
258 EXPECT_TRUE(managed_user->GetString(kChromeAvatarKey, &avatar)); | |
259 EXPECT_EQ(kAvatar3, avatar); | |
260 } | |
261 { | |
262 const base::DictionaryValue* managed_user = NULL; | |
263 ASSERT_TRUE(managed_users->GetDictionary(kUserId4, &managed_user)); | |
264 ASSERT_TRUE(managed_user); | |
265 std::string name; | |
266 EXPECT_TRUE(managed_user->GetString(kNameKey, &name)); | |
267 EXPECT_EQ(kName4, name); | |
268 bool acknowledged = false; | |
269 EXPECT_TRUE(managed_user->GetBoolean(kAcknowledgedKey, &acknowledged)); | |
270 EXPECT_TRUE(acknowledged); | |
271 std::string avatar; | |
272 EXPECT_TRUE(managed_user->GetString(kChromeAvatarKey, &avatar)); | |
273 EXPECT_EQ(kAvatar4, avatar); | |
274 } | |
275 | |
276 EXPECT_EQ(1u, change_processor()->changes().size()); | |
277 { | |
278 SyncChange change = change_processor()->GetChange(kUserId1); | |
279 ASSERT_TRUE(change.IsValid()); | |
280 EXPECT_EQ(SyncChange::ACTION_ADD, change.change_type()); | |
281 const ManagedUserSpecifics& managed_user = | |
282 change.sync_data().GetSpecifics().managed_user(); | |
283 EXPECT_EQ(kName1, managed_user.name()); | |
284 EXPECT_FALSE(managed_user.acknowledged()); | |
285 EXPECT_EQ(kAvatar1, managed_user.chrome_avatar()); | |
286 } | |
287 } | |
288 | |
289 TEST_F(ManagedUserSyncServiceTest, GetAvatarIndex) { | |
290 int avatar = 100; | |
291 EXPECT_TRUE(ManagedUserSyncService::GetAvatarIndex(std::string(), &avatar)); | |
292 EXPECT_EQ(ManagedUserSyncService::kNoAvatar, avatar); | |
293 | |
294 int avatar_index = 4; | |
295 #if defined(OS_CHROMEOS) | |
296 avatar_index += chromeos::kFirstDefaultImageIndex; | |
297 #endif | |
298 std::string avatar_str = | |
299 ManagedUserSyncService::BuildAvatarString(avatar_index); | |
300 #if defined(OS_CHROMEOS) | |
301 EXPECT_EQ(base::StringPrintf("chromeos-avatar-index:%d", avatar_index), | |
302 avatar_str); | |
303 #else | |
304 EXPECT_EQ(base::StringPrintf("chrome-avatar-index:%d", avatar_index), | |
305 avatar_str); | |
306 #endif | |
307 EXPECT_TRUE(ManagedUserSyncService::GetAvatarIndex(avatar_str, &avatar)); | |
308 EXPECT_EQ(avatar_index, avatar); | |
309 | |
310 avatar_index = 0; | |
311 #if defined(OS_CHROMEOS) | |
312 avatar_index += chromeos::kFirstDefaultImageIndex; | |
313 #endif | |
314 avatar_str = ManagedUserSyncService::BuildAvatarString(avatar_index); | |
315 #if defined(OS_CHROMEOS) | |
316 EXPECT_EQ(base::StringPrintf("chromeos-avatar-index:%d", avatar_index), | |
317 avatar_str); | |
318 #else | |
319 EXPECT_EQ(base::StringPrintf("chrome-avatar-index:%d", avatar_index), | |
320 avatar_str); | |
321 #endif | |
322 EXPECT_TRUE(ManagedUserSyncService::GetAvatarIndex(avatar_str, &avatar)); | |
323 EXPECT_EQ(avatar_index, avatar); | |
324 | |
325 EXPECT_FALSE(ManagedUserSyncService::GetAvatarIndex("wrong-prefix:5", | |
326 &avatar)); | |
327 #if defined(OS_CHROMEOS) | |
328 EXPECT_FALSE(ManagedUserSyncService::GetAvatarIndex("chromeos-avatar-indes:2", | |
329 &avatar)); | |
330 | |
331 EXPECT_FALSE( | |
332 ManagedUserSyncService::GetAvatarIndex("chromeos-avatar-indexxx:2", | |
333 &avatar)); | |
334 | |
335 EXPECT_FALSE(ManagedUserSyncService::GetAvatarIndex("chromeos-avatar-index:", | |
336 &avatar)); | |
337 | |
338 EXPECT_FALSE(ManagedUserSyncService::GetAvatarIndex("chromeos-avatar-index:x", | |
339 &avatar)); | |
340 | |
341 EXPECT_FALSE(ManagedUserSyncService::GetAvatarIndex("chrome-avatar-index:5", | |
342 &avatar)); | |
343 #else | |
344 EXPECT_FALSE(ManagedUserSyncService::GetAvatarIndex("chrome-avatar-indes:2", | |
345 &avatar)); | |
346 | |
347 EXPECT_FALSE(ManagedUserSyncService::GetAvatarIndex("chrome-avatar-indexxx:2", | |
348 &avatar)); | |
349 | |
350 EXPECT_FALSE(ManagedUserSyncService::GetAvatarIndex("chrome-avatar-index:", | |
351 &avatar)); | |
352 | |
353 EXPECT_FALSE(ManagedUserSyncService::GetAvatarIndex("chrome-avatar-index:x", | |
354 &avatar)); | |
355 | |
356 EXPECT_FALSE(ManagedUserSyncService::GetAvatarIndex("chromeos-avatar-index:5", | |
357 &avatar)); | |
358 #endif | |
359 } | |
OLD | NEW |