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.
40 lines
1.3 KiB
TypeScript
40 lines
1.3 KiB
TypeScript
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");
|
|
});
|