| OLD | NEW |
| (Empty) |
| 1 // Copyright 2015 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 "components/proximity_auth/cryptauth/cryptauth_enrollment_manager.h" | |
| 6 | |
| 7 #include <utility> | |
| 8 | |
| 9 #include "base/base64url.h" | |
| 10 #include "base/macros.h" | |
| 11 #include "base/memory/ptr_util.h" | |
| 12 #include "base/memory/weak_ptr.h" | |
| 13 #include "base/test/simple_test_clock.h" | |
| 14 #include "base/time/clock.h" | |
| 15 #include "base/time/time.h" | |
| 16 #include "components/prefs/testing_pref_service.h" | |
| 17 #include "components/proximity_auth/cryptauth/cryptauth_enroller.h" | |
| 18 #include "components/proximity_auth/cryptauth/fake_cryptauth_gcm_manager.h" | |
| 19 #include "components/proximity_auth/cryptauth/fake_secure_message_delegate.h" | |
| 20 #include "components/proximity_auth/cryptauth/mock_sync_scheduler.h" | |
| 21 #include "components/proximity_auth/cryptauth/pref_names.h" | |
| 22 #include "testing/gmock/include/gmock/gmock.h" | |
| 23 #include "testing/gtest/include/gtest/gtest.h" | |
| 24 | |
| 25 using ::testing::_; | |
| 26 using ::testing::NiceMock; | |
| 27 using ::testing::Return; | |
| 28 using ::testing::SaveArg; | |
| 29 | |
| 30 namespace proximity_auth { | |
| 31 | |
| 32 namespace { | |
| 33 | |
| 34 // The GCM registration id from a successful registration. | |
| 35 const char kGCMRegistrationId[] = "new gcm registration id"; | |
| 36 | |
| 37 // The user's persistent public key identifying the local device. | |
| 38 const char kUserPublicKey[] = "user public key"; | |
| 39 | |
| 40 // The initial "Now" time for testing. | |
| 41 const double kInitialTimeNowSeconds = 20000000; | |
| 42 | |
| 43 // A later "Now" time for testing. | |
| 44 const double kLaterTimeNow = kInitialTimeNowSeconds + 30; | |
| 45 | |
| 46 // The timestamp of a last successful enrollment that is still valid. | |
| 47 const double kLastEnrollmentTimeSeconds = | |
| 48 kInitialTimeNowSeconds - (60 * 60 * 24 * 15); | |
| 49 | |
| 50 // The timestamp of a last successful enrollment that is expired. | |
| 51 const double kLastExpiredEnrollmentTimeSeconds = | |
| 52 kInitialTimeNowSeconds - (60 * 60 * 24 * 100); | |
| 53 | |
| 54 // Mocks out the actual enrollment flow. | |
| 55 class MockCryptAuthEnroller : public CryptAuthEnroller { | |
| 56 public: | |
| 57 MockCryptAuthEnroller() {} | |
| 58 ~MockCryptAuthEnroller() override {} | |
| 59 | |
| 60 MOCK_METHOD5(Enroll, | |
| 61 void(const std::string& user_public_key, | |
| 62 const std::string& user_private_key, | |
| 63 const cryptauth::GcmDeviceInfo& device_info, | |
| 64 cryptauth::InvocationReason invocation_reason, | |
| 65 const EnrollmentFinishedCallback& callback)); | |
| 66 | |
| 67 private: | |
| 68 DISALLOW_COPY_AND_ASSIGN(MockCryptAuthEnroller); | |
| 69 }; | |
| 70 | |
| 71 // Creates MockCryptAuthEnroller instances, and allows expecations to be set | |
| 72 // before they are returned. | |
| 73 class MockCryptAuthEnrollerFactory : public CryptAuthEnrollerFactory { | |
| 74 public: | |
| 75 MockCryptAuthEnrollerFactory() | |
| 76 : next_cryptauth_enroller_(new NiceMock<MockCryptAuthEnroller>()) {} | |
| 77 ~MockCryptAuthEnrollerFactory() override {} | |
| 78 | |
| 79 // CryptAuthEnrollerFactory: | |
| 80 std::unique_ptr<CryptAuthEnroller> CreateInstance() override { | |
| 81 auto passed_cryptauth_enroller = std::move(next_cryptauth_enroller_); | |
| 82 next_cryptauth_enroller_.reset(new NiceMock<MockCryptAuthEnroller>()); | |
| 83 return std::move(passed_cryptauth_enroller); | |
| 84 } | |
| 85 | |
| 86 MockCryptAuthEnroller* next_cryptauth_enroller() { | |
| 87 return next_cryptauth_enroller_.get(); | |
| 88 } | |
| 89 | |
| 90 private: | |
| 91 // Stores the next CryptAuthEnroller to be created. | |
| 92 // Ownership is passed to the caller of |CreateInstance()|. | |
| 93 std::unique_ptr<MockCryptAuthEnroller> next_cryptauth_enroller_; | |
| 94 | |
| 95 DISALLOW_COPY_AND_ASSIGN(MockCryptAuthEnrollerFactory); | |
| 96 }; | |
| 97 | |
| 98 // Harness for testing CryptAuthEnrollmentManager. | |
| 99 class TestCryptAuthEnrollmentManager : public CryptAuthEnrollmentManager { | |
| 100 public: | |
| 101 TestCryptAuthEnrollmentManager( | |
| 102 std::unique_ptr<base::Clock> clock, | |
| 103 std::unique_ptr<CryptAuthEnrollerFactory> enroller_factory, | |
| 104 std::unique_ptr<SecureMessageDelegate> secure_message_delegate, | |
| 105 const cryptauth::GcmDeviceInfo& device_info, | |
| 106 CryptAuthGCMManager* gcm_manager, | |
| 107 PrefService* pref_service) | |
| 108 : CryptAuthEnrollmentManager(std::move(clock), | |
| 109 std::move(enroller_factory), | |
| 110 std::move(secure_message_delegate), | |
| 111 device_info, | |
| 112 gcm_manager, | |
| 113 pref_service), | |
| 114 scoped_sync_scheduler_(new NiceMock<MockSyncScheduler>()), | |
| 115 weak_sync_scheduler_factory_(scoped_sync_scheduler_.get()) {} | |
| 116 | |
| 117 ~TestCryptAuthEnrollmentManager() override {} | |
| 118 | |
| 119 std::unique_ptr<SyncScheduler> CreateSyncScheduler() override { | |
| 120 EXPECT_TRUE(scoped_sync_scheduler_); | |
| 121 return std::move(scoped_sync_scheduler_); | |
| 122 } | |
| 123 | |
| 124 base::WeakPtr<MockSyncScheduler> GetSyncScheduler() { | |
| 125 return weak_sync_scheduler_factory_.GetWeakPtr(); | |
| 126 } | |
| 127 | |
| 128 private: | |
| 129 // Ownership is passed to |CryptAuthEnrollmentManager| super class when | |
| 130 // |CreateSyncScheduler()| is called. | |
| 131 std::unique_ptr<MockSyncScheduler> scoped_sync_scheduler_; | |
| 132 | |
| 133 // Stores the pointer of |scoped_sync_scheduler_| after ownership is passed to | |
| 134 // the super class. | |
| 135 // This should be safe because the life-time this SyncScheduler will always be | |
| 136 // within the life of the TestCryptAuthEnrollmentManager object. | |
| 137 base::WeakPtrFactory<MockSyncScheduler> weak_sync_scheduler_factory_; | |
| 138 | |
| 139 DISALLOW_COPY_AND_ASSIGN(TestCryptAuthEnrollmentManager); | |
| 140 }; | |
| 141 | |
| 142 } // namespace | |
| 143 | |
| 144 class ProximityAuthCryptAuthEnrollmentManagerTest | |
| 145 : public testing::Test, | |
| 146 public CryptAuthEnrollmentManager::Observer { | |
| 147 protected: | |
| 148 ProximityAuthCryptAuthEnrollmentManagerTest() | |
| 149 : public_key_(kUserPublicKey), | |
| 150 clock_(new base::SimpleTestClock()), | |
| 151 enroller_factory_(new MockCryptAuthEnrollerFactory()), | |
| 152 secure_message_delegate_(new FakeSecureMessageDelegate()), | |
| 153 gcm_manager_(kGCMRegistrationId), | |
| 154 enrollment_manager_(base::WrapUnique(clock_), | |
| 155 base::WrapUnique(enroller_factory_), | |
| 156 base::WrapUnique(secure_message_delegate_), | |
| 157 device_info_, | |
| 158 &gcm_manager_, | |
| 159 &pref_service_) {} | |
| 160 | |
| 161 // testing::Test: | |
| 162 void SetUp() override { | |
| 163 clock_->SetNow(base::Time::FromDoubleT(kInitialTimeNowSeconds)); | |
| 164 enrollment_manager_.AddObserver(this); | |
| 165 | |
| 166 private_key_ = | |
| 167 secure_message_delegate_->GetPrivateKeyForPublicKey(public_key_); | |
| 168 secure_message_delegate_->set_next_public_key(public_key_); | |
| 169 | |
| 170 CryptAuthEnrollmentManager::RegisterPrefs(pref_service_.registry()); | |
| 171 pref_service_.SetUserPref( | |
| 172 prefs::kCryptAuthEnrollmentIsRecoveringFromFailure, | |
| 173 new base::FundamentalValue(false)); | |
| 174 pref_service_.SetUserPref( | |
| 175 prefs::kCryptAuthEnrollmentLastEnrollmentTimeSeconds, | |
| 176 new base::FundamentalValue(kLastEnrollmentTimeSeconds)); | |
| 177 pref_service_.SetUserPref( | |
| 178 prefs::kCryptAuthEnrollmentReason, | |
| 179 new base::FundamentalValue(cryptauth::INVOCATION_REASON_UNKNOWN)); | |
| 180 | |
| 181 std::string public_key_b64, private_key_b64; | |
| 182 base::Base64UrlEncode(public_key_, | |
| 183 base::Base64UrlEncodePolicy::INCLUDE_PADDING, | |
| 184 &public_key_b64); | |
| 185 base::Base64UrlEncode(private_key_, | |
| 186 base::Base64UrlEncodePolicy::INCLUDE_PADDING, | |
| 187 &private_key_b64); | |
| 188 pref_service_.SetString(prefs::kCryptAuthEnrollmentUserPublicKey, | |
| 189 public_key_b64); | |
| 190 pref_service_.SetString(prefs::kCryptAuthEnrollmentUserPrivateKey, | |
| 191 private_key_b64); | |
| 192 | |
| 193 ON_CALL(*sync_scheduler(), GetStrategy()) | |
| 194 .WillByDefault(Return(SyncScheduler::Strategy::PERIODIC_REFRESH)); | |
| 195 } | |
| 196 | |
| 197 void TearDown() override { enrollment_manager_.RemoveObserver(this); } | |
| 198 | |
| 199 // CryptAuthEnrollmentManager::Observer: | |
| 200 void OnEnrollmentStarted() override { OnEnrollmentStartedProxy(); } | |
| 201 | |
| 202 void OnEnrollmentFinished(bool success) override { | |
| 203 // Simulate the scheduler changing strategies based on success or failure. | |
| 204 SyncScheduler::Strategy new_strategy = | |
| 205 SyncScheduler::Strategy::AGGRESSIVE_RECOVERY; | |
| 206 ON_CALL(*sync_scheduler(), GetStrategy()) | |
| 207 .WillByDefault(Return(new_strategy)); | |
| 208 | |
| 209 OnEnrollmentFinishedProxy(success); | |
| 210 } | |
| 211 | |
| 212 MOCK_METHOD0(OnEnrollmentStartedProxy, void()); | |
| 213 MOCK_METHOD1(OnEnrollmentFinishedProxy, void(bool success)); | |
| 214 | |
| 215 // Simulates firing the SyncScheduler to trigger an enrollment attempt. | |
| 216 CryptAuthEnroller::EnrollmentFinishedCallback FireSchedulerForEnrollment( | |
| 217 cryptauth::InvocationReason expected_invocation_reason) { | |
| 218 CryptAuthEnroller::EnrollmentFinishedCallback completion_callback; | |
| 219 EXPECT_CALL( | |
| 220 *next_cryptauth_enroller(), | |
| 221 Enroll(public_key_, private_key_, _, expected_invocation_reason, _)) | |
| 222 .WillOnce(SaveArg<4>(&completion_callback)); | |
| 223 | |
| 224 auto sync_request = base::MakeUnique<SyncScheduler::SyncRequest>( | |
| 225 enrollment_manager_.GetSyncScheduler()); | |
| 226 EXPECT_CALL(*this, OnEnrollmentStartedProxy()); | |
| 227 | |
| 228 SyncScheduler::Delegate* delegate = | |
| 229 static_cast<SyncScheduler::Delegate*>(&enrollment_manager_); | |
| 230 delegate->OnSyncRequested(std::move(sync_request)); | |
| 231 | |
| 232 return completion_callback; | |
| 233 } | |
| 234 | |
| 235 MockSyncScheduler* sync_scheduler() { | |
| 236 return enrollment_manager_.GetSyncScheduler().get(); | |
| 237 } | |
| 238 | |
| 239 MockCryptAuthEnroller* next_cryptauth_enroller() { | |
| 240 return enroller_factory_->next_cryptauth_enroller(); | |
| 241 } | |
| 242 | |
| 243 // The expected persistent keypair. | |
| 244 std::string public_key_; | |
| 245 std::string private_key_; | |
| 246 | |
| 247 // Owned by |enrollment_manager_|. | |
| 248 base::SimpleTestClock* clock_; | |
| 249 | |
| 250 // Owned by |enrollment_manager_|. | |
| 251 MockCryptAuthEnrollerFactory* enroller_factory_; | |
| 252 | |
| 253 // Ownered by |enrollment_manager_|. | |
| 254 FakeSecureMessageDelegate* secure_message_delegate_; | |
| 255 | |
| 256 cryptauth::GcmDeviceInfo device_info_; | |
| 257 | |
| 258 TestingPrefServiceSimple pref_service_; | |
| 259 | |
| 260 FakeCryptAuthGCMManager gcm_manager_; | |
| 261 | |
| 262 TestCryptAuthEnrollmentManager enrollment_manager_; | |
| 263 | |
| 264 DISALLOW_COPY_AND_ASSIGN(ProximityAuthCryptAuthEnrollmentManagerTest); | |
| 265 }; | |
| 266 | |
| 267 TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, RegisterPrefs) { | |
| 268 TestingPrefServiceSimple pref_service; | |
| 269 CryptAuthEnrollmentManager::RegisterPrefs(pref_service.registry()); | |
| 270 EXPECT_TRUE(pref_service.FindPreference( | |
| 271 prefs::kCryptAuthEnrollmentLastEnrollmentTimeSeconds)); | |
| 272 EXPECT_TRUE(pref_service.FindPreference( | |
| 273 prefs::kCryptAuthEnrollmentIsRecoveringFromFailure)); | |
| 274 EXPECT_TRUE(pref_service.FindPreference(prefs::kCryptAuthEnrollmentReason)); | |
| 275 } | |
| 276 | |
| 277 TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, GetEnrollmentState) { | |
| 278 enrollment_manager_.Start(); | |
| 279 | |
| 280 ON_CALL(*sync_scheduler(), GetStrategy()) | |
| 281 .WillByDefault(Return(SyncScheduler::Strategy::PERIODIC_REFRESH)); | |
| 282 EXPECT_FALSE(enrollment_manager_.IsRecoveringFromFailure()); | |
| 283 | |
| 284 ON_CALL(*sync_scheduler(), GetStrategy()) | |
| 285 .WillByDefault(Return(SyncScheduler::Strategy::AGGRESSIVE_RECOVERY)); | |
| 286 EXPECT_TRUE(enrollment_manager_.IsRecoveringFromFailure()); | |
| 287 | |
| 288 base::TimeDelta time_to_next_sync = base::TimeDelta::FromMinutes(60); | |
| 289 ON_CALL(*sync_scheduler(), GetTimeToNextSync()) | |
| 290 .WillByDefault(Return(time_to_next_sync)); | |
| 291 EXPECT_EQ(time_to_next_sync, enrollment_manager_.GetTimeToNextAttempt()); | |
| 292 | |
| 293 ON_CALL(*sync_scheduler(), GetSyncState()) | |
| 294 .WillByDefault(Return(SyncScheduler::SyncState::SYNC_IN_PROGRESS)); | |
| 295 EXPECT_TRUE(enrollment_manager_.IsEnrollmentInProgress()); | |
| 296 | |
| 297 ON_CALL(*sync_scheduler(), GetSyncState()) | |
| 298 .WillByDefault(Return(SyncScheduler::SyncState::WAITING_FOR_REFRESH)); | |
| 299 EXPECT_FALSE(enrollment_manager_.IsEnrollmentInProgress()); | |
| 300 } | |
| 301 | |
| 302 TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, InitWithDefaultPrefs) { | |
| 303 std::unique_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock()); | |
| 304 clock->SetNow(base::Time::FromDoubleT(kInitialTimeNowSeconds)); | |
| 305 base::TimeDelta elapsed_time = clock->Now() - base::Time::FromDoubleT(0); | |
| 306 | |
| 307 TestingPrefServiceSimple pref_service; | |
| 308 CryptAuthEnrollmentManager::RegisterPrefs(pref_service.registry()); | |
| 309 | |
| 310 TestCryptAuthEnrollmentManager enrollment_manager( | |
| 311 std::move(clock), base::MakeUnique<MockCryptAuthEnrollerFactory>(), | |
| 312 base::MakeUnique<FakeSecureMessageDelegate>(), device_info_, | |
| 313 &gcm_manager_, &pref_service); | |
| 314 | |
| 315 EXPECT_CALL( | |
| 316 *enrollment_manager.GetSyncScheduler(), | |
| 317 Start(elapsed_time, SyncScheduler::Strategy::AGGRESSIVE_RECOVERY)); | |
| 318 enrollment_manager.Start(); | |
| 319 | |
| 320 EXPECT_FALSE(enrollment_manager.IsEnrollmentValid()); | |
| 321 EXPECT_TRUE(enrollment_manager.GetLastEnrollmentTime().is_null()); | |
| 322 } | |
| 323 | |
| 324 TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, InitWithExistingPrefs) { | |
| 325 EXPECT_CALL( | |
| 326 *sync_scheduler(), | |
| 327 Start(clock_->Now() - base::Time::FromDoubleT(kLastEnrollmentTimeSeconds), | |
| 328 SyncScheduler::Strategy::PERIODIC_REFRESH)); | |
| 329 | |
| 330 enrollment_manager_.Start(); | |
| 331 EXPECT_TRUE(enrollment_manager_.IsEnrollmentValid()); | |
| 332 EXPECT_EQ(base::Time::FromDoubleT(kLastEnrollmentTimeSeconds), | |
| 333 enrollment_manager_.GetLastEnrollmentTime()); | |
| 334 } | |
| 335 | |
| 336 TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, InitWithExpiredEnrollment) { | |
| 337 pref_service_.SetUserPref( | |
| 338 prefs::kCryptAuthEnrollmentLastEnrollmentTimeSeconds, | |
| 339 new base::FundamentalValue(kLastExpiredEnrollmentTimeSeconds)); | |
| 340 | |
| 341 EXPECT_CALL(*sync_scheduler(), | |
| 342 Start(clock_->Now() - base::Time::FromDoubleT( | |
| 343 kLastExpiredEnrollmentTimeSeconds), | |
| 344 SyncScheduler::Strategy::AGGRESSIVE_RECOVERY)); | |
| 345 | |
| 346 enrollment_manager_.Start(); | |
| 347 EXPECT_FALSE(enrollment_manager_.IsEnrollmentValid()); | |
| 348 EXPECT_EQ(base::Time::FromDoubleT(kLastExpiredEnrollmentTimeSeconds), | |
| 349 enrollment_manager_.GetLastEnrollmentTime()); | |
| 350 } | |
| 351 | |
| 352 TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, ForceEnrollment) { | |
| 353 enrollment_manager_.Start(); | |
| 354 | |
| 355 EXPECT_CALL(*sync_scheduler(), ForceSync()); | |
| 356 enrollment_manager_.ForceEnrollmentNow( | |
| 357 cryptauth::INVOCATION_REASON_SERVER_INITIATED); | |
| 358 | |
| 359 auto completion_callback = | |
| 360 FireSchedulerForEnrollment(cryptauth::INVOCATION_REASON_SERVER_INITIATED); | |
| 361 | |
| 362 clock_->SetNow(base::Time::FromDoubleT(kLaterTimeNow)); | |
| 363 EXPECT_CALL(*this, OnEnrollmentFinishedProxy(true)); | |
| 364 completion_callback.Run(true); | |
| 365 EXPECT_EQ(clock_->Now(), enrollment_manager_.GetLastEnrollmentTime()); | |
| 366 } | |
| 367 | |
| 368 TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, | |
| 369 EnrollmentFailsThenSucceeds) { | |
| 370 enrollment_manager_.Start(); | |
| 371 base::Time old_enrollment_time = enrollment_manager_.GetLastEnrollmentTime(); | |
| 372 | |
| 373 // The first periodic enrollment fails. | |
| 374 ON_CALL(*sync_scheduler(), GetStrategy()) | |
| 375 .WillByDefault(Return(SyncScheduler::Strategy::PERIODIC_REFRESH)); | |
| 376 auto completion_callback = | |
| 377 FireSchedulerForEnrollment(cryptauth::INVOCATION_REASON_PERIODIC); | |
| 378 clock_->SetNow(base::Time::FromDoubleT(kLaterTimeNow)); | |
| 379 EXPECT_CALL(*this, OnEnrollmentFinishedProxy(false)); | |
| 380 completion_callback.Run(false); | |
| 381 EXPECT_EQ(old_enrollment_time, enrollment_manager_.GetLastEnrollmentTime()); | |
| 382 EXPECT_TRUE(pref_service_.GetBoolean( | |
| 383 prefs::kCryptAuthEnrollmentIsRecoveringFromFailure)); | |
| 384 | |
| 385 // The second recovery enrollment succeeds. | |
| 386 ON_CALL(*sync_scheduler(), GetStrategy()) | |
| 387 .WillByDefault(Return(SyncScheduler::Strategy::AGGRESSIVE_RECOVERY)); | |
| 388 completion_callback = | |
| 389 FireSchedulerForEnrollment(cryptauth::INVOCATION_REASON_FAILURE_RECOVERY); | |
| 390 clock_->SetNow(base::Time::FromDoubleT(kLaterTimeNow + 30)); | |
| 391 EXPECT_CALL(*this, OnEnrollmentFinishedProxy(true)); | |
| 392 completion_callback.Run(true); | |
| 393 EXPECT_EQ(clock_->Now(), enrollment_manager_.GetLastEnrollmentTime()); | |
| 394 EXPECT_FALSE(pref_service_.GetBoolean( | |
| 395 prefs::kCryptAuthEnrollmentIsRecoveringFromFailure)); | |
| 396 } | |
| 397 | |
| 398 TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, | |
| 399 EnrollmentSucceedsForFirstTime) { | |
| 400 // Initialize |enrollment_manager_|. | |
| 401 ON_CALL(*sync_scheduler(), GetStrategy()) | |
| 402 .WillByDefault(Return(SyncScheduler::Strategy::PERIODIC_REFRESH)); | |
| 403 gcm_manager_.set_registration_id(std::string()); | |
| 404 pref_service_.ClearPref(prefs::kCryptAuthEnrollmentUserPublicKey); | |
| 405 pref_service_.ClearPref(prefs::kCryptAuthEnrollmentUserPrivateKey); | |
| 406 pref_service_.ClearPref(prefs::kCryptAuthEnrollmentLastEnrollmentTimeSeconds); | |
| 407 enrollment_manager_.Start(); | |
| 408 EXPECT_FALSE(enrollment_manager_.IsEnrollmentValid()); | |
| 409 | |
| 410 // Trigger a sync request. | |
| 411 EXPECT_CALL(*this, OnEnrollmentStartedProxy()); | |
| 412 auto sync_request = base::MakeUnique<SyncScheduler::SyncRequest>( | |
| 413 enrollment_manager_.GetSyncScheduler()); | |
| 414 static_cast<SyncScheduler::Delegate*>(&enrollment_manager_) | |
| 415 ->OnSyncRequested(std::move(sync_request)); | |
| 416 | |
| 417 // Complete GCM registration successfully, and expect an enrollment. | |
| 418 CryptAuthEnroller::EnrollmentFinishedCallback enrollment_callback; | |
| 419 EXPECT_CALL(*next_cryptauth_enroller(), | |
| 420 Enroll(public_key_, private_key_, _, | |
| 421 cryptauth::INVOCATION_REASON_INITIALIZATION, _)) | |
| 422 .WillOnce(SaveArg<4>(&enrollment_callback)); | |
| 423 ASSERT_TRUE(gcm_manager_.registration_in_progress()); | |
| 424 gcm_manager_.CompleteRegistration(kGCMRegistrationId); | |
| 425 | |
| 426 // Complete CryptAuth enrollment. | |
| 427 ASSERT_FALSE(enrollment_callback.is_null()); | |
| 428 clock_->SetNow(base::Time::FromDoubleT(kLaterTimeNow)); | |
| 429 EXPECT_CALL(*this, OnEnrollmentFinishedProxy(true)); | |
| 430 enrollment_callback.Run(true); | |
| 431 EXPECT_EQ(clock_->Now(), enrollment_manager_.GetLastEnrollmentTime()); | |
| 432 EXPECT_TRUE(enrollment_manager_.IsEnrollmentValid()); | |
| 433 | |
| 434 // Check that CryptAuthEnrollmentManager returns the expected key-pair. | |
| 435 EXPECT_EQ(public_key_, enrollment_manager_.GetUserPublicKey()); | |
| 436 EXPECT_EQ(private_key_, enrollment_manager_.GetUserPrivateKey()); | |
| 437 } | |
| 438 | |
| 439 TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, GCMRegistrationFails) { | |
| 440 // Initialize |enrollment_manager_|. | |
| 441 ON_CALL(*sync_scheduler(), GetStrategy()) | |
| 442 .WillByDefault(Return(SyncScheduler::Strategy::PERIODIC_REFRESH)); | |
| 443 gcm_manager_.set_registration_id(std::string()); | |
| 444 enrollment_manager_.Start(); | |
| 445 | |
| 446 // Trigger a sync request. | |
| 447 EXPECT_CALL(*this, OnEnrollmentStartedProxy()); | |
| 448 auto sync_request = base::MakeUnique<SyncScheduler::SyncRequest>( | |
| 449 enrollment_manager_.GetSyncScheduler()); | |
| 450 static_cast<SyncScheduler::Delegate*>(&enrollment_manager_) | |
| 451 ->OnSyncRequested(std::move(sync_request)); | |
| 452 | |
| 453 // Complete GCM registration with failure. | |
| 454 EXPECT_CALL(*this, OnEnrollmentFinishedProxy(false)); | |
| 455 gcm_manager_.CompleteRegistration(std::string()); | |
| 456 } | |
| 457 | |
| 458 TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, ReenrollOnGCMPushMessage) { | |
| 459 enrollment_manager_.Start(); | |
| 460 | |
| 461 // Simulate receiving a GCM push message, forcing the device to re-enroll. | |
| 462 gcm_manager_.PushReenrollMessage(); | |
| 463 auto completion_callback = | |
| 464 FireSchedulerForEnrollment(cryptauth::INVOCATION_REASON_SERVER_INITIATED); | |
| 465 | |
| 466 EXPECT_CALL(*this, OnEnrollmentFinishedProxy(true)); | |
| 467 completion_callback.Run(true); | |
| 468 } | |
| 469 | |
| 470 } // namespace proximity_auth | |
| OLD | NEW |