Files
2026-10-28 14:43:43 +01:00

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");
}
}