You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
447 lines
24 KiB
C++
447 lines
24 KiB
C++
/*
|
|
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
|
* its licensors.
|
|
*
|
|
* For complete copyright and license terms please see the LICENSE at the root of this
|
|
* distribution (the "License"). All use of this software is governed by the License,
|
|
* or, if provided, by the license below or the license accompanying this file. Do not
|
|
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
*
|
|
*/
|
|
|
|
#include <AzTest/AzTest.h>
|
|
#include <AzCore/UnitTest/TestTypes.h>
|
|
#include <AWSClientAuthGemMock.h>
|
|
#include <Authorization/AWSCognitoAuthorizationController.h>
|
|
#include <Credential/AWSCredentialBus.h>
|
|
#include <aws/cognito-identity/CognitoIdentityErrors.h>
|
|
|
|
namespace AWSClientAuthUnitTest
|
|
{
|
|
class AWSCognitoAuthorizationControllerTestLocalMock
|
|
: public AWSClientAuth::AWSCognitoAuthorizationController
|
|
|
|
{
|
|
public:
|
|
using AWSClientAuth::AWSCognitoAuthorizationController::m_settings;
|
|
using AWSClientAuth::AWSCognitoAuthorizationController::m_persistentCognitoIdentityProvider;
|
|
using AWSClientAuth::AWSCognitoAuthorizationController::m_persistentAnonymousCognitoIdentityProvider;
|
|
using AWSClientAuth::AWSCognitoAuthorizationController::m_cognitoCachingCredentialsProvider;
|
|
using AWSClientAuth::AWSCognitoAuthorizationController::m_cognitoCachingAnonymousCredentialsProvider;
|
|
};
|
|
}
|
|
|
|
class AWSCognitoAuthorizationControllerTest
|
|
: public AWSClientAuthUnitTest::AWSClientAuthGemAllocatorFixture
|
|
{
|
|
protected:
|
|
void SetUp() override
|
|
{
|
|
AWSClientAuthUnitTest::AWSClientAuthGemAllocatorFixture::SetUp();
|
|
|
|
AWSClientAuth::CognitoAuthorizationSettings::Reflect(*m_serializeContext);
|
|
|
|
m_mockController = AZStd::make_unique<AWSClientAuthUnitTest::AWSCognitoAuthorizationControllerTestLocalMock>();
|
|
}
|
|
|
|
void TearDown() override
|
|
{
|
|
m_mockController.reset();
|
|
AWSClientAuthUnitTest::AWSClientAuthGemAllocatorFixture::TearDown();
|
|
}
|
|
|
|
public:
|
|
AZStd::unique_ptr<AWSClientAuthUnitTest::AWSCognitoAuthorizationControllerTestLocalMock> m_mockController;
|
|
};
|
|
|
|
TEST_F(AWSCognitoAuthorizationControllerTest, Initialize_Success)
|
|
{
|
|
AZStd::string path = AZStd::string::format("%s/%s/awsCognitoAuthorization.setreg",
|
|
m_testFolder->c_str(), AZ::SettingsRegistryInterface::RegistryFolder);
|
|
CreateTestFile("awsCognitoAuthorization.setreg"
|
|
, R"({
|
|
"AWS": {
|
|
"CognitoIdentityPool": {
|
|
"CognitoUserPoolId": "TestUserPoolId",
|
|
"LoginWithAmazonId": "www.amazon.com",
|
|
"AWSAccountId": "1234567890",
|
|
"IdentityPoolId": "TestIdentityPoolId"
|
|
}
|
|
}
|
|
})");
|
|
|
|
ASSERT_TRUE(m_mockController->Initialize(path));
|
|
ASSERT_TRUE(m_mockController->m_settings->m_cognitoUserPoolId == "TestUserPoolId");
|
|
}
|
|
|
|
TEST_F(AWSCognitoAuthorizationControllerTest, RequestAWSCredentials_WithLogins_Success)
|
|
{
|
|
AWSClientAuth::AuthenticationTokens tokens(
|
|
AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN,
|
|
AWSClientAuth::ProviderNameEnum::AWSCognitoIDP, 60);
|
|
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnPasswordGrantSingleFactorSignInSuccess(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnPasswordGrantSingleFactorSignInSuccess, tokens);
|
|
|
|
AWSClientAuth::AuthenticationTokens tokens1(
|
|
AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN,
|
|
AWSClientAuth::ProviderNameEnum::Google, 60);
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnDeviceCodeGrantConfirmSignInSuccess(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnDeviceCodeGrantConfirmSignInSuccess, tokens1);
|
|
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetId(testing::_)).Times(1);
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetCredentialsForIdentity(testing::_)).Times(1);
|
|
EXPECT_CALL(m_awsCognitoAuthorizationNotificationsBusMock, OnRequestAWSCredentialsSuccess(testing::_)).Times(1);
|
|
m_mockController->RequestAWSCredentialsAsync();
|
|
|
|
ASSERT_TRUE(m_mockController->GetIdentityId() == AWSClientAuthUnitTest::TEST_IDENTITY_ID);
|
|
auto creds = m_mockController->GetCognitoCredentialsProvider()->GetAWSCredentials();
|
|
ASSERT_TRUE(creds.GetAWSAccessKeyId() == AWSClientAuthUnitTest::TEST_ACCESS_KEY_ID);
|
|
ASSERT_TRUE(creds.GetAWSSecretKey() == AWSClientAuthUnitTest::TEST_SECRET_KEY_ID);
|
|
}
|
|
|
|
TEST_F(AWSCognitoAuthorizationControllerTest, RequestAWSCredentials_WithoutLoginsAnonymous_Success)
|
|
{
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetId(testing::_)).Times(1);
|
|
EXPECT_CALL(m_awsCognitoAuthorizationNotificationsBusMock, OnRequestAWSCredentialsSuccess(testing::_)).Times(1);
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetCredentialsForIdentity(testing::_)).Times(1);
|
|
m_mockController->RequestAWSCredentialsAsync();
|
|
|
|
ASSERT_TRUE(m_mockController->GetIdentityId() == AWSClientAuthUnitTest::TEST_IDENTITY_ID);
|
|
auto creds = m_mockController->GetAnonymousCognitoCredentialsProvider()->GetAWSCredentials();
|
|
ASSERT_TRUE(creds.GetAWSAccessKeyId() == AWSClientAuthUnitTest::TEST_ACCESS_KEY_ID);
|
|
ASSERT_TRUE(creds.GetAWSSecretKey() == AWSClientAuthUnitTest::TEST_SECRET_KEY_ID);
|
|
}
|
|
|
|
TEST_F(AWSCognitoAuthorizationControllerTest, MultipleCalls_UsesCacheCredentials_Success)
|
|
{
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetId(testing::_)).Times(1);
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetCredentialsForIdentity(testing::_)).Times(1);
|
|
EXPECT_CALL(m_awsCognitoAuthorizationNotificationsBusMock, OnRequestAWSCredentialsSuccess(testing::_)).Times(1);
|
|
m_mockController->RequestAWSCredentialsAsync();
|
|
|
|
ASSERT_TRUE(m_mockController->GetIdentityId() == AWSClientAuthUnitTest::TEST_IDENTITY_ID);
|
|
auto creds = m_mockController->GetAnonymousCognitoCredentialsProvider()->GetAWSCredentials();
|
|
ASSERT_TRUE(creds.GetAWSAccessKeyId() == AWSClientAuthUnitTest::TEST_ACCESS_KEY_ID);
|
|
ASSERT_TRUE(creds.GetAWSSecretKey() == AWSClientAuthUnitTest::TEST_SECRET_KEY_ID);
|
|
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetId(testing::_)).Times(0);
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetCredentialsForIdentity(testing::_)).Times(0);
|
|
EXPECT_CALL(m_awsCognitoAuthorizationNotificationsBusMock, OnRequestAWSCredentialsSuccess(testing::_)).Times(1);
|
|
m_mockController->RequestAWSCredentialsAsync();
|
|
}
|
|
|
|
TEST_F(AWSCognitoAuthorizationControllerTest, RequestAWSCredentials_Fail_GetIdError)
|
|
{
|
|
AWSClientAuth::AuthenticationTokens cognitoTokens(
|
|
AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN,
|
|
AWSClientAuth::ProviderNameEnum::AWSCognitoIDP, 60);
|
|
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnPasswordGrantSingleFactorSignInSuccess(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnPasswordGrantSingleFactorSignInSuccess, cognitoTokens);
|
|
|
|
ASSERT_TRUE(m_mockController->m_persistentCognitoIdentityProvider->GetLogins().size() == 1);
|
|
|
|
Aws::Client::AWSError<Aws::CognitoIdentity::CognitoIdentityErrors> error;
|
|
error.SetExceptionName(AWSClientAuthUnitTest::TEST_EXCEPTION);
|
|
Aws::CognitoIdentity::Model::GetIdOutcome outcome(error);
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetId(testing::_)).Times(1).WillOnce(testing::Return(outcome));
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetCredentialsForIdentity(testing::_)).Times(0);
|
|
EXPECT_CALL(m_awsCognitoAuthorizationNotificationsBusMock, OnRequestAWSCredentialsSuccess(testing::_)).Times(0);
|
|
EXPECT_CALL(m_awsCognitoAuthorizationNotificationsBusMock, OnRequestAWSCredentialsFail(testing::_)).Times(1);
|
|
m_mockController->RequestAWSCredentialsAsync();
|
|
}
|
|
|
|
TEST_F(AWSCognitoAuthorizationControllerTest, RequestAWSCredentials_Fail_GetCredentialsForIdentityError)
|
|
{
|
|
AWSClientAuth::AuthenticationTokens cognitoTokens(
|
|
AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN,
|
|
AWSClientAuth::ProviderNameEnum::AWSCognitoIDP, 60);
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnPasswordGrantSingleFactorSignInSuccess(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnPasswordGrantSingleFactorSignInSuccess, cognitoTokens);
|
|
|
|
AWSClientAuth::AuthenticationTokens googleTokens(
|
|
AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN,
|
|
AWSClientAuth::ProviderNameEnum::Google, 60);
|
|
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnDeviceCodeGrantConfirmSignInSuccess(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnDeviceCodeGrantConfirmSignInSuccess, googleTokens);
|
|
|
|
ASSERT_TRUE(m_mockController->m_persistentCognitoIdentityProvider->GetLogins().size() == 2);
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnDeviceCodeGrantConfirmSignInSuccess(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnDeviceCodeGrantConfirmSignInSuccess, googleTokens);
|
|
|
|
ASSERT_TRUE(m_mockController->m_persistentCognitoIdentityProvider->GetLogins().size() == 2);
|
|
|
|
Aws::Client::AWSError<Aws::CognitoIdentity::CognitoIdentityErrors> error;
|
|
error.SetExceptionName(AWSClientAuthUnitTest::TEST_EXCEPTION);
|
|
Aws::CognitoIdentity::Model::GetCredentialsForIdentityOutcome outcome(error);
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetId(testing::_)).Times(1);
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetCredentialsForIdentity(testing::_)).Times(1).WillOnce(testing::Return(outcome));
|
|
EXPECT_CALL(m_awsCognitoAuthorizationNotificationsBusMock, OnRequestAWSCredentialsSuccess(testing::_)).Times(0);
|
|
EXPECT_CALL(m_awsCognitoAuthorizationNotificationsBusMock, OnRequestAWSCredentialsFail(testing::_)).Times(1);
|
|
m_mockController->RequestAWSCredentialsAsync();
|
|
}
|
|
|
|
TEST_F(AWSCognitoAuthorizationControllerTest, AddRemoveLogins_Succuess)
|
|
{
|
|
AWSClientAuth::AuthenticationTokens cognitoTokens(
|
|
AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN,
|
|
AWSClientAuth::ProviderNameEnum::AWSCognitoIDP, 60);
|
|
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnPasswordGrantSingleFactorSignInSuccess(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnPasswordGrantSingleFactorSignInSuccess, cognitoTokens);
|
|
|
|
|
|
ASSERT_TRUE(m_mockController->m_persistentCognitoIdentityProvider->GetLogins().size() == 1);
|
|
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnPasswordGrantSingleFactorSignInSuccess(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnPasswordGrantSingleFactorSignInSuccess, cognitoTokens);
|
|
|
|
// One entry max for each provider.
|
|
ASSERT_TRUE(m_mockController->m_persistentCognitoIdentityProvider->GetLogins().size() == 1);
|
|
|
|
AWSClientAuth::AuthenticationTokens googleTokens(
|
|
AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN,
|
|
AWSClientAuth::ProviderNameEnum::Google, 60);
|
|
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnDeviceCodeGrantConfirmSignInSuccess(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnDeviceCodeGrantConfirmSignInSuccess, googleTokens);
|
|
|
|
ASSERT_TRUE(m_mockController->m_persistentCognitoIdentityProvider->GetLogins().size() == 2);
|
|
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnDeviceCodeGrantConfirmSignInSuccess(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnDeviceCodeGrantConfirmSignInSuccess, googleTokens);
|
|
|
|
ASSERT_TRUE(m_mockController->m_persistentCognitoIdentityProvider->GetLogins().size() == 2);
|
|
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnSignOut(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnSignOut, AWSClientAuth::ProviderNameEnum::Google);
|
|
ASSERT_TRUE(m_mockController->m_persistentCognitoIdentityProvider->GetLogins().size() == 1);
|
|
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnSignOut(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnSignOut, AWSClientAuth::ProviderNameEnum::AWSCognitoIDP);
|
|
ASSERT_TRUE(m_mockController->m_persistentCognitoIdentityProvider->GetLogins().size() == 0);
|
|
|
|
AWSClientAuth::AuthenticationTokens lwaTokens(
|
|
AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN,
|
|
AWSClientAuth::ProviderNameEnum::LoginWithAmazon, 60);
|
|
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnPasswordGrantMultiFactorConfirmSignInSuccess(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnPasswordGrantMultiFactorConfirmSignInSuccess, lwaTokens);
|
|
|
|
ASSERT_TRUE(m_mockController->m_persistentCognitoIdentityProvider->GetLogins().size() == 1);
|
|
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnSignOut(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnSignOut, AWSClientAuth::ProviderNameEnum::LoginWithAmazon);
|
|
ASSERT_TRUE(m_mockController->m_persistentCognitoIdentityProvider->GetLogins().size() == 0);
|
|
}
|
|
|
|
TEST_F(AWSCognitoAuthorizationControllerTest, ResetAuthenticated_ClearsCachedLoginsAndIdentityId_Success)
|
|
{
|
|
AWSClientAuth::AuthenticationTokens cognitoTokens(
|
|
AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN,
|
|
AWSClientAuth::ProviderNameEnum::AWSCognitoIDP, 60);
|
|
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnPasswordGrantSingleFactorSignInSuccess(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnPasswordGrantSingleFactorSignInSuccess, cognitoTokens);
|
|
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetId(testing::_)).Times(1);
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetCredentialsForIdentity(testing::_)).Times(1);
|
|
EXPECT_CALL(m_awsCognitoAuthorizationNotificationsBusMock, OnRequestAWSCredentialsSuccess(testing::_)).Times(1);
|
|
m_mockController->RequestAWSCredentialsAsync();
|
|
|
|
ASSERT_TRUE(m_mockController->GetIdentityId() == AWSClientAuthUnitTest::TEST_IDENTITY_ID);
|
|
auto creds = m_mockController->GetCognitoCredentialsProvider()->GetAWSCredentials();
|
|
ASSERT_TRUE(creds.GetAWSAccessKeyId() == AWSClientAuthUnitTest::TEST_ACCESS_KEY_ID);
|
|
ASSERT_TRUE(creds.GetAWSSecretKey() == AWSClientAuthUnitTest::TEST_SECRET_KEY_ID);
|
|
|
|
m_mockController->Reset();
|
|
|
|
|
|
EXPECT_TRUE(m_mockController->GetIdentityId() == "");
|
|
EXPECT_TRUE(m_mockController->m_persistentCognitoIdentityProvider->GetLogins().size() == 0);
|
|
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetId(testing::_)).Times(1);
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetCredentialsForIdentity(testing::_)).Times(1);
|
|
EXPECT_CALL(m_awsCognitoAuthorizationNotificationsBusMock, OnRequestAWSCredentialsSuccess(testing::_)).Times(1);
|
|
m_mockController->RequestAWSCredentialsAsync();
|
|
}
|
|
|
|
TEST_F(AWSCognitoAuthorizationControllerTest, ResetAnonymous_ClearsCachedLoginsAndIdentityId_Success)
|
|
{
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetId(testing::_)).Times(1);
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetCredentialsForIdentity(testing::_)).Times(1);
|
|
EXPECT_CALL(m_awsCognitoAuthorizationNotificationsBusMock, OnRequestAWSCredentialsSuccess(testing::_)).Times(1);
|
|
m_mockController->RequestAWSCredentialsAsync();
|
|
|
|
ASSERT_TRUE(m_mockController->GetIdentityId() == AWSClientAuthUnitTest::TEST_IDENTITY_ID);
|
|
auto creds = m_mockController->GetAnonymousCognitoCredentialsProvider()->GetAWSCredentials();
|
|
ASSERT_TRUE(creds.GetAWSAccessKeyId() == AWSClientAuthUnitTest::TEST_ACCESS_KEY_ID);
|
|
ASSERT_TRUE(creds.GetAWSSecretKey() == AWSClientAuthUnitTest::TEST_SECRET_KEY_ID);
|
|
|
|
m_mockController->Reset();
|
|
|
|
EXPECT_TRUE(m_mockController->GetIdentityId() == "");
|
|
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetId(testing::_)).Times(1);
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetCredentialsForIdentity(testing::_)).Times(1);
|
|
EXPECT_CALL(m_awsCognitoAuthorizationNotificationsBusMock, OnRequestAWSCredentialsSuccess(testing::_)).Times(1);
|
|
m_mockController->RequestAWSCredentialsAsync();
|
|
}
|
|
|
|
TEST_F(AWSCognitoAuthorizationControllerTest, GetCredentialsProvider_ForPersistedLogins_ResultIsAuthenticatedCredentials)
|
|
{
|
|
AWSClientAuth::AuthenticationTokens cognitoTokens(
|
|
AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN,
|
|
AWSClientAuth::ProviderNameEnum::AWSCognitoIDP, 60);
|
|
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnPasswordGrantSingleFactorSignInSuccess(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnPasswordGrantSingleFactorSignInSuccess, cognitoTokens);
|
|
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetId(testing::_)).Times(1);
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetCredentialsForIdentity(testing::_)).Times(1);
|
|
|
|
std::shared_ptr<Aws::Auth::AWSCredentialsProvider> actualCredentialsProvider;
|
|
AWSCore::AWSCredentialRequestBus::BroadcastResult(actualCredentialsProvider, &AWSCore::AWSCredentialRequests::GetCredentialsProvider);
|
|
EXPECT_TRUE(actualCredentialsProvider == m_mockController->m_cognitoCachingCredentialsProvider);
|
|
}
|
|
|
|
TEST_F(AWSCognitoAuthorizationControllerTest, GetCredentialsProvider_NoPersistedLogins_ResultIsAnonymousCredentials)
|
|
{
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetId(testing::_)).Times(1);
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetCredentialsForIdentity(testing::_)).Times(1);
|
|
|
|
std::shared_ptr<Aws::Auth::AWSCredentialsProvider> actualCredentialsProvider;
|
|
AWSCore::AWSCredentialRequestBus::BroadcastResult(actualCredentialsProvider, &AWSCore::AWSCredentialRequests::GetCredentialsProvider);
|
|
EXPECT_TRUE(actualCredentialsProvider == m_mockController->m_cognitoCachingAnonymousCredentialsProvider);
|
|
}
|
|
|
|
TEST_F(AWSCognitoAuthorizationControllerTest, GetCredentialsProvider_NoPersistedLogins_NoAnonymousCredentials_ResultNullPtr)
|
|
{
|
|
Aws::Client::AWSError<Aws::CognitoIdentity::CognitoIdentityErrors> error;
|
|
error.SetExceptionName(AWSClientAuthUnitTest::TEST_EXCEPTION);
|
|
Aws::CognitoIdentity::Model::GetIdOutcome outcome(error);
|
|
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetId(testing::_)).Times(1).WillOnce(testing::Return(outcome));
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetCredentialsForIdentity(testing::_)).Times(0);
|
|
|
|
std::shared_ptr<Aws::Auth::AWSCredentialsProvider> actualCredentialsProvider;
|
|
AWSCore::AWSCredentialRequestBus::BroadcastResult(
|
|
actualCredentialsProvider, &AWSCore::AWSCredentialRequests::GetCredentialsProvider);
|
|
EXPECT_TRUE(actualCredentialsProvider == nullptr);
|
|
}
|
|
|
|
TEST_F(
|
|
AWSCognitoAuthorizationControllerTest,
|
|
GetCredentialsProvider_OneThreadPersistLogins_SecondThreadGetCredentialsProvider_GetCredentialsSuccess)
|
|
{
|
|
AZStd::vector<AZStd::thread> testThreads;
|
|
AZStd::atomic_bool loginsAdded = false;
|
|
AZStd::atomic_int anonymousLogin = 0;
|
|
AZStd::atomic_int authenticatedLogin = 0;
|
|
|
|
testThreads.emplace_back(AZStd::thread([&]() {
|
|
AWSClientAuth::AuthenticationTokens cognitoTokens(
|
|
AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN, AWSClientAuthUnitTest::TEST_TOKEN,
|
|
AWSClientAuth::ProviderNameEnum::AWSCognitoIDP, 60);
|
|
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnPasswordGrantSingleFactorSignInSuccess(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnPasswordGrantSingleFactorSignInSuccess, cognitoTokens);
|
|
loginsAdded = true;
|
|
}));
|
|
|
|
testThreads.emplace_back(AZStd::thread([&]() {
|
|
std::shared_ptr<Aws::Auth::AWSCredentialsProvider> actualCredentialsProvider;
|
|
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetId(testing::_)).Times(1);
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetCredentialsForIdentity(testing::_)).Times(1);
|
|
|
|
AWSCore::AWSCredentialRequestBus::BroadcastResult(
|
|
actualCredentialsProvider, &AWSCore::AWSCredentialRequests::GetCredentialsProvider);
|
|
if (actualCredentialsProvider == m_mockController->m_cognitoCachingAnonymousCredentialsProvider)
|
|
{
|
|
anonymousLogin++;
|
|
}
|
|
else if (actualCredentialsProvider == m_mockController->m_cognitoCachingCredentialsProvider)
|
|
{
|
|
authenticatedLogin++;
|
|
}
|
|
|
|
EXPECT_TRUE(loginsAdded ? m_mockController->HasPersistedLogins() : true);
|
|
EXPECT_TRUE(actualCredentialsProvider != nullptr);
|
|
}));
|
|
|
|
for (auto& testThread : testThreads)
|
|
{
|
|
testThread.join();
|
|
}
|
|
testThreads.clear();
|
|
|
|
AZStd::atomic_bool loginsCleared = false;
|
|
testThreads.emplace_back(AZStd::thread([&]() {
|
|
EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnSignOut(testing::_)).Times(1);
|
|
AWSClientAuth::AuthenticationProviderNotificationBus::Broadcast(
|
|
&AWSClientAuth::AuthenticationProviderNotifications::OnSignOut, AWSClientAuth::ProviderNameEnum::AWSCognitoIDP);
|
|
loginsCleared = true;
|
|
}));
|
|
|
|
testThreads.emplace_back(AZStd::thread([&]() {
|
|
|
|
std::shared_ptr<Aws::Auth::AWSCredentialsProvider> actualCredentialsProvider;
|
|
// Can be 0, 1 depending on the previous thread order.
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetId(testing::_)).Times(testing::Between(0, 1));
|
|
EXPECT_CALL(*m_cognitoIdentityClientMock, GetCredentialsForIdentity(testing::_)).Times(testing::Between(0, 1));
|
|
AWSCore::AWSCredentialRequestBus::BroadcastResult(
|
|
actualCredentialsProvider, &AWSCore::AWSCredentialRequests::GetCredentialsProvider);
|
|
EXPECT_FALSE(loginsCleared ? m_mockController->HasPersistedLogins() : false);
|
|
EXPECT_TRUE(actualCredentialsProvider != nullptr);
|
|
if (actualCredentialsProvider == m_mockController->m_cognitoCachingAnonymousCredentialsProvider)
|
|
{
|
|
anonymousLogin++;
|
|
}
|
|
else if (actualCredentialsProvider == m_mockController->m_cognitoCachingCredentialsProvider)
|
|
{
|
|
authenticatedLogin++;
|
|
}
|
|
EXPECT_TRUE(authenticatedLogin.load() + anonymousLogin.load() == 2);
|
|
}));
|
|
|
|
for (auto& testThread : testThreads)
|
|
{
|
|
testThread.join();
|
|
}
|
|
}
|
|
|
|
TEST_F(AWSCognitoAuthorizationControllerTest, GetCredentialHandlerOrder_Call_AlwaysGetExpectedValue)
|
|
{
|
|
int order;
|
|
AWSCore::AWSCredentialRequestBus::BroadcastResult(order, &AWSCore::AWSCredentialRequests::GetCredentialHandlerOrder);
|
|
EXPECT_EQ(order, AWSCore::CredentialHandlerOrder::COGNITO_IDENITY_POOL_CREDENTIAL_HANDLER);
|
|
}
|
|
|
|
TEST_F(AWSCognitoAuthorizationControllerTest, Initialize_Fail_InvalidPath)
|
|
{
|
|
AZ_TEST_START_TRACE_SUPPRESSION;
|
|
ASSERT_FALSE(m_mockController->Initialize(""));
|
|
AZ_TEST_STOP_TRACE_SUPPRESSION(1);
|
|
}
|