The e-mail client and server of every host come into the model (core: EmailClientConfiguration, EmailServerConfiguration, EmailMessage), from Java's view: - the server's accounts are those of /mailserver/konten.txt, as Java reads them at every simulation start; without the file those of the bean list, which Java would drop; - the client's account is that of /konten.txt; without it the first of an older file's kontoListe, which FILIUS 2.14 no longer reads; - messages are numbered per program in folder order, as Swift does; the sent folder's are sent; a date is taken only when the file gives one. Departures from Swift: accounts and messages stay where Swift drops what fails its checks; first and last name stay apart; a port that is no number is the default, with a warning. On the corpus the model matches Swift's on all 13 files; the one Swift error is named (it numbers a mailbox's messages as their received time and writes that into the konten.txt it rewrites). The Swift dump now carries the e-mail state, and the file system comparison leaves out only Swift's hidden state files (and the directories it makes for them) instead of all of /mail, /mailserver and /peer2peer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
66 lines
3.1 KiB
Markdown
66 lines
3.1 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.
|
|
|
|
## 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.
|
|
|
|
`--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.
|