Skip to content

Commit

Permalink
Implement first version of client-server tests
Browse files Browse the repository at this point in the history
  • Loading branch information
tuokri committed Nov 20, 2023
1 parent 56310e6 commit 7cad6d4
Show file tree
Hide file tree
Showing 3 changed files with 150 additions and 289 deletions.
184 changes: 112 additions & 72 deletions templates/uscript_test_mutator.jinja
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,48 @@ var array<{{ message.name }}> MsgQueue_{{ message.name }};
var bool bClientServerDone_{{ message.name }};
{% endfor %}

enum ETestState
{
ETS_None,
{% for message in messages %}
ETS_Sending_{{ message.name }},
ETS_WaitingFor_{{ message.name }},
{% endfor %}
};

var ETestState TestState;

var int TotalFailures;
var int TotalMessagesToSend;
var int TotalMessagesReceived;
var int NumTestRounds;
var bool bDone;
var bool bLocalDone;
var array<byte> BytesToSend;

event Tick(float DeltaTime)
{
super.Tick(DeltaTime);

`ulog("TestState:" @ TestState, TestState != ETS_None);

switch (TestState)
{
{% for message in messages %}
case ETS_Sending_{{ message.name }}:
`ulog("MsgQueue_{{ message.name }}.Length:" @ MsgQueue_{{ message.name }}.Length);
SendMsg_{{ message.name }}();
break;
case ETS_WaitingFor_{{ message.name }}:
if (MessageReady_{{ message.name }}())
{
TotalFailures += CheckMessage_{{ message.name }}();
}
break;
{% endfor %}
default:
return;
}
}

