|
|
@@ -7,6 +7,7 @@ import (
|
|
|
"testing"
|
|
|
|
|
|
"tailscale.com/disco"
|
|
|
+ udprelay "tailscale.com/net/udprelay/endpoint"
|
|
|
"tailscale.com/types/key"
|
|
|
"tailscale.com/util/set"
|
|
|
)
|
|
|
@@ -78,3 +79,41 @@ func TestRelayManagerGetServers(t *testing.T) {
|
|
|
t.Errorf("got %v != want %v", got, servers)
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+// Test for http://go/corp/32978
|
|
|
+func TestRelayManager_handleNewServerEndpointRunLoop(t *testing.T) {
|
|
|
+ rm := relayManager{}
|
|
|
+ rm.init()
|
|
|
+ <-rm.runLoopStoppedCh // prevent runLoop() from starting, we will inject/handle events in the test
|
|
|
+ ep := &endpoint{}
|
|
|
+ conn := newConn(t.Logf)
|
|
|
+ ep.c = conn
|
|
|
+ serverDisco := key.NewDisco().Public()
|
|
|
+ rm.handleNewServerEndpointRunLoop(newRelayServerEndpointEvent{
|
|
|
+ wlb: endpointWithLastBest{
|
|
|
+ ep: ep,
|
|
|
+ },
|
|
|
+ se: udprelay.ServerEndpoint{
|
|
|
+ ServerDisco: serverDisco,
|
|
|
+ LamportID: 1,
|
|
|
+ VNI: 1,
|
|
|
+ },
|
|
|
+ })
|
|
|
+ rm.handleNewServerEndpointRunLoop(newRelayServerEndpointEvent{
|
|
|
+ wlb: endpointWithLastBest{
|
|
|
+ ep: ep,
|
|
|
+ },
|
|
|
+ se: udprelay.ServerEndpoint{
|
|
|
+ ServerDisco: serverDisco,
|
|
|
+ LamportID: 2,
|
|
|
+ VNI: 2,
|
|
|
+ },
|
|
|
+ })
|
|
|
+ rm.stopWorkRunLoop(ep)
|
|
|
+ if len(rm.handshakeWorkByServerDiscoByEndpoint) != 0 ||
|
|
|
+ len(rm.handshakeWorkByServerDiscoVNI) != 0 ||
|
|
|
+ len(rm.handshakeWorkAwaitingPong) != 0 ||
|
|
|
+ len(rm.addrPortVNIToHandshakeWork) != 0 {
|
|
|
+ t.Fatal("stranded relayHandshakeWork state")
|
|
|
+ }
|
|
|
+}
|