AuthenticationProviderManagerTest.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <AzCore/std/smart_ptr/unique_ptr.h>
  9. #include <AzCore/std/smart_ptr/make_shared.h>
  10. #include <AzCore/std/utils.h>
  11. #include <Authentication/AuthenticationProviderManager.h>
  12. #include <Authentication/AWSCognitoAuthenticationProvider.h>
  13. #include <Authentication/LWAAuthenticationProvider.h>
  14. #include <Authentication/AuthenticationTokens.h>
  15. #include <AWSClientAuthGemMock.h>
  16. #include <Authentication/AuthenticationProviderManagerMock.h>
  17. class AuthenticationProviderManagerTest
  18. : public AWSClientAuthUnitTest::AWSClientAuthGemAllocatorFixture
  19. {
  20. protected:
  21. void SetUp() override
  22. {
  23. AWSClientAuthUnitTest::AWSClientAuthGemAllocatorFixture::SetUp();
  24. AWSClientAuth::LWAProviderSetting::Reflect(*m_serializeContext);
  25. AWSClientAuth::GoogleProviderSetting::Reflect(*m_serializeContext);
  26. AZStd::string settingspath = AZStd::string::format(
  27. "%s/%s/authenticationProvider.setreg",
  28. m_testFolder->c_str(), AZ::SettingsRegistryInterface::RegistryFolder);
  29. CreateTestFile("authenticationProvider.setreg"
  30. , R"({
  31. "AWS":
  32. {
  33. "LoginWithAmazon":
  34. {
  35. "AppClientId": "TestLWAClientId",
  36. "GrantType": "device_code",
  37. "Scope": "profile",
  38. "ResponseType": "device_code",
  39. "OAuthCodeURL": "https://api.amazon.com/auth/o2/create/codepair",
  40. "OAuthTokensURL": "https://oauth2.googleapis.com/token"
  41. },
  42. "Google":
  43. {
  44. "AppClientId": "TestGoogleClientId",
  45. "ClientSecret": "123",
  46. "GrantType": "urn:ietf:params:oauth:grant-type:device_code",
  47. "Scope": "profile",
  48. "OAuthCodeURL": "https://oauth2.googleapis.com/device/code",
  49. "OAuthTokensURL": "https://oauth2.googleapis.com/token"
  50. }
  51. }
  52. })");
  53. m_settingsRegistry->MergeSettingsFile(settingspath, AZ::SettingsRegistryInterface::Format::JsonMergePatch, {});
  54. m_mockController = AZStd::make_unique<testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderManagerLocalMock>>();
  55. }
  56. void TearDown() override
  57. {
  58. m_mockController.reset();
  59. AWSClientAuthUnitTest::AWSClientAuthGemAllocatorFixture::TearDown();
  60. }
  61. public:
  62. AZStd::unique_ptr<testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderManagerLocalMock>> m_mockController;
  63. AZStd::vector<AWSClientAuth::ProviderNameEnum> m_enabledProviderNames {AWSClientAuth::ProviderNameEnum::AWSCognitoIDP,
  64. AWSClientAuth::ProviderNameEnum::LoginWithAmazon, AWSClientAuth::ProviderNameEnum::Google};
  65. };
  66. TEST_F(AuthenticationProviderManagerTest, Initialize_Success)
  67. {
  68. ASSERT_TRUE(m_mockController->Initialize(m_enabledProviderNames));
  69. ASSERT_TRUE(m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::AWSCognitoIDP] != nullptr);
  70. }
  71. TEST_F(AuthenticationProviderManagerTest, PasswordGrantSingleFactorSignInAsync_Success)
  72. {
  73. m_mockController->Initialize(m_enabledProviderNames);
  74. testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock> *cognitoProviderMock = (testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>*)m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::AWSCognitoIDP].get();
  75. EXPECT_CALL(*cognitoProviderMock, PasswordGrantSingleFactorSignInAsync(testing::_, testing::_)).Times(1);
  76. m_mockController->PasswordGrantSingleFactorSignInAsync(AWSClientAuth::ProviderNameEnum::AWSCognitoIDP, AWSClientAuthUnitTest::TEST_USERNAME, AWSClientAuthUnitTest::TEST_PASSWORD);
  77. cognitoProviderMock = nullptr;
  78. }
  79. TEST_F(AuthenticationProviderManagerTest, PasswordGrantSingleFactorSignInAsync_Fail_NonConfiguredProviderError)
  80. {
  81. AZ_TEST_START_TRACE_SUPPRESSION;
  82. m_mockController->PasswordGrantSingleFactorSignInAsync(AWSClientAuth::ProviderNameEnum::Apple, AWSClientAuthUnitTest::TEST_USERNAME, AWSClientAuthUnitTest::TEST_PASSWORD);
  83. AZ_TEST_STOP_TRACE_SUPPRESSION(1);
  84. }
  85. TEST_F(AuthenticationProviderManagerTest, PasswordGrantMultiFactorSignInAsync_Success)
  86. {
  87. m_mockController->Initialize(m_enabledProviderNames);
  88. testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>* cognitoProviderMock = (testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>*)m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::AWSCognitoIDP].get();
  89. testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>* lwaProviderMock = (testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>*)m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::LoginWithAmazon].get();
  90. EXPECT_CALL(*cognitoProviderMock, PasswordGrantMultiFactorSignInAsync(testing::_, testing::_)).Times(1);
  91. m_mockController->PasswordGrantMultiFactorSignInAsync(AWSClientAuth::ProviderNameEnum::AWSCognitoIDP, AWSClientAuthUnitTest::TEST_USERNAME, AWSClientAuthUnitTest::TEST_PASSWORD);
  92. EXPECT_CALL(*lwaProviderMock, PasswordGrantMultiFactorSignInAsync(testing::_, testing::_)).Times(1);
  93. m_mockController->PasswordGrantMultiFactorSignInAsync(AWSClientAuth::ProviderNameEnum::LoginWithAmazon, AWSClientAuthUnitTest::TEST_USERNAME, AWSClientAuthUnitTest::TEST_PASSWORD);
  94. cognitoProviderMock = nullptr;
  95. }
  96. TEST_F(AuthenticationProviderManagerTest, PasswordGrantMultiFactorConfirmSignInAsync_Success)
  97. {
  98. m_mockController->Initialize(m_enabledProviderNames);
  99. testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock> *cognitoProviderMock = (testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>*)m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::AWSCognitoIDP].get();
  100. testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock> *lwaProviderMock = (testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>*)m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::LoginWithAmazon].get();
  101. EXPECT_CALL(*cognitoProviderMock, PasswordGrantMultiFactorConfirmSignInAsync(testing::_, testing::_)).Times(1);
  102. m_mockController->PasswordGrantMultiFactorConfirmSignInAsync(AWSClientAuth::ProviderNameEnum::AWSCognitoIDP, AWSClientAuthUnitTest::TEST_USERNAME, AWSClientAuthUnitTest::TEST_PASSWORD);
  103. EXPECT_CALL(*lwaProviderMock, PasswordGrantMultiFactorConfirmSignInAsync(testing::_, testing::_)).Times(1);
  104. m_mockController->PasswordGrantMultiFactorConfirmSignInAsync(AWSClientAuth::ProviderNameEnum::LoginWithAmazon, AWSClientAuthUnitTest::TEST_USERNAME, AWSClientAuthUnitTest::TEST_PASSWORD);
  105. cognitoProviderMock = nullptr;
  106. }
  107. TEST_F(AuthenticationProviderManagerTest, DeviceCodeGrantSignInAsync_Success)
  108. {
  109. m_mockController->Initialize(m_enabledProviderNames);
  110. testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>* cognitoProviderMock = (testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>*)m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::AWSCognitoIDP].get();
  111. testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>* lwaProviderMock = (testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>*)m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::LoginWithAmazon].get();
  112. EXPECT_CALL(*cognitoProviderMock, DeviceCodeGrantSignInAsync()).Times(1);
  113. m_mockController->DeviceCodeGrantSignInAsync(AWSClientAuth::ProviderNameEnum::AWSCognitoIDP);
  114. EXPECT_CALL(*lwaProviderMock, DeviceCodeGrantSignInAsync()).Times(1);
  115. m_mockController->DeviceCodeGrantSignInAsync(AWSClientAuth::ProviderNameEnum::LoginWithAmazon);
  116. cognitoProviderMock = nullptr;
  117. }
  118. TEST_F(AuthenticationProviderManagerTest, DeviceCodeGrantConfirmSignInAsync_Success)
  119. {
  120. m_mockController->Initialize(m_enabledProviderNames);
  121. testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>* cognitoProviderMock = (testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>*)m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::AWSCognitoIDP].get();
  122. testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>* lwaProviderMock = (testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>*)m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::LoginWithAmazon].get();
  123. EXPECT_CALL(*cognitoProviderMock, DeviceCodeGrantConfirmSignInAsync()).Times(1);
  124. m_mockController->DeviceCodeGrantConfirmSignInAsync(AWSClientAuth::ProviderNameEnum::AWSCognitoIDP);
  125. EXPECT_CALL(*lwaProviderMock, DeviceCodeGrantConfirmSignInAsync()).Times(1);
  126. m_mockController->DeviceCodeGrantConfirmSignInAsync(AWSClientAuth::ProviderNameEnum::LoginWithAmazon);
  127. cognitoProviderMock = nullptr;
  128. }
  129. TEST_F(AuthenticationProviderManagerTest, RefreshTokenAsync_Success)
  130. {
  131. m_mockController->Initialize(m_enabledProviderNames);
  132. testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock> *cognitoProviderMock = (testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>*)m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::AWSCognitoIDP].get();
  133. testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock> *lwaProviderMock = (testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>*)m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::LoginWithAmazon].get();
  134. EXPECT_CALL(*cognitoProviderMock, RefreshTokensAsync()).Times(1);
  135. m_mockController->RefreshTokensAsync(AWSClientAuth::ProviderNameEnum::AWSCognitoIDP);
  136. EXPECT_CALL(*lwaProviderMock, RefreshTokensAsync()).Times(1);
  137. m_mockController->RefreshTokensAsync(AWSClientAuth::ProviderNameEnum::LoginWithAmazon);
  138. cognitoProviderMock = nullptr;
  139. }
  140. TEST_F(AuthenticationProviderManagerTest, GetTokensWithRefreshAsync_ValidToken_Success)
  141. {
  142. m_mockController->Initialize(m_enabledProviderNames);
  143. testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>* cognitoProviderMock = (testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>*)m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::AWSCognitoIDP].get();
  144. AWSClientAuth::AuthenticationTokens tokens(
  145. AWSClientAuthUnitTest::TEST_ACCESS_TOKEN, AWSClientAuthUnitTest::TEST_REFRESH_TOKEN, AWSClientAuthUnitTest::TEST_ID_TOKEN,
  146. AWSClientAuth::ProviderNameEnum::AWSCognitoIDP, 600);
  147. EXPECT_CALL(*cognitoProviderMock, GetAuthenticationTokens()).Times(1).WillOnce(testing::Return(tokens));
  148. EXPECT_CALL(*cognitoProviderMock, RefreshTokensAsync()).Times(0);
  149. EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnRefreshTokensSuccess(testing::_)).Times(1);
  150. m_mockController->GetTokensWithRefreshAsync(AWSClientAuth::ProviderNameEnum::AWSCognitoIDP);
  151. cognitoProviderMock = nullptr;
  152. }
  153. TEST_F(AuthenticationProviderManagerTest, GetTokensWithRefreshAsync_InvalidToken_Success)
  154. {
  155. m_mockController->Initialize(m_enabledProviderNames);
  156. testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>* cognitoProviderMock = (testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>*)m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::AWSCognitoIDP].get();
  157. AWSClientAuth::AuthenticationTokens tokens;
  158. EXPECT_CALL(*cognitoProviderMock, GetAuthenticationTokens()).Times(1).WillOnce(testing::Return(tokens));
  159. EXPECT_CALL(*cognitoProviderMock, RefreshTokensAsync()).Times(1);
  160. m_mockController->GetTokensWithRefreshAsync(AWSClientAuth::ProviderNameEnum::AWSCognitoIDP);
  161. cognitoProviderMock = nullptr;
  162. }
  163. TEST_F(AuthenticationProviderManagerTest, GetTokensWithRefreshAsync_NotInitializedProvider_Fail)
  164. {
  165. AZ_TEST_START_TRACE_SUPPRESSION;
  166. EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnRefreshTokensSuccess(testing::_)).Times(0);
  167. EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnRefreshTokensFail(testing::_)).Times(1);
  168. m_mockController->GetTokensWithRefreshAsync(AWSClientAuth::ProviderNameEnum::AWSCognitoIDP);
  169. AZ_TEST_STOP_TRACE_SUPPRESSION(1);
  170. }
  171. TEST_F(AuthenticationProviderManagerTest, GetTokens_Success)
  172. {
  173. m_mockController->Initialize(m_enabledProviderNames);
  174. testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>* cognitoProviderMock = (testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>*)m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::AWSCognitoIDP].get();
  175. AWSClientAuth::AuthenticationTokens tokens(
  176. AWSClientAuthUnitTest::TEST_ACCESS_TOKEN, AWSClientAuthUnitTest::TEST_REFRESH_TOKEN, AWSClientAuthUnitTest::TEST_ID_TOKEN,
  177. AWSClientAuth::ProviderNameEnum::AWSCognitoIDP, 60);
  178. EXPECT_CALL(*cognitoProviderMock, GetAuthenticationTokens()).Times(1).WillOnce(testing::Return(tokens));
  179. m_mockController->GetAuthenticationTokens(AWSClientAuth::ProviderNameEnum::AWSCognitoIDP);
  180. cognitoProviderMock = nullptr;
  181. }
  182. TEST_F(AuthenticationProviderManagerTest, IsSignedIn_Success)
  183. {
  184. m_mockController->Initialize(m_enabledProviderNames);
  185. testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>* cognitoProviderMock = (testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>*)m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::AWSCognitoIDP].get();
  186. AWSClientAuth::AuthenticationTokens tokens(
  187. AWSClientAuthUnitTest::TEST_ACCESS_TOKEN, AWSClientAuthUnitTest::TEST_REFRESH_TOKEN, AWSClientAuthUnitTest::TEST_ID_TOKEN,
  188. AWSClientAuth::ProviderNameEnum::AWSCognitoIDP, 60);
  189. EXPECT_CALL(*cognitoProviderMock, GetAuthenticationTokens()).Times(1).WillOnce(testing::Return(tokens));
  190. m_mockController->IsSignedIn(AWSClientAuth::ProviderNameEnum::AWSCognitoIDP);
  191. cognitoProviderMock = nullptr;
  192. }
  193. TEST_F(AuthenticationProviderManagerTest, SignOut_Success)
  194. {
  195. m_mockController->Initialize(m_enabledProviderNames);
  196. testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>* googleProviderMock = (testing::NiceMock<AWSClientAuthUnitTest::AuthenticationProviderMock>*)m_mockController->m_authenticationProvidersMap[AWSClientAuth::ProviderNameEnum::Google].get();
  197. EXPECT_CALL(*googleProviderMock, SignOut()).Times(1);
  198. EXPECT_CALL(m_authenticationProviderNotificationsBusMock, OnSignOut(testing::_)).Times(1);
  199. m_mockController->SignOut(AWSClientAuth::ProviderNameEnum::Google);
  200. googleProviderMock = nullptr;
  201. }