2025-05-09 14:50:01 -07:00
|
|
|
// Copyright (c) Tailscale Inc & AUTHORS
|
|
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
|
|
|
|
package magicsock
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"tailscale.com/disco"
|
2025-05-16 13:51:40 -07:00
|
|
|
"tailscale.com/types/key"
|
2025-06-20 15:00:28 -07:00
|
|
|
"tailscale.com/util/set"
|
2025-05-09 14:50:01 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
func TestRelayManagerInitAndIdle(t *testing.T) {
|
|
|
|
rm := relayManager{}
|
2025-06-30 12:12:57 -07:00
|
|
|
rm.startUDPRelayPathDiscoveryFor(&endpoint{}, addrQuality{}, false)
|
2025-05-09 14:50:01 -07:00
|
|
|
<-rm.runLoopStoppedCh
|
|
|
|
|
|
|
|
rm = relayManager{}
|
2025-05-16 13:51:40 -07:00
|
|
|
rm.stopWork(&endpoint{})
|
2025-05-09 14:50:01 -07:00
|
|
|
<-rm.runLoopStoppedCh
|
|
|
|
|
|
|
|
rm = relayManager{}
|
2025-07-21 10:02:37 -07:00
|
|
|
rm.handleCallMeMaybeVia(&endpoint{c: &Conn{discoPrivate: key.NewDisco()}}, addrQuality{}, false, &disco.CallMeMaybeVia{UDPRelayEndpoint: disco.UDPRelayEndpoint{ServerDisco: key.NewDisco().Public()}})
|
2025-05-09 14:50:01 -07:00
|
|
|
<-rm.runLoopStoppedCh
|
|
|
|
|
|
|
|
rm = relayManager{}
|
2025-07-21 10:02:37 -07:00
|
|
|
rm.handleRxDiscoMsg(&Conn{discoPrivate: key.NewDisco()}, &disco.BindUDPRelayEndpointChallenge{}, key.NodePublic{}, key.DiscoPublic{}, epAddr{})
|
2025-05-09 14:50:01 -07:00
|
|
|
<-rm.runLoopStoppedCh
|
2025-06-20 15:00:28 -07:00
|
|
|
|
|
|
|
rm = relayManager{}
|
2025-07-21 10:02:37 -07:00
|
|
|
rm.handleRelayServersSet(make(set.Set[candidatePeerRelay]))
|
2025-06-20 15:00:28 -07:00
|
|
|
<-rm.runLoopStoppedCh
|
2025-07-16 10:03:05 -07:00
|
|
|
|
|
|
|
rm = relayManager{}
|
|
|
|
rm.getServers()
|
|
|
|
<-rm.runLoopStoppedCh
|
2025-07-21 10:02:37 -07:00
|
|
|
|
|
|
|
rm = relayManager{}
|
|
|
|
rm.handleDERPHomeChange(key.NodePublic{}, 1)
|
|
|
|
<-rm.runLoopStoppedCh
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestRelayManagerHandleDERPHomeChange(t *testing.T) {
|
|
|
|
rm := relayManager{}
|
|
|
|
servers := make(set.Set[candidatePeerRelay], 1)
|
|
|
|
c := candidatePeerRelay{
|
|
|
|
nodeKey: key.NewNode().Public(),
|
|
|
|
discoKey: key.NewDisco().Public(),
|
|
|
|
derpHomeRegionID: 1,
|
|
|
|
}
|
|
|
|
servers.Add(c)
|
|
|
|
rm.handleRelayServersSet(servers)
|
|
|
|
want := c
|
|
|
|
want.derpHomeRegionID = 2
|
|
|
|
rm.handleDERPHomeChange(c.nodeKey, 2)
|
|
|
|
got := rm.getServers()
|
|
|
|
if len(got) != 1 {
|
|
|
|
t.Fatalf("got %d servers, want 1", len(got))
|
|
|
|
}
|
|
|
|
_, ok := got[want]
|
|
|
|
if !ok {
|
|
|
|
t.Fatal("DERP home change failed to propagate")
|
|
|
|
}
|
2025-07-16 10:03:05 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
func TestRelayManagerGetServers(t *testing.T) {
|
|
|
|
rm := relayManager{}
|
2025-07-21 10:02:37 -07:00
|
|
|
servers := make(set.Set[candidatePeerRelay], 1)
|
|
|
|
c := candidatePeerRelay{
|
|
|
|
nodeKey: key.NewNode().Public(),
|
|
|
|
discoKey: key.NewDisco().Public(),
|
|
|
|
}
|
|
|
|
servers.Add(c)
|
2025-07-16 10:03:05 -07:00
|
|
|
rm.handleRelayServersSet(servers)
|
|
|
|
got := rm.getServers()
|
|
|
|
if !servers.Equal(got) {
|
|
|
|
t.Errorf("got %v != want %v", got, servers)
|
|
|
|
}
|
2025-05-09 14:50:01 -07:00
|
|
|
}
|