@@ -142,21 +142,22 @@ func TestPortForward(t *testing.T) {
142
142
},
143
143
}
144
144
145
+ // Setup agent once to be shared between test-cases (avoid expensive
146
+ // non-parallel setup).
147
+ var (
148
+ client = coderdtest .New (t , & coderdtest.Options {IncludeProvisionerD : true })
149
+ user = coderdtest .CreateFirstUser (t , client )
150
+ _ , workspace = runAgent (t , client , user .UserID )
151
+ )
152
+
145
153
for _ , c := range cases { //nolint:paralleltest // the `c := c` confuses the linter
146
154
c := c
147
- // Avoid parallel test here because setupLocal reserves
155
+ // Delay parallel tests here because setupLocal reserves
148
156
// a free open port which is not guaranteed to be free
149
- // after the listener closes.
150
- //nolint:paralleltest
157
+ // between the listener closing and port-forward ready.
151
158
t .Run (c .name , func (t * testing.T ) {
152
- //nolint:paralleltest
153
159
t .Run ("OnePort" , func (t * testing.T ) {
154
- var (
155
- client = coderdtest .New (t , & coderdtest.Options {IncludeProvisionerD : true })
156
- user = coderdtest .CreateFirstUser (t , client )
157
- _ , workspace = runAgent (t , client , user .UserID )
158
- p1 = setupTestListener (t , c .setupRemote (t ))
159
- )
160
+ p1 := setupTestListener (t , c .setupRemote (t ))
160
161
161
162
// Create a flag that forwards from local to listener 1.
162
163
localAddress , localFlag := c .setupLocal (t )
@@ -176,6 +177,8 @@ func TestPortForward(t *testing.T) {
176
177
}()
177
178
waitForPortForwardReady (t , buf )
178
179
180
+ t .Parallel () // Port is reserved, enable parallel execution.
181
+
179
182
// Open two connections simultaneously and test them out of
180
183
// sync.
181
184
d := net.Dialer {Timeout : 3 * time .Second }
@@ -196,11 +199,8 @@ func TestPortForward(t *testing.T) {
196
199
//nolint:paralleltest
197
200
t .Run ("TwoPorts" , func (t * testing.T ) {
198
201
var (
199
- client = coderdtest .New (t , & coderdtest.Options {IncludeProvisionerD : true })
200
- user = coderdtest .CreateFirstUser (t , client )
201
- _ , workspace = runAgent (t , client , user .UserID )
202
- p1 = setupTestListener (t , c .setupRemote (t ))
203
- p2 = setupTestListener (t , c .setupRemote (t ))
202
+ p1 = setupTestListener (t , c .setupRemote (t ))
203
+ p2 = setupTestListener (t , c .setupRemote (t ))
204
204
)
205
205
206
206
// Create a flags for listener 1 and listener 2.
@@ -223,6 +223,8 @@ func TestPortForward(t *testing.T) {
223
223
}()
224
224
waitForPortForwardReady (t , buf )
225
225
226
+ t .Parallel () // Port is reserved, enable parallel execution.
227
+
226
228
// Open a connection to both listener 1 and 2 simultaneously and
227
229
// then test them out of order.
228
230
d := net.Dialer {Timeout : 3 * time .Second }
@@ -246,10 +248,6 @@ func TestPortForward(t *testing.T) {
246
248
//nolint:paralleltest
247
249
t .Run ("TCP2Unix" , func (t * testing.T ) {
248
250
var (
249
- client = coderdtest .New (t , & coderdtest.Options {IncludeProvisionerD : true })
250
- user = coderdtest .CreateFirstUser (t , client )
251
- _ , workspace = runAgent (t , client , user .UserID )
252
-
253
251
// Find the TCP and Unix cases so we can use their setupLocal and
254
252
// setupRemote methods respectively.
255
253
tcpCase = cases [0 ]
@@ -278,6 +276,8 @@ func TestPortForward(t *testing.T) {
278
276
}()
279
277
waitForPortForwardReady (t , buf )
280
278
279
+ t .Parallel () // Port is reserved, enable parallel execution.
280
+
281
281
// Open two connections simultaneously and test them out of
282
282
// sync.
283
283
d := net.Dialer {Timeout : 3 * time .Second }
@@ -299,9 +299,6 @@ func TestPortForward(t *testing.T) {
299
299
//nolint:paralleltest
300
300
t .Run ("All" , func (t * testing.T ) {
301
301
var (
302
- client = coderdtest .New (t , & coderdtest.Options {IncludeProvisionerD : true })
303
- user = coderdtest .CreateFirstUser (t , client )
304
- _ , workspace = runAgent (t , client , user .UserID )
305
302
// These aren't fixed size because we exclude Unix on Windows.
306
303
dials = []addr {}
307
304
flags = []string {}
@@ -339,6 +336,8 @@ func TestPortForward(t *testing.T) {
339
336
}()
340
337
waitForPortForwardReady (t , buf )
341
338
339
+ t .Parallel () // Port is reserved, enable parallel execution.
340
+
342
341
// Open connections to all items in the "dial" array.
343
342
var (
344
343
d = net.Dialer {Timeout : 3 * time .Second }
@@ -425,6 +424,8 @@ func runAgent(t *testing.T, client *codersdk.Client, userID uuid.UUID) ([]coders
425
424
// setupTestListener starts accepting connections and echoing a single packet.
426
425
// Returns the listener and the listen port or Unix path.
427
426
func setupTestListener (t * testing.T , l net.Listener ) string {
427
+ t .Helper ()
428
+
428
429
// Wait for listener to completely exit before releasing.
429
430
done := make (chan struct {})
430
431
t .Cleanup (func () {
@@ -440,6 +441,7 @@ func setupTestListener(t *testing.T, l net.Listener) string {
440
441
for {
441
442
c , err := l .Accept ()
442
443
if err != nil {
444
+ _ = l .Close ()
443
445
return
444
446
}
445
447
@@ -479,6 +481,7 @@ func testAccept(t *testing.T, c net.Conn) {
479
481
}
480
482
481
483
func assertReadPayload (t * testing.T , r io.Reader , payload []byte ) {
484
+ t .Helper ()
482
485
b := make ([]byte , len (payload )+ 16 )
483
486
n , err := r .Read (b )
484
487
assert .NoError (t , err , "read payload" )
@@ -487,12 +490,14 @@ func assertReadPayload(t *testing.T, r io.Reader, payload []byte) {
487
490
}
488
491
489
492
func assertWritePayload (t * testing.T , w io.Writer , payload []byte ) {
493
+ t .Helper ()
490
494
n , err := w .Write (payload )
491
495
assert .NoError (t , err , "write payload" )
492
496
assert .Equal (t , len (payload ), n , "payload length does not match" )
493
497
}
494
498
495
499
func waitForPortForwardReady (t * testing.T , output * threadSafeBuffer ) {
500
+ t .Helper ()
496
501
for i := 0 ; i < 100 ; i ++ {
497
502
time .Sleep (250 * time .Millisecond )
498
503
0 commit comments