feat(e2e): add debug/tcplogger E2E scenario kinds using debugclient

Adds a trimmed debug_e2e.cfg (DebugService on 8080/8081, TcpLogger on
9090) and two new scenarios (s55_debug_force_trace_break, kind=debug;
s56_tcplogger_delivery, kind=tcplogger) reusing it, with matching
run_e2e.sh scenario-list/dispatch wiring and debugclient build steps.

Also fixes a real bug found while wiring s56: debugclient's tcplogger
check was tautological (it matched MarteController's own local
"CMD"-level echo of the outgoing command, which contains the same text
as the triggered event, instead of a line actually delivered over the
real TCPLogger TCP socket) and its trigger command (an invalid FORCE)
never reaches DebugServiceBase's REPORT_ERROR at all. Switched the
trigger to a MSG-to-missing-destination command (which does call
REPORT_ERROR) and the match to require the real log text
("not found in ORD"), recorded only after a connect-settle baseline —
verified with a positive run (real Warning-level TCPLogger line
received) and a negative control (LogPort=0 disables TcpLogger and the
scenario correctly FAILs).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Martino Ferrari
2026-07-01 19:36:47 +02:00
parent efb4ea48fb
commit 83d0a060fe
5 changed files with 216 additions and 18 deletions
+9
View File
@@ -76,6 +76,15 @@ class TestScenarios(unittest.TestCase):
for s in S.SCENARIOS:
S.validate_scenario(s) # must not raise
def test_debug_and_tcplogger_scenarios_present(self):
kinds = {s["kind"] for s in S.SCENARIOS}
self.assertIn("debug", kinds)
self.assertIn("tcplogger", kinds)
debug_ids = {s["id"] for s in S.SCENARIOS if s["kind"] == "debug"}
self.assertEqual(debug_ids, {"s55_debug_force_trace_break"})
tcplogger_ids = {s["id"] for s in S.SCENARIOS if s["kind"] == "tcplogger"}
self.assertEqual(tcplogger_ids, {"s56_tcplogger_delivery"})
class TestGenData(unittest.TestCase):
def test_ground_truth_shapes(self):