Index: components/proximity_auth/cryptauth/cryptauth_enrollment_manager_unittest.cc |
diff --git a/components/proximity_auth/cryptauth/cryptauth_enrollment_manager_unittest.cc b/components/proximity_auth/cryptauth/cryptauth_enrollment_manager_unittest.cc |
deleted file mode 100644 |
index 915d7257ea1edf929da12f6f5bbf6691b251c212..0000000000000000000000000000000000000000 |
--- a/components/proximity_auth/cryptauth/cryptauth_enrollment_manager_unittest.cc |
+++ /dev/null |
@@ -1,470 +0,0 @@ |
-// Copyright 2015 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "components/proximity_auth/cryptauth/cryptauth_enrollment_manager.h" |
- |
-#include <utility> |
- |
-#include "base/base64url.h" |
-#include "base/macros.h" |
-#include "base/memory/ptr_util.h" |
-#include "base/memory/weak_ptr.h" |
-#include "base/test/simple_test_clock.h" |
-#include "base/time/clock.h" |
-#include "base/time/time.h" |
-#include "components/prefs/testing_pref_service.h" |
-#include "components/proximity_auth/cryptauth/cryptauth_enroller.h" |
-#include "components/proximity_auth/cryptauth/fake_cryptauth_gcm_manager.h" |
-#include "components/proximity_auth/cryptauth/fake_secure_message_delegate.h" |
-#include "components/proximity_auth/cryptauth/mock_sync_scheduler.h" |
-#include "components/proximity_auth/cryptauth/pref_names.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-using ::testing::_; |
-using ::testing::NiceMock; |
-using ::testing::Return; |
-using ::testing::SaveArg; |
- |
-namespace proximity_auth { |
- |
-namespace { |
- |
-// The GCM registration id from a successful registration. |
-const char kGCMRegistrationId[] = "new gcm registration id"; |
- |
-// The user's persistent public key identifying the local device. |
-const char kUserPublicKey[] = "user public key"; |
- |
-// The initial "Now" time for testing. |
-const double kInitialTimeNowSeconds = 20000000; |
- |
-// A later "Now" time for testing. |
-const double kLaterTimeNow = kInitialTimeNowSeconds + 30; |
- |
-// The timestamp of a last successful enrollment that is still valid. |
-const double kLastEnrollmentTimeSeconds = |
- kInitialTimeNowSeconds - (60 * 60 * 24 * 15); |
- |
-// The timestamp of a last successful enrollment that is expired. |
-const double kLastExpiredEnrollmentTimeSeconds = |
- kInitialTimeNowSeconds - (60 * 60 * 24 * 100); |
- |
-// Mocks out the actual enrollment flow. |
-class MockCryptAuthEnroller : public CryptAuthEnroller { |
- public: |
- MockCryptAuthEnroller() {} |
- ~MockCryptAuthEnroller() override {} |
- |
- MOCK_METHOD5(Enroll, |
- void(const std::string& user_public_key, |
- const std::string& user_private_key, |
- const cryptauth::GcmDeviceInfo& device_info, |
- cryptauth::InvocationReason invocation_reason, |
- const EnrollmentFinishedCallback& callback)); |
- |
- private: |
- DISALLOW_COPY_AND_ASSIGN(MockCryptAuthEnroller); |
-}; |
- |
-// Creates MockCryptAuthEnroller instances, and allows expecations to be set |
-// before they are returned. |
-class MockCryptAuthEnrollerFactory : public CryptAuthEnrollerFactory { |
- public: |
- MockCryptAuthEnrollerFactory() |
- : next_cryptauth_enroller_(new NiceMock<MockCryptAuthEnroller>()) {} |
- ~MockCryptAuthEnrollerFactory() override {} |
- |
- // CryptAuthEnrollerFactory: |
- std::unique_ptr<CryptAuthEnroller> CreateInstance() override { |
- auto passed_cryptauth_enroller = std::move(next_cryptauth_enroller_); |
- next_cryptauth_enroller_.reset(new NiceMock<MockCryptAuthEnroller>()); |
- return std::move(passed_cryptauth_enroller); |
- } |
- |
- MockCryptAuthEnroller* next_cryptauth_enroller() { |
- return next_cryptauth_enroller_.get(); |
- } |
- |
- private: |
- // Stores the next CryptAuthEnroller to be created. |
- // Ownership is passed to the caller of |CreateInstance()|. |
- std::unique_ptr<MockCryptAuthEnroller> next_cryptauth_enroller_; |
- |
- DISALLOW_COPY_AND_ASSIGN(MockCryptAuthEnrollerFactory); |
-}; |
- |
-// Harness for testing CryptAuthEnrollmentManager. |
-class TestCryptAuthEnrollmentManager : public CryptAuthEnrollmentManager { |
- public: |
- TestCryptAuthEnrollmentManager( |
- std::unique_ptr<base::Clock> clock, |
- std::unique_ptr<CryptAuthEnrollerFactory> enroller_factory, |
- std::unique_ptr<SecureMessageDelegate> secure_message_delegate, |
- const cryptauth::GcmDeviceInfo& device_info, |
- CryptAuthGCMManager* gcm_manager, |
- PrefService* pref_service) |
- : CryptAuthEnrollmentManager(std::move(clock), |
- std::move(enroller_factory), |
- std::move(secure_message_delegate), |
- device_info, |
- gcm_manager, |
- pref_service), |
- scoped_sync_scheduler_(new NiceMock<MockSyncScheduler>()), |
- weak_sync_scheduler_factory_(scoped_sync_scheduler_.get()) {} |
- |
- ~TestCryptAuthEnrollmentManager() override {} |
- |
- std::unique_ptr<SyncScheduler> CreateSyncScheduler() override { |
- EXPECT_TRUE(scoped_sync_scheduler_); |
- return std::move(scoped_sync_scheduler_); |
- } |
- |
- base::WeakPtr<MockSyncScheduler> GetSyncScheduler() { |
- return weak_sync_scheduler_factory_.GetWeakPtr(); |
- } |
- |
- private: |
- // Ownership is passed to |CryptAuthEnrollmentManager| super class when |
- // |CreateSyncScheduler()| is called. |
- std::unique_ptr<MockSyncScheduler> scoped_sync_scheduler_; |
- |
- // Stores the pointer of |scoped_sync_scheduler_| after ownership is passed to |
- // the super class. |
- // This should be safe because the life-time this SyncScheduler will always be |
- // within the life of the TestCryptAuthEnrollmentManager object. |
- base::WeakPtrFactory<MockSyncScheduler> weak_sync_scheduler_factory_; |
- |
- DISALLOW_COPY_AND_ASSIGN(TestCryptAuthEnrollmentManager); |
-}; |
- |
-} // namespace |
- |
-class ProximityAuthCryptAuthEnrollmentManagerTest |
- : public testing::Test, |
- public CryptAuthEnrollmentManager::Observer { |
- protected: |
- ProximityAuthCryptAuthEnrollmentManagerTest() |
- : public_key_(kUserPublicKey), |
- clock_(new base::SimpleTestClock()), |
- enroller_factory_(new MockCryptAuthEnrollerFactory()), |
- secure_message_delegate_(new FakeSecureMessageDelegate()), |
- gcm_manager_(kGCMRegistrationId), |
- enrollment_manager_(base::WrapUnique(clock_), |
- base::WrapUnique(enroller_factory_), |
- base::WrapUnique(secure_message_delegate_), |
- device_info_, |
- &gcm_manager_, |
- &pref_service_) {} |
- |
- // testing::Test: |
- void SetUp() override { |
- clock_->SetNow(base::Time::FromDoubleT(kInitialTimeNowSeconds)); |
- enrollment_manager_.AddObserver(this); |
- |
- private_key_ = |
- secure_message_delegate_->GetPrivateKeyForPublicKey(public_key_); |
- secure_message_delegate_->set_next_public_key(public_key_); |
- |
- CryptAuthEnrollmentManager::RegisterPrefs(pref_service_.registry()); |
- pref_service_.SetUserPref( |
- prefs::kCryptAuthEnrollmentIsRecoveringFromFailure, |
- new base::FundamentalValue(false)); |
- pref_service_.SetUserPref( |
- prefs::kCryptAuthEnrollmentLastEnrollmentTimeSeconds, |
- new base::FundamentalValue(kLastEnrollmentTimeSeconds)); |
- pref_service_.SetUserPref( |
- prefs::kCryptAuthEnrollmentReason, |
- new base::FundamentalValue(cryptauth::INVOCATION_REASON_UNKNOWN)); |
- |
- std::string public_key_b64, private_key_b64; |
- base::Base64UrlEncode(public_key_, |
- base::Base64UrlEncodePolicy::INCLUDE_PADDING, |
- &public_key_b64); |
- base::Base64UrlEncode(private_key_, |
- base::Base64UrlEncodePolicy::INCLUDE_PADDING, |
- &private_key_b64); |
- pref_service_.SetString(prefs::kCryptAuthEnrollmentUserPublicKey, |
- public_key_b64); |
- pref_service_.SetString(prefs::kCryptAuthEnrollmentUserPrivateKey, |
- private_key_b64); |
- |
- ON_CALL(*sync_scheduler(), GetStrategy()) |
- .WillByDefault(Return(SyncScheduler::Strategy::PERIODIC_REFRESH)); |
- } |
- |
- void TearDown() override { enrollment_manager_.RemoveObserver(this); } |
- |
- // CryptAuthEnrollmentManager::Observer: |
- void OnEnrollmentStarted() override { OnEnrollmentStartedProxy(); } |
- |
- void OnEnrollmentFinished(bool success) override { |
- // Simulate the scheduler changing strategies based on success or failure. |
- SyncScheduler::Strategy new_strategy = |
- SyncScheduler::Strategy::AGGRESSIVE_RECOVERY; |
- ON_CALL(*sync_scheduler(), GetStrategy()) |
- .WillByDefault(Return(new_strategy)); |
- |
- OnEnrollmentFinishedProxy(success); |
- } |
- |
- MOCK_METHOD0(OnEnrollmentStartedProxy, void()); |
- MOCK_METHOD1(OnEnrollmentFinishedProxy, void(bool success)); |
- |
- // Simulates firing the SyncScheduler to trigger an enrollment attempt. |
- CryptAuthEnroller::EnrollmentFinishedCallback FireSchedulerForEnrollment( |
- cryptauth::InvocationReason expected_invocation_reason) { |
- CryptAuthEnroller::EnrollmentFinishedCallback completion_callback; |
- EXPECT_CALL( |
- *next_cryptauth_enroller(), |
- Enroll(public_key_, private_key_, _, expected_invocation_reason, _)) |
- .WillOnce(SaveArg<4>(&completion_callback)); |
- |
- auto sync_request = base::MakeUnique<SyncScheduler::SyncRequest>( |
- enrollment_manager_.GetSyncScheduler()); |
- EXPECT_CALL(*this, OnEnrollmentStartedProxy()); |
- |
- SyncScheduler::Delegate* delegate = |
- static_cast<SyncScheduler::Delegate*>(&enrollment_manager_); |
- delegate->OnSyncRequested(std::move(sync_request)); |
- |
- return completion_callback; |
- } |
- |
- MockSyncScheduler* sync_scheduler() { |
- return enrollment_manager_.GetSyncScheduler().get(); |
- } |
- |
- MockCryptAuthEnroller* next_cryptauth_enroller() { |
- return enroller_factory_->next_cryptauth_enroller(); |
- } |
- |
- // The expected persistent keypair. |
- std::string public_key_; |
- std::string private_key_; |
- |
- // Owned by |enrollment_manager_|. |
- base::SimpleTestClock* clock_; |
- |
- // Owned by |enrollment_manager_|. |
- MockCryptAuthEnrollerFactory* enroller_factory_; |
- |
- // Ownered by |enrollment_manager_|. |
- FakeSecureMessageDelegate* secure_message_delegate_; |
- |
- cryptauth::GcmDeviceInfo device_info_; |
- |
- TestingPrefServiceSimple pref_service_; |
- |
- FakeCryptAuthGCMManager gcm_manager_; |
- |
- TestCryptAuthEnrollmentManager enrollment_manager_; |
- |
- DISALLOW_COPY_AND_ASSIGN(ProximityAuthCryptAuthEnrollmentManagerTest); |
-}; |
- |
-TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, RegisterPrefs) { |
- TestingPrefServiceSimple pref_service; |
- CryptAuthEnrollmentManager::RegisterPrefs(pref_service.registry()); |
- EXPECT_TRUE(pref_service.FindPreference( |
- prefs::kCryptAuthEnrollmentLastEnrollmentTimeSeconds)); |
- EXPECT_TRUE(pref_service.FindPreference( |
- prefs::kCryptAuthEnrollmentIsRecoveringFromFailure)); |
- EXPECT_TRUE(pref_service.FindPreference(prefs::kCryptAuthEnrollmentReason)); |
-} |
- |
-TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, GetEnrollmentState) { |
- enrollment_manager_.Start(); |
- |
- ON_CALL(*sync_scheduler(), GetStrategy()) |
- .WillByDefault(Return(SyncScheduler::Strategy::PERIODIC_REFRESH)); |
- EXPECT_FALSE(enrollment_manager_.IsRecoveringFromFailure()); |
- |
- ON_CALL(*sync_scheduler(), GetStrategy()) |
- .WillByDefault(Return(SyncScheduler::Strategy::AGGRESSIVE_RECOVERY)); |
- EXPECT_TRUE(enrollment_manager_.IsRecoveringFromFailure()); |
- |
- base::TimeDelta time_to_next_sync = base::TimeDelta::FromMinutes(60); |
- ON_CALL(*sync_scheduler(), GetTimeToNextSync()) |
- .WillByDefault(Return(time_to_next_sync)); |
- EXPECT_EQ(time_to_next_sync, enrollment_manager_.GetTimeToNextAttempt()); |
- |
- ON_CALL(*sync_scheduler(), GetSyncState()) |
- .WillByDefault(Return(SyncScheduler::SyncState::SYNC_IN_PROGRESS)); |
- EXPECT_TRUE(enrollment_manager_.IsEnrollmentInProgress()); |
- |
- ON_CALL(*sync_scheduler(), GetSyncState()) |
- .WillByDefault(Return(SyncScheduler::SyncState::WAITING_FOR_REFRESH)); |
- EXPECT_FALSE(enrollment_manager_.IsEnrollmentInProgress()); |
-} |
- |
-TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, InitWithDefaultPrefs) { |
- std::unique_ptr<base::SimpleTestClock> clock(new base::SimpleTestClock()); |
- clock->SetNow(base::Time::FromDoubleT(kInitialTimeNowSeconds)); |
- base::TimeDelta elapsed_time = clock->Now() - base::Time::FromDoubleT(0); |
- |
- TestingPrefServiceSimple pref_service; |
- CryptAuthEnrollmentManager::RegisterPrefs(pref_service.registry()); |
- |
- TestCryptAuthEnrollmentManager enrollment_manager( |
- std::move(clock), base::MakeUnique<MockCryptAuthEnrollerFactory>(), |
- base::MakeUnique<FakeSecureMessageDelegate>(), device_info_, |
- &gcm_manager_, &pref_service); |
- |
- EXPECT_CALL( |
- *enrollment_manager.GetSyncScheduler(), |
- Start(elapsed_time, SyncScheduler::Strategy::AGGRESSIVE_RECOVERY)); |
- enrollment_manager.Start(); |
- |
- EXPECT_FALSE(enrollment_manager.IsEnrollmentValid()); |
- EXPECT_TRUE(enrollment_manager.GetLastEnrollmentTime().is_null()); |
-} |
- |
-TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, InitWithExistingPrefs) { |
- EXPECT_CALL( |
- *sync_scheduler(), |
- Start(clock_->Now() - base::Time::FromDoubleT(kLastEnrollmentTimeSeconds), |
- SyncScheduler::Strategy::PERIODIC_REFRESH)); |
- |
- enrollment_manager_.Start(); |
- EXPECT_TRUE(enrollment_manager_.IsEnrollmentValid()); |
- EXPECT_EQ(base::Time::FromDoubleT(kLastEnrollmentTimeSeconds), |
- enrollment_manager_.GetLastEnrollmentTime()); |
-} |
- |
-TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, InitWithExpiredEnrollment) { |
- pref_service_.SetUserPref( |
- prefs::kCryptAuthEnrollmentLastEnrollmentTimeSeconds, |
- new base::FundamentalValue(kLastExpiredEnrollmentTimeSeconds)); |
- |
- EXPECT_CALL(*sync_scheduler(), |
- Start(clock_->Now() - base::Time::FromDoubleT( |
- kLastExpiredEnrollmentTimeSeconds), |
- SyncScheduler::Strategy::AGGRESSIVE_RECOVERY)); |
- |
- enrollment_manager_.Start(); |
- EXPECT_FALSE(enrollment_manager_.IsEnrollmentValid()); |
- EXPECT_EQ(base::Time::FromDoubleT(kLastExpiredEnrollmentTimeSeconds), |
- enrollment_manager_.GetLastEnrollmentTime()); |
-} |
- |
-TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, ForceEnrollment) { |
- enrollment_manager_.Start(); |
- |
- EXPECT_CALL(*sync_scheduler(), ForceSync()); |
- enrollment_manager_.ForceEnrollmentNow( |
- cryptauth::INVOCATION_REASON_SERVER_INITIATED); |
- |
- auto completion_callback = |
- FireSchedulerForEnrollment(cryptauth::INVOCATION_REASON_SERVER_INITIATED); |
- |
- clock_->SetNow(base::Time::FromDoubleT(kLaterTimeNow)); |
- EXPECT_CALL(*this, OnEnrollmentFinishedProxy(true)); |
- completion_callback.Run(true); |
- EXPECT_EQ(clock_->Now(), enrollment_manager_.GetLastEnrollmentTime()); |
-} |
- |
-TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, |
- EnrollmentFailsThenSucceeds) { |
- enrollment_manager_.Start(); |
- base::Time old_enrollment_time = enrollment_manager_.GetLastEnrollmentTime(); |
- |
- // The first periodic enrollment fails. |
- ON_CALL(*sync_scheduler(), GetStrategy()) |
- .WillByDefault(Return(SyncScheduler::Strategy::PERIODIC_REFRESH)); |
- auto completion_callback = |
- FireSchedulerForEnrollment(cryptauth::INVOCATION_REASON_PERIODIC); |
- clock_->SetNow(base::Time::FromDoubleT(kLaterTimeNow)); |
- EXPECT_CALL(*this, OnEnrollmentFinishedProxy(false)); |
- completion_callback.Run(false); |
- EXPECT_EQ(old_enrollment_time, enrollment_manager_.GetLastEnrollmentTime()); |
- EXPECT_TRUE(pref_service_.GetBoolean( |
- prefs::kCryptAuthEnrollmentIsRecoveringFromFailure)); |
- |
- // The second recovery enrollment succeeds. |
- ON_CALL(*sync_scheduler(), GetStrategy()) |
- .WillByDefault(Return(SyncScheduler::Strategy::AGGRESSIVE_RECOVERY)); |
- completion_callback = |
- FireSchedulerForEnrollment(cryptauth::INVOCATION_REASON_FAILURE_RECOVERY); |
- clock_->SetNow(base::Time::FromDoubleT(kLaterTimeNow + 30)); |
- EXPECT_CALL(*this, OnEnrollmentFinishedProxy(true)); |
- completion_callback.Run(true); |
- EXPECT_EQ(clock_->Now(), enrollment_manager_.GetLastEnrollmentTime()); |
- EXPECT_FALSE(pref_service_.GetBoolean( |
- prefs::kCryptAuthEnrollmentIsRecoveringFromFailure)); |
-} |
- |
-TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, |
- EnrollmentSucceedsForFirstTime) { |
- // Initialize |enrollment_manager_|. |
- ON_CALL(*sync_scheduler(), GetStrategy()) |
- .WillByDefault(Return(SyncScheduler::Strategy::PERIODIC_REFRESH)); |
- gcm_manager_.set_registration_id(std::string()); |
- pref_service_.ClearPref(prefs::kCryptAuthEnrollmentUserPublicKey); |
- pref_service_.ClearPref(prefs::kCryptAuthEnrollmentUserPrivateKey); |
- pref_service_.ClearPref(prefs::kCryptAuthEnrollmentLastEnrollmentTimeSeconds); |
- enrollment_manager_.Start(); |
- EXPECT_FALSE(enrollment_manager_.IsEnrollmentValid()); |
- |
- // Trigger a sync request. |
- EXPECT_CALL(*this, OnEnrollmentStartedProxy()); |
- auto sync_request = base::MakeUnique<SyncScheduler::SyncRequest>( |
- enrollment_manager_.GetSyncScheduler()); |
- static_cast<SyncScheduler::Delegate*>(&enrollment_manager_) |
- ->OnSyncRequested(std::move(sync_request)); |
- |
- // Complete GCM registration successfully, and expect an enrollment. |
- CryptAuthEnroller::EnrollmentFinishedCallback enrollment_callback; |
- EXPECT_CALL(*next_cryptauth_enroller(), |
- Enroll(public_key_, private_key_, _, |
- cryptauth::INVOCATION_REASON_INITIALIZATION, _)) |
- .WillOnce(SaveArg<4>(&enrollment_callback)); |
- ASSERT_TRUE(gcm_manager_.registration_in_progress()); |
- gcm_manager_.CompleteRegistration(kGCMRegistrationId); |
- |
- // Complete CryptAuth enrollment. |
- ASSERT_FALSE(enrollment_callback.is_null()); |
- clock_->SetNow(base::Time::FromDoubleT(kLaterTimeNow)); |
- EXPECT_CALL(*this, OnEnrollmentFinishedProxy(true)); |
- enrollment_callback.Run(true); |
- EXPECT_EQ(clock_->Now(), enrollment_manager_.GetLastEnrollmentTime()); |
- EXPECT_TRUE(enrollment_manager_.IsEnrollmentValid()); |
- |
- // Check that CryptAuthEnrollmentManager returns the expected key-pair. |
- EXPECT_EQ(public_key_, enrollment_manager_.GetUserPublicKey()); |
- EXPECT_EQ(private_key_, enrollment_manager_.GetUserPrivateKey()); |
-} |
- |
-TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, GCMRegistrationFails) { |
- // Initialize |enrollment_manager_|. |
- ON_CALL(*sync_scheduler(), GetStrategy()) |
- .WillByDefault(Return(SyncScheduler::Strategy::PERIODIC_REFRESH)); |
- gcm_manager_.set_registration_id(std::string()); |
- enrollment_manager_.Start(); |
- |
- // Trigger a sync request. |
- EXPECT_CALL(*this, OnEnrollmentStartedProxy()); |
- auto sync_request = base::MakeUnique<SyncScheduler::SyncRequest>( |
- enrollment_manager_.GetSyncScheduler()); |
- static_cast<SyncScheduler::Delegate*>(&enrollment_manager_) |
- ->OnSyncRequested(std::move(sync_request)); |
- |
- // Complete GCM registration with failure. |
- EXPECT_CALL(*this, OnEnrollmentFinishedProxy(false)); |
- gcm_manager_.CompleteRegistration(std::string()); |
-} |
- |
-TEST_F(ProximityAuthCryptAuthEnrollmentManagerTest, ReenrollOnGCMPushMessage) { |
- enrollment_manager_.Start(); |
- |
- // Simulate receiving a GCM push message, forcing the device to re-enroll. |
- gcm_manager_.PushReenrollMessage(); |
- auto completion_callback = |
- FireSchedulerForEnrollment(cryptauth::INVOCATION_REASON_SERVER_INITIATED); |
- |
- EXPECT_CALL(*this, OnEnrollmentFinishedProxy(true)); |
- completion_callback.Run(true); |
-} |
- |
-} // namespace proximity_auth |