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 |