Every packet that comes in goes through its node's IP thread (UDP, TCP) or ICMP thread (ICMP), as Java's IPThread and ICMPThread: deliver, answer an echo request or forward, one after the other; while one waits for ARP, the next wait behind it. A packet a node sends to itself is delivered at once, as Java's IP.senden does. The transport send threads and these are one mechanism now (handToProtocolThread). ArpRun has three stories through the router (routedUdpBehind, routedPingBesideUdp, routedPingBehindPing); the oracle writes ICMP frames with type, code, addresses and sequence number. All seven ArpRun stories match Java FILIUS. Measured and not taken: Java's ARP wakes one waiter with notify, not the one whose answer came; the core wakes all that wait for the address. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
154 lines
8.2 KiB
Bash
Executable File
154 lines
8.2 KiB
Bash
Executable File
#!/bin/sh
|
|
# Reads every .fls under corpus/ with Java FILIUS itself and writes
|
|
# corpus/corpus.java.json. Java is the arbiter for the file format (plan §13, M2).
|
|
# Needs a JDK (17+), Maven and xvfb-run: FILIUS opens its main window while
|
|
# loading (Information.reset → JMainFrame), so it needs a display, not headless.
|
|
set -eu
|
|
here="$(cd "$(dirname "$0")" && pwd)"
|
|
root="$(cd "$here/../.." && pwd)"
|
|
commit=6640354
|
|
upstream="$here/.upstream"
|
|
if [ ! -d "$upstream/.git" ]; then
|
|
git clone -q https://gitlab.com/filius1/filius.git "$upstream"
|
|
fi
|
|
if [ "$(git -C "$upstream" rev-parse --short=7 HEAD)" != "$commit" ]; then
|
|
git -C "$upstream" fetch -q origin
|
|
git -C "$upstream" checkout -q "$commit"
|
|
rm -rf "$upstream/target"
|
|
fi
|
|
if [ ! -f "$upstream/target/filius.jar" ]; then
|
|
(cd "$upstream" && mvn -q -DskipTests package dependency:copy-dependencies -DoutputDirectory=target/lib)
|
|
fi
|
|
classpath="$upstream/target/filius.jar:$upstream/target/lib/*"
|
|
mkdir -p "$here/.build"
|
|
javac -encoding UTF-8 -d "$here/.build" -cp "$classpath" "$here/src/FlsOracle.java" "$here/src/GetterDefaults.java" "$here/src/IpCheckCases.java" "$here/src/DnsHostsCases.java" "$here/src/EmailFileCases.java" "$here/src/BeansDump.java" "$here/src/Base64Cases.java" "$here/src/ScenarioNetwork.java" "$here/src/DhcpRun.java" "$here/src/TcpRun.java" "$here/src/DnsRun.java" "$here/src/ArpRun.java"
|
|
# FILIUS writes its settings below $HOME; keep them out of the real one.
|
|
mkdir -p "$here/.build/home"
|
|
# Removed first: a crashed run must not leave the previous result standing.
|
|
rm -f "$root/corpus/corpus.java.json"
|
|
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" FlsOracle \
|
|
"$root/corpus" "$root/corpus/corpus.java.json" 2>&1 | grep -v 'logback\|^$' || true
|
|
test -s "$root/corpus/corpus.java.json"
|
|
|
|
# Getter defaults and static constants for the XMLEncoder references (packages/fls/src/javaDefaults.json).
|
|
defaults="$root/packages/fls/src/javaDefaults.json"
|
|
rm -f "$defaults"
|
|
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" GetterDefaults "$defaults" \
|
|
filius.gui.netzwerksicht.JSidebarButton#iconTextGap \
|
|
filius.gui.netzwerksicht.JSidebarButton#verticalTextPosition \
|
|
filius.gui.netzwerksicht.JSidebarButton#displayedMnemonicIndex \
|
|
filius.gui.netzwerksicht.JSidebarButton#debugGraphicsOptions \
|
|
filius.gui.netzwerksicht.JSidebarButton#enabled \
|
|
java.lang.ThreadGroup#maxPriority \
|
|
filius.hardware.knoten.Rechner#maxLayerOfOperation \
|
|
filius.hardware.knoten.Notebook#maxLayerOfOperation \
|
|
filius.hardware.knoten.Vermittlungsrechner#maxLayerOfOperation \
|
|
filius.hardware.knoten.Gateway#maxLayerOfOperation \
|
|
filius.software.clientserver.ServerBaustein#port \
|
|
filius.software.dhcp.DHCPServer#port \
|
|
filius.software.dns.DNSServer#port \
|
|
filius.software.rip.RIPServer#port \
|
|
filius.software.www.WebServer#port \
|
|
javax.swing.SwingConstants::CENTER \
|
|
filius.software.clientserver.ServerBaustein#aktiv \
|
|
filius.software.clientserver.ClientBaustein#zielPort \
|
|
filius.software.clientserver.ClientBaustein#zielIPAdresse \
|
|
filius.software.dns.DNSServer#aktiv \
|
|
filius.software.www.WebServer#aktiv \
|
|
filius.software.www.WebServer#useVHost \
|
|
filius.software.dateiaustausch.PeerToPeerAnwendung#maxTeilnehmerZahl \
|
|
2>&1 | grep -v 'logback\|^$' || true
|
|
test -s "$defaults"
|
|
|
|
# IP.ipCheck on hand-picked cases (packages/fls/src/javaIp.ts).
|
|
cases="$root/packages/fls/test/ip-check.cases.txt"
|
|
ipcheck="$root/packages/fls/test/ip-check.java.json"
|
|
rm -f "$ipcheck"
|
|
HOME="$here/.build/home" java -cp "$classpath:$here/.build" IpCheckCases "$cases" "$ipcheck" 2>&1 | grep -v 'logback\|^$' || true
|
|
test -s "$ipcheck"
|
|
|
|
# Base64.encodeBytes around its line length (packages/fls/src/exportProject.ts, javaBase64).
|
|
base64="$root/packages/fls/test/base64.java.json"
|
|
rm -f "$base64"
|
|
HOME="$here/.build/home" java -cp "$classpath:$here/.build" Base64Cases "$base64" 0 1 2 3 55 56 57 58 59 113 114 115 116 171 172 2000 2001 2002 2052 2>&1 | grep -v 'logback\|^$' || true
|
|
test -s "$base64"
|
|
|
|
# DNSServer's own reading of /dns/hosts on hand-picked files (packages/fls/src/dnsHosts.ts).
|
|
cases="$root/packages/fls/test/dns-hosts.cases.txt"
|
|
dnshosts="$root/packages/fls/test/dns-hosts.java.json"
|
|
rm -f "$dnshosts"
|
|
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" DnsHostsCases "$cases" "$dnshosts" 2>&1 | grep -v 'logback\|^$' || true
|
|
test -s "$dnshosts"
|
|
|
|
# EmailServer.kontenLaden and EmailAnwendung.laden on hand-picked account files (packages/fls/src/javaEmail.ts).
|
|
for kind in server client; do
|
|
cases="$root/packages/fls/test/email-$kind.cases.txt"
|
|
output="$root/packages/fls/test/email-$kind.java.json"
|
|
rm -f "$output"
|
|
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" EmailFileCases "$kind" "$cases" "$output" 2>&1 | grep -v 'logback\|^$' || true
|
|
test -s "$output"
|
|
done
|
|
|
|
# What XMLDecoder makes of the files packages/fls/src/javaBeansWriter.ts writes.
|
|
beans="$root/packages/fls/test/beans"
|
|
rm -f "$beans/beans.java.json"
|
|
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" BeansDump "$beans" "$beans/beans.java.json" 2>&1 | grep -v 'logback\|^$' || true
|
|
test -s "$beans/beans.java.json"
|
|
|
|
# What Java loads from the files packages/fls writes: Java's view written
|
|
# again (topologyWriter.test.ts, UPDATE_WRITTEN=1) and the editor model
|
|
# exported (exportProject.test.ts, UPDATE_EXPORTED=1). The files are not
|
|
# checked in, their SHA-256 is.
|
|
for written in "$root/packages/fls/test/written" "$root/packages/fls/test/exported"; do
|
|
if [ -d "$written" ]; then
|
|
rm -f "$written.java.json"
|
|
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" FlsOracle "$written" "$written.java.json" --sha256 2>&1 | grep -v 'logback\|^$' || true
|
|
test -s "$written.java.json"
|
|
fi
|
|
done
|
|
|
|
# DHCP as Java FILIUS runs it: a core scenario's network, started as the
|
|
# action mode starts it, for the given real-time milliseconds; every frame
|
|
# each card saw and the addresses at the end (packages/core/test/dhcpJava.test.ts).
|
|
# One run after another: a busy machine stretches the times.
|
|
for run in dhcp-lan:8000 dhcp-two-servers:8000 dhcp-conflict:25000 dhcp-no-server:25000; do
|
|
name="${run%%:*}"
|
|
output="$root/packages/core/test/scenarios/$name.java.json"
|
|
rm -f "$output"
|
|
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" DhcpRun \
|
|
"$root/packages/core/test/scenarios/$name.scenario.json" "${run##*:}" "$output" 2>&1 | grep -v 'logback\|^$' || true
|
|
test -s "$output"
|
|
done
|
|
|
|
# TCP as Java FILIUS runs it: stories of socket calls on tcp-lan's network
|
|
# (TcpRun); frames, calls and socket states, for the core's TCP comparison.
|
|
for run in exchange:30000 closedPort:30000 lostData:45000 lostSynAck:70000 lostFin:60000 lostLastFin:60000; do
|
|
story="${run%%:*}"
|
|
output="$root/packages/core/test/scenarios/tcp-java-$story.java.json"
|
|
rm -f "$output"
|
|
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" TcpRun \
|
|
"$root/packages/core/test/scenarios/tcp-lan.scenario.json" "$story" "${run##*:}" "$output" 2>&1 | grep -v 'logback\|^$' || true
|
|
test -s "$output"
|
|
done
|
|
|
|
# DNS as Java FILIUS runs it: a resolver's lookup on dns-lan's network
|
|
# (DnsRun); frames and the call's result, for the core's DNS comparison.
|
|
for run in address:5000 mail:5000 referral:5000 unknown:5000 noServer:22000; do
|
|
story="${run%%:*}"
|
|
output="$root/packages/core/test/scenarios/dns-java-$story.java.json"
|
|
rm -f "$output"
|
|
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" DnsRun \
|
|
"$root/packages/core/test/scenarios/dns-lan.scenario.json" "$story" "${run##*:}" "$output" 2>&1 | grep -v 'logback\|^$' || true
|
|
test -s "$output"
|
|
done
|
|
|
|
# ARP as Java FILIUS runs it: sends to addresses no card has on arp-routed's
|
|
# network (ArpRun); frames and the calls, for the core's ARP comparison.
|
|
for story in pingLan pingRouted udpTwice udpBehind routedUdpBehind routedPingBesideUdp routedPingBehindPing; do
|
|
output="$root/packages/core/test/scenarios/arp-java-$story.java.json"
|
|
rm -f "$output"
|
|
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" ArpRun \
|
|
"$root/packages/core/test/scenarios/arp-routed.scenario.json" "$story" 16000 "$output" 2>&1 | grep -v 'logback\|^$' || true
|
|
test -s "$output"
|
|
done
|