@@ -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 ,derpMap * tailcfg.DERPMap ,clientNumber int , 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,18 +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 ,derpMap * tailcfg.DERPMap ,clientNumber int ,myID ,peerID uuid.UUID )* tailnet.Conn {
268
- listenPort := uint16 (client1Port )
269
- if clientNumber == 2 {
270
- listenPort = client2Port
271
- }
272
- return startClientOptions (t ,logger ,serverURL ,myID ,peerID ,& tailnet.Options {
273
- Addresses : []netip.Prefix {netip .PrefixFrom (tailnet .IPFromUUID (myID ),128 )},
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 )},
274
292
DERPMap :derpMap ,
275
293
BlockEndpoints :true ,
276
294
Logger :logger ,
277
295
DERPForceWebSockets :false ,
278
- ListenPort :listenPort ,
296
+ ListenPort :me . ListenPort ,
279
297
// These tests don't have internet connection, so we need to force
280
298
// magicsock to do anything.
281
299
ForceNetworkUp :true ,
@@ -284,18 +302,14 @@ func StartClientDERP(t *testing.T, logger slog.Logger, serverURL *url.URL, derpM
284
302
285
303
// StartClientDERPWebSockets does the same thing as StartClientDERP but will
286
304
// only use DERP WebSocket fallback.
287
- func StartClientDERPWebSockets (t * testing.T ,logger slog.Logger ,serverURL * url.URL ,derpMap * tailcfg.DERPMap ,clientNumber int ,myID ,peerID uuid.UUID )* tailnet.Conn {
288
- listenPort := uint16 (client1Port )
289
- if clientNumber == 2 {
290
- listenPort = client2Port
291
- }
292
- return startClientOptions (t ,logger ,serverURL ,myID ,peerID ,& tailnet.Options {
293
- Addresses : []netip.Prefix {netip .PrefixFrom (tailnet .IPFromUUID (myID ),128 )},
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 )},
294
308
DERPMap :derpMap ,
295
309
BlockEndpoints :true ,
296
310
Logger :logger ,
297
311
DERPForceWebSockets :true ,
298
- ListenPort :listenPort ,
312
+ ListenPort :me . ListenPort ,
299
313
// These tests don't have internet connection, so we need to force
300
314
// magicsock to do anything.
301
315
ForceNetworkUp :true ,
@@ -305,25 +319,21 @@ func StartClientDERPWebSockets(t *testing.T, logger slog.Logger, serverURL *url.
305
319
// StartClientDirect does the same thing as StartClientDERP but disables
306
320
// BlockEndpoints (which enables Direct connections), and waits for a direct
307
321
// connection to be established between the two peers.
308
- func StartClientDirect (t * testing.T ,logger slog.Logger ,serverURL * url.URL ,derpMap * tailcfg.DERPMap ,clientNumber int ,myID ,peerID uuid.UUID )* tailnet.Conn {
309
- listenPort := uint16 (client1Port )
310
- if clientNumber == 2 {
311
- listenPort = client2Port
312
- }
313
- conn := startClientOptions (t ,logger ,serverURL ,myID ,peerID ,& tailnet.Options {
314
- Addresses : []netip.Prefix {netip .PrefixFrom (tailnet .IPFromUUID (myID ),128 )},
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 )},
315
325
DERPMap :derpMap ,
316
326
BlockEndpoints :false ,
317
327
Logger :logger ,
318
328
DERPForceWebSockets :true ,
319
- ListenPort :listenPort ,
329
+ ListenPort :me . ListenPort ,
320
330
// These tests don't have internet connection, so we need to force
321
331
// magicsock to do anything.
322
332
ForceNetworkUp :true ,
323
333
})
324
334
325
335
// Wait for direct connection to be established.
326
- peerIP := tailnet .IPFromUUID (peerID )
336
+ peerIP := tailnet .IPFromUUID (peer . ID )
327
337
require .Eventually (t ,func ()bool {
328
338
t .Log ("attempting ping to peer to judge direct connection" )
329
339
ctx := testutil .Context (t ,testutil .WaitShort )
@@ -347,8 +357,8 @@ type ClientStarter struct {
347
357
Options * tailnet.Options
348
358
}
349
359
350
- func startClientOptions (t * testing.T ,logger slog.Logger ,serverURL * url.URL ,myID , peerID uuid. UUID ,options * tailnet.Options )* tailnet.Conn {
351
- 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 ()))
352
362
require .NoError (t ,err )
353
363
//nolint:bodyclose
354
364
ws ,_ ,err := websocket .Dial (context .Background (),u .String (),nil )
@@ -372,7 +382,7 @@ func startClientOptions(t *testing.T, logger slog.Logger, serverURL *url.URL, my
372
382
_ = conn .Close ()
373
383
})
374
384
375
- coordination := tailnet .NewRemoteCoordination (logger ,coord ,conn ,peerID )
385
+ coordination := tailnet .NewRemoteCoordination (logger ,coord ,conn ,peer . ID )
376
386
t .Cleanup (func () {
377
387
_ = coordination .Close ()
378
388
})