Files
UnrealEngine/Engine/Source/Programs/UnrealBuildAccelerator/Test/Private/UbaTestNetwork.cpp
2025-05-18 13:04:45 +08:00

188 lines
6.2 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "UbaBinaryReaderWriter.h"
#include "UbaPlatform.h"
#include "UbaNetworkClient.h"
#include "UbaNetworkServer.h"
#include "UbaNetworkMessage.h"
#include "UbaNetworkBackendTcp.h"
#include "UbaNetworkBackendMemory.h"
namespace uba
{
bool TestSockets(LoggerWithWriter& logger, const StringBufferBase& testRootDir)
{
static constexpr u16 port = 1346;
Atomic<u8> result;
NetworkBackendTcp tcp(logger.m_writer);
Thread t([&]()
{
logger.Info(TC("Starting to Listen"));
tcp.StartListen(logger, port, TC("127.0.0.1"), [&](void* connection, const sockaddr& remoteSocketAddr)
{
logger.Info(TC("Listen got connection"));
tcp.SetDisconnectCallback(connection, nullptr, [](void*, const Guid&, void*) {});
tcp.SetRecvCallbacks(connection, &result, 1,
[](void* context, const Guid& connectionUid, u8* headerData, void*& outBodyContext, u8*& outBodyData, u32& outBodySize)
{
*(Atomic<u8>*)context = *headerData;
//wprintf(TC("Listen got data from peer: %u\n"), *headerData);
return true;
},
nullptr, TC(""));
return true;
});
return 0;
});
Sleep(100);
logger.Info(TC("Starting to Connect"));
tcp.Connect(logger, TC("127.0.0.1"), [&](void* connection, const sockaddr& remoteSocketAddr, bool* timedOut)
{
tcp.SetDisconnectCallback(connection, nullptr, [](void*, const Guid&, void*) {});
tcp.SetRecvCallbacks(connection, &tcp, 1, [](void* context, const Guid& connectionUid, u8* headerData, void*& outBodyContext, u8*& outBodyData, u32& outBodySize) { return true; }, nullptr, TC(""));
u8 b = 42;
NetworkBackend::SendContext sc;
tcp.Send(logger, connection, &b, 1, sc, TC(""));
return true;
}, port);
Sleep(200);
t.Wait();
if (result != 42)
return logger.Error(TC("Failed to receive data"));
return true;
}
bool TestClientServer(LoggerWithWriter& logger, const StringBufferBase& testRootDir)
{
auto& logWriter = logger.m_writer;
NetworkBackendTcp networkBackend(logWriter);
bool ctorSuccess = true;
NetworkServer server(ctorSuccess, logWriter);
NetworkClient client(ctorSuccess, logWriter);
server.RegisterService(1, [&](const ConnectionInfo& connectionInfo, const WorkContext& workContext, MessageInfo& messageInfo, BinaryReader& reader, BinaryWriter& writer)
{
logger.Info(TC("Got ping!"));
UBA_ASSERT(messageInfo.type == SessionMessageType_Ping);
writer.WriteByte(42);
return true;
});
auto ds = MakeGuard([&]() { networkBackend.StopListen(); server.DisconnectClients(); });
if (!server.StartListen(networkBackend, 1234))
return logger.Error(TC("Failed to listen"));
Sleep(100);
auto dg = MakeGuard([&]() { client.Disconnect(); });
if (!client.Connect(networkBackend, TC("127.0.0.1"), 1234))
return logger.Error(TC("Failed to connect"));
StackBinaryWriter<128> writer;
NetworkMessage msg(client, 1, SessionMessageType_Ping, writer);
writer.WriteU32(32);
StackBinaryReader<32> reader;
if (!msg.Send(reader))
return logger.Error(TC("Failed to get message"));
u8 value = reader.ReadByte();
logger.Info(TC("Got value %u"), value);
if (!server.SendKeepAlive())
return logger.Error(TC("Failed to send keep alive"));
Sleep(100);
return true;
}
bool TestClientServer2(LoggerWithWriter& logger, const StringBufferBase& testRootDir)
{
auto& logWriter = logger.m_writer;
NetworkBackendTcp networkBackend(logWriter);
bool ctorSuccess = true;
NetworkServer server(ctorSuccess, logWriter);
NetworkClient client(ctorSuccess, logWriter);
server.RegisterService(1, [&](const ConnectionInfo& connectionInfo, const WorkContext& workContext, MessageInfo& messageInfo, BinaryReader& reader, BinaryWriter& writer)
{
logger.Info(TC("Got ping!"));
UBA_ASSERT(messageInfo.type == SessionMessageType_Ping);
writer.WriteByte(42);
return true;
});
if (!client.StartListen(networkBackend, 1239))
return logger.Error(TC("Client failed to listen"));
Sleep(100);
auto ds = MakeGuard([&]() { networkBackend.StopListen(); server.DisconnectClients(); });
auto dg = MakeGuard([&]() { client.Disconnect(); });
if (!server.AddClient(networkBackend, TC("127.0.0.1"), 1239))
return logger.Error(TC("Server failed to connect"));
if (!server.AddClient(networkBackend, TC("127.0.0.1"), 1239))
return logger.Error(TC("Server failed to connect second"));
u64 time = GetTime();
while (!client.GetConnectionCount())
{
if (TimeToMs(GetTime() - time) > 4000)
return logger.Error(TC("Client failed to establish connection"));
Sleep(100);
}
StackBinaryWriter<128> writer;
NetworkMessage msg(client, 1, SessionMessageType_Ping, writer);
writer.WriteU32(32);
StackBinaryReader<32> reader;
if (!msg.Send(reader))
return logger.Error(TC("Failed to get message"));
u8 value = reader.ReadByte();
logger.Info(TC("Got value %u"), value);
return true;
}
bool TestClientServerMem(LoggerWithWriter& logger, const StringBufferBase& testRootDir)
{
auto& logWriter = logger.m_writer;
NetworkBackendMemory networkBackend(logWriter);
bool ctorSuccess = true;
NetworkServer server(ctorSuccess, logWriter);
NetworkClient client(ctorSuccess, logWriter);
server.RegisterService(1, [&](const ConnectionInfo& connectionInfo, const WorkContext& workContext, MessageInfo& messageInfo, BinaryReader& reader, BinaryWriter& writer)
{
logger.Info(TC("Got ping!"));
UBA_ASSERT(messageInfo.type == SessionMessageType_Ping);
writer.WriteByte(42);
return true;
});
auto ds = MakeGuard([&]() { server.DisconnectClients(); });
if (!server.StartListen(networkBackend, 1234))
return logger.Error(TC("Failed to listen"));
Sleep(100);
auto dg = MakeGuard([&]() { client.Disconnect(); });
if (!client.Connect(networkBackend, TC("127.0.0.1"), 1234))
return logger.Error(TC("Failed to connect"));
StackBinaryWriter<128> writer;
NetworkMessage msg(client, 1, SessionMessageType_Ping, writer);
writer.WriteU32(32);
StackBinaryReader<32> reader;
if (!msg.Send(reader))
return logger.Error(TC("Failed to get message"));
u8 value = reader.ReadByte();
if (value != 42)
return logger.Error(TC("Got wrong value %u, expected 42"), value);
logger.Info(TC("Got value %u"), value);
return true;
}
}