A resolver's lookup on the new dns-lan network (A, MX, a referral by NS, an unknown name, a missing server): every frame and the call's result. ScenarioNetwork installs a scenario's DNS servers. The Swift comparison reads only scenarios with a Swift result. Measured: Java's text messages (ID=... QR=... header, question and record lines), no question in the answer, RCODE 0 always, a referral in the answer section, an iterative resolver waiting 5 RTT per query. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
87 lines
3.4 KiB
Java
87 lines
3.4 KiB
Java
// Runs a DNS lookup on dns-lan's network in Java FILIUS (ScenarioNetwork)
|
|
// and records what really happens: every frame each card saw, and when the
|
|
// resolver's call started and what it returned (or that it failed).
|
|
//
|
|
// DnsRun <scenario.json> <story> <milliseconds> <out.json>
|
|
//
|
|
// Server 192.168.0.10 knows web.filius.de, filius.de's mail exchange and
|
|
// refers schule.de to 192.168.0.11, which knows www.schule.de. The stories,
|
|
// each the resolver of a client (Resolver, as FILIUS' programs call it):
|
|
// address 192.168.0.20 asks for web.filius.de (A)
|
|
// mail 192.168.0.20 asks for filius.de's mail server (MX, then its A)
|
|
// referral 192.168.0.20 asks for www.schule.de (A), referred to .11
|
|
// unknown 192.168.0.20 asks for x.unbekannt.org, which no one knows
|
|
// noServer 192.168.0.21 asks its DNS server 192.168.0.99, which is not there
|
|
|
|
import filius.software.dns.Resolver;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
public class DnsRun {
|
|
static final String CLIENT = "00000000-0000-0000-0000-000000000101";
|
|
static final String LOST_CLIENT = "00000000-0000-0000-0000-000000000104";
|
|
|
|
static ScenarioNetwork network;
|
|
static final List<Object[]> events = new ArrayList<>();
|
|
|
|
interface Call {
|
|
String run() throws Exception;
|
|
}
|
|
|
|
static void event(String what) {
|
|
events.add(new Object[] { System.currentTimeMillis() - network.start, what });
|
|
}
|
|
|
|
static void call(String label, Call call) {
|
|
event(label + " called");
|
|
try {
|
|
event(label + " returned " + call.run());
|
|
} catch (Exception e) {
|
|
event(label + " failed " + e.getClass().getSimpleName());
|
|
}
|
|
}
|
|
|
|
public static void main(String[] args) throws Exception {
|
|
network = ScenarioNetwork.read(args[0]);
|
|
String story = args[1];
|
|
long end = Long.parseLong(args[2]);
|
|
network.start();
|
|
Thread.sleep(500);
|
|
Resolver client = network.system(CLIENT).holeDNSClient();
|
|
switch (story) {
|
|
case "address":
|
|
call("holeIPAdresse web.filius.de", () -> client.holeIPAdresse("web.filius.de"));
|
|
break;
|
|
case "mail":
|
|
call("holeIPAdresseMailServer filius.de", () -> client.holeIPAdresseMailServer("filius.de"));
|
|
break;
|
|
case "referral":
|
|
call("holeIPAdresse www.schule.de", () -> client.holeIPAdresse("www.schule.de"));
|
|
break;
|
|
case "unknown":
|
|
call("holeIPAdresse x.unbekannt.org", () -> client.holeIPAdresse("x.unbekannt.org"));
|
|
break;
|
|
case "noServer":
|
|
Resolver lost = network.system(LOST_CLIENT).holeDNSClient();
|
|
call("holeIPAdresse web.filius.de", () -> lost.holeIPAdresse("web.filius.de"));
|
|
break;
|
|
default:
|
|
throw new IllegalArgumentException("unknown story " + story);
|
|
}
|
|
long rest = network.start + end - System.currentTimeMillis();
|
|
if (rest > 0) Thread.sleep(rest);
|
|
|
|
ScenarioNetwork.Json out = new ScenarioNetwork.Json();
|
|
out.open('{');
|
|
network.writeFrames(out);
|
|
out.key("events").open('[');
|
|
for (Object[] each : events) out.open('[').number((Long) each[0]).string((String) each[1]).close(']');
|
|
out.close(']');
|
|
out.close('}');
|
|
network.stop();
|
|
ScenarioNetwork.write(args[3], out);
|
|
System.exit(0);
|
|
}
|
|
}
|