|
|
|
|
@ -80,40 +80,177 @@ func TestRelayManagerGetServers(t *testing.T) {
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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{}
|
|
|
|
|
wantHandshakeWorkCount := func(t *testing.T, rm *relayManager, n int) {
|
|
|
|
|
t.Helper()
|
|
|
|
|
byServerDiscoByEndpoint := 0
|
|
|
|
|
for _, v := range rm.handshakeWorkByServerDiscoByEndpoint {
|
|
|
|
|
byServerDiscoByEndpoint += len(v)
|
|
|
|
|
}
|
|
|
|
|
byServerDiscoVNI := len(rm.handshakeWorkByServerDiscoVNI)
|
|
|
|
|
if byServerDiscoByEndpoint != n ||
|
|
|
|
|
byServerDiscoVNI != n ||
|
|
|
|
|
byServerDiscoByEndpoint != byServerDiscoVNI {
|
|
|
|
|
t.Fatalf("want handshake work count %d byServerDiscoByEndpoint=%d byServerDiscoVNI=%d",
|
|
|
|
|
n,
|
|
|
|
|
byServerDiscoByEndpoint,
|
|
|
|
|
byServerDiscoVNI,
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
conn := newConn(t.Logf)
|
|
|
|
|
ep.c = conn
|
|
|
|
|
serverDisco := key.NewDisco().Public()
|
|
|
|
|
rm.handleNewServerEndpointRunLoop(newRelayServerEndpointEvent{
|
|
|
|
|
wlb: endpointWithLastBest{
|
|
|
|
|
ep: ep,
|
|
|
|
|
epA := &endpoint{c: conn}
|
|
|
|
|
epB := &endpoint{c: conn}
|
|
|
|
|
serverDiscoA := key.NewDisco().Public()
|
|
|
|
|
serverDiscoB := key.NewDisco().Public()
|
|
|
|
|
|
|
|
|
|
serverAendpointALamport1VNI1 := newRelayServerEndpointEvent{
|
|
|
|
|
wlb: endpointWithLastBest{ep: epA},
|
|
|
|
|
se: udprelay.ServerEndpoint{ServerDisco: serverDiscoA, LamportID: 1, VNI: 1},
|
|
|
|
|
}
|
|
|
|
|
serverAendpointALamport1VNI1LastBestMatching := newRelayServerEndpointEvent{
|
|
|
|
|
wlb: endpointWithLastBest{ep: epA, lastBestIsTrusted: true, lastBest: addrQuality{relayServerDisco: serverDiscoA}},
|
|
|
|
|
se: udprelay.ServerEndpoint{ServerDisco: serverDiscoA, LamportID: 1, VNI: 1},
|
|
|
|
|
}
|
|
|
|
|
serverAendpointALamport2VNI1 := newRelayServerEndpointEvent{
|
|
|
|
|
wlb: endpointWithLastBest{ep: epA},
|
|
|
|
|
se: udprelay.ServerEndpoint{ServerDisco: serverDiscoA, LamportID: 2, VNI: 1},
|
|
|
|
|
}
|
|
|
|
|
serverAendpointALamport2VNI2 := newRelayServerEndpointEvent{
|
|
|
|
|
wlb: endpointWithLastBest{ep: epA},
|
|
|
|
|
se: udprelay.ServerEndpoint{ServerDisco: serverDiscoA, LamportID: 2, VNI: 2},
|
|
|
|
|
}
|
|
|
|
|
serverAendpointBLamport1VNI2 := newRelayServerEndpointEvent{
|
|
|
|
|
wlb: endpointWithLastBest{ep: epB},
|
|
|
|
|
se: udprelay.ServerEndpoint{ServerDisco: serverDiscoA, LamportID: 1, VNI: 2},
|
|
|
|
|
}
|
|
|
|
|
serverBendpointALamport1VNI1 := newRelayServerEndpointEvent{
|
|
|
|
|
wlb: endpointWithLastBest{ep: epA},
|
|
|
|
|
se: udprelay.ServerEndpoint{ServerDisco: serverDiscoB, LamportID: 1, VNI: 1},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
tests := []struct {
|
|
|
|
|
name string
|
|
|
|
|
events []newRelayServerEndpointEvent
|
|
|
|
|
want []newRelayServerEndpointEvent
|
|
|
|
|
}{
|
|
|
|
|
{
|
|
|
|
|
// Test for http://go/corp/32978
|
|
|
|
|
name: "eq server+ep neq VNI higher lamport",
|
|
|
|
|
events: []newRelayServerEndpointEvent{
|
|
|
|
|
serverAendpointALamport1VNI1,
|
|
|
|
|
serverAendpointALamport2VNI2,
|
|
|
|
|
},
|
|
|
|
|
want: []newRelayServerEndpointEvent{
|
|
|
|
|
serverAendpointALamport2VNI2,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "eq server+ep neq VNI lower lamport",
|
|
|
|
|
events: []newRelayServerEndpointEvent{
|
|
|
|
|
serverAendpointALamport2VNI2,
|
|
|
|
|
serverAendpointALamport1VNI1,
|
|
|
|
|
},
|
|
|
|
|
want: []newRelayServerEndpointEvent{
|
|
|
|
|
serverAendpointALamport2VNI2,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "eq server+vni neq ep lower lamport",
|
|
|
|
|
events: []newRelayServerEndpointEvent{
|
|
|
|
|
serverAendpointALamport2VNI2,
|
|
|
|
|
serverAendpointBLamport1VNI2,
|
|
|
|
|
},
|
|
|
|
|
want: []newRelayServerEndpointEvent{
|
|
|
|
|
serverAendpointALamport2VNI2,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "eq server+vni neq ep higher lamport",
|
|
|
|
|
events: []newRelayServerEndpointEvent{
|
|
|
|
|
serverAendpointBLamport1VNI2,
|
|
|
|
|
serverAendpointALamport2VNI2,
|
|
|
|
|
},
|
|
|
|
|
want: []newRelayServerEndpointEvent{
|
|
|
|
|
serverAendpointALamport2VNI2,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "eq server+endpoint+vni higher lamport",
|
|
|
|
|
events: []newRelayServerEndpointEvent{
|
|
|
|
|
serverAendpointALamport1VNI1,
|
|
|
|
|
serverAendpointALamport2VNI1,
|
|
|
|
|
},
|
|
|
|
|
want: []newRelayServerEndpointEvent{
|
|
|
|
|
serverAendpointALamport2VNI1,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
se: udprelay.ServerEndpoint{
|
|
|
|
|
ServerDisco: serverDisco,
|
|
|
|
|
LamportID: 1,
|
|
|
|
|
VNI: 1,
|
|
|
|
|
{
|
|
|
|
|
name: "eq server+endpoint+vni lower lamport",
|
|
|
|
|
events: []newRelayServerEndpointEvent{
|
|
|
|
|
serverAendpointALamport2VNI1,
|
|
|
|
|
serverAendpointALamport1VNI1,
|
|
|
|
|
},
|
|
|
|
|
want: []newRelayServerEndpointEvent{
|
|
|
|
|
serverAendpointALamport2VNI1,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
rm.handleNewServerEndpointRunLoop(newRelayServerEndpointEvent{
|
|
|
|
|
wlb: endpointWithLastBest{
|
|
|
|
|
ep: ep,
|
|
|
|
|
{
|
|
|
|
|
name: "eq endpoint+vni+lamport neq server",
|
|
|
|
|
events: []newRelayServerEndpointEvent{
|
|
|
|
|
serverAendpointALamport1VNI1,
|
|
|
|
|
serverBendpointALamport1VNI1,
|
|
|
|
|
},
|
|
|
|
|
want: []newRelayServerEndpointEvent{
|
|
|
|
|
serverAendpointALamport1VNI1,
|
|
|
|
|
serverBendpointALamport1VNI1,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
se: udprelay.ServerEndpoint{
|
|
|
|
|
ServerDisco: serverDisco,
|
|
|
|
|
LamportID: 2,
|
|
|
|
|
VNI: 2,
|
|
|
|
|
{
|
|
|
|
|
name: "trusted last best with matching server",
|
|
|
|
|
events: []newRelayServerEndpointEvent{
|
|
|
|
|
serverAendpointALamport1VNI1LastBestMatching,
|
|
|
|
|
},
|
|
|
|
|
want: []newRelayServerEndpointEvent{},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
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")
|
|
|
|
|
}
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
|
rm := &relayManager{}
|
|
|
|
|
rm.init()
|
|
|
|
|
<-rm.runLoopStoppedCh // prevent runLoop() from starting
|
|
|
|
|
|
|
|
|
|
// feed events
|
|
|
|
|
for _, event := range tt.events {
|
|
|
|
|
rm.handleNewServerEndpointRunLoop(event)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// validate state
|
|
|
|
|
wantHandshakeWorkCount(t, rm, len(tt.want))
|
|
|
|
|
for _, want := range tt.want {
|
|
|
|
|
byServerDisco, ok := rm.handshakeWorkByServerDiscoByEndpoint[want.wlb.ep]
|
|
|
|
|
if !ok {
|
|
|
|
|
t.Fatal("work not found by endpoint")
|
|
|
|
|
}
|
|
|
|
|
workByServerDiscoByEndpoint, ok := byServerDisco[want.se.ServerDisco]
|
|
|
|
|
if !ok {
|
|
|
|
|
t.Fatal("work not found by server disco by endpoint")
|
|
|
|
|
}
|
|
|
|
|
workByServerDiscoVNI, ok := rm.handshakeWorkByServerDiscoVNI[serverDiscoVNI{want.se.ServerDisco, want.se.VNI}]
|
|
|
|
|
if !ok {
|
|
|
|
|
t.Fatal("work not found by server disco + VNI")
|
|
|
|
|
}
|
|
|
|
|
if workByServerDiscoByEndpoint != workByServerDiscoVNI {
|
|
|
|
|
t.Fatal("workByServerDiscoByEndpoint != workByServerDiscoVNI")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// cleanup
|
|
|
|
|
for _, event := range tt.events {
|
|
|
|
|
rm.stopWorkRunLoop(event.wlb.ep)
|
|
|
|
|
}
|
|
|
|
|
wantHandshakeWorkCount(t, rm, 0)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|