63 lines
2.9 KiB
C
63 lines
2.9 KiB
C
// Isolated engine serialization/lifecycle test. No HTTP calls or real players.
|
|
class ERR_TelemetryProbe
|
|
{
|
|
static bool Check(bool ok, string detail)
|
|
{
|
|
if (ok) Print("ERR SMOKE PASS: telemetry " + detail);
|
|
else Print("ERR SMOKE FAIL: telemetry " + detail, LogLevel.ERROR);
|
|
return ok;
|
|
}
|
|
}
|
|
modded class ERR_Telemetry
|
|
{
|
|
bool ProbeStart()
|
|
{
|
|
if (!ERR_TelemetryProbe.Check(Enabled() && m_State.pending.Count() == 1 && !m_Dirty, "start queued and persisted before HTTP")) return false;
|
|
JsonLoadContext json = new JsonLoadContext(); string type, id;
|
|
if (!ERR_TelemetryProbe.Check(json.LoadFromString(m_State.pending[0]) && json.ReadValue("type", type) && type == "mission_started" && json.ReadValue("eventId", id) && UUID.IsUUID(id), "native event JSON has type and stable event UUID")) return false;
|
|
string server = m_State.serverId;
|
|
if (!ERR_TelemetryProbe.Check(LoadState(STATE) && m_State.serverId == server && m_State.pending.Count() == 1, "native JSON queue reload preserves server and event")) return false;
|
|
return true;
|
|
}
|
|
bool ProbeResult()
|
|
{
|
|
Finish("interrupted");
|
|
JsonLoadContext json = new JsonLoadContext(); string outcome;
|
|
if (!ERR_TelemetryProbe.Check(m_Ended && m_State.pending.Count() == 2 && json.LoadFromString(m_State.pending[1]) && json.ReadValue("outcome", outcome) && outcome == "preparation_failed", "preparation failure queued once; later interruption cannot overwrite it")) return false;
|
|
return true;
|
|
}
|
|
int ProbeDelivered() { return m_Delivered; }
|
|
bool ProbeBoundedQueue()
|
|
{
|
|
for (int i = 0; i < 70; i++) Event("heartbeat");
|
|
return ERR_TelemetryProbe.Check(m_State.pending.Count() == 64 && m_State.droppedEvents == 6 && !m_Dirty, "offline queue is bounded and reports dropped heartbeat events");
|
|
}
|
|
bool ProbeDisabled()
|
|
{
|
|
return ERR_TelemetryProbe.Check(!Enabled() && m_State.pending.IsEmpty() && m_Players.IsEmpty() && !FileIO.FileExists(STATE + ".bak"), "admin disable clears pending data and recovery file");
|
|
}
|
|
}
|
|
modded class ERR_GameMode
|
|
{
|
|
override protected void StartScenario()
|
|
{
|
|
string fixture;
|
|
if (!System.GetCLIParam("errSmokeOutcome", fixture) || fixture != "telemetry") { super.StartScenario(); return; }
|
|
if (!m_ERRTelemetry || !m_ERRTelemetry.ProbeStart()) return;
|
|
FailPreparation("Telemetry fixture: deliberate startup failure");
|
|
if (!m_ERRTelemetry.ProbeResult()) return;
|
|
GetGame().GetCallqueue().CallLater(ERR_TestTelemetryDelivered, 1000, true);
|
|
}
|
|
protected void ERR_TestTelemetryDelivered()
|
|
{
|
|
if (!m_ERRTelemetry || m_ERRTelemetry.ProbeDelivered() < 2) return;
|
|
GetGame().GetCallqueue().Remove(ERR_TestTelemetryDelivered);
|
|
if (!ERR_TelemetryProbe.Check(m_ERRTelemetry.ProbeDelivered() == 2, "HTTP retry acknowledged start and failure result")) return;
|
|
if (!m_ERRTelemetry.ProbeBoundedQueue()) return;
|
|
array<string> replies = {};
|
|
Admin().Execute(this, true, "mission telemetry set 0", replies);
|
|
if (!m_ERRTelemetry.ProbeDisabled()) return;
|
|
Print("ERR SMOKE COMPLETE: telemetry");
|
|
}
|
|
}
|