/* * Copyright (c) Contributors to the Open 3D Engine Project. * For complete copyright and license terms please see the LICENSE at the root of this distribution. * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ #pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace AWSClientAuthUnitTest { constexpr char TEST_USERNAME[] = "TestUsername"; constexpr char TEST_PASSWORD[] = "TestPassword"; constexpr char TEST_NEW_PASSWORD[] = "TestNewPassword"; constexpr char TEST_CODE[] = "TestCode"; constexpr char TEST_REGION[] = "us-east-1"; constexpr char TEST_EMAIL[] = "test@test.com"; constexpr char TEST_PHONE[] = "+11234567890"; constexpr char TEST_COGNITO_CLIENTID[] = "TestCognitoClientId"; constexpr char TEST_EXCEPTION[] = "TestException"; constexpr char TEST_SESSION[] = "TestSession"; constexpr char TEST_TOKEN[] = "TestToken"; constexpr char TEST_ACCOUNT_ID[] = "TestAccountId"; constexpr char TEST_IDENTITY_POOL_ID[] = "TestIdenitityPoolId"; constexpr char TEST_IDENTITY_ID[] = "TestIdenitityId"; constexpr char TEST_ACCESS_TOKEN[] = "TestAccessToken"; constexpr char TEST_REFRESH_TOKEN[] = "TestRefreshToken"; constexpr char TEST_ID_TOKEN[] = "TestIdToken"; constexpr char TEST_ACCESS_KEY_ID[] = "TestAccessKeyId"; constexpr char TEST_SECRET_KEY_ID[] = "TestSecretKeyId"; constexpr char TEST_RESOURCE_NAME_ID[] = "TestResourceNameId"; class AWSResourceMappingRequestBusMock : public AWSCore::AWSResourceMappingRequestBus::Handler { public: AWSResourceMappingRequestBusMock() { AWSCore::AWSResourceMappingRequestBus::Handler::BusConnect(); ON_CALL(*this, GetResourceRegion).WillByDefault(testing::Return(TEST_REGION)); ON_CALL(*this, GetDefaultAccountId).WillByDefault(testing::Return(TEST_ACCOUNT_ID)); ON_CALL(*this, GetResourceAccountId).WillByDefault(testing::Return(TEST_ACCOUNT_ID)); ON_CALL(*this, GetResourceNameId).WillByDefault(testing::Return(TEST_RESOURCE_NAME_ID)); ON_CALL(*this, GetDefaultRegion).WillByDefault(testing::Return(TEST_REGION)); } ~AWSResourceMappingRequestBusMock() { AWSCore::AWSResourceMappingRequestBus::Handler::BusDisconnect(); } MOCK_CONST_METHOD0(GetDefaultAccountId, AZStd::string()); MOCK_CONST_METHOD0(GetDefaultRegion, AZStd::string()); MOCK_CONST_METHOD1(GetResourceAccountId, AZStd::string(const AZStd::string& resourceKeyName)); MOCK_CONST_METHOD1(GetResourceNameId, AZStd::string(const AZStd::string& resourceKeyName)); MOCK_CONST_METHOD1(GetResourceRegion, AZStd::string(const AZStd::string& resourceKeyName)); MOCK_CONST_METHOD1(GetResourceType, AZStd::string(const AZStd::string& resourceKeyName)); MOCK_CONST_METHOD1(GetServiceUrlByServiceName, AZStd::string(const AZStd::string& serviceName)); MOCK_CONST_METHOD2( GetServiceUrlByRESTApiIdAndStage, AZStd::string(const AZStd::string& restApiIdKeyName, const AZStd::string& restApiStageKeyName)); MOCK_METHOD1(ReloadConfigFile, void(bool isReloadingConfigFileName)); }; class AWSCoreRequestBusMock : public AWSCore::AWSCoreRequestBus::Handler { public: AWSCoreRequestBusMock() { AWSCore::AWSCoreRequestBus::Handler::BusConnect(); ON_CALL(*this, GetDefaultJobContext).WillByDefault(testing::Return(nullptr)); ON_CALL(*this, GetDefaultConfig).WillByDefault(testing::Return(nullptr)); } ~AWSCoreRequestBusMock() { AWSCore::AWSCoreRequestBus::Handler::BusDisconnect(); } MOCK_METHOD0(GetDefaultJobContext, AZ::JobContext*()); MOCK_METHOD0(GetDefaultConfig, AWSCore::AwsApiJobConfig*()); }; class HttpRequestorRequestBusMock : public HttpRequestor::HttpRequestorRequestBus::Handler { public: HttpRequestorRequestBusMock() { ON_CALL(*this, AddRequestWithHeadersAndBody(testing::_, testing::_, testing::_, testing::_, testing::_)).WillByDefault(testing::Invoke(this, &HttpRequestorRequestBusMock::AddRequestWithHeadersAndBodyMock)); HttpRequestor::HttpRequestorRequestBus::Handler::BusConnect(); } virtual ~HttpRequestorRequestBusMock() { HttpRequestor::HttpRequestorRequestBus::Handler::BusDisconnect(); } MOCK_METHOD5(AddRequestWithHeadersAndBody, void(const AZStd::string& URI, Aws::Http::HttpMethod method, const HttpRequestor::Headers& headers, const AZStd::string& body, const HttpRequestor::Callback& callback)); void AddRequestWithHeadersAndBodyError(const AZStd::string& URI, Aws::Http::HttpMethod method, const HttpRequestor::Headers& headers, const AZStd::string& body, const HttpRequestor::Callback& callback) { AZ_UNUSED(URI); AZ_UNUSED(method); AZ_UNUSED(headers); AZ_UNUSED(body); Aws::Utils::Json::JsonValue jsonValue; jsonValue.WithString("error", "TestError"); Aws::Utils::Json::JsonView jsonView(jsonValue); Aws::Http::HttpResponseCode code = Aws::Http::HttpResponseCode::INTERNAL_SERVER_ERROR; callback(jsonView, code); } void AddRequest(const AZStd::string& URI, Aws::Http::HttpMethod method, const HttpRequestor::Callback& callback) override { AZ_UNUSED(URI); AZ_UNUSED(method); AZ_UNUSED(callback); } void AddRequestWithHeaders(const AZStd::string& URI, Aws::Http::HttpMethod method, const HttpRequestor::Headers& headers, const HttpRequestor::Callback& callback) override { AZ_UNUSED(URI); AZ_UNUSED(method); AZ_UNUSED(headers); AZ_UNUSED(callback); } void AddRequestWithHeadersAndBodyMock(const AZStd::string& URI, Aws::Http::HttpMethod method, const HttpRequestor::Headers& headers, const AZStd::string& body, const HttpRequestor::Callback& callback) { AZ_UNUSED(URI); AZ_UNUSED(method); AZ_UNUSED(headers); AZ_UNUSED(body); Aws::Utils::Json::JsonValue jsonValue; jsonValue.WithString("user_code", "TestCode"); jsonValue.WithString("device_code", "TestDeviceCode"); jsonValue.WithString("verification_uri", "TestVerificationURI"); jsonValue.WithString("access_token", "TestAccessToken"); jsonValue.WithString("refresh_token", "TestRefreshToken"); jsonValue.WithString("id_token", "TestIdToken"); jsonValue.WithString("expires_in", "600"); Aws::Utils::Json::JsonView jsonView(jsonValue); Aws::Http::HttpResponseCode code = Aws::Http::HttpResponseCode::OK; callback(jsonView, code); } void AddTextRequest(const AZStd::string& URI, Aws::Http::HttpMethod method, const HttpRequestor::TextCallback& callback) override { AZ_UNUSED(URI); AZ_UNUSED(method); AZ_UNUSED(callback); } void AddTextRequestWithHeaders(const AZStd::string& URI, Aws::Http::HttpMethod method, const HttpRequestor::Headers& headers, const HttpRequestor::TextCallback& callback) override { AZ_UNUSED(URI); AZ_UNUSED(method); AZ_UNUSED(headers); AZ_UNUSED(callback); } void AddTextRequestWithHeadersAndBody(const AZStd::string& URI, Aws::Http::HttpMethod method, const HttpRequestor::Headers& headers, const AZStd::string& body, const HttpRequestor::TextCallback& callback) override { AZ_UNUSED(URI); AZ_UNUSED(method); AZ_UNUSED(headers); AZ_UNUSED(body); AZ_UNUSED(callback); } }; class CognitoIdentityProviderClientMock : public Aws::CognitoIdentityProvider::CognitoIdentityProviderClient { public: CognitoIdentityProviderClientMock() : Aws::CognitoIdentityProvider::CognitoIdentityProviderClient(Aws::Auth::AWSCredentials()) { ON_CALL(*this, InitiateAuth(testing::_)).WillByDefault(testing::Invoke(this, &CognitoIdentityProviderClientMock::InitiateAuthMock)); ON_CALL(*this, SignUp(testing::_)).WillByDefault(testing::Invoke(this, &CognitoIdentityProviderClientMock::SignUpMock)); ON_CALL(*this, ConfirmSignUp(testing::_)).WillByDefault(testing::Invoke(this, &CognitoIdentityProviderClientMock::ConfirmSignUpMock)); ON_CALL(*this, RespondToAuthChallenge(testing::_)).WillByDefault(testing::Invoke(this, &CognitoIdentityProviderClientMock::RespondToAuthChallengeMock)); ON_CALL(*this, ForgotPassword(testing::_)).WillByDefault(testing::Invoke(this, &CognitoIdentityProviderClientMock::ForgotPasswordMock)); ON_CALL(*this, ConfirmForgotPassword(testing::_)).WillByDefault(testing::Invoke(this, &CognitoIdentityProviderClientMock::ConfirmForgotPasswordMock)); ON_CALL(*this, SetUserMFAPreference(testing::_)).WillByDefault(testing::Invoke(this, &CognitoIdentityProviderClientMock::SetUserMFAPreferenceMock)); } MOCK_CONST_METHOD1(InitiateAuth , Aws::CognitoIdentityProvider::Model::InitiateAuthOutcome(const Aws::CognitoIdentityProvider::Model::InitiateAuthRequest& request)); MOCK_CONST_METHOD1(RespondToAuthChallenge , Aws::CognitoIdentityProvider::Model::RespondToAuthChallengeOutcome(const Aws::CognitoIdentityProvider::Model::RespondToAuthChallengeRequest& request)); MOCK_CONST_METHOD1(SignUp , Aws::CognitoIdentityProvider::Model::SignUpOutcome(const Aws::CognitoIdentityProvider::Model::SignUpRequest& request)); MOCK_CONST_METHOD1(ConfirmSignUp , Aws::CognitoIdentityProvider::Model::ConfirmSignUpOutcome(const Aws::CognitoIdentityProvider::Model::ConfirmSignUpRequest& request)); MOCK_CONST_METHOD1(ForgotPassword , Aws::CognitoIdentityProvider::Model::ForgotPasswordOutcome(const Aws::CognitoIdentityProvider::Model::ForgotPasswordRequest& request)); MOCK_CONST_METHOD1(ConfirmForgotPassword , Aws::CognitoIdentityProvider::Model::ConfirmForgotPasswordOutcome(const Aws::CognitoIdentityProvider::Model::ConfirmForgotPasswordRequest& request)); MOCK_CONST_METHOD1(SetUserMFAPreference , Aws::CognitoIdentityProvider::Model::SetUserMFAPreferenceOutcome(const Aws::CognitoIdentityProvider::Model::SetUserMFAPreferenceRequest& request)); Aws::CognitoIdentityProvider::Model::InitiateAuthOutcome InitiateAuthMock(const Aws::CognitoIdentityProvider::Model::InitiateAuthRequest& request) { AZ_UNUSED(request); Aws::CognitoIdentityProvider::Model::AuthenticationResultType authenticationResult; authenticationResult.SetAccessToken(TEST_ACCESS_TOKEN); authenticationResult.SetRefreshToken(TEST_REFRESH_TOKEN); authenticationResult.SetIdToken(TEST_ID_TOKEN); authenticationResult.SetExpiresIn(5); Aws::CognitoIdentityProvider::Model::InitiateAuthResult result; result.SetChallengeName(Aws::CognitoIdentityProvider::Model::ChallengeNameType::NOT_SET); result.SetAuthenticationResult(authenticationResult); Aws::CognitoIdentityProvider::Model::InitiateAuthOutcome outcome(result); return outcome; } Aws::CognitoIdentityProvider::Model::SignUpOutcome SignUpMock(const Aws::CognitoIdentityProvider::Model::SignUpRequest& request) { AZ_UNUSED(request); Aws::CognitoIdentityProvider::Model::SignUpResult result; result.SetUserSub("TestUserUUID"); Aws::CognitoIdentityProvider::Model::SignUpOutcome outcome(result); return outcome; } Aws::CognitoIdentityProvider::Model::RespondToAuthChallengeOutcome RespondToAuthChallengeMock(const Aws::CognitoIdentityProvider::Model::RespondToAuthChallengeRequest& request) { AZ_UNUSED(request); Aws::CognitoIdentityProvider::Model::RespondToAuthChallengeResult result; Aws::CognitoIdentityProvider::Model::AuthenticationResultType authenticationResult; authenticationResult.SetAccessToken(TEST_ACCESS_TOKEN); authenticationResult.SetRefreshToken(TEST_REFRESH_TOKEN); authenticationResult.SetIdToken(TEST_ID_TOKEN); authenticationResult.SetExpiresIn(30); result.SetAuthenticationResult(authenticationResult); Aws::CognitoIdentityProvider::Model::RespondToAuthChallengeOutcome outcome(result); return outcome; } Aws::CognitoIdentityProvider::Model::ConfirmSignUpOutcome ConfirmSignUpMock(const Aws::CognitoIdentityProvider::Model::ConfirmSignUpRequest& request) { AZ_UNUSED(request); Aws::CognitoIdentityProvider::Model::ConfirmSignUpResult result; Aws::CognitoIdentityProvider::Model::ConfirmSignUpOutcome outcome(result); return outcome; } Aws::CognitoIdentityProvider::Model::ForgotPasswordOutcome ForgotPasswordMock(const Aws::CognitoIdentityProvider::Model::ForgotPasswordRequest& request) { AZ_UNUSED(request); Aws::CognitoIdentityProvider::Model::ForgotPasswordResult result; Aws::CognitoIdentityProvider::Model::ForgotPasswordOutcome outcome(result); return outcome; } Aws::CognitoIdentityProvider::Model::ConfirmForgotPasswordOutcome ConfirmForgotPasswordMock(const Aws::CognitoIdentityProvider::Model::ConfirmForgotPasswordRequest& request) { AZ_UNUSED(request); Aws::CognitoIdentityProvider::Model::ConfirmForgotPasswordResult result; Aws::CognitoIdentityProvider::Model::ConfirmForgotPasswordOutcome outcome(result); return outcome; } Aws::CognitoIdentityProvider::Model::SetUserMFAPreferenceOutcome SetUserMFAPreferenceMock(const Aws::CognitoIdentityProvider::Model::SetUserMFAPreferenceRequest& request) { AZ_UNUSED(request); Aws::CognitoIdentityProvider::Model::SetUserMFAPreferenceResult result; Aws::CognitoIdentityProvider::Model::SetUserMFAPreferenceOutcome outcome(result); return outcome; } }; class CognitoIdentityClientMock : public Aws::CognitoIdentity::CognitoIdentityClient { public: CognitoIdentityClientMock() : Aws::CognitoIdentity::CognitoIdentityClient(Aws::Auth::AWSCredentials()) { ON_CALL(*this, GetId(testing::_)).WillByDefault(testing::Invoke(this, &CognitoIdentityClientMock::GetIdMock)); ON_CALL(*this, GetCredentialsForIdentity(testing::_)).WillByDefault(testing::Invoke(this, &CognitoIdentityClientMock::GetCredentialsForIdentityMock)); } MOCK_CONST_METHOD1(GetId , Aws::CognitoIdentity::Model::GetIdOutcome(const Aws::CognitoIdentity::Model::GetIdRequest& request)); MOCK_CONST_METHOD1(GetCredentialsForIdentity , Aws::CognitoIdentity::Model::GetCredentialsForIdentityOutcome(const Aws::CognitoIdentity::Model::GetCredentialsForIdentityRequest& request)); Aws::CognitoIdentity::Model::GetIdOutcome GetIdMock(const Aws::CognitoIdentity::Model::GetIdRequest& request) { AZ_UNUSED(request); Aws::CognitoIdentity::Model::GetIdResult result; result.SetIdentityId(TEST_IDENTITY_ID); Aws::CognitoIdentity::Model::GetIdOutcome outcome(result); return outcome; } Aws::CognitoIdentity::Model::GetCredentialsForIdentityOutcome GetCredentialsForIdentityMock(const Aws::CognitoIdentity::Model::GetCredentialsForIdentityRequest& request) { AZ_UNUSED(request); Aws::CognitoIdentity::Model::Credentials creds; creds.SetAccessKeyId(TEST_ACCESS_KEY_ID); creds.SetSecretKey(TEST_SECRET_KEY_ID); creds.SetExpiration(Aws::Utils::DateTime(std::chrono::system_clock::now() + std::chrono::seconds(600))); Aws::CognitoIdentity::Model::GetCredentialsForIdentityResult result; result.SetIdentityId(TEST_IDENTITY_ID); result.SetCredentials(creds); Aws::CognitoIdentity::Model::GetCredentialsForIdentityOutcome outcome(result); return outcome; } }; class AuthenticationProviderMock : public AWSClientAuth::AuthenticationProviderInterface { public: AuthenticationProviderMock() { ON_CALL(*this, Initialize()).WillByDefault(testing::Return(true)); } virtual ~AuthenticationProviderMock() = default; MOCK_METHOD0(Initialize, bool()); MOCK_METHOD2(PasswordGrantSingleFactorSignInAsync, void(const AZStd::string& username, const AZStd::string& password)); MOCK_METHOD2(PasswordGrantMultiFactorSignInAsync, void(const AZStd::string& username, const AZStd::string& password)); MOCK_METHOD2(PasswordGrantMultiFactorConfirmSignInAsync, void(const AZStd::string& username, const AZStd::string& confirmationCode)); MOCK_METHOD0(DeviceCodeGrantSignInAsync, void()); MOCK_METHOD0(DeviceCodeGrantConfirmSignInAsync, void()); MOCK_METHOD0(RefreshTokensAsync, void()); MOCK_METHOD0(GetAuthenticationTokens, AWSClientAuth::AuthenticationTokens()); MOCK_METHOD0(SignOut, void()); }; class AuthenticationProviderNotificationsBusMock : public AWSClientAuth::AuthenticationProviderNotificationBus::Handler { public: AuthenticationProviderNotificationsBusMock() { AWSClientAuth::AuthenticationProviderNotificationBus::Handler::BusConnect(); } virtual ~AuthenticationProviderNotificationsBusMock() { AWSClientAuth::AuthenticationProviderNotificationBus::Handler::BusDisconnect(); } MOCK_METHOD1(OnPasswordGrantSingleFactorSignInSuccess, void(const AWSClientAuth::AuthenticationTokens& authenticationToken)); MOCK_METHOD1(OnPasswordGrantSingleFactorSignInFail, void(const AZStd::string& error)); MOCK_METHOD0(OnPasswordGrantMultiFactorSignInSuccess, void()); MOCK_METHOD1(OnPasswordGrantMultiFactorSignInFail, void(const AZStd::string& error)); MOCK_METHOD1(OnPasswordGrantMultiFactorConfirmSignInSuccess, void(const AWSClientAuth::AuthenticationTokens& authenticationToken)); MOCK_METHOD1(OnPasswordGrantMultiFactorConfirmSignInFail, void(const AZStd::string& error)); MOCK_METHOD3(OnDeviceCodeGrantSignInSuccess, void(const AZStd::string& userCode, const AZStd::string& verificationUrl, int codeExpiresInSeconds)); MOCK_METHOD1(OnDeviceCodeGrantSignInFail, void(const AZStd::string& error)); MOCK_METHOD1(OnDeviceCodeGrantConfirmSignInSuccess, void(const AWSClientAuth::AuthenticationTokens& authenticationToken)); MOCK_METHOD1(OnDeviceCodeGrantConfirmSignInFail, void(const AZStd::string& error)); MOCK_METHOD1(OnRefreshTokensSuccess, void(const AWSClientAuth::AuthenticationTokens& authenticationToken)); MOCK_METHOD1(OnRefreshTokensFail, void(const AZStd::string& error)); MOCK_METHOD1(OnSignOut, void(const AWSClientAuth::ProviderNameEnum& providerName)); }; class AWSCognitoAuthorizationNotificationsBusMock : public AWSClientAuth::AWSCognitoAuthorizationNotificationBus::Handler { public: AWSCognitoAuthorizationNotificationsBusMock() { AWSClientAuth::AWSCognitoAuthorizationNotificationBus::Handler::BusConnect(); } virtual ~AWSCognitoAuthorizationNotificationsBusMock() { AWSClientAuth::AWSCognitoAuthorizationNotificationBus::Handler::BusDisconnect(); } MOCK_METHOD1(OnRequestAWSCredentialsSuccess, void(const AWSClientAuth::ClientAuthAWSCredentials& awsCredentials)); MOCK_METHOD1(OnRequestAWSCredentialsFail, void(const AZStd::string& error)); }; class AWSCognitoUserManagementNotificationsBusMock : public AWSClientAuth::AWSCognitoUserManagementNotificationBus::Handler { public: AWSCognitoUserManagementNotificationsBusMock() { AWSClientAuth::AWSCognitoUserManagementNotificationBus::Handler::BusConnect(); } virtual ~AWSCognitoUserManagementNotificationsBusMock() { AWSClientAuth::AWSCognitoUserManagementNotificationBus::Handler::BusDisconnect(); } MOCK_METHOD1(OnEmailSignUpSuccess, void(const AZStd::string& uuid)); MOCK_METHOD1(OnEmailSignUpFail, void(const AZStd::string& error)); MOCK_METHOD1(OnPhoneSignUpSuccess, void(const AZStd::string& uuid)); MOCK_METHOD1(OnPhoneSignUpFail, void(const AZStd::string& error)); MOCK_METHOD0(OnConfirmSignUpSuccess, void()); MOCK_METHOD1(OnConfirmSignUpFail, void(const AZStd::string& error)); MOCK_METHOD0(OnForgotPasswordSuccess, void()); MOCK_METHOD1(OnForgotPasswordFail, void(const AZStd::string& error)); MOCK_METHOD0(OnConfirmForgotPasswordSuccess, void()); MOCK_METHOD1(OnConfirmForgotPasswordFail, void(const AZStd::string& error)); MOCK_METHOD0(OnEnableMFASuccess, void()); MOCK_METHOD1(OnEnableMFAFail, void(const AZStd::string& error)); }; class AWSClientAuthGemAllocatorFixture : public UnitTest::ScopedAllocatorSetupFixture , public AZ::ComponentApplicationBus::Handler , public AWSClientAuth::AWSClientAuthRequestBus::Handler { public: AWSClientAuthGemAllocatorFixture() { } AWSClientAuthGemAllocatorFixture(bool connectClientAuthBus) { m_connectClientAuthBus = connectClientAuthBus; } virtual ~AWSClientAuthGemAllocatorFixture() = default; protected: AZStd::shared_ptr m_serializeContext; AZStd::unique_ptr m_registrationContext; AZStd::shared_ptr m_settingsRegistry; AZStd::unique_ptr m_testFolder; bool m_testFolderCreated = false; AZStd::unique_ptr m_jobContext; AZStd::unique_ptr m_jobCancelGroup; AZStd::unique_ptr m_jobManager; std::shared_ptr m_cognitoIdentityProviderClientMock; std::shared_ptr m_cognitoIdentityClientMock; bool m_connectClientAuthBus = true; AuthenticationProviderNotificationsBusMock m_authenticationProviderNotificationsBusMock; AWSCognitoAuthorizationNotificationsBusMock m_awsCognitoAuthorizationNotificationsBusMock; AWSCognitoUserManagementNotificationsBusMock m_awsCognitoUserManagementNotificationsBusMock; void SetUp() override { AZ::AllocatorInstance::Create(); AZ::IO::FileIOBase::SetInstance(aznew AZ::IO::LocalFileIO()); m_serializeContext = AZStd::make_unique(); m_registrationContext = AZStd::make_unique(); AZ::JsonSystemComponent::Reflect(m_registrationContext.get()); m_settingsRegistry = AZStd::make_unique(); m_settingsRegistry->SetContext(m_serializeContext.get()); m_settingsRegistry->SetContext(m_registrationContext.get()); AZ::SettingsRegistry::Register(m_settingsRegistry.get()); AZ::ComponentApplicationBus::Handler::BusConnect(); AZ::Interface::Register(this); if (m_connectClientAuthBus) { AZ::Interface::Register(this); AWSClientAuth::AWSClientAuthRequestBus::Handler::BusConnect(); } m_testFolder = AZStd::make_unique("AWSClientAuthTest_"); m_testFolder->append(AZ::Uuid::CreateRandom().ToString(false, false)); AZ::JobManagerDesc jobManagerDesc; AZ::JobManagerThreadDesc threadDesc; m_jobManager.reset(aznew AZ::JobManager(jobManagerDesc)); m_jobCancelGroup.reset(aznew AZ::JobCancelGroup()); jobManagerDesc.m_workerThreads.push_back(threadDesc); jobManagerDesc.m_workerThreads.push_back(threadDesc); jobManagerDesc.m_workerThreads.push_back(threadDesc); m_jobContext.reset(aznew AZ::JobContext(*m_jobManager, *m_jobCancelGroup)); AZ::JobContext::SetGlobalContext(m_jobContext.get()); AWSNativeSDKInit::InitializationManager::InitAwsApi(); m_cognitoIdentityProviderClientMock = std::make_shared(); m_cognitoIdentityClientMock = std::make_shared(); } void TearDown() override { AZ::JobContext::SetGlobalContext(nullptr); m_jobContext.reset(); m_jobCancelGroup.reset(); m_jobManager.reset(); m_cognitoIdentityProviderClientMock.reset(); m_cognitoIdentityClientMock.reset(); AWSNativeSDKInit::InitializationManager::Shutdown(); AZ::AllocatorInstance::Destroy(); if (m_testFolderCreated) { DeleteFolderRecursive(*m_testFolder); } m_registrationContext->EnableRemoveReflection(); AZ::JsonSystemComponent::Reflect(m_registrationContext.get()); m_registrationContext->DisableRemoveReflection(); AZ::Interface::Unregister(this); AZ::ComponentApplicationBus::Handler::BusDisconnect(); if (m_connectClientAuthBus) { AZ::Interface::Unregister(this); AWSClientAuth::AWSClientAuthRequestBus::Handler::BusDisconnect(); } AZ::SettingsRegistry::Unregister(m_settingsRegistry.get()); m_testFolder.reset(); m_settingsRegistry.reset(); m_serializeContext.reset(); m_registrationContext.reset(); delete AZ::IO::FileIOBase::GetInstance(); AZ::IO::FileIOBase::SetInstance(nullptr); } // ComponentApplicationBus overrides. Required by settings registry for json serialization context. AZ::ComponentApplication* GetApplication() override { return nullptr; } void RegisterComponentDescriptor(const AZ::ComponentDescriptor*) override { } void UnregisterComponentDescriptor(const AZ::ComponentDescriptor*) override { } void RegisterEntityAddedEventHandler(AZ::EntityAddedEvent::Handler&) override { } void RegisterEntityRemovedEventHandler(AZ::EntityRemovedEvent::Handler&) override { } void RegisterEntityActivatedEventHandler(AZ::EntityActivatedEvent::Handler&) override { } void RegisterEntityDeactivatedEventHandler(AZ::EntityDeactivatedEvent::Handler&) override { } void SignalEntityActivated(AZ::Entity*) override { } void SignalEntityDeactivated(AZ::Entity*) override { } bool AddEntity(AZ::Entity*) override { return true; } bool RemoveEntity(AZ::Entity*) override { return true; } bool DeleteEntity(const AZ::EntityId&) override { return true; } AZ::Entity* FindEntity(const AZ::EntityId&) override { return nullptr; } AZ::BehaviorContext* GetBehaviorContext() override { return nullptr; } const char* GetExecutableFolder() const override { return nullptr; } const char* GetEngineRoot() const override { return nullptr; } void EnumerateEntities(const EntityCallback& /*callback*/) override {} void QueryApplicationType(AZ::ApplicationTypeQuery& /*appType*/) const override {} AZ::SerializeContext* GetSerializeContext() override { return m_serializeContext.get(); } AZ::JsonRegistrationContext* GetJsonRegistrationContext() override { return m_registrationContext.get(); } // AWSClientAuthBus std::shared_ptr GetCognitoIDPClient() override { return m_cognitoIdentityProviderClientMock; } std::shared_ptr GetCognitoIdentityClient() override { return m_cognitoIdentityClientMock; } // TODO Add safety check. Also use pattern to create and remove one file. static void DeleteFolderRecursive(const AZStd::string& path) { auto callback = [&path](const char* filename, bool isFile) -> bool { if (isFile) { AZStd::string filePath = path; filePath += '/'; filePath += filename; AZ::IO::SystemFile::Delete(filePath.c_str()); } else { if (strcmp(filename, ".") != 0 && strcmp(filename, "..") != 0) { AZStd::string folderPath = path; folderPath += '/'; folderPath += filename; DeleteFolderRecursive(folderPath); } } return true; }; AZStd::string searchPath = path; searchPath += "/*"; AZ::IO::SystemFile::FindFiles(searchPath.c_str(), callback); AZ::IO::SystemFile::DeleteDir(path.c_str()); } AZStd::string CreateTestFile(AZStd::string_view name, AZStd::string_view content) { using namespace AZ::IO; AZStd::string path = AZStd::string::format("%s/%s/%.*s", m_testFolder->c_str(), AZ::SettingsRegistryInterface::RegistryFolder, static_cast(name.length()), name.data()); SystemFile file; if (!file.Open(path.c_str(), SystemFile::OpenMode::SF_OPEN_CREATE | SystemFile::SF_OPEN_CREATE_PATH | SystemFile::SF_OPEN_WRITE_ONLY)) { AZ_Assert(false, "Unable to open test file for writing: %s", path.c_str()); return path; } if (file.Write(content.data(), content.size()) != content.size()) { AZ_Assert(false, "Unable to write content to test file: %s", path.c_str()); } m_testFolderCreated = true; return path; } }; }