@@ -41,12 +41,34 @@ import (
41
41
"github.com/coder/coder/v2/testutil"
42
42
)
43
43
44
- // IDs used in tests.
45
- var (
46
- Client1ID = uuid .MustParse ("00000000-0000-0000-0000-000000000001" )
47
- Client2ID = uuid .MustParse ("00000000-0000-0000-0000-000000000002" )
44
+ type ClientNumber int
45
+
46
+ const (
47
+ ClientNumber1 ClientNumber = 1
48
+ ClientNumber2 ClientNumber = 2
48
49
)
49
50
51
+ type Client struct {
52
+ Number ClientNumber
53
+ ID uuid.UUID
54
+ ListenPort uint16
55
+ ShouldRunTests bool
56
+ }
57
+
58
+ var Client1 = Client {
59
+ Number : ClientNumber1 ,
60
+ ID : uuid .MustParse ("00000000-0000-0000-0000-000000000001" ),
61
+ ListenPort : client1Port ,
62
+ ShouldRunTests : true ,
63
+ }
64
+
65
+ var Client2 = Client {
66
+ Number : ClientNumber2 ,
67
+ ID : uuid .MustParse ("00000000-0000-0000-0000-000000000002" ),
68
+ ListenPort : client2Port ,
69
+ ShouldRunTests : false ,
70
+ }
71
+
50
72
type TestTopology struct {
51
73
Name string
52
74
// SetupNetworking creates interfaces and network namespaces for the test.
@@ -59,12 +81,12 @@ type TestTopology struct {
59
81
Server ServerStarter
60
82
// StartClient gets called in each client subprocess. It's expected to
61
83
// create the tailnet.Conn and ensure connectivity to it's peer.
62
- StartClient func (t * testing.T , logger slog.Logger , serverURL * url.URL , myID uuid. UUID , peerID uuid. UUID ) * tailnet.Conn
84
+ StartClient func (t * testing.T , logger slog.Logger , serverURL * url.URL , derpMap * tailcfg. DERPMap , me Client , peer Client ) * tailnet.Conn
63
85
64
86
// RunTests is the main test function. It's called in each of the client
65
87
// subprocesses. If tests can only run once, they should check the client ID
66
88
// and return early if it's not the expected one.
67
- RunTests func (t * testing.T , logger slog.Logger , serverURL * url.URL , myID uuid. UUID , peerID uuid. UUID , conn * tailnet. Conn )
89
+ RunTests func (t * testing.T , logger slog.Logger , serverURL * url.URL , conn * tailnet. Conn , me Client , peer Client )
68
90
}
69
91
70
92
type ServerStarter interface {
@@ -264,13 +286,14 @@ http {
264
286
265
287
// StartClientDERP creates a client connection to the server for coordination
266
288
// and creates a tailnet.Conn which will only use DERP to connect to the peer.
267
- func StartClientDERP (t * testing.T , logger slog.Logger , serverURL * url.URL , myID , peerID uuid. UUID ) * tailnet.Conn {
268
- return startClientOptions (t , logger , serverURL , myID , peerID , & tailnet.Options {
269
- Addresses : []netip.Prefix {netip .PrefixFrom (tailnet .IPFromUUID (myID ), 128 )},
270
- DERPMap : basicDERPMap ( t , serverURL ) ,
289
+ func StartClientDERP (t * testing.T , logger slog.Logger , serverURL * url.URL , derpMap * tailcfg. DERPMap , me , peer Client ) * tailnet.Conn {
290
+ return startClientOptions (t , logger , serverURL , me , peer , & tailnet.Options {
291
+ Addresses : []netip.Prefix {netip .PrefixFrom (tailnet .IPFromUUID (me . ID ), 128 )},
292
+ DERPMap : derpMap ,
271
293
BlockEndpoints : true ,
272
294
Logger : logger ,
273
295
DERPForceWebSockets : false ,
296
+ ListenPort : me .ListenPort ,
274
297
// These tests don't have internet connection, so we need to force
275
298
// magicsock to do anything.
276
299
ForceNetworkUp : true ,
@@ -279,13 +302,14 @@ func StartClientDERP(t *testing.T, logger slog.Logger, serverURL *url.URL, myID,
279
302
280
303
// StartClientDERPWebSockets does the same thing as StartClientDERP but will
281
304
// only use DERP WebSocket fallback.
282
- func StartClientDERPWebSockets (t * testing.T , logger slog.Logger , serverURL * url.URL , myID , peerID uuid. UUID ) * tailnet.Conn {
283
- return startClientOptions (t , logger , serverURL , myID , peerID , & tailnet.Options {
284
- Addresses : []netip.Prefix {netip .PrefixFrom (tailnet .IPFromUUID (myID ), 128 )},
285
- DERPMap : basicDERPMap ( t , serverURL ) ,
305
+ func StartClientDERPWebSockets (t * testing.T , logger slog.Logger , serverURL * url.URL , derpMap * tailcfg. DERPMap , me , peer Client ) * tailnet.Conn {
306
+ return startClientOptions (t , logger , serverURL , me , peer , & tailnet.Options {
307
+ Addresses : []netip.Prefix {netip .PrefixFrom (tailnet .IPFromUUID (me . ID ), 128 )},
308
+ DERPMap : derpMap ,
286
309
BlockEndpoints : true ,
287
310
Logger : logger ,
288
311
DERPForceWebSockets : true ,
312
+ ListenPort : me .ListenPort ,
289
313
// These tests don't have internet connection, so we need to force
290
314
// magicsock to do anything.
291
315
ForceNetworkUp : true ,
@@ -295,20 +319,21 @@ func StartClientDERPWebSockets(t *testing.T, logger slog.Logger, serverURL *url.
295
319
// StartClientDirect does the same thing as StartClientDERP but disables
296
320
// BlockEndpoints (which enables Direct connections), and waits for a direct
297
321
// connection to be established between the two peers.
298
- func StartClientDirect (t * testing.T , logger slog.Logger , serverURL * url.URL , myID , peerID uuid. UUID ) * tailnet.Conn {
299
- conn := startClientOptions (t , logger , serverURL , myID , peerID , & tailnet.Options {
300
- Addresses : []netip.Prefix {netip .PrefixFrom (tailnet .IPFromUUID (myID ), 128 )},
301
- DERPMap : basicDERPMap ( t , serverURL ) ,
322
+ func StartClientDirect (t * testing.T , logger slog.Logger , serverURL * url.URL , derpMap * tailcfg. DERPMap , me , peer Client ) * tailnet.Conn {
323
+ conn := startClientOptions (t , logger , serverURL , me , peer , & tailnet.Options {
324
+ Addresses : []netip.Prefix {netip .PrefixFrom (tailnet .IPFromUUID (me . ID ), 128 )},
325
+ DERPMap : derpMap ,
302
326
BlockEndpoints : false ,
303
327
Logger : logger ,
304
328
DERPForceWebSockets : true ,
329
+ ListenPort : me .ListenPort ,
305
330
// These tests don't have internet connection, so we need to force
306
331
// magicsock to do anything.
307
332
ForceNetworkUp : true ,
308
333
})
309
334
310
335
// Wait for direct connection to be established.
311
- peerIP := tailnet .IPFromUUID (peerID )
336
+ peerIP := tailnet .IPFromUUID (peer . ID )
312
337
require .Eventually (t , func () bool {
313
338
t .Log ("attempting ping to peer to judge direct connection" )
314
339
ctx := testutil .Context (t , testutil .WaitShort )
@@ -332,8 +357,8 @@ type ClientStarter struct {
332
357
Options * tailnet.Options
333
358
}
334
359
335
- func startClientOptions (t * testing.T , logger slog.Logger , serverURL * url.URL , myID , peerID uuid. UUID , options * tailnet.Options ) * tailnet.Conn {
336
- u , err := serverURL .Parse (fmt .Sprintf ("/api/v2/workspaceagents/%s/coordinate" , myID .String ()))
360
+ func startClientOptions (t * testing.T , logger slog.Logger , serverURL * url.URL , me , peer Client , options * tailnet.Options ) * tailnet.Conn {
361
+ u , err := serverURL .Parse (fmt .Sprintf ("/api/v2/workspaceagents/%s/coordinate" , me . ID .String ()))
337
362
require .NoError (t , err )
338
363
//nolint:bodyclose
339
364
ws , _ , err := websocket .Dial (context .Background (), u .String (), nil )
@@ -357,18 +382,25 @@ func startClientOptions(t *testing.T, logger slog.Logger, serverURL *url.URL, my
357
382
_ = conn .Close ()
358
383
})
359
384
360
- coordination := tailnet .NewRemoteCoordination (logger , coord , conn , peerID )
385
+ coordination := tailnet .NewRemoteCoordination (logger , coord , conn , peer . ID )
361
386
t .Cleanup (func () {
362
387
_ = coordination .Close ()
363
388
})
364
389
365
390
return conn
366
391
}
367
392
368
- func basicDERPMap (t * testing.T , serverURL * url.URL ) * tailcfg.DERPMap {
393
+ func basicDERPMap (serverURLStr string ) (* tailcfg.DERPMap , error ) {
394
+ serverURL , err := url .Parse (serverURLStr )
395
+ if err != nil {
396
+ return nil , xerrors .Errorf ("parse server URL %q: %w" , serverURLStr , err )
397
+ }
398
+
369
399
portStr := serverURL .Port ()
370
400
port , err := strconv .Atoi (portStr )
371
- require .NoError (t , err , "parse server port" )
401
+ if err != nil {
402
+ return nil , xerrors .Errorf ("parse port %q: %w" , portStr , err )
403
+ }
372
404
373
405
hostname := serverURL .Hostname ()
374
406
ipv4 := ""
@@ -399,7 +431,7 @@ func basicDERPMap(t *testing.T, serverURL *url.URL) *tailcfg.DERPMap {
399
431
},
400
432
},
401
433
},
402
- }
434
+ }, nil
403
435
}
404
436
405
437
// ExecBackground starts a subprocess with the given flags and returns a
0 commit comments