headscale/hscontrol/servertest
Kristoffer Dalby e2f2f9211f state, servertest: property-test HA election + invariant catalogue
Expand TestPrimaryRoutesProperty (5 -> 9 ops). New ops mirror the
production shapes the failure cases hit: BatchProbeResults via
UpdateNodes, SimultaneousDisconnect via UpdateNodes, SetApprovedRoutes
that leaves announced RoutableIPs intact, OfflineExpiry that keeps
Unhealthy set. The model now tracks announced and approved separately
and recomputes the intersection.

Strengthen the per-op assertions to cover invariants the model alone
cannot prove: every primary must be online, every primary must
currently advertise its prefix, no flap onto an unhealthy candidate
when a healthy one was available, no flap off a previous primary that
remains a healthy candidate. The check now takes a pre-op snapshot so
the anti-flap rule has a stable reference.

Add TestHAProberProperty in servertest. It drives a real TestServer
with three HA-route-advertising clients through rapid-drawn sequences
of ClientDisconnect / ClientReconnect / ProberTick / WaitForSnapshot
ops and re-checks the same shape invariants after every step.

Document the system in hscontrol/state/HA_INVARIANTS.md: a state
machine over (Healthy+Online, Unhealthy+Online, Offline,
OfflineExpired), fifteen numbered invariants with predicates and
violation paths, and a coverage matrix mapping each invariant to its
unit, servertest, and integration tests. Three rows pin the recent
fixes to the invariants they enforce.
2026-05-18 17:18:08 +02:00
..
assertions.go hscontrol/servertest: add policy, route, ephemeral, and content tests 2026-03-19 07:05:58 +01:00
client.go servertest: use memnet networking and add WithNodeExpiry option 2026-04-08 13:00:22 +01:00
connect_race_test.go state: switch consumers to NodeStore primary routes 2026-04-29 18:08:39 +01:00
consistency_test.go hscontrol/servertest: add policy, route, ephemeral, and content tests 2026-03-19 07:05:58 +01:00
content_test.go hscontrol/servertest: add policy, route, ephemeral, and content tests 2026-03-19 07:05:58 +01:00
ephemeral_test.go state: replace zcache with bounded LRU for auth cache 2026-04-10 14:09:57 +01:00
grants_test.go servertest: cover broader-dst via grant in filter test 2026-05-18 14:02:00 +02:00
ha_dynamic_test.go state: batch HA probe results so dual-disconnect cannot flap primary 2026-05-18 17:18:08 +02:00
ha_health_test.go state: batch HA probe results so dual-disconnect cannot flap primary 2026-05-18 17:18:08 +02:00
ha_property_test.go state, servertest: property-test HA election + invariant catalogue 2026-05-18 17:18:08 +02:00
harness.go hscontrol/servertest: add policy, route, ephemeral, and content tests 2026-03-19 07:05:58 +01:00
issues_test.go types: persist Node JSON slices via named IsZero types 2026-05-15 11:21:58 +02:00
lifecycle_test.go hscontrol/servertest: expand issue tests to 24 scenarios, surface 4 issues 2026-03-19 07:05:58 +01:00
nodeattrs_test.go types/config, types/node: model default-auto-update from auto_update.enabled 2026-05-13 14:22:30 +02:00
ping_test.go noise: reject non-HEAD on PingResponseHandler 2026-04-17 16:31:49 +01:00
policy_test.go servertest: add regression tests for via grant filter rules 2026-04-01 14:10:42 +01:00
poll_race_test.go hscontrol/servertest: add race, stress, and poll race tests 2026-03-19 07:05:58 +01:00
race_test.go hscontrol/servertest: add race, stress, and poll race tests 2026-03-19 07:05:58 +01:00
routes_test.go servertest, integration: cover HA both-offline recovery 2026-04-29 18:08:39 +01:00
server.go mapper, state: deliver nodeAttrs through MapResponse and harden nextdns DoH rewrite 2026-05-13 14:22:30 +02:00
stress_test.go hscontrol/servertest: add race, stress, and poll race tests 2026-03-19 07:05:58 +01:00
via_compat_test.go servertest: add via grant map compat tests 2026-04-17 16:31:49 +01:00
via_ha_compat_test.go servertest: add TestViaGrantHACompat for via+HA compat tests 2026-04-17 16:31:49 +01:00
weather_test.go hscontrol/servertest: add control plane lifecycle and consistency tests 2026-03-19 07:05:58 +01:00