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