| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/proximity_auth/cryptauth/cryptauth_enrollment_manager.h" | 5 #include "components/proximity_auth/cryptauth/cryptauth_enrollment_manager.h" |
| 6 | 6 |
| 7 #include <utility> | 7 #include <utility> |
| 8 | 8 |
| 9 #include "base/base64url.h" | 9 #include "base/base64url.h" |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| 11 #include "base/memory/ptr_util.h" |
| 11 #include "base/memory/weak_ptr.h" | 12 #include "base/memory/weak_ptr.h" |
| 12 #include "base/test/simple_test_clock.h" | 13 #include "base/test/simple_test_clock.h" |
| 13 #include "base/time/clock.h" | 14 #include "base/time/clock.h" |
| 14 #include "base/time/time.h" | 15 #include "base/time/time.h" |
| 15 #include "components/prefs/testing_pref_service.h" | 16 #include "components/prefs/testing_pref_service.h" |
| 16 #include "components/proximity_auth/cryptauth/cryptauth_enroller.h" | 17 #include "components/proximity_auth/cryptauth/cryptauth_enroller.h" |
| 17 #include "components/proximity_auth/cryptauth/fake_cryptauth_gcm_manager.h" | 18 #include "components/proximity_auth/cryptauth/fake_cryptauth_gcm_manager.h" |
| 18 #include "components/proximity_auth/cryptauth/fake_secure_message_delegate.h" | 19 #include "components/proximity_auth/cryptauth/fake_secure_message_delegate.h" |
| 19 #include "components/proximity_auth/cryptauth/mock_sync_scheduler.h" | 20 #include "components/proximity_auth/cryptauth/mock_sync_scheduler.h" |
| 20 #include "components/proximity_auth/cryptauth/pref_names.h" | 21 #include "components/proximity_auth/cryptauth/pref_names.h" |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 | 70 |
| 70 // Creates MockCryptAuthEnroller instances, and allows expecations to be set | 71 // Creates MockCryptAuthEnroller instances, and allows expecations to be set |
| 71 // before they are returned. | 72 // before they are returned. |
| 72 class MockCryptAuthEnrollerFactory : public CryptAuthEnrollerFactory { | 73 class MockCryptAuthEnrollerFactory : public CryptAuthEnrollerFactory { |
| 73 public: | 74 public: |
| 74 MockCryptAuthEnrollerFactory() | 75 MockCryptAuthEnrollerFactory() |
| 75 : next_cryptauth_enroller_(new NiceMock<MockCryptAuthEnroller>()) {} | 76 : next_cryptauth_enroller_(new NiceMock<MockCryptAuthEnroller>()) {} |
| 76 ~MockCryptAuthEnrollerFactory() override {} | 77 ~MockCryptAuthEnrollerFactory() override {} |
| 77 | 78 |
| 78 // CryptAuthEnrollerFactory: | 79 // CryptAuthEnrollerFactory: |
| 79 scoped_ptr<CryptAuthEnroller> CreateInstance() override { | 80 std::unique_ptr<CryptAuthEnroller> CreateInstance() override { |
| 80 auto passed_cryptauth_enroller = std::move(next_cryptauth_enroller_); | 81 auto passed_cryptauth_enroller = std::move(next_cryptauth_enroller_); |
| 81 next_cryptauth_enroller_.reset(new NiceMock<MockCryptAuthEnroller>()); | 82 next_cryptauth_enroller_.reset(new NiceMock<MockCryptAuthEnroller>()); |
| 82 return std::move(passed_cryptauth_enroller); | 83 return std::move(passed_cryptauth_enroller); |
| 83 } | 84 } |
| 84 | 85 |
| 85 MockCryptAuthEnroller* next_cryptauth_enroller() { | 86 MockCryptAuthEnroller* next_cryptauth_enroller() { |
| 86 return next_cryptauth_enroller_.get(); | 87 return next_cryptauth_enroller_.get(); |
| 87 } | 88 } |
| 88 | 89 |
| 89 private: | 90 private: |
| 90 // Stores the next CryptAuthEnroller to be created. | 91 // Stores the next CryptAuthEnroller to be created. |
| 91 // Ownership is passed to the caller of |CreateInstance()|. | 92 // Ownership is passed to the caller of |CreateInstance()|. |
| 92 scoped_ptr<MockCryptAuthEnroller> next_cryptauth_enroller_; | 93 std::unique_ptr<MockCryptAuthEnroller> next_cryptauth_enroller_; |
| 93 | 94 |
| 94 DISALLOW_COPY_AND_ASSIGN(MockCryptAuthEnrollerFactory); | 95 DISALLOW_COPY_AND_ASSIGN(MockCryptAuthEnrollerFactory); |
| 95 }; | 96 }; |
| 96 | 97 |
| 97 // Harness for testing CryptAuthEnrollmentManager. | 98 // Harness for testing CryptAuthEnrollmentManager. |
| 98 class TestCryptAuthEnrollmentManager : public CryptAuthEnrollmentManager { | 99 class TestCryptAuthEnrollmentManager : public CryptAuthEnrollmentManager { |
| 99 public: | 100 public: |
| 100 TestCryptAuthEnrollmentManager( | 101 TestCryptAuthEnrollmentManager( |
| 101 scoped_ptr<base::Clock> clock, | 102 std::unique_ptr<base::Clock> clock, |
| 102 scoped_ptr<CryptAuthEnrollerFactory> enroller_factory, | 103 std::unique_ptr<CryptAuthEnrollerFactory> enroller_factory, |
| 103 scoped_ptr<SecureMessageDelegate> secure_message_delegate, | 104 std::unique_ptr<SecureMessageDelegate> secure_message_delegate, |
| 104 const cryptauth::GcmDeviceInfo& device_info, | 105 const cryptauth::GcmDeviceInfo& device_info, |
| 105 CryptAuthGCMManager* gcm_manager, | 106 CryptAuthGCMManager* gcm_manager, |
| 106 PrefService* pref_service) | 107 PrefService* pref_service) |
| 107 : CryptAuthEnrollmentManager(std::move(clock), | 108 : CryptAuthEnrollmentManager(std::move(clock), |
| 108 std::move(enroller_factory), | 109 std::move(enroller_factory), |
| 109 std::move(secure_message_delegate), | 110 std::move(secure_message_delegate), |
| 110 device_info, | 111 device_info, |
| 111 gcm_manager, | 112 gcm_manager, |
| 112 pref_service), | 113 pref_service), |
| 113 scoped_sync_scheduler_(new NiceMock<MockSyncScheduler>()), | 114 scoped_sync_scheduler_(new NiceMock<MockSyncScheduler>()), |
| 114 weak_sync_scheduler_factory_(scoped_sync_scheduler_.get()) {} | 115 weak_sync_scheduler_factory_(scoped_sync_scheduler_.get()) {} |
| 115 | 116 |
| 116 ~TestCryptAuthEnrollmentManager() override {} | 117 ~TestCryptAuthEnrollmentManager() override {} |
| 117 | 118 |
| 118 scoped_ptr<SyncScheduler> CreateSyncScheduler() override { | 119 std::unique_ptr<SyncScheduler> CreateSyncScheduler() override { |
| 119 EXPECT_TRUE(scoped_sync_scheduler_); | 120 EXPECT_TRUE(scoped_sync_scheduler_); |
| 120 return std::move(scoped_sync_scheduler_); | 121 return std::move(scoped_sync_scheduler_); |
| 121 } | 122 } |
| 122 | 123 |
| 123 base::WeakPtr<MockSyncScheduler> GetSyncScheduler() { | 124 base::WeakPtr<MockSyncScheduler> GetSyncScheduler() { |
| 124 return weak_sync_scheduler_factory_.GetWeakPtr(); | 125 return weak_sync_scheduler_factory_.GetWeakPtr(); |
| 125 } | 126 } |
| 126 | 127 |
| 127 private: | 128 private: |
| 128 // Ownership is passed to |CryptAuthEnrollmentManager| super class when | 129 // Ownership is passed to |CryptAuthEnrollmentManager| super class when |
| 129 // |CreateSyncScheduler()| is called. | 130 // |CreateSyncScheduler()| is called. |
| 130 scoped_ptr<MockSyncScheduler> scoped_sync_scheduler_; | 131 std::unique_ptr<MockSyncScheduler> scoped_sync_scheduler_; |
| 131 | 132 |
| 132 // Stores the pointer of |scoped_sync_scheduler_| after ownership is passed to | 133 // Stores the pointer of |scoped_sync_scheduler_| after ownership is passed to |
| 133 // the super class. | 134 // the super class. |
| 134 // This should be safe because the life-time this SyncScheduler will always be | 135 // This should be safe because the life-time this SyncScheduler will always be |
| 135 // within the life of the TestCryptAuthEnrollmentManager object. | 136 // within the life of the TestCryptAuthEnrollmentManager object. |
| 136 base::WeakPtrFactory<MockSyncScheduler> weak_sync_scheduler_factory_; | 137 base::WeakPtrFactory<MockSyncScheduler> weak_sync_scheduler_factory_; |
| 137 | 138 |
| 138 DISALLOW_COPY_AND_ASSIGN(TestCryptAuthEnrollmentManager); | 139 DISALLOW_COPY_AND_ASSIGN(TestCryptAuthEnrollmentManager); |
| 139 }; | 140 }; |
| 140 | 141 |
| 141 } // namespace | 142 } // namespace |
| 142 | 143 |
| 143 class ProximityAuthCryptAuthEnrollmentManagerTest | 144 class ProximityAuthCryptAuthEnrollmentManagerTest |
| 144 : public testing::Test, | 145 : public testing::Test, |
| 145 public CryptAuthEnrollmentManager::Observer { | 146 public CryptAuthEnrollmentManager::Observer { |
| 146 protected: | 147 protected: |
| 147 ProximityAuthCryptAuthEnrollmentManagerTest() | 148 ProximityAuthCryptAuthEnrollmentManagerTest() |
| 148 : public_key_(kUserPublicKey), | 149 : public_key_(kUserPublicKey), |
| 149 clock_(new base::SimpleTestClock()), | 150 clock_(new base::SimpleTestClock()), |
| 150 enroller_factory_(new MockCryptAuthEnrollerFactory()), | 151 enroller_factory_(new MockCryptAuthEnrollerFactory()), |
| 151 secure_message_delegate_(new FakeSecureMessageDelegate()), | 152 secure_message_delegate_(new FakeSecureMessageDelegate()), |
| 152 gcm_manager_(kGCMRegistrationId), | 153 gcm_manager_(kGCMRegistrationId), |
| 153 enrollment_manager_(make_scoped_ptr(clock_), | 154 enrollment_manager_(base::WrapUnique(clock_), |
| 154 make_scoped_ptr(enroller_factory_), | 155 base::WrapUnique(enroller_factory_), |
| 155 make_scoped_ptr(secure_message_delegate_), | 156 base::WrapUnique(secure_message_delegate_), |
| 156 device_info_, | 157 device_info_, |
| 157 &gcm_manager_, | 158 &gcm_manager_, |
| 158 &pref_service_) {} | 159 &pref_service_) {} |
| 159 | 160 |
| 160 // testing::Test: | 161 // testing::Test: |
| 161 void SetUp() override { | 162 void SetUp() override { |
| 162 clock_->SetNow(base::Time::FromDoubleT(kInitialTimeNowSeconds)); | 163 clock_->SetNow(base::Time::FromDoubleT(kInitialTimeNowSeconds)); |
| 163 enrollment_manager_.AddObserver(this); | 164 enrollment_manager_.AddObserver(this); |
| 164 | 165 |
| 165 private_key_ = | 166 private_key_ = |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 213 | 214 |
| 214 // Simulates firing the SyncScheduler to trigger an enrollment attempt. | 215 // Simulates firing the SyncScheduler to trigger an enrollment attempt. |
| 215 CryptAuthEnroller::EnrollmentFinishedCallback FireSchedulerForEnrollment( | 216 CryptAuthEnroller::EnrollmentFinishedCallback FireSchedulerForEnrollment( |
| 216 cryptauth::InvocationReason expected_invocation_reason) { | 217 cryptauth::InvocationReason expected_invocation_reason) { |
| 217 CryptAuthEnroller::EnrollmentFinishedCallback completion_callback; | 218 CryptAuthEnroller::EnrollmentFinishedCallback completion_callback; |
| 218 EXPECT_CALL( | 219 EXPECT_CALL( |
| 219 *next_cryptauth_enroller(), | 220 *next_cryptauth_enroller(), |
| 220 Enroll(public_key_, private_key_, _, expected_invocation_reason, _)) | 221 Enroll(public_key_, private_key_, _, expected_invocation_reason, _)) |
| 221 .WillOnce(SaveArg<4>(&completion_callback)); | 222 .WillOnce(SaveArg<4>(&completion_callback)); |
| 222 | 223 |
| 223 auto sync_request = make_scoped_ptr( | 224 auto sync_request = base::WrapUnique( |
| 224 new SyncScheduler::SyncRequest(enrollment_manager_.GetSyncScheduler())); | 225 new SyncScheduler::SyncRequest(enrollment_manager_.GetSyncScheduler())); |
| 225 EXPECT_CALL(*this, OnEnrollmentStartedProxy()); | 226 EXPECT_CALL(*this, OnEnrollmentStartedProxy()); |
| 226 | 227 |
| 227 SyncScheduler::Delegate* delegate = | 228 SyncScheduler::Delegate* delegate = |
| 228 static_cast<SyncScheduler::Delegate*>(&enrollment_manager_); | 229 static_cast<SyncScheduler::Delegate*>(&enrollment_manager_); |
| 229 delegate->OnSyncRequested(std::move(sync_request)); | 230 delegate->OnSyncRequested(std::move(sync_request)); |
| 230 | 231 |
| 231 return completion_callback; | 232 return completion_callback; |
| 232 } | 233 } |
| 233 | 234 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 292 ON_CALL(*sync_scheduler(), GetSyncState()) | 293 ON_CALL(*sync_scheduler(), GetSyncState()) |
| 293 .WillByDefault(Return(SyncScheduler::SyncState::SYNC_IN_PROGRESS)); | 294 .WillByDefault(Return(SyncScheduler::SyncState::SYNC_IN_PROGRESS)); |
| 294 EXPECT_TRUE(enrollment_manager_.IsEnrollmentInProgress()); | 295 EXPECT_TRUE(enrollment_manager_.IsEnrollmentInProgress()); |
| 295 | 296 |
| 296 ON_CALL(*sync_scheduler(), GetSyncState()) | 297 ON_CALL(*sync_scheduler(), GetSyncState()) |
| 297 .WillByDefault(Return(SyncScheduler::SyncState::WAITING_FOR_REFRESH)); | 298 .WillByDefault(Return(SyncScheduler::SyncState::WAITING_FOR_REFRESH)); |
| 298 EXPECT_FALSE(enrollment_manager_.IsEnrollmentInProgress()); | 299 EXPECT_FALSE(enrollment_manager_.IsEnrollmentInProgress()); |
| 299 } | 300 } |
| 300 | 301 |
| 301 TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, InitWithDefaultPrefs) { | 302 TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, InitWithDefaultPrefs) { |
| 302 scoped_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock()); | 303 std::unique_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock()); |
| 303 clock->SetNow(base::Time::FromDoubleT(kInitialTimeNowSeconds)); | 304 clock->SetNow(base::Time::FromDoubleT(kInitialTimeNowSeconds)); |
| 304 base::TimeDelta elapsed_time = clock->Now() - base::Time::FromDoubleT(0); | 305 base::TimeDelta elapsed_time = clock->Now() - base::Time::FromDoubleT(0); |
| 305 | 306 |
| 306 TestingPrefServiceSimple pref_service; | 307 TestingPrefServiceSimple pref_service; |
| 307 CryptAuthEnrollmentManager::RegisterPrefs(pref_service.registry()); | 308 CryptAuthEnrollmentManager::RegisterPrefs(pref_service.registry()); |
| 308 | 309 |
| 309 TestCryptAuthEnrollmentManager enrollment_manager( | 310 TestCryptAuthEnrollmentManager enrollment_manager( |
| 310 std::move(clock), make_scoped_ptr(new MockCryptAuthEnrollerFactory()), | 311 std::move(clock), base::WrapUnique(new MockCryptAuthEnrollerFactory()), |
| 311 make_scoped_ptr(new FakeSecureMessageDelegate()), device_info_, | 312 base::WrapUnique(new FakeSecureMessageDelegate()), device_info_, |
| 312 &gcm_manager_, &pref_service); | 313 &gcm_manager_, &pref_service); |
| 313 | 314 |
| 314 EXPECT_CALL( | 315 EXPECT_CALL( |
| 315 *enrollment_manager.GetSyncScheduler(), | 316 *enrollment_manager.GetSyncScheduler(), |
| 316 Start(elapsed_time, SyncScheduler::Strategy::AGGRESSIVE_RECOVERY)); | 317 Start(elapsed_time, SyncScheduler::Strategy::AGGRESSIVE_RECOVERY)); |
| 317 enrollment_manager.Start(); | 318 enrollment_manager.Start(); |
| 318 | 319 |
| 319 EXPECT_FALSE(enrollment_manager.IsEnrollmentValid()); | 320 EXPECT_FALSE(enrollment_manager.IsEnrollmentValid()); |
| 320 EXPECT_TRUE(enrollment_manager.GetLastEnrollmentTime().is_null()); | 321 EXPECT_TRUE(enrollment_manager.GetLastEnrollmentTime().is_null()); |
| 321 } | 322 } |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 .WillByDefault(Return(SyncScheduler::Strategy::PERIODIC_REFRESH)); | 402 .WillByDefault(Return(SyncScheduler::Strategy::PERIODIC_REFRESH)); |
| 402 gcm_manager_.set_registration_id(std::string()); | 403 gcm_manager_.set_registration_id(std::string()); |
| 403 pref_service_.ClearPref(prefs::kCryptAuthEnrollmentUserPublicKey); | 404 pref_service_.ClearPref(prefs::kCryptAuthEnrollmentUserPublicKey); |
| 404 pref_service_.ClearPref(prefs::kCryptAuthEnrollmentUserPrivateKey); | 405 pref_service_.ClearPref(prefs::kCryptAuthEnrollmentUserPrivateKey); |
| 405 pref_service_.ClearPref(prefs::kCryptAuthEnrollmentLastEnrollmentTimeSeconds); | 406 pref_service_.ClearPref(prefs::kCryptAuthEnrollmentLastEnrollmentTimeSeconds); |
| 406 enrollment_manager_.Start(); | 407 enrollment_manager_.Start(); |
| 407 EXPECT_FALSE(enrollment_manager_.IsEnrollmentValid()); | 408 EXPECT_FALSE(enrollment_manager_.IsEnrollmentValid()); |
| 408 | 409 |
| 409 // Trigger a sync request. | 410 // Trigger a sync request. |
| 410 EXPECT_CALL(*this, OnEnrollmentStartedProxy()); | 411 EXPECT_CALL(*this, OnEnrollmentStartedProxy()); |
| 411 auto sync_request = make_scoped_ptr( | 412 auto sync_request = base::WrapUnique( |
| 412 new SyncScheduler::SyncRequest(enrollment_manager_.GetSyncScheduler())); | 413 new SyncScheduler::SyncRequest(enrollment_manager_.GetSyncScheduler())); |
| 413 static_cast<SyncScheduler::Delegate*>(&enrollment_manager_) | 414 static_cast<SyncScheduler::Delegate*>(&enrollment_manager_) |
| 414 ->OnSyncRequested(std::move(sync_request)); | 415 ->OnSyncRequested(std::move(sync_request)); |
| 415 | 416 |
| 416 // Complete GCM registration successfully, and expect an enrollment. | 417 // Complete GCM registration successfully, and expect an enrollment. |
| 417 CryptAuthEnroller::EnrollmentFinishedCallback enrollment_callback; | 418 CryptAuthEnroller::EnrollmentFinishedCallback enrollment_callback; |
| 418 EXPECT_CALL(*next_cryptauth_enroller(), | 419 EXPECT_CALL(*next_cryptauth_enroller(), |
| 419 Enroll(public_key_, private_key_, _, | 420 Enroll(public_key_, private_key_, _, |
| 420 cryptauth::INVOCATION_REASON_INITIALIZATION, _)) | 421 cryptauth::INVOCATION_REASON_INITIALIZATION, _)) |
| 421 .WillOnce(SaveArg<4>(&enrollment_callback)); | 422 .WillOnce(SaveArg<4>(&enrollment_callback)); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 437 | 438 |
| 438 TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, GCMRegistrationFails) { | 439 TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, GCMRegistrationFails) { |
| 439 // Initialize |enrollment_manager_|. | 440 // Initialize |enrollment_manager_|. |
| 440 ON_CALL(*sync_scheduler(), GetStrategy()) | 441 ON_CALL(*sync_scheduler(), GetStrategy()) |
| 441 .WillByDefault(Return(SyncScheduler::Strategy::PERIODIC_REFRESH)); | 442 .WillByDefault(Return(SyncScheduler::Strategy::PERIODIC_REFRESH)); |
| 442 gcm_manager_.set_registration_id(std::string()); | 443 gcm_manager_.set_registration_id(std::string()); |
| 443 enrollment_manager_.Start(); | 444 enrollment_manager_.Start(); |
| 444 | 445 |
| 445 // Trigger a sync request. | 446 // Trigger a sync request. |
| 446 EXPECT_CALL(*this, OnEnrollmentStartedProxy()); | 447 EXPECT_CALL(*this, OnEnrollmentStartedProxy()); |
| 447 auto sync_request = make_scoped_ptr( | 448 auto sync_request = base::WrapUnique( |
| 448 new SyncScheduler::SyncRequest(enrollment_manager_.GetSyncScheduler())); | 449 new SyncScheduler::SyncRequest(enrollment_manager_.GetSyncScheduler())); |
| 449 static_cast<SyncScheduler::Delegate*>(&enrollment_manager_) | 450 static_cast<SyncScheduler::Delegate*>(&enrollment_manager_) |
| 450 ->OnSyncRequested(std::move(sync_request)); | 451 ->OnSyncRequested(std::move(sync_request)); |
| 451 | 452 |
| 452 // Complete GCM registration with failure. | 453 // Complete GCM registration with failure. |
| 453 EXPECT_CALL(*this, OnEnrollmentFinishedProxy(false)); | 454 EXPECT_CALL(*this, OnEnrollmentFinishedProxy(false)); |
| 454 gcm_manager_.CompleteRegistration(std::string()); | 455 gcm_manager_.CompleteRegistration(std::string()); |
| 455 } | 456 } |
| 456 | 457 |
| 457 TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, ReenrollOnGCMPushMessage) { | 458 TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, ReenrollOnGCMPushMessage) { |
| 458 enrollment_manager_.Start(); | 459 enrollment_manager_.Start(); |
| 459 | 460 |
| 460 // Simulate receiving a GCM push message, forcing the device to re-enroll. | 461 // Simulate receiving a GCM push message, forcing the device to re-enroll. |
| 461 gcm_manager_.PushReenrollMessage(); | 462 gcm_manager_.PushReenrollMessage(); |
| 462 auto completion_callback = | 463 auto completion_callback = |
| 463 FireSchedulerForEnrollment(cryptauth::INVOCATION_REASON_SERVER_INITIATED); | 464 FireSchedulerForEnrollment(cryptauth::INVOCATION_REASON_SERVER_INITIATED); |
| 464 | 465 |
| 465 EXPECT_CALL(*this, OnEnrollmentFinishedProxy(true)); | 466 EXPECT_CALL(*this, OnEnrollmentFinishedProxy(true)); |
| 466 completion_callback.Run(true); | 467 completion_callback.Run(true); |
| 467 } | 468 } |
| 468 | 469 |
| 469 } // namespace proximity_auth | 470 } // namespace proximity_auth |
| OLD | NEW |