#!/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