test: F2 acceptance — five of FILIUS' examples run as Java FILIUS runs them

ExampleRun opens an example as FILIUS opens it (SzenarioVerwaltung.laden
into the window's lists), starts it as the action mode does, plays a
story and writes every card's frames and tables, the calls, the
addresses and the RIP tables' changes. examplesJava.test.ts reads the
same file with this package's reader and runs it in the core
(projectSnapshot, new): routing (internetwork_komplett), DHCP
(einfaches_rechnernetz_komplett), DNS (dns_server), NAT
(nat_with_mapped_port) and firewall (Internet_Komplett_..._DE) match
card by card.

Found and fixed: a host's ipForwardingEnabled, which Java saves and
obeys, was unknown to the reader, the model, the core, the writer, the
export and FlsOracle; and Java's ARP learns only from a request for its
own address or a reply. Named Java bugs: a ping without a gateway throws
a NullPointerException; a home router drops the answer of a second
remote end. Open: Java picks between equally long RIP routes by thread
timing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-01 15:57:10 +00:00
co-authored by Claude Opus 5.5
parent 21a404693c
commit 0abce60aef
29 changed files with 64827 additions and 36 deletions
+40
View File
@@ -506,3 +506,43 @@ RIP: Der Anlauf entscheidet, wie viele Zufallspausen jeder Router zieht
(jede Nachricht zieht eine), und der hängt an Javas Startreihenfolge. Eine
Aufnahme, deren Anlauf von dem des Kerns (alle Router zugleich) abweicht,
liegt danach in allen Zeiten daneben; das Werkzeug wird dann wiederholt.
## Beispiele von Filius (Abnahme F2)
`ExampleRun` öffnet eine Beispieldatei aus `corpus/java-examples` so, wie
Filius eine Datei öffnet (`ScenarioNetwork.fromFile`:
`SzenarioVerwaltung.laden` in die Listen des Fensters), startet sie wie der
Aktionsmodus (jedes Gerät in der Reihenfolge der Datei), spielt einen Ablauf
und schreibt nach `packages/fls/test/examples/<ablauf>.java.json` die Frames
jeder Karte (unter ihrer MAC-Adresse), Javas Tabellen, die Zuordnung der
Karten (`cards`: MAC → `Gerät/Index`, ein wiederholter Name mit `#2`, `#3`, …),
die Aufrufe, die Adressen am Ende und jede Änderung der RIP-Tabellen. Abläufe:
`routing` (internetwork_komplett: Pings über drei Router, dann von einem
Notebook ohne Gateway), `dhcp` (einfaches_rechnernetz_komplett: vier
Clients), `dns` (dns_server: rekursiv über Wurzel, `de.`, `filius.de.`),
`nat` (nat_with_mapped_port: Pings durch zwei Heimrouter), `firewall`
(Internet_Komplett_…_DE: acht DHCP-Clients, dann Pings durch die Firewall).
Gemessen (01.10.2026):
* **`ipForwardingEnabled`** eines Rechners: Java speichert und beachtet den
Schalter (`meine-schule.de` leitet die Pakete der iPads weiter); Leser,
Modell, Kern und `FlsOracle` kannten ihn nicht. `FlsOracle` schreibt ihn
jetzt für jeden Knoten mit IP-Stapel; Korpus, Schreiber und Export neu
geprüft.
* **ARP-Lernregel** (`ARPThread`): Einen Eintrag lernt ein Gerät nur aus einer
Anfrage nach seiner eigenen Adresse oder aus einer Antwort, eine Antwort
gibt es nur auf eine Anfrage mit Ziel-MAC `ff:ff:ff:ff:ff:ff`, und ein
Paket von der Netzadresse wird verworfen. Der Kern lernte aus jedem Paket.
* Javas Firewall wendet ihre Regeln nur auf TCP und UDP an; ICMP lässt sie
durch, außer „ICMP verwerfen" ist an (`checkAcceptIcmp`). Der Kern ebenso.
* Ein Ping von einem Rechner ohne Gateway an ein fremdes Netz wirft in Java
eine `NullPointerException`; der Kern meldet „Netz nicht erreichbar".
* **Gleich lange RIP-Wege**: Hat ein Router zwei gleich lange Wege, nimmt
Java den, dessen Nachricht seine Threads zuerst verarbeiten; im
Firewall-Beispiel wechselte das zwischen Läufen (Router #3 zu 42.0.0.0
über Router `""` oder über #2). Der Ablauf meidet solche Ziele.
* Gleichzeitig startende DHCP-Clients bedient der Server in der Reihenfolge,
in der Javas Threads senden; mit acht Clients stauen sich die Broadcasts,
ein Frame erreicht die Karten bis zu rund 450 ms versetzt, und Javas
Mitschnitt verliert eigene Frames eines Clients.