/* * 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 * */ #include #include #include using namespace AWSCore; class TestCredentialHandlerOne : AWSCredentialRequestBus::Handler { public: void ActivateHandler() { m_handlerCounter = 0; m_credentialsProvider = std::make_shared(); AWSCredentialRequestBus::Handler::BusConnect(); } void DeactivateHandler() { AWSCredentialRequestBus::Handler::BusDisconnect(); m_credentialsProvider.reset(); } int GetCredentialHandlerOrder() const override { return 1; } std::shared_ptr GetCredentialsProvider() override { ++m_handlerCounter; return m_credentialsProvider; } std::shared_ptr m_credentialsProvider; AZStd::atomic m_handlerCounter; }; class TestCredentialHandlerTwo : AWSCredentialRequestBus::Handler { public: void ActivateHandler() { m_handlerCounter = 0; m_credentialsProvider = std::make_shared(); AWSCredentialRequestBus::Handler::BusConnect(); } void DeactivateHandler() { AWSCredentialRequestBus::Handler::BusDisconnect(); m_credentialsProvider.reset(); } int GetCredentialHandlerOrder() const override { return 2; } std::shared_ptr GetCredentialsProvider() override { ++m_handlerCounter; return m_credentialsProvider; } std::shared_ptr m_credentialsProvider; AZStd::atomic m_handlerCounter; }; class AWSCredentialBusTest : public AWSCoreFixture { public: AWSCredentialBusTest() { m_handlerOne = AZStd::make_unique(); m_handlerTwo = AZStd::make_unique(); } void SetUp() override { AWSCoreFixture::SetUpFixture(); m_handlerOne->ActivateHandler(); m_handlerTwo->ActivateHandler(); } void TearDown() override { m_handlerOne->DeactivateHandler(); m_handlerTwo->DeactivateHandler(); AWSCoreFixture::TearDownFixture(); } AZStd::unique_ptr m_handlerOne; AZStd::unique_ptr m_handlerTwo; }; TEST_F(AWSCredentialBusTest, GetCredentialsProvider_CallFromMultithread_GetExpectedCredentialsProviderAndNumberOfCalls) { constexpr int testThreadNumber = 10; AZStd::atomic actualEbusCalls = 0; AZStd::vector testThreadPool; for (int index = 0; index < testThreadNumber; ++index) { testThreadPool.emplace_back(AZStd::thread([&]() { AWSCredentialResult result; AWSCredentialRequestBus::BroadcastResult(result, &AWSCredentialRequests::GetCredentialsProvider); ASSERT_TRUE(result.result); EXPECT_TRUE(result.result == m_handlerOne->m_credentialsProvider); actualEbusCalls++; })); } for (auto& testThread : testThreadPool) { testThread.join(); } EXPECT_TRUE(m_handlerOne->m_handlerCounter == testThreadNumber); EXPECT_TRUE(m_handlerTwo->m_handlerCounter == testThreadNumber); EXPECT_TRUE(actualEbusCalls == testThreadNumber); }