Skip to content

Commit cbbec79

Browse files
committed
test(daemon): update TestSendToEncryptedBeforeKeyExchangeQueuesAndInitiates for KE dedup
The AddPeer guard now prevents SendTo from firing a second key-exchange frame when one is already pending. Restructure the test to: - verify the AddPeer-triggered KE frame arrives first - verify multiple SendTo calls queue all packets (not drop them) - verify no second KE frame is sent (dedup guard working)
1 parent d5c1d56 commit cbbec79

1 file changed

Lines changed: 26 additions & 21 deletions

File tree

pkg/daemon/zz_tunnel_send_test.go

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -147,29 +147,11 @@ func TestSendToEncryptedBeforeKeyExchangeQueuesAndInitiates(t *testing.T) {
147147
defer peerConn.Close()
148148
peerAddr := peerConn.LocalAddr().(*net.UDPAddr)
149149

150-
// sendKeyExchangeToNode looks up addr from tm.peers, so register 77.
150+
// AddPeer registers the address and fires one KE frame (the dedup guard
151+
// prevents SendTo from firing a second one while the first is pending).
151152
tm.AddPeer(77, peerAddr)
152-
// Drain the AddPeer-triggered key-exchange frame so the real SendTo check is clean.
153-
drainBuf := make([]byte, 1500)
154-
peerConn.SetReadDeadline(deadlineMS(200))
155-
peerConn.ReadFromUDP(drainBuf)
156153

157-
// No crypto for node 77 yet → SendTo should queue and initiate key exchange.
158-
if err := tm.SendTo(peerAddr, 77, newPacket("q1")); err != nil {
159-
t.Fatalf("SendTo: %v", err)
160-
}
161-
if err := tm.SendTo(peerAddr, 77, newPacket("q2")); err != nil {
162-
t.Fatalf("SendTo: %v", err)
163-
}
164-
165-
tm.pendMu.Lock()
166-
queued := len(tm.pending[77])
167-
tm.pendMu.Unlock()
168-
if queued != 2 {
169-
t.Fatalf("pending[77] = %d, want 2", queued)
170-
}
171-
172-
// Peer should have received at least one key-exchange frame (PILK magic).
154+
// Peer should have received the AddPeer-triggered KE frame (PILK magic).
173155
buf := make([]byte, 1500)
174156
if err := peerConn.SetReadDeadline(deadlineMS(500)); err != nil {
175157
t.Fatalf("setdeadline: %v", err)
@@ -185,6 +167,29 @@ func TestSendToEncryptedBeforeKeyExchangeQueuesAndInitiates(t *testing.T) {
185167
if string(buf[0:4]) != string(protocol.TunnelMagicKeyEx[:]) {
186168
t.Fatalf("expected PILK magic for key-exchange init, got %x", buf[0:4])
187169
}
170+
171+
// Multiple SendTo calls before crypto is ready must queue all packets
172+
// and must NOT fire additional KE frames (dedup guard keeps one in-flight).
173+
if err := tm.SendTo(peerAddr, 77, newPacket("q1")); err != nil {
174+
t.Fatalf("SendTo: %v", err)
175+
}
176+
if err := tm.SendTo(peerAddr, 77, newPacket("q2")); err != nil {
177+
t.Fatalf("SendTo: %v", err)
178+
}
179+
180+
tm.pendMu.Lock()
181+
queued := len(tm.pending[77])
182+
tm.pendMu.Unlock()
183+
if queued != 2 {
184+
t.Fatalf("pending[77] = %d, want 2", queued)
185+
}
186+
187+
// No second KE frame should have been sent (dedup guard).
188+
peerConn.SetReadDeadline(deadlineMS(100))
189+
var extra [1500]byte
190+
if _, _, err2 := peerConn.ReadFromUDP(extra[:]); err2 == nil {
191+
t.Fatal("unexpected second KE frame — dedup guard should suppress it")
192+
}
188193
}
189194

190195
func TestSendToEncryptedWithReadyCryptoSendsEncryptedFrame(t *testing.T) {

0 commit comments

Comments
 (0)