Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c4a068f

Browse files
committed
Use one-level of subtests in port test
1 parent ec0cc6b commit c4a068f

File tree

1 file changed

+87
-89
lines changed

1 file changed

+87
-89
lines changed

cli/portforward_test.go

Lines changed: 87 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import (
2121
"github.com/coder/coder/testutil"
2222
)
2323

24-
//nolint:paralleltest // Non-parallel subtests.
24+
//nolint:tparallel,paralleltest // Subtests require setup that must not be done in parallel.
2525
func TestPortForward(t *testing.T) {
2626
t.Run("None", func(t *testing.T) {
2727
t.Parallel()
@@ -119,95 +119,93 @@ func TestPortForward(t *testing.T) {
119119
// Delay parallel tests here because setupLocal reserves
120120
// a free open port which is not guaranteed to be free
121121
// 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))
164124

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)
211209
})
212210
}
213211

0 commit comments

Comments
 (0)