Files
dnswatcher/TESTING.md
sneak 6f6bf3a65b
All checks were successful
check / check (push) Successful in 1m34s
test: disable Go's test cache so every run queries live DNS (closes #139)
`script/test` did not pass `-count=1`, so on an unchanged tree Go
served the whole suite from its test cache: exit 0 in ~0.2s with every
package marked `(cached)` and not one DNS query made. This repo's suite
exists to exercise live resolution on every run (`TESTING.md`), so that
green asserted nothing — and it is exactly the green used as evidence
that a flakiness fix works, since "run it a few times" stops being
runs after the first.

`-count=1` now disables caching on every invocation.

The conditional verbose rerun that `REPO_POLICIES.md` mandates was
missing at the same spot and is added here rather than left broken: the
primary run had been unconditionally `-v`, which is the failure mode
the policy exists to prevent (unreadable CI and `docker build` logs on
success). Tests now run quiet, and only a failure triggers the `-v`
rerun. The rerun carries `-count=1` too, so it cannot replay a cached
copy of the failure it is meant to diagnose, and its exit status is
discarded in favour of a forced 1: the first failure already proved the
suite broken, so a flake that passes the second time must not turn the
build green.

`-timeout 90s` is untouched. It is a deliberate backstop that must
strictly exceed the 60s hard cap on suite duration.

No special-casing for the Docker build, which also reaches this script
via `RUN make test`: a fresh container's test cache is empty, so
`-count=1` changes nothing there and carving out an exception would
only create a second code path that could drift.

Verified: three back-to-back `make test` runs on an unchanged tree,
zero `(cached)` markers, ~4.0-4.5s wall each (was ~0.2s cached),
comfortably inside the 20s target with `-race` and `-cover` both still
working and coverage percentages unchanged. The rerun-and-still-fail
path was exercised against a purpose-built flaky test that fails once
then passes: quiet failure, verbose rerun that genuinely re-executed,
exit 1 regardless. `make check` green.
2026-08-10 13:48:15 +00:00

1.5 KiB
Raw Blame History

Testing Policy

DNS Resolution Tests

All resolver tests MUST use live queries against real DNS servers. No mocking of the DNS client layer is permitted.

Rationale

The resolver performs iterative resolution from root nameservers through the full delegation chain. Mocked responses cannot faithfully represent the variety of real-world DNS behavior (truncation, referrals, glue records, DNSSEC, varied response times, EDNS, etc.). Testing against real servers ensures the resolver works correctly in production.

Constraints

  • Tests hit real DNS infrastructure and require network access
  • Test duration depends on network conditions; timeout tuning keeps the suite within the 60-second target
  • Query timeout is calibrated to 3× maximum antipodal RTT (~300ms) plus processing margin
  • Root server fan-out is limited to reduce parallel query load
  • Flaky failures from transient network issues are acceptable and should be investigated as potential resolver bugs, not papered over with mocks or skip flags

What NOT to do

  • Do not mock DNSClient for resolver tests (the mock constructor exists for unit-testing other packages that consume the resolver)
  • Do not add -short flags to skip slow tests
  • Do not increase -timeout to hide hanging queries
  • Do not remove -count=1 from script/test — Go's test cache replays a previous run's output without querying anything, so a cached pass is not evidence that live resolution works
  • Do not modify linter configuration to suppress findings