2022-07-13 03:11:55 -04:00
// Copyright Epic Games, Inc. All Rights Reserved.
# include "ReplicationSystemServerClientTestFixture.h"
2024-03-28 14:38:23 -04:00
# include "Logging/LogScopedVerbosityOverride.h"
2022-07-13 03:11:55 -04:00
# include "Iris/Core/IrisLog.h"
# include "Iris/ReplicationSystem/ReplicationSystem.h"
# include "Iris/ReplicationSystem/ReplicationSystemInternal.h"
# include "Iris/ReplicationSystem/ReplicationConnections.h"
# include "Iris/ReplicationSystem/ReplicationWriter.h"
# include "Iris/ReplicationSystem/ReplicationReader.h"
# include "Iris/PacketControl/PacketNotification.h"
2022-08-31 06:14:22 -04:00
# include "Net/Core/Trace/NetTrace.h"
2022-07-13 03:11:55 -04:00
namespace UE : : Net
{
// FDataStreamTestUtil implementation
FDataStreamTestUtil : : FDataStreamTestUtil ( )
: DataStreamDefinitions ( nullptr )
, CurrentDataStreamDefinitions ( nullptr )
{
}
void FDataStreamTestUtil : : SetUp ( )
{
StoreDataStreamDefinitions ( ) ;
}
void FDataStreamTestUtil : : TearDown ( )
{
RestoreDataStreamDefinitions ( ) ;
}
void FDataStreamTestUtil : : StoreDataStreamDefinitions ( )
{
DataStreamDefinitions = static_cast < UMyDataStreamDefinitions * > ( GetMutableDefault < UDataStreamDefinitions > ( ) ) ;
check ( DataStreamDefinitions ! = nullptr ) ;
CurrentDataStreamDefinitions = & DataStreamDefinitions - > ReadWriteDataStreamDefinitions ( ) ;
PointerToFixupComplete = & DataStreamDefinitions - > ReadWriteFixupComplete ( ) ;
PreviousDataStreamDefinitions . Empty ( ) ;
Swap ( * CurrentDataStreamDefinitions , PreviousDataStreamDefinitions ) ;
* PointerToFixupComplete = false ;
}
void FDataStreamTestUtil : : RestoreDataStreamDefinitions ( )
{
Swap ( * CurrentDataStreamDefinitions , PreviousDataStreamDefinitions ) ;
* PointerToFixupComplete = false ;
}
void FDataStreamTestUtil : : AddDataStreamDefinition ( const TCHAR * StreamName , const TCHAR * ClassPath , bool bValid )
{
FDataStreamDefinition Definition = { } ;
Definition . DataStreamName = FName ( StreamName ) ;
Definition . ClassName = bValid ? FName ( ClassPath ) : FName ( ) ;
Definition . Class = nullptr ;
Definition . DefaultSendStatus = EDataStreamSendStatus : : Send ;
Definition . bAutoCreate = false ;
CurrentDataStreamDefinitions - > Add ( Definition ) ;
}
// FReplicationSystemTestNode implementation
2022-08-31 06:14:22 -04:00
FReplicationSystemTestNode : : FReplicationSystemTestNode ( bool bIsServer , const TCHAR * Name )
2024-05-16 12:55:44 -04:00
{
Setup ( bIsServer , Name ) ;
}
FReplicationSystemTestNode : : FReplicationSystemTestNode ( FReplicationSystemTestNode : : EDelaySetup )
{
// Do nothing until asked to start up
}
void FReplicationSystemTestNode : : Setup ( bool bIsServer , const TCHAR * Name , FReplicationSystemTestNode : : FReplicationSystemParamsOverride * ParamsOverride )
2022-07-13 03:11:55 -04:00
{
2024-09-18 04:10:29 -04:00
// Init NetTokenStore
{
using namespace UE : : Net ;
NetTokenStore = MakeUnique < FNetTokenStore > ( ) ;
FNetTokenStore : : FInitParams NetTokenStoreInitParams ;
NetTokenStoreInitParams . Authority = bIsServer ? FNetToken : : ENetTokenAuthority : : Authority : FNetToken : : ENetTokenAuthority : : None ;
NetTokenStore - > Init ( NetTokenStoreInitParams ) ;
// Register data stores for supported types, $TODO: make this configurable.
2024-09-18 04:45:56 -04:00
NetTokenStore - > CreateAndRegisterDataStore < FStringTokenStore > ( ) ;
NetTokenStore - > CreateAndRegisterDataStore < FNameTokenStore > ( ) ;
2024-09-18 04:10:29 -04:00
}
2022-07-13 03:11:55 -04:00
ReplicationBridge = NewObject < UReplicatedTestObjectBridge > ( ) ;
2024-03-28 14:38:23 -04:00
check ( ReplicationBridge ! = nullptr ) ;
2022-07-13 03:11:55 -04:00
CreatedObjects . Add ( TStrongObjectPtr < UObject > ( ReplicationBridge ) ) ;
UReplicationSystem : : FReplicationSystemParams Params ;
Params . ReplicationBridge = ReplicationBridge ;
Params . bIsServer = bIsServer ;
Params . bAllowObjectReplication = bIsServer ;
2024-09-18 04:10:29 -04:00
Params . NetTokenStore = NetTokenStore . Get ( ) ;
2022-07-13 03:11:55 -04:00
2024-05-16 12:55:44 -04:00
if ( ParamsOverride )
{
Params . MaxReplicatedObjectCount = ParamsOverride - > MaxReplicatedObjectCount > 0 ? ParamsOverride - > MaxReplicatedObjectCount : Params . MaxReplicatedObjectCount ;
Params . InitialNetObjectListCount = ParamsOverride - > InitialNetObjectListCount > 0 ? ParamsOverride - > InitialNetObjectListCount : Params . InitialNetObjectListCount ;
Params . NetObjectListGrowCount = ParamsOverride - > NetObjectListGrowCount > 0 ? ParamsOverride - > NetObjectListGrowCount : Params . NetObjectListGrowCount ;
}
2024-03-28 14:38:23 -04:00
LOG_SCOPE_VERBOSITY_OVERRIDE ( LogIris , ELogVerbosity : : Error ) ;
2022-07-13 03:11:55 -04:00
ReplicationSystem = FReplicationSystemFactory : : CreateReplicationSystem ( Params ) ;
if ( ! bIsServer )
{
ReplicationBridge - > SetCreatedObjectsOnNode ( & CreatedObjects ) ;
}
2022-08-31 06:14:22 -04:00
UE_NET_TRACE_UPDATE_INSTANCE ( GetNetTraceId ( ) , bIsServer , Name ) ;
}
2022-11-17 07:11:09 -05:00
FReplicationSystemTestNode : : ~ FReplicationSystemTestNode ( )
{
const uint32 NetTraceId = ReplicationSystem - > GetId ( ) ;
2024-03-28 14:38:23 -04:00
LOG_SCOPE_VERBOSITY_OVERRIDE ( LogIris , ELogVerbosity : : Error ) ;
2022-11-17 07:11:09 -05:00
FReplicationSystemFactory : : DestroyReplicationSystem ( ReplicationSystem ) ;
CreatedObjects . Empty ( ) ;
// End NetTrace session for this instance
UE_NET_TRACE_END_SESSION ( NetTraceId ) ;
}
2022-08-31 06:14:22 -04:00
uint32 FReplicationSystemTestNode : : GetNetTraceId ( ) const
{
return ReplicationSystem ? ReplicationSystem - > GetId ( ) : ~ 0U ;
2022-07-13 03:11:55 -04:00
}
2024-08-27 10:29:26 -04:00
UTestReplicatedIrisObject * FReplicationSystemTestNode : : CreateObject ( const UObjectReplicationBridge : : FRootObjectReplicationParams & Params , UTestReplicatedIrisObject : : FComponents * ComponentsToCreate )
2023-06-06 09:49:57 -04:00
{
UTestReplicatedIrisObject * CreatedObject = NewObject < UTestReplicatedIrisObject > ( ) ;
2023-12-14 14:40:06 -05:00
if ( ComponentsToCreate )
{
CreatedObject - > AddComponents ( * ComponentsToCreate ) ;
}
2023-06-06 09:49:57 -04:00
CreatedObjects . Add ( TStrongObjectPtr < UObject > ( CreatedObject ) ) ;
// Add it to the bridge for replication
ReplicationBridge - > BeginReplication ( CreatedObject , Params ) ;
return CreatedObject ;
}
2022-07-13 03:11:55 -04:00
UTestReplicatedIrisObject * FReplicationSystemTestNode : : CreateObject ( uint32 NumComponents , uint32 NumIrisComponents )
{
UTestReplicatedIrisObject * CreatedObject = NewObject < UTestReplicatedIrisObject > ( ) ;
CreatedObjects . Add ( TStrongObjectPtr < UObject > ( CreatedObject ) ) ;
CreatedObject - > AddComponents ( NumComponents , NumIrisComponents ) ;
// Add it to the bridge for replication
ReplicationBridge - > BeginReplication ( CreatedObject ) ;
return CreatedObject ;
}
UTestReplicatedIrisObject * FReplicationSystemTestNode : : CreateObject ( const UTestReplicatedIrisObject : : FComponents & Components )
{
UTestReplicatedIrisObject * CreatedObject = NewObject < UTestReplicatedIrisObject > ( ) ;
CreatedObject - > AddComponents ( Components ) ;
CreatedObjects . Add ( TStrongObjectPtr < UObject > ( CreatedObject ) ) ;
// Add it to the bridge for replication
ReplicationBridge - > BeginReplication ( CreatedObject ) ;
return CreatedObject ;
}
2022-11-17 07:11:09 -05:00
UTestReplicatedIrisObject * FReplicationSystemTestNode : : CreateSubObject ( FNetRefHandle Owner , const UTestReplicatedIrisObject : : FComponents & Components )
2022-07-13 03:11:55 -04:00
{
UTestReplicatedIrisObject * CreatedObject = NewObject < UTestReplicatedIrisObject > ( ) ;
CreatedObjects . Add ( TStrongObjectPtr < UObject > ( CreatedObject ) ) ;
CreatedObject - > AddComponents ( Components ) ;
// Add it to the bridge for replication
ReplicationBridge - > BeginReplication ( Owner , CreatedObject ) ;
return CreatedObject ;
}
2022-11-17 07:11:09 -05:00
UTestReplicatedIrisObject * FReplicationSystemTestNode : : CreateSubObject ( FNetRefHandle Owner , uint32 NumComponents , uint32 NumIrisComponents )
2022-07-13 03:11:55 -04:00
{
UTestReplicatedIrisObject * CreatedObject = NewObject < UTestReplicatedIrisObject > ( ) ;
CreatedObjects . Add ( TStrongObjectPtr < UObject > ( CreatedObject ) ) ;
CreatedObject - > AddComponents ( NumComponents , NumIrisComponents ) ;
// Add it to the bridge for replication
ReplicationBridge - > BeginReplication ( Owner , CreatedObject ) ;
return CreatedObject ;
}
UTestReplicatedIrisObject * FReplicationSystemTestNode : : CreateObjectWithDynamicState ( uint32 NumComponents , uint32 NumIrisComponents , uint32 NumDynamicStateComponents )
{
UTestReplicatedIrisObject * CreatedObject = NewObject < UTestReplicatedIrisObject > ( ) ;
CreatedObjects . Add ( TStrongObjectPtr < UObject > ( CreatedObject ) ) ;
CreatedObject - > AddComponents ( NumComponents , NumIrisComponents ) ;
CreatedObject - > AddDynamicStateComponents ( NumDynamicStateComponents ) ;
return CreatedObject ;
}
2022-09-12 05:52:11 -04:00
void FReplicationSystemTestNode : : DestroyObject ( UReplicatedTestObject * Object , EEndReplicationFlags EndReplicationFlags )
2022-07-13 03:11:55 -04:00
{
// Destroy handle
2022-11-17 07:11:09 -05:00
check ( Object & & Object - > NetRefHandle . IsValid ( ) ) ;
2022-07-13 03:11:55 -04:00
2022-09-12 05:52:11 -04:00
// End replication for the handle
ReplicationBridge - > EndReplication ( Object , EndReplicationFlags ) ;
2022-07-13 03:11:55 -04:00
// Release ref
CreatedObjects . Remove ( TStrongObjectPtr < UObject > ( Object ) ) ;
// Mark as garbage
Object - > MarkAsGarbage ( ) ;
}
uint32 FReplicationSystemTestNode : : AddConnection ( )
{
check ( ReplicationSystem ) ;
FConnectionInfo Connection ;
Connection . ConnectionId = Connections . Num ( ) + 1U ;
// Create DataStreams
FDataStreamManagerInitParams InitParams ;
InitParams . PacketWindowSize = 256 ;
UDataStreamManager * DataStreamManager = NewObject < UDataStreamManager > ( ) ;
DataStreamManager - > Init ( InitParams ) ;
Connection . DataStreamManager = DataStreamManager ;
CreatedObjects . Add ( TStrongObjectPtr < UObject > ( Connection . DataStreamManager ) ) ;
2024-09-18 04:10:29 -04:00
// Init and store RemoteNetTokenStoreState
ReplicationSystem - > GetNetTokenStore ( ) - > InitRemoteNetTokenStoreState ( Connection . ConnectionId ) ;
Connection . RemoteNetTokenStoreState = ReplicationSystem - > GetNetTokenStore ( ) - > GetRemoteNetTokenStoreState ( Connection . ConnectionId ) ;
2022-07-13 03:11:55 -04:00
// Streams created based on config
Connection . DataStreamManager - > CreateStream ( " NetToken " ) ;
Connection . NetTokenDataStream = StaticCast < UNetTokenDataStream * > ( Connection . DataStreamManager - > GetStream ( " NetToken " ) ) ;
Connection . DataStreamManager - > CreateStream ( " Replication " ) ;
Connection . ReplicationDataStream = StaticCast < UReplicationDataStream * > ( Connection . DataStreamManager - > GetStream ( " Replication " ) ) ;
2022-08-31 06:14:22 -04:00
UE_NET_TRACE_CONNECTION_CREATED ( GetNetTraceId ( ) , Connection . ConnectionId ) ;
UE_NET_TRACE_CONNECTION_STATE_UPDATED ( GetNetTraceId ( ) , Connection . ConnectionId , static_cast < uint8 > ( 3 ) ) ;
2022-07-13 03:11:55 -04:00
// Add a connection
ReplicationSystem - > AddConnection ( Connection . ConnectionId ) ;
// Initialize Streams
ReplicationSystem - > InitDataStreams ( Connection . ConnectionId , Connection . DataStreamManager ) ;
ReplicationSystem - > SetReplicationEnabledForConnection ( Connection . ConnectionId , true ) ;
// Add view
FReplicationView View ;
View . Views . AddDefaulted ( ) ;
ReplicationSystem - > SetReplicationView ( Connection . ConnectionId , View ) ;
Connections . Add ( Connection ) ;
return Connection . ConnectionId ;
}
2024-06-04 03:39:03 -04:00
void FReplicationSystemTestNode : : RemoveConnection ( uint32 ConnectionId )
{
for ( TArray < FConnectionInfo > : : TIterator It = Connections . CreateIterator ( ) ; It ; + + It )
{
FConnectionInfo & ConnectionInfo = * It ;
if ( ConnectionInfo . ConnectionId ! = ConnectionId )
{
continue ;
}
ReplicationSystem - > RemoveConnection ( ConnectionInfo . ConnectionId ) ;
if ( IsValid ( ConnectionInfo . DataStreamManager ) )
{
ConnectionInfo . DataStreamManager - > Deinit ( ) ;
ConnectionInfo . DataStreamManager - > MarkAsGarbage ( ) ;
}
UE_NET_TRACE_CONNECTION_CLOSED ( GetNetTraceId ( ) , ConnectionId ) ;
It . RemoveCurrent ( ) ;
break ;
}
}
2023-09-28 10:58:24 -04:00
void FReplicationSystemTestNode : : PreSendUpdate ( const UReplicationSystem : : FSendUpdateParams & Params )
{
ReplicationSystem - > PreSendUpdate ( Params ) ;
CurrentSendPass = Params . SendPass ;
}
2022-07-13 03:11:55 -04:00
void FReplicationSystemTestNode : : PreSendUpdate ( )
{
2023-09-28 10:58:24 -04:00
PreSendUpdate ( UReplicationSystem : : FSendUpdateParams { . SendPass = EReplicationSystemSendPass : : TickFlush , . DeltaSeconds = 1.f } ) ;
2022-07-13 03:11:55 -04:00
}
2023-07-20 09:40:06 -04:00
bool FReplicationSystemTestNode : : SendUpdate ( uint32 ConnectionId , const TCHAR * Desc )
2022-07-13 03:11:55 -04:00
{
FPacketData Packet ;
FNetBitStreamWriter Writer ;
Writer . InitBytes ( Packet . PacketBuffer , FMath : : Min < uint32 > ( FPacketData : : MaxPacketSize , MaxSendPacketSize ) ) ;
FNetSerializationContext Context ( & Writer ) ;
2022-09-12 08:33:29 -04:00
Context . SetTraceCollector ( UE_NET_TRACE_CREATE_COLLECTOR ( ENetTraceVerbosity : : Trace ) ) ;
2022-08-31 06:14:22 -04:00
2022-07-13 03:11:55 -04:00
FConnectionInfo & Connection = GetConnectionInfo ( ConnectionId ) ;
const FDataStreamRecord * Record = nullptr ;
2023-09-22 10:55:20 -04:00
UDataStream : : FBeginWriteParameters BeginWriteParameters ;
2022-07-13 03:11:55 -04:00
2023-09-28 10:58:24 -04:00
if ( CurrentSendPass = = EReplicationSystemSendPass : : PostTickDispatch )
{
BeginWriteParameters . WriteMode = EDataStreamWriteMode : : PostTickDispatch ;
}
2023-09-22 10:55:20 -04:00
const bool bResult = ( Connection . DataStreamManager - > BeginWrite ( BeginWriteParameters ) ! = UDataStream : : EWriteResult : : NoData ) & & ( Connection . DataStreamManager - > WriteData ( Context , Record ) ! = UDataStream : : EWriteResult : : NoData ) ;
2022-07-13 03:11:55 -04:00
if ( bResult )
{
Writer . CommitWrites ( ) ;
Packet . BitCount = Writer . GetPosBits ( ) ;
2022-08-31 06:14:22 -04:00
Packet . PacketId = PacketId + + ;
2023-07-20 09:40:06 -04:00
if ( Desc )
{
Packet . Desc = FString ( Desc ) ;
}
2022-07-13 03:11:55 -04:00
Connection . WriteRecords . Enqueue ( Record ) ;
Connection . WrittenPackets . Enqueue ( Packet ) ;
}
Connection . DataStreamManager - > EndWrite ( ) ;
2023-01-23 12:22:11 -05:00
if ( bResult )
{
UE_NET_TRACE_FLUSH_COLLECTOR ( Context . GetTraceCollector ( ) , GetNetTraceId ( ) , Connection . ConnectionId , ENetTracePacketType : : Outgoing ) ;
UE_NET_TRACE_PACKET_SEND ( GetNetTraceId ( ) , Connection . ConnectionId , Packet . PacketId , Packet . BitCount ) ;
2023-07-20 09:40:06 -04:00
UE_LOG ( LogIris , Log , TEXT ( " ReplicationSystemTestFixture: Conn: %u Send PacketId: %u %s " ) , ConnectionId , Packet . PacketId , * Packet . Desc ) ;
2023-01-23 12:22:11 -05:00
}
2022-08-31 06:14:22 -04:00
UE_NET_TRACE_DESTROY_COLLECTOR ( Context . GetTraceCollector ( ) ) ;
2022-07-13 03:11:55 -04:00
return bResult ;
}
void FReplicationSystemTestNode : : PostSendUpdate ( )
{
ReplicationSystem - > PostSendUpdate ( ) ;
2023-09-28 10:58:24 -04:00
CurrentSendPass = EReplicationSystemSendPass : : Invalid ;
2022-07-13 03:11:55 -04:00
}
void FReplicationSystemTestNode : : DeliverTo ( FReplicationSystemTestNode & Dest , uint32 LocalConnectionId , uint32 RemoteConnectionId , bool bDeliver )
{
FConnectionInfo & Connection = GetConnectionInfo ( LocalConnectionId ) ;
2023-10-13 07:18:13 -04:00
if ( Connection . WrittenPackets . IsEmpty ( ) )
{
UE_LOG ( LogIris , Log , TEXT ( " ReplicationSystemTestFixture: Conn: %u Unable to %hs packet as there are no packets. " ) , LocalConnectionId , ( bDeliver ? " deliver " : " drop " ) ) ;
return ;
}
2022-08-31 06:14:22 -04:00
const FPacketData & Packet = Connection . WrittenPackets . Peek ( ) ;
2022-07-13 03:11:55 -04:00
if ( bDeliver )
{
FNetBitStreamReader Reader ;
Reader . InitBits ( Packet . PacketBuffer , Packet . BitCount ) ;
FNetSerializationContext Context ( & Reader ) ;
2022-09-12 08:33:29 -04:00
Context . SetTraceCollector ( UE_NET_TRACE_CREATE_COLLECTOR ( ENetTraceVerbosity : : Trace ) ) ;
2022-08-31 06:14:22 -04:00
2023-07-20 09:40:06 -04:00
UE_LOG ( LogIris , Log , TEXT ( " ReplicationSystemTestFixture: Conn: %u Deliver PacketId: %u %s " ) , LocalConnectionId , Packet . PacketId , * Packet . Desc ) ;
2022-07-13 03:11:55 -04:00
Dest . RecvUpdate ( RemoteConnectionId , Context ) ;
2022-08-31 06:14:22 -04:00
UE_NET_TRACE_FLUSH_COLLECTOR ( Context . GetTraceCollector ( ) , Dest . GetNetTraceId ( ) , RemoteConnectionId , ENetTracePacketType : : Incoming ) ;
UE_NET_TRACE_DESTROY_COLLECTOR ( Context . GetTraceCollector ( ) ) ;
UE_NET_TRACE_PACKET_RECV ( Dest . GetNetTraceId ( ) , RemoteConnectionId , Packet . PacketId , Packet . BitCount ) ;
}
else
{
2023-07-20 09:40:06 -04:00
UE_LOG ( LogIris , Log , TEXT ( " ReplicationSystemTestFixture: Conn: %u Dropped PacketId: %u %s " ) , LocalConnectionId , Packet . PacketId , * Packet . Desc ) ;
2022-08-31 06:14:22 -04:00
UE_NET_TRACE_PACKET_DROPPED ( Dest . GetNetTraceId ( ) , RemoteConnectionId , Packet . PacketId , ENetTracePacketType : : Incoming ) ;
2022-09-12 05:52:11 -04:00
UE_NET_TRACE_PACKET_DROPPED ( GetNetTraceId ( ) , LocalConnectionId , Packet . PacketId , ENetTracePacketType : : Outgoing ) ;
2022-07-13 03:11:55 -04:00
}
// If this triggers an assert, ensure that SendTo() actually wrote any packets before.
Connection . DataStreamManager - > ProcessPacketDeliveryStatus ( bDeliver ? EPacketDeliveryStatus : : Delivered : EPacketDeliveryStatus : : Lost , Connection . WriteRecords . Peek ( ) ) ;
Connection . WriteRecords . Pop ( ) ;
Connection . WrittenPackets . Pop ( ) ;
}
void FReplicationSystemTestNode : : RecvUpdate ( uint32 ConnectionId , FNetSerializationContext & Context )
{
FConnectionInfo & Connection = GetConnectionInfo ( ConnectionId ) ;
Connection . DataStreamManager - > ReadData ( Context ) ;
check ( ! Context . HasErrorOrOverflow ( ) ) ;
check ( Context . GetBitStreamReader ( ) - > GetBitsLeft ( ) = = 0U ) ;
}
2022-11-17 07:11:09 -05:00
uint32 FReplicationSystemTestNode : : GetReplicationSystemId ( ) const
2022-07-13 03:11:55 -04:00
{
2022-11-17 07:11:09 -05:00
return ReplicationSystem ? ReplicationSystem - > GetId ( ) : uint32 ( ~ 0U ) ;
2022-07-13 03:11:55 -04:00
}
2023-06-09 11:12:03 -04:00
float FReplicationSystemTestNode : : ConvertPollPeriodIntoFrequency ( uint32 PollPeriod ) const
{
2024-09-17 03:40:58 -04:00
const float PollFrequency = ReplicationBridge - > GetMaxTickRate ( ) / ( float ) ( PollPeriod + 1 ) ;
2023-06-09 11:12:03 -04:00
return PollFrequency ;
}
2023-10-05 12:04:52 -04:00
//*****************************************************************************
// Class FReplicationSystemTestClient
//*****************************************************************************
2022-11-17 07:11:09 -05:00
FReplicationSystemTestClient : : FReplicationSystemTestClient ( const TCHAR * Name )
2022-08-31 06:14:22 -04:00
: FReplicationSystemTestNode ( false , Name )
2022-07-13 03:11:55 -04:00
, ConnectionIdOnServer ( ~ 0U )
{
}
2023-10-05 12:04:52 -04:00
bool FReplicationSystemTestClient : : UpdateAndSend ( FReplicationSystemTestServer * Server , bool bDeliver )
{
bool bSuccess = false ;
PreSendUpdate ( ) ;
if ( SendUpdate ( ) )
{
constexpr uint32 ServerRemoteConnectionId = 0x01 ;
DeliverTo ( * Server , LocalConnectionId , ServerRemoteConnectionId , bDeliver ) ;
bSuccess = true ;
}
PostSendUpdate ( ) ;
return bSuccess ;
}
//*****************************************************************************
// Class FReplicationSystemTestServer
//*****************************************************************************
2022-08-31 06:14:22 -04:00
FReplicationSystemTestServer : : FReplicationSystemTestServer ( const TCHAR * Name )
2023-10-05 12:04:52 -04:00
: FReplicationSystemTestNode ( true , Name )
2022-07-13 03:11:55 -04:00
{
}
2023-07-20 09:40:06 -04:00
bool FReplicationSystemTestServer : : SendAndDeliverTo ( FReplicationSystemTestClient * Client , bool bDeliver , const TCHAR * Desc )
2022-07-13 03:11:55 -04:00
{
2023-07-20 09:40:06 -04:00
if ( SendUpdate ( Client - > ConnectionIdOnServer , Desc ) )
2022-07-13 03:11:55 -04:00
{
DeliverTo ( Client , bDeliver ) ;
return true ;
}
return false ;
}
// Send data, return true if data was written
2023-07-20 09:40:06 -04:00
bool FReplicationSystemTestServer : : SendTo ( FReplicationSystemTestClient * Client , const TCHAR * Desc )
2022-07-13 03:11:55 -04:00
{
2023-07-20 09:40:06 -04:00
return SendUpdate ( Client - > ConnectionIdOnServer , Desc ) ;
2022-07-13 03:11:55 -04:00
}
// If bDeliver is true deliver data to client and report packet as delivered
// if bDeliver is false, do not deliver packet and report a dropped packet
void FReplicationSystemTestServer : : DeliverTo ( FReplicationSystemTestClient * Client , bool bDeliver )
{
FReplicationSystemTestNode : : DeliverTo ( * Client , Client - > ConnectionIdOnServer , Client - > LocalConnectionId , bDeliver ) ;
}
2023-10-13 07:18:13 -04:00
bool FReplicationSystemTestServer : : UpdateAndSend ( const TArrayView < FReplicationSystemTestClient * const > & Clients , bool bDeliver /*= true*/ )
2023-05-12 09:49:39 -04:00
{
bool bSuccess = true ;
PreSendUpdate ( ) ;
for ( FReplicationSystemTestClient * Client : Clients )
{
bSuccess & = SendAndDeliverTo ( Client , bDeliver ) ;
}
PostSendUpdate ( ) ;
return bSuccess ;
}
2023-10-05 12:04:52 -04:00
//*****************************************************************************
// Class FReplicationSystemServerClientTestFixture
//*****************************************************************************
2022-07-13 03:11:55 -04:00
void FReplicationSystemServerClientTestFixture : : SetUp ( )
{
FNetworkAutomationTestSuiteFixture : : SetUp ( ) ;
// Fake what we normally get from config
DataStreamUtil . SetUp ( ) ;
DataStreamUtil . AddDataStreamDefinition ( TEXT ( " NetToken " ) , TEXT ( " /Script/IrisCore.NetTokenDataStream " ) ) ;
DataStreamUtil . AddDataStreamDefinition ( TEXT ( " Replication " ) , TEXT ( " /Script/IrisCore.ReplicationDataStream " ) ) ;
DataStreamUtil . FixupDefinitions ( ) ;
2022-08-31 06:14:22 -04:00
Server = new FReplicationSystemTestServer ( GetName ( ) ) ;
2022-07-13 03:11:55 -04:00
}
2022-11-17 07:11:09 -05:00
void FReplicationSystemServerClientTestFixture : : TearDown ( )
2022-07-13 03:11:55 -04:00
{
delete Server ;
for ( FReplicationSystemTestClient * Client : Clients )
{
delete Client ;
}
Clients . Empty ( ) ;
DataStreamUtil . TearDown ( ) ;
FNetworkAutomationTestSuiteFixture : : TearDown ( ) ;
}
2022-11-17 07:11:09 -05:00
FReplicationSystemTestClient * FReplicationSystemServerClientTestFixture : : CreateClient ( )
{
FReplicationSystemTestClient * Client = new FReplicationSystemTestClient ( GetName ( ) ) ;
Clients . Add ( Client ) ;
// The client needs a connection
Client - > LocalConnectionId = Client - > AddConnection ( ) ;
// Auto connect to server
Client - > ConnectionIdOnServer = Server - > AddConnection ( ) ;
return Client ;
}
2024-06-04 03:39:03 -04:00
void FReplicationSystemServerClientTestFixture : : DestroyClient ( FReplicationSystemTestClient * Client )
{
if ( ! Clients . Remove ( Client ) )
{
UE_LOG ( LogIris , Warning , TEXT ( " Unable to find FReplicationSystemTestClient %p for destroy. NOT destroying. " ) , Client ) ;
return ;
}
Server - > RemoveConnection ( Client - > ConnectionIdOnServer ) ;
delete Client ;
}
2022-07-13 03:11:55 -04:00
}