Files
mdg-filius/tools/java-oracle/run.sh
T
julian.kiedaischandClaude Opus 5.5 b8b999fd66 feat: F4.8d the documentation mode's report as a PDF, as Java's
ReportRun reads Java's report back with iText: every piece of text with its
place, font, size and colour. The editor lays the report out by iText's
rules (A4, leading 1.5, loose chunks in the current line, tables 80 % wide
with padding 2, fixed traffic columns, page breaks) and draws it with
pdf-lib in the PDF's own Helvetica, widths without kerning as iText measures.
All device pages of Internet_Komplett, the first page and the data exchange
of einfaches_rechnernetz_komplett match Java piece by piece; Java's iText
reads our PDF with the same text in the same places. The sidebar gains
Java's "Report"; the frames come from the room by a short subscription.
Not adopted: true/false for DHCP (Java's own Ja/Nein), hash table orders,
an image running off the page, the report writing back into the model.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-04 12:35:35 +00:00

545 lines
32 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" "$here/src/RipRun.java" "$here/src/NatRun.java" "$here/src/WlanRun.java" "$here/src/ExampleRun.java" "$here/src/EchoRun.java" "$here/src/WebRun.java" "$here/src/RouterWebRun.java" "$here/src/KonfigCases.java" "$here/src/EmailRun.java" "$here/src/MailCases.java" "$here/src/EmailClientRun.java" "$here/src/TerminalCases.java" "$here/src/TerminalRun.java" "$here/src/FileCases.java" "$here/src/GnutellaRun.java" "$here/src/NewDeviceRun.java" "$here/src/SheetRun.java" "$here/src/TerminalWindowRun.java" "$here/src/InstallRun.java" "$here/src/BrowserWindowRun.java" "$here/src/MailWindowRun.java" "$here/src/SaveAfterRunRun.java" "$here/src/TextEditorWindowRun.java" "$here/src/FileExplorerWindowRun.java" "$here/src/EchoWindowRun.java" "$here/src/DnsWindowRun.java" "$here/src/FirewallWindowRun.java" "$here/src/GnutellaWindowRun.java" "$here/src/ViewersRun.java" "$here/src/ExchangeWindowRun.java" "$here/src/DocuRun.java" "$here/src/ExportRun.java" "$here/src/ReportRun.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 \
filius.software.dhcp.DHCPServer#priority \
filius.software.rip.RIPServer#priority \
filius.software.lokal.Terminal#priority \
filius.software.lokal.ImageViewer#priority \
filius.software.lokal.FileExplorer#priority \
filius.software.dns.DNSServer#priority \
filius.software.email.EmailAnwendung#priority \
filius.software.email.EmailServer#priority \
filius.software.clientserver.ServerBaustein#priority \
filius.software.clientserver.ClientBaustein#priority \
filius.software.firewall.Firewall#priority \
filius.software.dateiaustausch.PeerToPeerAnwendung#priority \
filius.software.lokal.TextEditor#priority \
filius.software.www.WebServer#priority \
filius.software.www.WebBrowser#priority \
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
# The same with a recursive server (dns-recursive). unknownInOwnZone asks
# itself without end: a short run, and a bounded heap.
for run in address:5000 referral:5000 unknown:5000 unknownInZone:5000 unknownInOwnZone:15500; do
story="${run%%:*}"
output="$root/packages/core/test/scenarios/dns-recursive-java-$story.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Xmx1g -cp "$classpath:$here/.build" DnsRun \
"$root/packages/core/test/scenarios/dns-recursive.scenario.json" "$story" "${run##*:}" "$output" 2>&1 | grep -v 'logback\|^$' || true
test -s "$output"
done
# NAT as Java FILIUS runs it: nat-home's home router between a LAN PC and two
# WAN hosts (NatRun); frames, calls and the router's NAT table at the end.
for run in pingOut:10000 udpOut:10000 udpTwoRemotes:25000 tcpOut:20000 forward:20000 pingWan:15000 ttlOut:10000; do
story="${run%%:*}"
output="$root/packages/core/test/scenarios/nat-java-$story.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" NatRun \
"$root/packages/core/test/scenarios/nat-home.scenario.json" "$story" "${run##*:}" "$output" 2>&1 | grep -v 'logback\|^$' || true
test -s "$output"
done
# RIP as Java FILIUS runs it: rip-chain's routers, each with the core's seed
# for its pauses (RipRun); frames, table changes and the ping. Real time.
for run in converge:60000 expire:135000; do
story="${run%%:*}"
output="$root/packages/core/test/scenarios/rip-java-$story.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" RipRun \
"$root/packages/core/test/scenarios/rip-chain.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
# WLAN as Java FILIUS runs it: pings over wireless cables, a plain cable and
# to a host on the switch's SSID without a cable (WlanRun); frames and calls.
for story in pingWired pingWireless pingWithoutCable pingFromWithoutCable; do
output="$root/packages/core/test/scenarios/wlan-java-$story.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" WlanRun \
"$root/packages/core/test/scenarios/wlan-lan.scenario.json" "$story" 12000 "$output" 2>&1 | grep -v 'logback\|^$' || true
test -s "$output"
done
# The echo server and the generic client as Java FILIUS runs them, on
# tcp-lan's network (EchoRun); frames and each program's window lines.
for run in exchange:12000 closedPort:20000 noRoute:8000 notConnected:3000 serverOff:14000 reconnect:12000 \
twoClients:11000 otherPort:22000; do
story="${run%%:*}"
output="$root/packages/core/test/scenarios/echo-java-$story.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" EchoRun \
"$root/packages/core/test/scenarios/tcp-lan.scenario.json" "$story" "${run##*:}" "$output" 2>&1 | grep -v 'logback\|^$' || true
test -s "$output"
done
# The web server and the web browser as Java FILIUS runs them, on web-lan's
# network (WebRun); frames, the server's window lines, the browser's pages and
# images, and the server's files.
for run in page:8000 byName:12000 notFound:6000 vhost:14000 noServer:14000 unresolved:6000 post:8000 \
encoded:10000 traversal:6000 caseInsensitive:8000 raw:14000; do
story="${run%%:*}"
output="$root/packages/core/test/scenarios/web-java-$story.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" WebRun \
"$root/packages/core/test/scenarios/web-lan.scenario.json" "$story" "${run##*:}" "$output" 2>&1 | grep -v 'logback\|^$' || true
test -s "$output"
done
# The pages of routers and home routers as Java FILIUS serves them
# (RouterWebRun): router-web, nat-home and rip-chain. Java's router server
# sometimes never listens (a race in setAktiv): a run without a page is
# repeated.
for run in router-web:routerIndex:6000 router-web:routerRoutes:6000 router-web:routerLog:12000 router-web:routerKonfig:6000 \
router-web:konfigIcmp:12000 router-web:konfigBlock:30000 \
nat-home:gatewayIndex:9000 nat-home:gatewayFromWan:15000 rip-chain:ripRoutes:46000; do
network="${run%%:*}"; rest="${run#*:}"; story="${rest%%:*}"
output="$root/packages/core/test/scenarios/routerweb-java-$story.java.json"
for attempt in 1 2 3; do
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" RouterWebRun \
"$root/packages/core/test/scenarios/$network.scenario.json" "$story" "${rest##*:}" "$output" 2>&1 | grep -v 'logback\|^$' || true
grep -q '"page 200' "$output" && break
done
test -s "$output"
done
# The firewall settings page (konfig) fed with what a browser posts, in both
# languages (KonfigCases; packages/core/test/firewallSettings.test.ts).
for language in de en; do
output="$root/packages/core/test/firewall-settings.$language.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" KonfigCases "$language" \
"$root/packages/core/test/firewall-settings.cases.txt" "$output" 2>&1 | grep -v 'logback\|^$' || true
test -s "$output"
done
# The e-mail server as Java FILIUS runs it (EmailRun on mail-lan), and its
# SMTP and POP3 workers fed without a network, in both languages (MailCases);
# the e-mail program with two servers (EmailClientRun). The JVM runs in the
# language's locale: a server's notice carries DateFormat's date in it.
german="-Duser.language=de -Duser.country=DE"
for run in smtp:16000 smtpErrors:25000 pop3:36000 pop3Errors:20000; do
story="${run%%:*}"
output="$root/packages/core/test/scenarios/email-java-$story.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java $german -cp "$classpath:$here/.build" EmailRun \
"$root/packages/core/test/scenarios/mail-lan.scenario.json" "$story" "${run##*:}" "$output" 2>&1 | grep -v 'logback\|^$' || true
test -s "$output"
done
for language in de:DE en:GB; do
output="$root/packages/core/test/email-server.${language%%:*}.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language="${language%%:*}" -Duser.country="${language##*:}" -cp "$classpath:$here/.build" \
MailCases "${language%%:*}" "$root/packages/core/test/email-server.cases.txt" "$output" 2>&1 | grep -v 'logback\|^$' || true
test -s "$output"
done
for run in send:15000 fetch:10000 byName:35000 wrongPass:8000 noServer:15000 unknownHost:15000; do
story="${run%%:*}"
output="$root/packages/core/test/scenarios/email-client-java-$story.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java $german -cp "$classpath:$here/.build" EmailClientRun \
"$root/packages/core/test/scenarios/mail-lan.scenario.json" "$story" "${run##*:}" "$output" 2>&1 | grep -v 'logback\|^$\|^\s*at ' || true
test -s "$output"
done
# The command line fed with lines as typed, without a running network, in
# both languages (TerminalCases; packages/core/test/terminal.test.ts).
for language in de en; do
output="$root/packages/core/test/terminal.$language.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" TerminalCases "$language" \
"$root/packages/core/test/scenarios/router-web.scenario.json" "$root/packages/core/test/terminal.cases.txt" "$output" 2>&1 | grep -v 'logback\|^$' || true
test -s "$output"
done
# The Gnutella program joining peers, searching and downloading on terminal-net (GnutellaRun;
# packages/core/test/gnutellaJava.test.ts).
for run in pair:6000 chain:9000 twoPaths:15000 full:11000 reset:7000 errors:40000 search:29000 searchBoth:13000; do
story="${run%%:*}"
output="$root/packages/core/test/scenarios/gnutella-java-$story.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java $german -cp "$classpath:$here/.build" GnutellaRun \
"$root/packages/core/test/scenarios/terminal-net.scenario.json" "$story" "${run##*:}" "$output" 2>&1 | grep -v 'logback\|^$\|^\s*at \|scrollpane' || true
test -s "$output"
done
# What the file explorer and the text editor do to a host's files, without a
# running network, in both languages (FileCases; packages/core/test/filePrograms.test.ts).
for language in de en; do
output="$root/packages/core/test/file-programs.$language.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" FileCases "$language" \
"$root/packages/core/test/scenarios/router-web.scenario.json" "$root/packages/core/test/file-programs.cases.txt" "$output" 2>&1 | grep -v 'logback\|^$' || true
test -s "$output"
done
# The command line's network commands on terminal-net, typed at set times
# (TerminalRun; packages/core/test/terminalJava.test.ts), in the German locale.
for run in pingLan:8000 pingRouted:13000 pingNobody:49000 pingUnreachable:45000 pingBroadcast:27000 pingSelf:17000 \
pingErrors:14000 interrupt:16000 dns:15000 dnsTimeout:80000 arp:11000 netstat:10000 traceLan:4000 \
traceRouted:6000 traceUnreachable:35000 traceNoRoute:4000 traceNobody:12000 traceSelf:3500 traceErrors:20000 \
traceInterrupt:12000 tcpdump:10000; do
story="${run%%:*}"
output="$root/packages/core/test/scenarios/terminal-java-$story.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java $german -cp "$classpath:$here/.build" TerminalRun \
"$root/packages/core/test/scenarios/terminal-net.scenario.json" "$story" "${run##*:}" "$output" 2>&1 | grep -v 'logback\|^$\|^\s*at ' || true
test -s "$output"
done
# Every kind of device as FILIUS' palette makes it, saved as FILIUS saves
# (NewDeviceRun): what the editor's new devices must be (packages/doc/test/devices.test.ts).
output="$root/packages/doc/test/fixtures/new-devices.fls"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" NewDeviceRun "$output" 2>&1 | grep -v 'logback\|^$' || true
test -s "$output"
# FILIUS' programs as its software installation installs and removes them
# (InstallRun), saved as Java saves a project: the editor's installation
# (packages/doc/test/install.test.ts).
output="$root/packages/doc/test/fixtures/installed-programs.fls"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language=de -Duser.country=DE -cp "$classpath:$here/.build" InstallRun "$output" 2>&1 | grep -v 'logback\|^$\|INFO' || true
test -s "$output"
# Text typed into FILIUS' settings panels of a host, a switch and a modem and
# taken as they take it (SheetRun): what the editor's device sheet marks and
# keeps (packages/doc/test/sheet.test.ts).
output="$root/packages/doc/test/sheet.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" SheetRun \
"$root/packages/doc/test/sheet.cases.txt" "$output" 2>&1 | grep -v 'logback\|^$' || true
test -s "$output"
# FILIUS' command line window as it shows what is typed into it, key by key,
# over a stop and a start (TerminalWindowRun): the room's window
# (packages/sim/test/terminalWindow.test.ts).
output="$root/packages/sim/test/terminalWindow.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language=de -Duser.country=DE -cp "$classpath:$here/.build" TerminalWindowRun "$output" 2>&1 | grep -v 'logback\|^$' || true
test -s "$output"
# FILIUS' web browser and web server windows used as a person does — an
# address typed, a link clicked, a form's button pressed, the server's
# button, check box and table — on web-lan's network (BrowserWindowRun): the
# room's browser window and the server's (packages/sim/test/browserWindow.test.ts).
output="$root/packages/sim/test/browserWindow.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language=de -Duser.country=DE -cp "$classpath:$here/.build" BrowserWindowRun \
"$root/packages/core/test/scenarios/web-lan.scenario.json" "$output" 2>&1 | grep -v 'logback\|^$\|^\s*at \|AWT-EventQueue' || true
test -s "$output"
# FILIUS' e-mail server and e-mail program windows used as a person does —
# the server switched, its domain set, accounts made and removed; the
# program's account set, mails written, sent, fetched, answered and deleted,
# Java's dialogs answered — on mail-lan's network (MailWindowRun): the room's
# e-mail windows (packages/sim/test/mailWindow.test.ts).
output="$root/packages/sim/test/mailWindow.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language=de -Duser.country=DE -cp "$classpath:$here/.build" MailWindowRun \
"$root/packages/core/test/scenarios/mail-lan.scenario.json" "$output" 2>&1 | grep -v 'logback\|^$\|^\s*at \|AWT-EventQueue' || true
test -s "$output"
# What a run leaves in FILIUS' project: an example started, a story played,
# stopped as the design mode stops it and saved (SaveAfterRunRun): the room's
# write-back into the document (packages/sim/test/writeBack.test.ts; echo:
# packages/sim/test/echoWindow.test.ts).
for run in email:email_komplett dhcp:einfaches_rechnernetz_komplett echo:email_komplett; do
story="${run%%:*}"
output="$root/packages/sim/test/fixtures/after-run-$story.fls"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language=de -Duser.country=DE -cp "$classpath:$here/.build" SaveAfterRunRun \
"$root/corpus/java-examples/${run##*:}.fls" "$story" "$output" 2>&1 | grep -v 'logback\|^$\|^\s*at ' || true
test -s "$output"
done
# FILIUS' text editor window used as a person does — typing, „Neu“,
# „Öffnen“, „Speichern“, „Speichern unter“ over its file dialog, the command
# line changing the files beside it (TextEditorWindowRun): the editor's text
# editor (packages/editor/test/textEditor.test.ts).
output="$root/packages/sim/test/textEditorWindow.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language=de -Duser.country=DE -cp "$classpath:$here/.build" TextEditorWindowRun \
"$root/packages/core/test/scenarios/mail-lan.scenario.json" "$output" 2>&1 | grep -v 'logback\|^$\|^\s*at ' || true
test -s "$output"
# FILIUS' file explorer and image viewer windows used as a person does —
# the tree, the right-click menu, Java's questions answered, the import
# window, the viewer's "Öffnen" (FileExplorerWindowRun): the editor's
# explorer and viewer (packages/editor/test/fileExplorer.test.ts).
output="$root/packages/sim/test/fileExplorerWindow.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language=de -Duser.country=DE -cp "$classpath:$here/.build" FileExplorerWindowRun \
"$root/packages/core/test/scenarios/mail-lan.scenario.json" "$output" 2>&1 | grep -v 'logback\|^$\|^\s*at ' || true
test -s "$output"
# FILIUS' echo server and generic client windows used as a person does —
# the port typed (also one that is no number), "Verbinden", "Senden" (also
# nothing), the server stopped while connected, failures (EchoWindowRun): the
# room's echo windows (packages/sim/test/echoWindow.test.ts).
output="$root/packages/sim/test/echoWindow.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language=de -Duser.country=DE -cp "$classpath:$here/.build" EchoWindowRun \
"$root/packages/core/test/scenarios/mail-lan.scenario.json" "$output" 2>&1 | grep -v 'logback\|^$\|^\s*at ' || true
test -s "$output"
# FILIUS' DNS server window used as a person does — the button, the box,
# each tab's fields and buttons, a cell edited, a row removed, /dns/hosts
# changed beside it, the first computer's resolver asked (DnsWindowRun): the
# DNS server's window (packages/core/test/dnsWindow.test.ts).
output="$root/packages/core/test/dnsWindow.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language=de -Duser.country=DE -cp "$classpath:$here/.build" DnsWindowRun \
"$root/packages/core/test/scenarios/mail-lan.scenario.json" "$output" 2>&1 | grep -v 'logback\|^$\|^\s*at ' || true
test -s "$output"
# FILIUS' firewall window of a computer used as a person does — the three
# boxes, the port field with its lists and "Hinzufügen" (also what is no
# number or no port), "Löschen" — and after it a ping, a TCP connection and a
# DNS question from the server's network and from behind the router
# (FirewallWindowRun): the firewall's window (packages/core/test/firewallWindow.test.ts).
output="$root/packages/core/test/firewallWindow.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language=de -Duser.country=DE -cp "$classpath:$here/.build" FirewallWindowRun \
"$root/packages/core/test/scenarios/firewall-pc.scenario.json" "$output" 2>&1 | grep -v 'logback\|^$\|^\s*at ' || true
test -s "$output"
# FILIUS' Gnutella window used as a person does — joining (also with what is
# no address), searching, "Stopp!", downloading, emptying the list, the number
# of peers (also what is no number), leaving — beside the line of
# GnutellaRun's story "search" (GnutellaWindowRun): the Gnutella window
# (packages/core/test/gnutellaWindow.test.ts).
output="$root/packages/core/test/gnutellaWindow.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language=de -Duser.country=DE -cp "$classpath:$here/.build" GnutellaWindowRun \
"$root/packages/core/test/scenarios/terminal-net.scenario.json" "$output" 2>&1 | grep -v 'logback\|^$\|^\s*at \|scrollpane' || true
test -s "$output"
# What FILIUS' viewers of a running simulation show — a switch's table, a
# home router's NAT table, each after its reset — and the frames "Pakete
# verwerfen" drops while it is held (ViewersRun): the viewers
# (packages/core/test/viewers.test.ts).
for run in switch:switch-lan nat:nat-home; do
story="${run%%:*}"
output="$root/packages/core/test/viewers-$story.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language=de -Duser.country=DE -cp "$classpath:$here/.build" ViewersRun \
"$root/packages/core/test/scenarios/${run##*:}.scenario.json" "$story" "$output" 2>&1 | grep -v 'logback\|^$\|^\s*at ' || true
test -s "$output"
done
# FILIUS' data exchange window used as a person does — a card opened, a page
# fetched by name, each row chosen and its details read, the table exported,
# a second card beside it, "Tabellen löschen", the simulation started again
# without one computer (ExchangeWindowRun): the capture window
# (packages/core/test/exchangeWindow.test.ts).
output="$root/packages/core/test/exchangeWindow.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language=de -Duser.country=DE -cp "$classpath:$here/.build" ExchangeWindowRun \
"$root/packages/core/test/scenarios/web-lan.scenario.json" "$output" 2>&1 | grep -v 'logback\|^$\|^\s*at ' || true
test -s "$output"
# FILIUS' documentation mode on its own elements — a new text and rectangle,
# their menus and colour lists, font and colour chosen, the smallest sizes a
# drag leaves, how they are painted, how they stack, a project saved with
# them and loaded again (DocuRun): the documentation items
# (packages/doc/test/documentation.test.ts, its fixture saved by Java).
output="$root/packages/doc/test/documentation.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language=de -Duser.country=DE -cp "$classpath:$here/.build" DocuRun \
"$output" "$root/packages/doc/test/fixtures/documentation.fls" 2>&1 | grep -v 'logback\|^$\|^\s*at ' || true
test -s "$output"
# FILIUS' „Exportieren“ (ExportRun): the print panel and the image Java makes
# of four projects and an empty one — the part cut out, the footer, the
# colours (packages/editor/test/networkImage.test.ts). Java's images go to
# .build/export, to look at.
output="$root/packages/editor/test/networkImage.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language=de -Duser.country=DE -cp "$classpath:$here/.build" ExportRun \
"$output" "$here/.build/export" "$upstream/beispiele/nat_with_mapped_port.fls" "$upstream/beispiele/zwei_rechnernetze_komplett.fls" \
"$root/packages/doc/test/fixtures/documentation.fls" "$upstream/beispiele/modem_beispiel.fls" 2>&1 | grep -v 'logback\|^$\|^\s*at ' || true
test -s "$output"
# FILIUS' „Report“ (ReportRun): the PDF Java writes of three projects (one run
# for 3 s, its packet log in it) and an empty one, read back with iText —
# every piece of text with its place, font, size and colour
# (packages/editor/test/report.test.ts). Then the editor's own report, which
# that test writes with UPDATE_REPORT=1, read back the same way, with its SHA-256.
output="$root/packages/editor/test/report.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -Duser.language=de -Duser.country=DE -cp "$classpath:$here/.build" ReportRun \
"$output" "$here/.build/report" "$upstream/beispiele/einfaches_rechnernetz_komplett.fls:3000" \
"$upstream/beispiele/Internet_Komplett_mit_eMail_Webserver_Intranet_Portforwarding_Firewall_DHCP_DE.fls" \
"$root/packages/doc/test/fixtures/documentation.fls" 2>&1 | grep -v 'logback\|^$\|^\s*at \|^TCP ' || true
test -s "$output"
(cd "$root" && UPDATE_REPORT=1 npx vitest run packages/editor/test/report.test.ts >/dev/null 2>&1 || true)
output="$root/packages/editor/test/report.ours.java.json"
rm -f "$output"
HOME="$here/.build/home" java -cp "$classpath:$here/.build" ReportRun --read "$output" "$here/.build/report-ours.pdf" 2>&1 | grep -v 'logback\|^$' || true
test -s "$output"
# FILIUS' own examples as Java FILIUS runs them, opened and started as FILIUS
# does (ExampleRun): the acceptance of F2 (packages/fls/test/examplesJava.test.ts)
# and the classics of F3 (web, email, gnutella; packages/fls/test/classicsJava.test.ts).
for run in internetwork_komplett:routing:12000 einfaches_rechnernetz_komplett:dhcp:20000 dns_server:dns:12000 \
nat_with_mapped_port:nat:15000 Internet_Komplett_mit_eMail_Webserver_Intranet_Portforwarding_Firewall_DHCP_DE:firewall:16000 \
internetwork_komplett:web:12000 Internet_Komplett_mit_eMail_Webserver_Intranet_Portforwarding_Firewall_DHCP_DE:email:40000 \
zwei_rechnernetze_komplett:gnutella:26000; do
file="${run%%:*}"; rest="${run#*:}"; story="${rest%%:*}"
output="$root/packages/fls/test/examples/$story.java.json"
rm -f "$output"
HOME="$here/.build/home" xvfb-run -a java -cp "$classpath:$here/.build" ExampleRun \
"$root/corpus/java-examples/$file.fls" "$story" "${rest##*:}" "$output" 2>&1 | grep -v 'logback\|^$' || true
test -s "$output"
done