supervised_user_registration_utility_unittest.cc revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_registration_utility.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop/message_loop.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/prefs/scoped_user_pref_update.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/run_loop.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/threading/sequenced_worker_pool.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_refresh_token_fetcher.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_shared_settings_service.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_shared_settings_service_factory.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_sync_service.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/supervised_user/supervised_user_sync_service_factory.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/pref_names.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_pref_service_syncable.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/test/base/testing_profile.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/test/test_utils.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "google_apis/gaia/google_service_auth_error.h" 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/attachments/attachment_id.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_change.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/api/sync_error_factory_mock.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/attachments/attachment_service_proxy_for_test.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync.pb.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using sync_pb::ManagedUserSpecifics; 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::SUPERVISED_USERS; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::SyncChange; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::SyncChangeList; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::SyncChangeProcessor; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::SyncData; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::SyncDataList; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::SyncError; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::SyncErrorFactory; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using syncer::SyncMergeResult; 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kSupervisedUserToken[] = "supervisedusertoken"; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockChangeProcessor : public SyncChangeProcessor { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockChangeProcessor() {} 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockChangeProcessor() {} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SyncChangeProcessor implementation: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SyncError ProcessSyncChanges( 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& from_here, 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SyncChangeList& change_list) OVERRIDE; 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual SyncDataList GetAllSyncData(syncer::ModelType type) const 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) OVERRIDE { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SyncDataList(); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SyncChangeList& changes() const { return change_list_; } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncChangeList change_list_; 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncError MockChangeProcessor::ProcessSyncChanges( 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const tracked_objects::Location& from_here, 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SyncChangeList& change_list) { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) change_list_ = change_list; 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return SyncError(); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockSupervisedUserRefreshTokenFetcher 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : public SupervisedUserRefreshTokenFetcher { 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockSupervisedUserRefreshTokenFetcher() {} 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~MockSupervisedUserRefreshTokenFetcher() {} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // SupervisedUserRefreshTokenFetcher implementation: 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Start(const std::string& supervised_user_id, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& device_name, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const TokenCallback& callback) OVERRIDE { 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceAuthError error(GoogleServiceAuthError::NONE); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) callback.Run(error, kSupervisedUserToken); 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SupervisedUserRegistrationUtilityTest : public ::testing::Test { 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserRegistrationUtilityTest(); 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~SupervisedUserRegistrationUtilityTest(); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TearDown() OVERRIDE; 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SyncChangeProcessor> CreateChangeProcessor(); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SyncErrorFactory> CreateErrorFactory(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncData CreateRemoteData(const std::string& id, const std::string& name); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncMergeResult StartInitialSync(); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserRegistrationUtility::RegistrationCallback 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRegistrationCallback(); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserRegistrationUtility* GetRegistrationUtility(); 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void Acknowledge(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PrefService* prefs() { return profile_.GetTestingPrefService(); } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserSyncService* service() { return service_; } 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserSharedSettingsService* shared_settings_service() { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return shared_settings_service_; 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockChangeProcessor* change_processor() { return change_processor_; } 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool received_callback() const { return received_callback_; } 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GoogleServiceAuthError& error() const { return error_; } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& token() const { return token_; } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnSupervisedUserRegistered(const GoogleServiceAuthError& error, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& token); 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::MessageLoop message_loop_; 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::RunLoop run_loop_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TestingProfile profile_; 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserSyncService* service_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserSharedSettingsService* shared_settings_service_; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SupervisedUserRegistrationUtility> registration_utility_; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Owned by the SupervisedUserSyncService. 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockChangeProcessor* change_processor_; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A unique ID for creating "remote" Sync data. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int64 sync_data_id_; 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether OnSupervisedUserRegistered has been called. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool received_callback_; 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Hold the registration result (either an error, or a token). 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GoogleServiceAuthError error_; 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string token_; 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::WeakPtrFactory<SupervisedUserRegistrationUtilityTest> weak_ptr_factory_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SupervisedUserRegistrationUtilityTest::SupervisedUserRegistrationUtilityTest() 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : change_processor_(NULL), 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sync_data_id_(0), 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_callback_(false), 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_(GoogleServiceAuthError::NUM_STATES), 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_(this) { 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service_ = SupervisedUserSyncServiceFactory::GetForProfile(&profile_); 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shared_settings_service_ = 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserSharedSettingsServiceFactory::GetForBrowserContext( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &profile_); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SupervisedUserRegistrationUtilityTest:: 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ~SupervisedUserRegistrationUtilityTest() { 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(weak_ptr_factory_.HasWeakPtrs()); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SupervisedUserRegistrationUtilityTest::TearDown() { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RunAllBlockingPoolTasksUntilIdle(); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<SyncChangeProcessor> 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SupervisedUserRegistrationUtilityTest::CreateChangeProcessor() { 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(change_processor_); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) change_processor_ = new MockChangeProcessor(); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scoped_ptr<SyncChangeProcessor>(change_processor_); 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)scoped_ptr<SyncErrorFactory> 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SupervisedUserRegistrationUtilityTest::CreateErrorFactory() { 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return scoped_ptr<SyncErrorFactory>(new syncer::SyncErrorFactoryMock()); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SyncMergeResult SupervisedUserRegistrationUtilityTest::StartInitialSync() { 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncDataList initial_sync_data; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncMergeResult result = 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service()->MergeDataAndStartSyncing(SUPERVISED_USERS, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_sync_data, 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateChangeProcessor(), 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateErrorFactory()); 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(result.error().IsSet()); 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return result; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SupervisedUserRegistrationUtility::RegistrationCallback 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SupervisedUserRegistrationUtilityTest::GetRegistrationCallback() { 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return base::Bind( 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &SupervisedUserRegistrationUtilityTest::OnSupervisedUserRegistered, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr()); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SupervisedUserRegistrationUtility* 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)SupervisedUserRegistrationUtilityTest::GetRegistrationUtility() { 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (registration_utility_.get()) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return registration_utility_.get(); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<SupervisedUserRefreshTokenFetcher> token_fetcher( 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new MockSupervisedUserRefreshTokenFetcher); 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) registration_utility_.reset( 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserRegistrationUtility::CreateImpl(prefs(), 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) token_fetcher.Pass(), 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service(), 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) shared_settings_service())); 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return registration_utility_.get(); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SupervisedUserRegistrationUtilityTest::Acknowledge() { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncChangeList new_changes; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const SyncChangeList& changes = change_processor()->changes(); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (SyncChangeList::const_iterator it = changes.begin(); it != changes.end(); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++it) { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(SyncChange::ACTION_ADD, it->change_type()); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ::sync_pb::EntitySpecifics specifics = it->sync_data().GetSpecifics(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(specifics.managed_user().acknowledged()); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) specifics.mutable_managed_user()->set_acknowledged(true); 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_changes.push_back( 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncChange(FROM_HERE, 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncChange::ACTION_UPDATE, 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncData::CreateRemoteData( 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ++sync_data_id_, 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) specifics, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Time(), 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::AttachmentIdList(), 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) syncer::AttachmentServiceProxyForTest::Create()))); 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service()->ProcessSyncChanges(FROM_HERE, new_changes); 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) run_loop_.Run(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void SupervisedUserRegistrationUtilityTest::OnSupervisedUserRegistered( 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GoogleServiceAuthError& error, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& token) { 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) received_callback_ = true; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) error_ = error; 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) token_ = token; 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) run_loop_.Quit(); 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SupervisedUserRegistrationUtilityTest, Register) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartInitialSync(); 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRegistrationUtility()->Register( 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserRegistrationUtility::GenerateNewSupervisedUserId(), 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserRegistrationInfo(base::ASCIIToUTF16("Dug"), 0), 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRegistrationCallback()); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, prefs()->GetDictionary(prefs::kSupervisedUsers)->size()); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Acknowledge(); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(received_callback()); 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GoogleServiceAuthError::NONE, error().state()); 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(token().empty()); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SupervisedUserRegistrationUtilityTest, RegisterBeforeInitialSync) { 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRegistrationUtility()->Register( 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserRegistrationUtility::GenerateNewSupervisedUserId(), 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserRegistrationInfo(base::ASCIIToUTF16("Nemo"), 5), 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRegistrationCallback()); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, prefs()->GetDictionary(prefs::kSupervisedUsers)->size()); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartInitialSync(); 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Acknowledge(); 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(received_callback()); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GoogleServiceAuthError::NONE, error().state()); 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(token().empty()); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SupervisedUserRegistrationUtilityTest, 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SyncServiceShutdownBeforeRegFinish) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartInitialSync(); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRegistrationUtility()->Register( 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserRegistrationUtility::GenerateNewSupervisedUserId(), 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserRegistrationInfo(base::ASCIIToUTF16("Remy"), 12), 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRegistrationCallback()); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, prefs()->GetDictionary(prefs::kSupervisedUsers)->size()); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service()->Shutdown(); 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, prefs()->GetDictionary(prefs::kSupervisedUsers)->size()); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(received_callback()); 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GoogleServiceAuthError::REQUEST_CANCELED, error().state()); 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(), token()); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(SupervisedUserRegistrationUtilityTest, StopSyncingBeforeRegFinish) { 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartInitialSync(); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRegistrationUtility()->Register( 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserRegistrationUtility::GenerateNewSupervisedUserId(), 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SupervisedUserRegistrationInfo(base::ASCIIToUTF16("Mike"), 17), 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetRegistrationCallback()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, prefs()->GetDictionary(prefs::kSupervisedUsers)->size()); 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) service()->StopSyncing(SUPERVISED_USERS); 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, prefs()->GetDictionary(prefs::kSupervisedUsers)->size()); 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(received_callback()); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(GoogleServiceAuthError::REQUEST_CANCELED, error().state()); 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(std::string(), token()); 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)