function bool MutatorIsAllowed()
Expand Down Expand Up @@ -109,7 +139,7 @@ final static function string RandomString(int Size)
{% set msg1 = "TESTVAR_" + message.name + "_Msg1" %}
{% set msg2 = "TESTVAR_" + message.name + "_Msg2" %}
{% set cls = "class'" + class_name + "'.static." %}
final simulated function int Test_{{ message.name }}()
final function int Test_{{ message.name }}()
{
local int Failures;
local int X;
Expand Down Expand Up @@ -254,6 +284,12 @@ function PreBeginPlay()
`ulog("##ERROR##: Failed to spawn UMBTestsTcpLink");
Failures += 1;
}
else
{
Link.TargetHost = "127.0.0.1";
Link.TargetPort = 55555;
Link.ConnectToServer();
}

// Local tests.
for (Round = 0; Round < NumTestRounds; ++Round)
Expand Down Expand Up @@ -281,117 +317,121 @@ function PreBeginPlay()

bLocalDone = True;

RunClientServerTests();
SetTimer(0.5, True, nameof(Quit));
}

function PostBeginPlay()
{
super.PostBeginPlay();

SetTimer(2.0, True, nameof(Quit));
RunClientServerTests();
}

function SendMsg()
{% for message in messages %}
final function SendMsg_{{ message.name }}()
{
local {{ message.name }} Msg;

if (MsgQueue_{{ message.name }}.Length > 0)
{
Msg = MsgQueue_{{ message.name }}[MsgQueue_{{ message.name }}.Length - 1];
class'{{ class_name }}'.static.{{ message.name }}_ToMultiBytes(Msg, BytesToSend);
MsgQueue_{{ message.name }}.Remove(MsgQueue_{{ message.name }}.Length - 1, 1);

// TODO: Store in temp var for comparison later in CheckMessage_XYZ.

Link.SendBytes(BytesToSend);
}
else
{
bClientServerDone_{{ message.name }} = True;
}

TestState = ETS_WaitingFor_{{ message.name }};
}

function bool IsMsgReceived()
final function bool MessageReady_{{ message.name }}()
{
return False;
// TODO: check from Link.
return True;
}

function bool CheckMessage()
/*
// TODO: move this check to a dedicated function! E.g. final test state.
`ulog("### ### ### ### ### ### ### ### ### ### ### ### ### ###");
`ulog("TotalMessagesToSend :" @ TotalMessagesToSend);
`ulog("TotalMessagesReceived :" @ TotalMessagesReceived);
`ulog("### ### ### ### ### ### ### ### ### ### ### ### ### ###");
TotalFailures += int(TotalMessagesToSend == TotalMessagesReceived);

`ulog("##TOTAL TEST RESULTS##: TotalFailures=" $ TotalFailures);
if (TotalFailures > 0)
{
`ulog("##TOTAL TEST RESULTS##: TEST SUITE(S) FAILED");
}
else
{
return False;
`ulog("##TOTAL TEST RESULTS##: ALL TESTS PASSED");
}

{% for message in messages %}
state Sending_{{ message.name }}
// Done with all message types, exit.
TestState = ETS_None;
bDone = True;
`ulog("quitting");
ConsoleCommand("QUIT", True);
*/

final function int CheckMessage_{{ message.name }}()
{
function SendMsg()
{
if (MsgQueue_{{ message.name }}.Length > 0)
{
// Send with Link.
// TODO: read from link and compare.
++TotalMessagesReceived;

GotoState('WaitingFor_{{ message.name }}');
}
else
{
if (bClientServerDone_{{ message.name }})
{
{% if loop.is_last %}
`ulog("### ### ### ### ### ### ### ### ### ### ### ### ### ###");
`ulog("TotalMessagesToSend :" @ TotalMessagesToSend);
`ulog("TotalMessagesReceived :" @ TotalMessagesReceived);
`ulog("### ### ### ### ### ### ### ### ### ### ### ### ### ###");
TotalFailures += int(TotalMessagesToSend == TotalMessagesReceived);

`ulog("##TOTAL TEST RESULTS##: TotalFailures=" $ TotalFailures);
if (TotalFailures > 0)
{
`ulog("##TOTAL TEST RESULTS##: TEST SUITE(S) FAILED");
}
else
{
`ulog("##TOTAL TEST RESULTS##: ALL TESTS PASSED");
}

// Done with all message types, exit.
GotoState('');
bDone = True;
`ulog("quitting");
ConsoleCommand("QUIT", True);
// Done with all message types, exit. TODO: move exit away from here.
Link.Close();
TestState = ETS_None;
bDone = True;
{% else %}
bClientServerDone_{{ message.name }} = True;
// Done with this type, go to next type's queue.
GotoState('WaitingFor_{{ at(messages, loop.index + 1).name }}');
// Done with this type. Move to next type's queue.
TestState = ETS_Sending_{{ at(messages, loop.index + 1).name }};
{% endif %}
}
}

Begin:
`ulog("Begin state Sending_{{ message.name }}");
}

state WaitingFor_{{ message.name }}
{
function bool IsMsgReceived()
{
// Check if Link has message ready for us.

return False;
}

function bool CheckMessage()
else
{
// Check that message is valid.

GotoState('Sending_{{ message.name }}');

return False;
TestState = ETS_Sending_{{ message.name }};
}

Begin:
`ulog("Begin state WaitingFor_{{ message.name }}");
return 0;
}

// ---------------------------------------------------------------------------
{% endfor %}
{% endfor -%}

final function RunClientServerTests()
{
if (Link.LinkState != STATE_Connected)
{
`ulog("Link not connected yet, state:" @ Link.LinkState);
SetTimer(0.01, False, nameof(RunClientServerTests));
return;
}

TotalMessagesToSend = 0;

{% for message in messages %}
TotalMessagesToSend += MsgQueue_{{ message.name }}.Length;
{% endfor %}
`ulog("TotalMessagesToSend:" @ TotalMessagesToSend);

// TODO: move this elsewhere.
bDone = True;
`ulog("quitting");
ConsoleCommand("QUIT", True);
TestState = ETS_Sending_{{ messages.0.name }};
}

final function Quit()
{
if (bDone)
{
`ulog("quitting");
ConsoleCommand("QUIT", True);
}
}
Expand Down
Loading

0 comments on commit 7cad6d4

Please sign in to comment.