Files
mdg-filius/tools/swift-oracle/README.md
T
julian.kiedaischandClaude Opus 5.5 e80be3bbdf feat(core): UDP sockets in the simulation core
engine.ts ports the UDP part of Swift's "UDP sockets and Router RIP": a
socket bound to a given port or to a free one drawn from 49152–65534 with
Java's random numbers on Swift's seed; sending, also as a limited broadcast
on every interface (or the bound one) with TTL 1; delivery into the queue
of every socket on the destination port, which then answers to the last
sender; receiving, with a timeout that advances the virtual clock; closing.
Stopping forgets sockets and queues. RIP stays not ported; Swift's DHCP
handling of a datagram has nothing to do until DHCP is in the snapshot.

The oracle gets the steps bindUdp, sendUdp, receiveUdp and closeSocket on
both sides and reports the sockets. Two new scenarios — a LAN, and two
networks through a router with a UDP firewall rule and a broadcast that
does not cross it — match the Swift engine trace for trace, the random
ports included. Swift's four UDP engine tests are ported, with a test for
stopping. 11 mutation probes were all caught (one only after the stop test
was added).

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

76 lines
3.6 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`. Das Ergebnis enthält die Sockets mit der Länge ihrer
Warteschlange.
## 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.