all: add tests for PingRequest implementation

Unit tests for Change (IsEmpty, Merge, Type, PingNode constructor),
ping tracker (register/complete/cancel lifecycle, concurrency, latency),
and end-to-end servertests exercising the full round-trip with real
controlclient.Direct instances.

Updates #2902
Updates #2129
This commit is contained in:
Kristoffer Dalby 2026-04-10 12:46:33 +00:00
parent b113655b71
commit 97778c9930
3 changed files with 367 additions and 0 deletions

View file

@ -89,6 +89,11 @@ func TestChange_IsEmpty(t *testing.T) {
response: Change{PeerPatches: []*tailcfg.PeerChange{{}}},
want: false,
},
{
name: "PingRequest not empty",
response: Change{PingRequest: &tailcfg.PingRequest{URL: "https://example.com"}},
want: false,
},
}
for _, tt := range tests {
@ -263,6 +268,24 @@ func TestChange_Merge(t *testing.T) {
r2: Change{TargetNode: 42},
want: Change{TargetNode: 42, IncludeSelf: true},
},
{
name: "PingRequest preserved from first",
r1: Change{PingRequest: &tailcfg.PingRequest{URL: "first"}},
r2: Change{IncludeSelf: true},
want: Change{PingRequest: &tailcfg.PingRequest{URL: "first"}, IncludeSelf: true},
},
{
name: "PingRequest preserved from second when first is nil",
r1: Change{IncludeSelf: true},
r2: Change{PingRequest: &tailcfg.PingRequest{URL: "second"}},
want: Change{PingRequest: &tailcfg.PingRequest{URL: "second"}, IncludeSelf: true},
},
{
name: "PingRequest first wins when both set",
r1: Change{PingRequest: &tailcfg.PingRequest{URL: "first"}},
r2: Change{PingRequest: &tailcfg.PingRequest{URL: "second"}},
want: Change{PingRequest: &tailcfg.PingRequest{URL: "first"}},
},
}
for _, tt := range tests {
@ -417,6 +440,14 @@ func TestChange_Type(t *testing.T) {
response: PolicyOnly(),
want: "config",
},
{
name: "ping request",
response: Change{
PingRequest: &tailcfg.PingRequest{URL: "https://example.com"},
TargetNode: 1,
},
want: "ping",
},
{
name: "empty is unknown",
response: Change{},
@ -432,6 +463,17 @@ func TestChange_Type(t *testing.T) {
}
}
func TestPingNode(t *testing.T) {
pr := &tailcfg.PingRequest{URL: "https://example.com/ping", URLIsNoise: true, Log: true}
r := PingNode(42, pr)
assert.Equal(t, "ping node", r.Reason)
assert.Equal(t, types.NodeID(42), r.TargetNode)
assert.Equal(t, pr, r.PingRequest)
assert.True(t, r.IsTargetedToNode())
assert.False(t, r.IsEmpty())
assert.Equal(t, "ping", r.Type())
}
func TestUniqueNodeIDs(t *testing.T) {
tests := []struct {
name string