hscontrol/servertest: expand issue tests to 24 scenarios, surface 4 issues
Split TestIssues into 7 focused test functions to stay under cyclomatic complexity limits while testing more aggressively. Issues surfaced (4 failing tests): 1. initial_map_should_include_peer_online_status: Initial MapResponse has Online=nil for peers. Online status only arrives later via PeersChangedPatch. 2. disco_key_should_propagate_to_peers: DiscoPublicKey set by client is not visible to peers. Peers see zero disco key. 3. approved_route_without_announcement_is_visible: Server-side route approval without client-side announcement silently produces empty SubnetRoutes (intersection of empty announced + approved = empty). 4. nodestore_correct_after_rapid_reconnect: After 5 rapid reconnect cycles, NodeStore reports node as offline despite having an active poll session. The connect/disconnect grace period interleaving leaves IsOnline in an incorrect state. Passing tests (20) verify: - IP uniqueness across 10 nodes - IP stability across reconnect - New peers have addresses immediately - Node rename propagates to peers - Node delete removes from all peer lists - Hostinfo changes (OS field) propagate - NodeStore/DB consistency after route mutations - Grace period timing (8-20s window) - Ephemeral node deletion (not just offline) - 10-node simultaneous connect convergence - Rapid sequential node additions - Reconnect produces complete map - Cross-user visibility with default policy - Same-user multiple nodes get distinct IDs - Same-hostname nodes get unique GivenNames - Policy change during connect still converges - DERP region references are valid - User profiles present for self and peers - Self-update arrives after route approval - Route advertisement stored as AnnouncedRoutes
This commit is contained in:
parent
f87b08676d
commit
ab4e205ce7
4 changed files with 905 additions and 37 deletions
|
|
@ -6,6 +6,7 @@ import (
|
|||
|
||||
"github.com/juanfont/headscale/hscontrol/servertest"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
"tailscale.com/types/netmap"
|
||||
)
|
||||
|
||||
|
|
@ -52,25 +53,32 @@ func TestEphemeralNodes(t *testing.T) {
|
|||
|
||||
regular.WaitForPeers(t, 1, 10*time.Second)
|
||||
|
||||
// Verify ephemeral peer is present before disconnect.
|
||||
_, found := regular.PeerByName("eph-cleanup-ephemeral")
|
||||
require.True(t, found, "ephemeral peer should be visible before disconnect")
|
||||
|
||||
// Ensure the ephemeral node's long-poll session is fully
|
||||
// established on the server before disconnecting. Without
|
||||
// this, the Disconnect may cancel a PollNetMap that hasn't
|
||||
// yet reached serveLongPoll, so no grace period or ephemeral
|
||||
// GC would ever be scheduled.
|
||||
ephemeral.WaitForPeers(t, 1, 10*time.Second)
|
||||
|
||||
// Disconnect the ephemeral node.
|
||||
ephemeral.Disconnect(t)
|
||||
|
||||
// After the grace period (10s) + ephemeral timeout (3s) +
|
||||
// some propagation time, the regular node should no longer
|
||||
// see the ephemeral node. This tests the full cleanup path.
|
||||
regular.WaitForCondition(t, "ephemeral peer gone or offline",
|
||||
// After the grace period (10s) + ephemeral timeout (3s),
|
||||
// the ephemeral node should be deleted from the server and
|
||||
// disappear from the regular node's peer list entirely.
|
||||
// Unlike non-ephemeral nodes which go offline but stay in
|
||||
// the peer list, ephemeral nodes should be garbage collected.
|
||||
regular.WaitForCondition(t, "ephemeral peer removed from peer list",
|
||||
60*time.Second,
|
||||
func(nm *netmap.NetworkMap) bool {
|
||||
for _, p := range nm.Peers {
|
||||
hi := p.Hostinfo()
|
||||
if hi.Valid() && hi.Hostname() == "eph-cleanup-ephemeral" {
|
||||
// Still present -- check if offline.
|
||||
isOnline, known := p.Online().GetOk()
|
||||
if known && !isOnline {
|
||||
return true // offline is acceptable
|
||||
}
|
||||
|
||||
return false // still online
|
||||
return false // still present
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue