@@ -21,7 +21,7 @@ import (
21
21
"github.com/coder/coder/testutil"
22
22
)
23
23
24
- //nolint:paralleltest // Non-parallel subtests .
24
+ //nolint:tparallel, paralleltest // Subtests require setup that must not be done in parallel .
25
25
func TestPortForward (t * testing.T ) {
26
26
t .Run ("None" , func (t * testing.T ) {
27
27
t .Parallel ()
@@ -119,95 +119,93 @@ func TestPortForward(t *testing.T) {
119
119
// Delay parallel tests here because setupLocal reserves
120
120
// a free open port which is not guaranteed to be free
121
121
// between the listener closing and port-forward ready.
122
- t .Run (c .name , func (t * testing.T ) {
123
- t .Run ("OnePort" , func (t * testing.T ) {
124
- p1 := setupTestListener (t , c .setupRemote (t ))
125
-
126
- // Create a flag that forwards from local to listener 1.
127
- localAddress , localFlag := c .setupLocal (t )
128
- flag := fmt .Sprintf (c .flag , localFlag , p1 )
129
-
130
- // Launch port-forward in a goroutine so we can start dialing
131
- // the "local" listener.
132
- inv , root := clitest .New (t , "-v" , "port-forward" , workspace .Name , flag )
133
- clitest .SetupConfig (t , client , root )
134
- pty := ptytest .New (t )
135
- inv .Stdin = pty .Input ()
136
- inv .Stdout = pty .Output ()
137
- inv .Stderr = pty .Output ()
138
- ctx , cancel := context .WithCancel (context .Background ())
139
- defer cancel ()
140
- errC := make (chan error )
141
- go func () {
142
- errC <- inv .WithContext (ctx ).Run ()
143
- }()
144
- pty .ExpectMatch ("Ready!" )
145
-
146
- t .Parallel () // Port is reserved, enable parallel execution.
147
-
148
- // Open two connections simultaneously and test them out of
149
- // sync.
150
- d := net.Dialer {Timeout : testutil .WaitShort }
151
- c1 , err := d .DialContext (ctx , c .network , localAddress )
152
- require .NoError (t , err , "open connection 1 to 'local' listener" )
153
- defer c1 .Close ()
154
- c2 , err := d .DialContext (ctx , c .network , localAddress )
155
- require .NoError (t , err , "open connection 2 to 'local' listener" )
156
- defer c2 .Close ()
157
- testDial (t , c2 )
158
- testDial (t , c1 )
159
-
160
- cancel ()
161
- err = <- errC
162
- require .ErrorIs (t , err , context .Canceled )
163
- })
122
+ t .Run (c .name + "_OnePort" , func (t * testing.T ) {
123
+ p1 := setupTestListener (t , c .setupRemote (t ))
164
124
165
- t .Run ("TwoPorts" , func (t * testing.T ) {
166
- var (
167
- p1 = setupTestListener (t , c .setupRemote (t ))
168
- p2 = setupTestListener (t , c .setupRemote (t ))
169
- )
170
-
171
- // Create a flags for listener 1 and listener 2.
172
- localAddress1 , localFlag1 := c .setupLocal (t )
173
- localAddress2 , localFlag2 := c .setupLocal (t )
174
- flag1 := fmt .Sprintf (c .flag , localFlag1 , p1 )
175
- flag2 := fmt .Sprintf (c .flag , localFlag2 , p2 )
176
-
177
- // Launch port-forward in a goroutine so we can start dialing
178
- // the "local" listeners.
179
- inv , root := clitest .New (t , "-v" , "port-forward" , workspace .Name , flag1 , flag2 )
180
- clitest .SetupConfig (t , client , root )
181
- pty := ptytest .New (t )
182
- inv .Stdin = pty .Input ()
183
- inv .Stdout = pty .Output ()
184
- inv .Stderr = pty .Output ()
185
- ctx , cancel := context .WithCancel (context .Background ())
186
- defer cancel ()
187
- errC := make (chan error )
188
- go func () {
189
- errC <- inv .WithContext (ctx ).Run ()
190
- }()
191
- pty .ExpectMatch ("Ready!" )
192
-
193
- t .Parallel () // Port is reserved, enable parallel execution.
194
-
195
- // Open a connection to both listener 1 and 2 simultaneously and
196
- // then test them out of order.
197
- d := net.Dialer {Timeout : testutil .WaitShort }
198
- c1 , err := d .DialContext (ctx , c .network , localAddress1 )
199
- require .NoError (t , err , "open connection 1 to 'local' listener 1" )
200
- defer c1 .Close ()
201
- c2 , err := d .DialContext (ctx , c .network , localAddress2 )
202
- require .NoError (t , err , "open connection 2 to 'local' listener 2" )
203
- defer c2 .Close ()
204
- testDial (t , c2 )
205
- testDial (t , c1 )
206
-
207
- cancel ()
208
- err = <- errC
209
- require .ErrorIs (t , err , context .Canceled )
210
- })
125
+ // Create a flag that forwards from local to listener 1.
126
+ localAddress , localFlag := c .setupLocal (t )
127
+ flag := fmt .Sprintf (c .flag , localFlag , p1 )
128
+
129
+ // Launch port-forward in a goroutine so we can start dialing
130
+ // the "local" listener.
131
+ inv , root := clitest .New (t , "-v" , "port-forward" , workspace .Name , flag )
132
+ clitest .SetupConfig (t , client , root )
133
+ pty := ptytest .New (t )
134
+ inv .Stdin = pty .Input ()
135
+ inv .Stdout = pty .Output ()
136
+ inv .Stderr = pty .Output ()
137
+ ctx , cancel := context .WithCancel (context .Background ())
138
+ defer cancel ()
139
+ errC := make (chan error )
140
+ go func () {
141
+ errC <- inv .WithContext (ctx ).Run ()
142
+ }()
143
+ pty .ExpectMatch ("Ready!" )
144
+
145
+ t .Parallel () // Port is reserved, enable parallel execution.
146
+
147
+ // Open two connections simultaneously and test them out of
148
+ // sync.
149
+ d := net.Dialer {Timeout : testutil .WaitShort }
150
+ c1 , err := d .DialContext (ctx , c .network , localAddress )
151
+ require .NoError (t , err , "open connection 1 to 'local' listener" )
152
+ defer c1 .Close ()
153
+ c2 , err := d .DialContext (ctx , c .network , localAddress )
154
+ require .NoError (t , err , "open connection 2 to 'local' listener" )
155
+ defer c2 .Close ()
156
+ testDial (t , c2 )
157
+ testDial (t , c1 )
158
+
159
+ cancel ()
160
+ err = <- errC
161
+ require .ErrorIs (t , err , context .Canceled )
162
+ })
163
+
164
+ t .Run (c .name + "_TwoPorts" , func (t * testing.T ) {
165
+ var (
166
+ p1 = setupTestListener (t , c .setupRemote (t ))
167
+ p2 = setupTestListener (t , c .setupRemote (t ))
168
+ )
169
+
170
+ // Create a flags for listener 1 and listener 2.
171
+ localAddress1 , localFlag1 := c .setupLocal (t )
172
+ localAddress2 , localFlag2 := c .setupLocal (t )
173
+ flag1 := fmt .Sprintf (c .flag , localFlag1 , p1 )
174
+ flag2 := fmt .Sprintf (c .flag , localFlag2 , p2 )
175
+
176
+ // Launch port-forward in a goroutine so we can start dialing
177
+ // the "local" listeners.
178
+ inv , root := clitest .New (t , "-v" , "port-forward" , workspace .Name , flag1 , flag2 )
179
+ clitest .SetupConfig (t , client , root )
180
+ pty := ptytest .New (t )
181
+ inv .Stdin = pty .Input ()
182
+ inv .Stdout = pty .Output ()
183
+ inv .Stderr = pty .Output ()
184
+ ctx , cancel := context .WithCancel (context .Background ())
185
+ defer cancel ()
186
+ errC := make (chan error )
187
+ go func () {
188
+ errC <- inv .WithContext (ctx ).Run ()
189
+ }()
190
+ pty .ExpectMatch ("Ready!" )
191
+
192
+ t .Parallel () // Port is reserved, enable parallel execution.
193
+
194
+ // Open a connection to both listener 1 and 2 simultaneously and
195
+ // then test them out of order.
196
+ d := net.Dialer {Timeout : testutil .WaitShort }
197
+ c1 , err := d .DialContext (ctx , c .network , localAddress1 )
198
+ require .NoError (t , err , "open connection 1 to 'local' listener 1" )
199
+ defer c1 .Close ()
200
+ c2 , err := d .DialContext (ctx , c .network , localAddress2 )
201
+ require .NoError (t , err , "open connection 2 to 'local' listener 2" )
202
+ defer c2 .Close ()
203
+ testDial (t , c2 )
204
+ testDial (t , c1 )
205
+
206
+ cancel ()
207
+ err = <- errC
208
+ require .ErrorIs (t , err , context .Canceled )
211
209
})
212
210
}
213
211
0 commit comments