feat(core): TCP in the simulation core
engine.ts ports Swift's "Java-compatible TCP sockets" in one piece, since half a state machine could not be checked: server and client sockets (a free port from Java's random numbers on their own seed), the three-way handshake with its result (connected, invalid socket, unreachable, timed out), segments of 1460 bytes, messages up to the push, a timeout of 3 × 2.5 s with at most three attempts, closing through every Java state including TIME_WAIT (2.5 s), sequence numbers modulo 2^32. Three scenarios match the Swift engine trace for trace: a LAN with data over three segments, closing from both ends, a closed port and an unreachable host; two networks through a router with a firewall rule, data lost until the connection closes, and an accepted socket that does not hold the port of its closed listener; CLOSING, reached by a lost FIN. The engine delivers a FIN within the same close, so both ends close at once only with packet loss; an empty message does not arrive in Swift (it does not advance the sequence number), nor here. Swift's four TCP engine tests are ported, with tests for stopping, a foreign SYN+ACK at a listener and the flag names. 17 mutation probes, 16 caught; the other (delivered, not waited, not connected gives unreachable) cannot be reached through Swift's engine, which never sends a reset and always acknowledges correctly. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -84,30 +84,39 @@
|
||||
"localIp" : null,
|
||||
"localPort" : 51180,
|
||||
"node" : "00000000-0000-0000-0000-000000000102",
|
||||
"parent" : null,
|
||||
"protocol" : "udp",
|
||||
"queued" : 0,
|
||||
"remoteIp" : "192.168.0.10",
|
||||
"remotePort" : 5000
|
||||
"remotePort" : 5000,
|
||||
"session" : null,
|
||||
"tcpState" : null
|
||||
},
|
||||
{
|
||||
"id" : "00000000-0000-0000-0000-000000000003",
|
||||
"localIp" : "192.168.0.30",
|
||||
"localPort" : 7000,
|
||||
"node" : "00000000-0000-0000-0000-000000000103",
|
||||
"parent" : null,
|
||||
"protocol" : "udp",
|
||||
"queued" : 0,
|
||||
"remoteIp" : null,
|
||||
"remotePort" : null
|
||||
"remotePort" : null,
|
||||
"session" : null,
|
||||
"tcpState" : null
|
||||
},
|
||||
{
|
||||
"id" : "00000000-0000-0000-0000-000000000004",
|
||||
"localIp" : null,
|
||||
"localPort" : 5000,
|
||||
"node" : "00000000-0000-0000-0000-000000000101",
|
||||
"parent" : null,
|
||||
"protocol" : "udp",
|
||||
"queued" : 0,
|
||||
"remoteIp" : null,
|
||||
"remotePort" : null
|
||||
"remotePort" : null,
|
||||
"session" : null,
|
||||
"tcpState" : null
|
||||
}
|
||||
],
|
||||
"switchTables" : {
|
||||
|
||||
Reference in New Issue
Block a user