|
|
|
|
@ -4015,3 +4015,84 @@ func TestConn_receiveIP(t *testing.T) {
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Test_lazyEndpoint_InitiationMessagePublicKey(t *testing.T) {
|
|
|
|
|
tests := []struct {
|
|
|
|
|
name string
|
|
|
|
|
callWithPeerMapKey bool
|
|
|
|
|
maybeEPMatchingKey bool
|
|
|
|
|
wantNoteRecvActivityCalled bool
|
|
|
|
|
}{
|
|
|
|
|
{
|
|
|
|
|
name: "noteRecvActivity called",
|
|
|
|
|
callWithPeerMapKey: true,
|
|
|
|
|
maybeEPMatchingKey: false,
|
|
|
|
|
wantNoteRecvActivityCalled: true,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "maybeEP early return",
|
|
|
|
|
callWithPeerMapKey: true,
|
|
|
|
|
maybeEPMatchingKey: true,
|
|
|
|
|
wantNoteRecvActivityCalled: false,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "not in peerMap early return",
|
|
|
|
|
callWithPeerMapKey: false,
|
|
|
|
|
maybeEPMatchingKey: false,
|
|
|
|
|
wantNoteRecvActivityCalled: false,
|
|
|
|
|
},
|
|
|
|
|
{
|
|
|
|
|
name: "not in peerMap maybeEP early return",
|
|
|
|
|
callWithPeerMapKey: false,
|
|
|
|
|
maybeEPMatchingKey: true,
|
|
|
|
|
wantNoteRecvActivityCalled: false,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
for _, tt := range tests {
|
|
|
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
|
|
|
ep := &endpoint{
|
|
|
|
|
nodeID: 1,
|
|
|
|
|
publicKey: key.NewNode().Public(),
|
|
|
|
|
}
|
|
|
|
|
ep.disco.Store(&endpointDisco{
|
|
|
|
|
key: key.NewDisco().Public(),
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
var noteRecvActivityCalledFor key.NodePublic
|
|
|
|
|
conn := newConn(t.Logf)
|
|
|
|
|
conn.noteRecvActivity = func(public key.NodePublic) {
|
|
|
|
|
// wireguard-go will call into ParseEndpoint if the "real"
|
|
|
|
|
// noteRecvActivity ends up JIT configuring the peer. Mimic that
|
|
|
|
|
// to ensure there are no deadlocks around conn.mu.
|
|
|
|
|
// See tailscale/tailscale#16651 & http://go/corp#30836
|
|
|
|
|
_, err := conn.ParseEndpoint(ep.publicKey.UntypedHexString())
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("ParseEndpoint() err: %v", err)
|
|
|
|
|
}
|
|
|
|
|
noteRecvActivityCalledFor = public
|
|
|
|
|
}
|
|
|
|
|
ep.c = conn
|
|
|
|
|
|
|
|
|
|
var pubKey [32]byte
|
|
|
|
|
if tt.callWithPeerMapKey {
|
|
|
|
|
copy(pubKey[:], ep.publicKey.AppendTo(nil))
|
|
|
|
|
}
|
|
|
|
|
conn.peerMap.upsertEndpoint(ep, key.DiscoPublic{})
|
|
|
|
|
|
|
|
|
|
le := &lazyEndpoint{
|
|
|
|
|
c: conn,
|
|
|
|
|
}
|
|
|
|
|
if tt.maybeEPMatchingKey {
|
|
|
|
|
le.maybeEP = ep
|
|
|
|
|
}
|
|
|
|
|
le.InitiationMessagePublicKey(pubKey)
|
|
|
|
|
want := key.NodePublic{}
|
|
|
|
|
if tt.wantNoteRecvActivityCalled {
|
|
|
|
|
want = ep.publicKey
|
|
|
|
|
}
|
|
|
|
|
if noteRecvActivityCalledFor.Compare(want) != 0 {
|
|
|
|
|
t.Fatalf("noteRecvActivityCalledFor = %v, want %v", noteRecvActivityCalledFor, want)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|