Files
mdg-filius/tools/swift-oracle/README.md
T
julian.kiedaischandClaude Opus 5.5 396dbacfc5 feat(core): DHCP in the simulation core, as in Swift
engine.ts ports Swift's "DHCP server and automatic client": an active
server listens on port 67 from the start and offers a static assignment
before its range, round from the address after the last one offered;
offers last 10 s, dynamic leases a day, and a server whose offer another
server beat blacklists that address for a while. A client starts as an
event: DISCOVER, OFFER, a check by ARP, DECLINE, REQUEST, ACK or NAK,
2.5 s per wait, and after ten failures its old address back. The snapshot
carries the DHCP settings of clients and servers.

Four scenarios match the Swift engine. One Swift error is named in the
oracle test: a client run directly is advanced a second time, to FINISH,
by the server's answer within its own DISCOVER, and the outer run then
writes back its stale copy of the status (Swift's value types); the
address and every trace agree, only the reported status is wrong in
Swift. Swift's three DHCP engine tests are ported, with tests for
stopping and the message format. 15 mutation probes, 14 caught; the other
concerns the home router, which runs only once NAT is ported.

Two departures from Java remain, to be fixed next: from the event queue
the client's ARP check does not wait, so an address conflict is never
found, and each answer that wakes the client makes it send its state's
message again (a second DISCOVER and REQUEST, the second answered with
NAK). Java waits a round trip and sends once per attempt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-30 10:17:36 +00:00

84 lines
4.2 KiB
Markdown

# Swift-Orakel
Der Swift-Kern von `filius-ipad` (Laufzeit, Modell, `.fls`, Berichte — alles
ohne Oberfläche) lässt sich unter Linux bauen. Dieses Werkzeug nutzt das als
**Maßstab für die Übertragung**: Ein Szenario wird einmal als JSON
beschrieben, in Swift abgespielt, und die TypeScript-Übertragung muss
dieselbe Ausgabe liefern — jedes einzelne Spurereignis, jede Antwort, den
Endzustand.
```bash
npm run oracle # = tools/swift-oracle/run.sh (braucht Docker)
npm test # vergleicht mit den geschriebenen *.swift.json
```
* Szenarien: `packages/core/test/scenarios/<name>.scenario.json`
* Ergebnis aus Swift: `<name>.swift.json` daneben — **wird eingecheckt**, damit
die Tests ohne Docker und ohne Swift laufen.
* Vergleich: `packages/core/test/oracle.test.ts`. Er meldet das **erste**
abweichende Spurereignis mit Nummer.
* Schritte: `ping`, `traceroute`, `resolveMac`, `advance`, `packetLoss`,
`sat`, `speed`; UDP (seit F2): `bindUdp` (Knoten, optional Port, lokale
Adresse, Gegenstelle; Ergebnis die Socket-ID), `sendUdp` (Socket, Text,
optional Ziel und Port), `receiveUdp` (Socket, optional Wartezeit),
`closeSocket`; TCP: `openTcpServer`, `openTcpClient`, `connectTcp`
(Ergebnis `connected`, `invalidSocket`, `unreachable`, `timedOut`),
`sendTcp` (mit `repeatCount` für lange Nachrichten), `receiveTcp`,
`acceptedTcp`, `peerTcp`, `cleanTcp`; `closeSocket` schließt auch TCP;
DHCP: `runDhcp` (Ergebnis der Client-Status). Szenarien können
`dhcpServers` (Bereich, eigene Einstellungen, feste Zuordnungen) und
`dhcpClients` angeben; das Ergebnis enthält die Gerätekonfiguration und
den DHCP-Zustand (Clients, Leases, Angebote, Sperrliste, Server).
Das Ergebnis enthält die Sockets mit der Länge ihrer Warteschlange, dem
TCP-Zustand, dem annehmenden Socket und den Sitzungswerten.
## Korpus
`--corpus` importiert jede `.fls` unter `corpus/` und schreibt
`corpus/corpus.swift.json`: je Datei die Zählwerte und Warnungen des Imports
und unter `state` Swifts ganzes importiertes Modell ohne die zufälligen UUIDs
(Geräte, Ports und Kabel als Indizes, IP-Konfiguration, Doku-Elemente mit
ihren abgeleiteten IDs). Daran misst `packages/fls/test/importProject.test.ts`
den Umbau — auf den 13 Dateien, die Swift vollständig liest.
## Dateisystem und Strings
`--vfs` spielt die Fälle aus `packages/core/test/vfs.cases.json` im
virtuellen Dateisystem ab (jedes Ergebnis, jeder Fehler samt Werten, der
Endzustand mit SHA-256 der Binärdaten). `--strings` misst, was Swift aus
Strings macht, wo JavaScript abweicht: Trimmen, Kleinschreibung, Gleichheit,
Sortierung, Base64 — und die ganzen Mengen `whitespacesAndNewlines` und
`controlCharacters` über alle Unicode-Skalare. Grenze: Das ist Foundation
unter Linux; ihre Steuerzeichen-Tabelle hat in Ebene 14 einen Fehler, den
der Port nicht übernimmt.
`--email-files server|client` liest die Kontodateien
(`packages/fls/test/email-*.cases.txt`) mit Swifts
`TopologyRuntimeEmailStorage.decodeJavaServer`/`decodeJavaClient`.
`--dns-hosts` liest dieselben `/dns/hosts`-Fälle wie das Java-Orakel
(`packages/fls/test/dns-hosts.cases.txt`) mit Swifts
`TopologyDNSHostsFileCodec`; unter `state` stehen die DNS-Einträge jedes
Servers (`dnsServer.records`) und E-Mail-Client und -Server mit Konten und Nachrichten (`emailClient`, `emailServer`).
## Wie es gebaut wird
`fetch-upstream.sh` holt `filius-ipad` am festen Stand `3b5ded0` und kopiert
die oberflächenfreien Quellen nach `Sources/FiliusCore/` (nicht eingecheckt).
Apple-Module, die es unter Linux nicht gibt, sind auf das Nötige verkleinert:
| Modul | Ersatz |
| --- | --- |
| `CoreGraphics` | `Foundation` (hat `CGPoint`/`CGFloat` unter Linux) |
| `CryptoKit` | `swift-crypto` (gleiche Schnittstelle) |
| `Compression` | eine Funktion, `compression_decode_buffer` mit rohem DEFLATE über zlib |
| `Network` | entfällt: `TopologyRemoteLinkLANController.swift` wird nicht mitgebaut |
`patches/linux-type-checker.patch` teilt zwei lange Ausdrücke auf, an denen der
Linux-Compiler die Typprüfung abbricht. Das Verhalten ändert sich dadurch nicht.
## Neue Schrittarten
Eine Schrittart gibt es zweimal — in `Sources/Oracle/main.swift` und in
`packages/core/test/oracle.test.ts`. Beide müssen dasselbe JSON schreiben.