milestone 28: query provenance — every logged query is exactly explainable
Gates / frontend (push) Successful in 1m36s
Gates / test (push) Successful in 1m56s
Gates / test-aarch64 (push) Successful in 7m37s
Gates / package (push) Successful in 9m12s
Gates / container (push) Successful in 13s
CI / gates (push) Successful in 19m4s
Gates / frontend (push) Successful in 1m36s
Gates / test (push) Successful in 1m56s
Gates / test-aarch64 (push) Successful in 7m37s
Gates / package (push) Successful in 9m12s
Gates / container (push) Successful in 13s
CI / gates (push) Successful in 19m4s
query rows gain qclass, rcode, group, policy action and reason, the matched rule or list entry with its source, cname and safe-search targets, route kind, forward zone, and the resolver that actually answered — the pool and local markers die. servfails are logged and name the resolver that lost; post-parse protocol refusals become rows. a detail page at /queries/:id renders the ordered explanation, and coverage watermarks distinguish an empty history from a missing one. the schema fingerprint changes: existing query history is recreated with the old file kept aside and the reset filed as a resolved diagnostic. fixes an oversized udp reply being rebuilt as noerror, which handed clients a truncated nxdomain as success.
This commit is contained in:
@@ -0,0 +1,39 @@
|
||||
import {
|
||||
ENUM_VALUES,
|
||||
policyActionLabel,
|
||||
policyReasonLabel,
|
||||
qclassName,
|
||||
rcodeName,
|
||||
routeKindLabel,
|
||||
} from "./provenanceCopy";
|
||||
|
||||
/**
|
||||
* `tsc` proves the maps total over the union; this proves the union is the set
|
||||
* the server actually stores, and that no entry was left as its raw tag name.
|
||||
*/
|
||||
test("every stored enum value has a label of its own", () => {
|
||||
const labels = [
|
||||
...ENUM_VALUES.policyAction.map(policyActionLabel),
|
||||
...ENUM_VALUES.policyReason.map(policyReasonLabel),
|
||||
...ENUM_VALUES.routeKind.map(routeKindLabel),
|
||||
];
|
||||
for (const label of labels) {
|
||||
expect(label).not.toBe("");
|
||||
expect(label).not.toMatch(/_/);
|
||||
}
|
||||
expect(new Set(ENUM_VALUES.policyReason.map(policyReasonLabel)).size).toBe(ENUM_VALUES.policyReason.length);
|
||||
});
|
||||
|
||||
test("response codes read by name where one exists, by number where none does", () => {
|
||||
expect(rcodeName(0)).toBe("NOERROR (0)");
|
||||
expect(rcodeName(3)).toBe("NXDOMAIN (3)");
|
||||
expect(rcodeName(16)).toBe("BADVERS (16)");
|
||||
// The column holds the twelve-bit extended code, most of which is unassigned.
|
||||
expect(rcodeName(3841)).toBe("RCODE 3841");
|
||||
});
|
||||
|
||||
test("query classes read the same way", () => {
|
||||
expect(qclassName(1)).toBe("IN (1)");
|
||||
expect(qclassName(255)).toBe("ANY (255)");
|
||||
expect(qclassName(42)).toBe("CLASS 42");
|
||||
});
|
||||
Reference in New Issue
Block a user