2
0

TcpTransportTests.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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 <AzNetworking/TcpTransport/TcpNetworkInterface.h>
  9. #include <AzNetworking/Framework/NetworkingSystemComponent.h>
  10. #include <AzNetworking/AutoGen/CorePackets.AutoPackets.h>
  11. #include <AzCore/Interface/Interface.h>
  12. #include <AzCore/Console/LoggerSystemComponent.h>
  13. #include <AzCore/Time/TimeSystem.h>
  14. #include <AzCore/Name/NameDictionary.h>
  15. #include <AzCore/UnitTest/TestTypes.h>
  16. namespace UnitTest
  17. {
  18. using namespace AzNetworking;
  19. class TestTcpConnectionListener
  20. : public IConnectionListener
  21. {
  22. public:
  23. ConnectResult ValidateConnect([[maybe_unused]] const IpAddress& remoteAddress, [[maybe_unused]] const IPacketHeader& packetHeader, [[maybe_unused]] ISerializer& serializer) override
  24. {
  25. return ConnectResult::Accepted;
  26. }
  27. void OnConnect([[maybe_unused]] IConnection* connection) override
  28. {
  29. ;
  30. }
  31. PacketDispatchResult OnPacketReceived([[maybe_unused]] IConnection* connection, const IPacketHeader& packetHeader, [[maybe_unused]] ISerializer& serializer) override
  32. {
  33. EXPECT_TRUE((packetHeader.GetPacketType() == static_cast<PacketType>(CorePackets::PacketType::InitiateConnectionPacket))
  34. || (packetHeader.GetPacketType() == static_cast<PacketType>(CorePackets::PacketType::HeartbeatPacket)));
  35. return PacketDispatchResult::Failure;
  36. }
  37. void OnPacketLost([[maybe_unused]] IConnection* connection, [[maybe_unused]] PacketId packetId) override
  38. {
  39. }
  40. void OnDisconnect([[maybe_unused]] IConnection* connection, [[maybe_unused]] DisconnectReason reason, [[maybe_unused]] TerminationEndpoint endpoint) override
  41. {
  42. // This should fail given we should be in a disconnecting state
  43. EXPECT_FALSE(connection->Disconnect(reason, endpoint));
  44. }
  45. };
  46. class TestTcpClient
  47. {
  48. public:
  49. TestTcpClient()
  50. {
  51. AZStd::string name = AZStd::string::format("TcpClient%d", ++s_numClients);
  52. m_name = name;
  53. m_clientNetworkInterface = AZ::Interface<INetworking>::Get()->CreateNetworkInterface(m_name, ProtocolType::Tcp, TrustZone::ExternalClientToServer, m_connectionListener);
  54. m_clientNetworkInterface->Connect(IpAddress(127, 0, 0, 1, 12345));
  55. }
  56. ~TestTcpClient()
  57. {
  58. AZ::Interface<INetworking>::Get()->DestroyNetworkInterface(m_name);
  59. }
  60. AZ::Name m_name;
  61. TestTcpConnectionListener m_connectionListener;
  62. INetworkInterface* m_clientNetworkInterface;
  63. static inline int32_t s_numClients = 0;
  64. };
  65. class TestTcpServer
  66. {
  67. public:
  68. TestTcpServer()
  69. {
  70. m_serverNetworkInterface = AZ::Interface<INetworking>::Get()->CreateNetworkInterface(m_name, ProtocolType::Tcp, TrustZone::ExternalClientToServer, m_connectionListener);
  71. m_serverNetworkInterface->Listen(12345);
  72. }
  73. ~TestTcpServer()
  74. {
  75. AZ::Interface<INetworking>::Get()->DestroyNetworkInterface(m_name);
  76. }
  77. AZ::Name m_name = AZ::Name(AZStd::string_view("TcpServer"));
  78. TestTcpConnectionListener m_connectionListener;
  79. INetworkInterface* m_serverNetworkInterface;
  80. };
  81. class TcpTransportTests
  82. : public LeakDetectionFixture
  83. {
  84. public:
  85. void SetUp() override
  86. {
  87. AZ::NameDictionary::Create();
  88. m_loggerComponent = AZStd::make_unique<AZ::LoggerSystemComponent>();
  89. m_timeSystem = AZStd::make_unique<AZ::TimeSystem>();
  90. m_networkingSystemComponent = AZStd::make_unique<AzNetworking::NetworkingSystemComponent>();
  91. }
  92. void TearDown() override
  93. {
  94. m_networkingSystemComponent.reset();
  95. m_timeSystem.reset();
  96. m_loggerComponent.reset();
  97. AZ::NameDictionary::Destroy();
  98. }
  99. AZStd::unique_ptr<AZ::LoggerSystemComponent> m_loggerComponent;
  100. AZStd::unique_ptr<AZ::TimeSystem> m_timeSystem;
  101. AZStd::unique_ptr<AzNetworking::NetworkingSystemComponent> m_networkingSystemComponent;
  102. };
  103. #if AZ_TRAIT_DISABLE_FAILED_NETWORKING_TESTS
  104. TEST_F(TcpTransportTests, DISABLED_TestSingleClient)
  105. #else
  106. TEST_F(TcpTransportTests, SUITE_sandbox_TestSingleClient)
  107. #endif // AZ_TRAIT_DISABLE_FAILED_NETWORKING_TESTS
  108. {
  109. TestTcpServer testServer;
  110. TestTcpClient testClient;
  111. constexpr AZ::TimeMs TotalIterationTimeMs = AZ::TimeMs{ 5000 };
  112. const AZ::TimeMs startTimeMs = AZ::GetElapsedTimeMs();
  113. for (;;)
  114. {
  115. AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(25));
  116. m_networkingSystemComponent->OnSystemTick();
  117. bool timeExpired = (AZ::GetElapsedTimeMs() - startTimeMs > TotalIterationTimeMs);
  118. bool canTerminate = (testServer.m_serverNetworkInterface->GetConnectionSet().GetConnectionCount() == 1)
  119. && (testClient.m_clientNetworkInterface->GetConnectionSet().GetConnectionCount() == 1);
  120. if (canTerminate || timeExpired)
  121. {
  122. break;
  123. }
  124. }
  125. EXPECT_EQ(testServer.m_serverNetworkInterface->GetConnectionSet().GetConnectionCount(), 1);
  126. EXPECT_EQ(testClient.m_clientNetworkInterface->GetConnectionSet().GetConnectionCount(), 1);
  127. const AZ::TimeMs timeoutMs = AZ::TimeMs{ 100 };
  128. testClient.m_clientNetworkInterface->SetTimeoutMs(timeoutMs);
  129. EXPECT_EQ(testClient.m_clientNetworkInterface->GetTimeoutMs(), timeoutMs);
  130. EXPECT_TRUE(testServer.m_serverNetworkInterface->StopListening());
  131. }
  132. #if AZ_TRAIT_DISABLE_FAILED_NETWORKING_TESTS
  133. TEST_F(TcpTransportTests, DISABLED_TestMultipleClients)
  134. #else
  135. TEST_F(TcpTransportTests, SUITE_sandbox_TestMultipleClients)
  136. #endif // AZ_TRAIT_DISABLE_FAILED_NETWORKING_TESTS
  137. {
  138. constexpr uint32_t NumTestClients = 50;
  139. TestTcpServer testServer;
  140. TestTcpClient testClient[NumTestClients];
  141. constexpr AZ::TimeMs TotalIterationTimeMs = AZ::TimeMs{ 5000 };
  142. const AZ::TimeMs startTimeMs = AZ::GetElapsedTimeMs();
  143. for (;;)
  144. {
  145. AZStd::this_thread::sleep_for(AZStd::chrono::milliseconds(25));
  146. m_networkingSystemComponent->OnSystemTick();
  147. bool timeExpired = (AZ::GetElapsedTimeMs() - startTimeMs > TotalIterationTimeMs);
  148. bool canTerminate = testServer.m_serverNetworkInterface->GetConnectionSet().GetConnectionCount() == NumTestClients;
  149. for (uint32_t i = 0; i < NumTestClients; ++i)
  150. {
  151. canTerminate &= testClient[i].m_clientNetworkInterface->GetConnectionSet().GetConnectionCount() == 1;
  152. }
  153. if (canTerminate || timeExpired)
  154. {
  155. break;
  156. }
  157. }
  158. EXPECT_EQ(testServer.m_serverNetworkInterface->GetConnectionSet().GetConnectionCount(), NumTestClients);
  159. for (uint32_t i = 0; i < NumTestClients; ++i)
  160. {
  161. EXPECT_EQ(testClient[i].m_clientNetworkInterface->GetConnectionSet().GetConnectionCount(), 1);
  162. }
  163. }
  164. }