chore(natpmp): fix determinism for test Test_Client_ExternalAddress

This commit is contained in:
Quentin McGaw
2024-12-14 21:04:07 +00:00
parent 7e58b4baee
commit ddd9f4d021
2 changed files with 9 additions and 4 deletions

View File

@@ -2,6 +2,7 @@ package natpmp
import ( import (
"context" "context"
"net"
"net/netip" "net/netip"
"testing" "testing"
"time" "time"
@@ -23,14 +24,15 @@ func Test_Client_ExternalAddress(t *testing.T) {
durationSinceStartOfEpoch time.Duration durationSinceStartOfEpoch time.Duration
externalIPv4Address netip.Addr externalIPv4Address netip.Addr
err error err error
errMessage string errMessageRegex string
}{ }{
"failure": { "failure": {
ctx: canceledCtx, ctx: canceledCtx,
gateway: netip.AddrFrom4([4]byte{127, 0, 0, 1}), gateway: netip.AddrFrom4([4]byte{127, 0, 0, 1}),
initialConnDuration: initialConnectionDuration, initialConnDuration: initialConnectionDuration,
err: context.Canceled, err: net.ErrClosed,
errMessage: "executing remote procedure call: reading from udp connection: context canceled", errMessageRegex: "executing remote procedure call: setting connection deadline: " +
"set udp 127.0.0.1:[1-9][0-9]{1,4}: use of closed network connection",
}, },
"success": { "success": {
ctx: context.Background(), ctx: context.Background(),
@@ -60,7 +62,7 @@ func Test_Client_ExternalAddress(t *testing.T) {
durationSinceStartOfEpoch, externalIPv4Address, err := client.ExternalAddress(testCase.ctx, testCase.gateway) durationSinceStartOfEpoch, externalIPv4Address, err := client.ExternalAddress(testCase.ctx, testCase.gateway)
assert.ErrorIs(t, err, testCase.err) assert.ErrorIs(t, err, testCase.err)
if testCase.err != nil { if testCase.err != nil {
assert.EqualError(t, err, testCase.errMessage) assert.Regexp(t, testCase.errMessageRegex, err.Error())
} }
assert.Equal(t, testCase.durationSinceStartOfEpoch, durationSinceStartOfEpoch) assert.Equal(t, testCase.durationSinceStartOfEpoch, durationSinceStartOfEpoch)
assert.Equal(t, testCase.externalIPv4Address, externalIPv4Address) assert.Equal(t, testCase.externalIPv4Address, externalIPv4Address)

View File

@@ -45,8 +45,10 @@ func (c *Client) rpc(ctx context.Context, gateway netip.Addr,
cancel() cancel()
<-endGoroutineDone <-endGoroutineDone
}() }()
ctxListeningReady := make(chan struct{})
go func() { go func() {
defer close(endGoroutineDone) defer close(endGoroutineDone)
close(ctxListeningReady)
// Context is canceled either by the parent context or // Context is canceled either by the parent context or
// when this function returns. // when this function returns.
<-ctx.Done() <-ctx.Done()
@@ -60,6 +62,7 @@ func (c *Client) rpc(ctx context.Context, gateway netip.Addr,
} }
err = fmt.Errorf("%w; closing connection: %w", err, closeErr) err = fmt.Errorf("%w; closing connection: %w", err, closeErr)
}() }()
<-ctxListeningReady // really to make unit testing reliable
const maxResponseSize = 16 const maxResponseSize = 16
response = make([]byte, maxResponseSize) response = make([]byte, maxResponseSize)