@@ -189,23 +189,34 @@ func newTunnelServer(t *testing.T) *tunnelServer {
189
189
require .Equal (t , "https" , baseURLParsed .Scheme )
190
190
baseURLParsed .Host = net .JoinHostPort ("tunnel.coder.com" , baseURLParsed .Port ())
191
191
192
- wireguardPort := freeUDPPort (t )
193
-
194
192
key , err := tunnelsdk .GeneratePrivateKey ()
195
193
require .NoError (t , err )
196
194
197
- options := & tunneld.Options {
198
- BaseURL : baseURLParsed ,
199
- WireguardEndpoint : fmt .Sprintf ("127.0.0.1:%d" , wireguardPort ),
200
- WireguardPort : wireguardPort ,
201
- WireguardKey : key ,
202
- WireguardMTU : tunneld .DefaultWireguardMTU ,
203
- WireguardServerIP : tunneld .DefaultWireguardServerIP ,
204
- WireguardNetworkPrefix : tunneld .DefaultWireguardNetworkPrefix ,
205
- }
195
+ // Sadly the tunnel server needs to be passed a port number and can't be
196
+ // passed an active listener (because wireguard needs to make the listener),
197
+ // so we may need to try a few times to get a free port.
198
+ var td * tunneld.API
199
+ for i := 0 ; i < 10 ; i ++ {
200
+ wireguardPort := freeUDPPort (t )
201
+ options := & tunneld.Options {
202
+ BaseURL : baseURLParsed ,
203
+ WireguardEndpoint : fmt .Sprintf ("127.0.0.1:%d" , wireguardPort ),
204
+ WireguardPort : wireguardPort ,
205
+ WireguardKey : key ,
206
+ WireguardMTU : tunneld .DefaultWireguardMTU ,
207
+ WireguardServerIP : tunneld .DefaultWireguardServerIP ,
208
+ WireguardNetworkPrefix : tunneld .DefaultWireguardNetworkPrefix ,
209
+ }
206
210
207
- td , err := tunneld .New (options )
208
- require .NoError (t , err )
211
+ td , err = tunneld .New (options )
212
+ if err == nil {
213
+ break
214
+ }
215
+ t .Logf ("failed to create tunnel server on port %d: %s" , wireguardPort , err )
216
+ }
217
+ if td == nil {
218
+ t .Fatal ("failed to create tunnel server in 10 attempts" )
219
+ }
209
220
handler = td .Router ()
210
221
t .Cleanup (func () {
211
222
_ = td .Close ()
0 commit comments