Skip to content

Commit d7303d0

Browse files
committed
Wait for OpenSSL server shutdown in e2e test
Updates e2e tests to wait until server shutdown before completing to ensure that we do not trigger errors due to leaked watchCtx goroutine, which was added to os/exec.Command in Go 1.20. We do so by moving from implicit shutdown via context cancellation to explicit shutdown. https://tip.golang.org/doc/go1.20 Signed-off-by: Daniel Mangum <georgedanielmangum@gmail.com>
1 parent 159122f commit d7303d0

2 files changed

Lines changed: 47 additions & 2 deletions

File tree

e2e/e2e_openssl_test.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func serverOpenSSL(c *comm) {
7878

7979
// launch command
8080
// #nosec G204
81-
cmd := exec.CommandContext(c.ctx, "openssl", args...)
81+
cmd := exec.Command("openssl", args...)
8282
var inner net.Conn
8383
inner, c.serverConn = net.Pipe()
8484
cmd.Stdin = inner
@@ -95,6 +95,8 @@ func serverOpenSSL(c *comm) {
9595

9696
c.serverReady <- struct{}{}
9797
simpleReadWrite(c.errChan, c.serverChan, c.serverConn, c.messageRecvCount)
98+
c.serverDone <- cmd.Process.Kill()
99+
close(c.serverDone)
98100
}()
99101
}
100102

@@ -155,7 +157,7 @@ func clientOpenSSL(c *comm) {
155157

156158
// launch command
157159
// #nosec G204
158-
cmd := exec.CommandContext(c.ctx, "openssl", args...)
160+
cmd := exec.Command("openssl", args...)
159161
var inner net.Conn
160162
inner, c.clientConn = net.Pipe()
161163
cmd.Stdin = inner
@@ -168,6 +170,8 @@ func clientOpenSSL(c *comm) {
168170
}
169171

170172
simpleReadWrite(c.errChan, c.clientChan, c.clientConn, c.messageRecvCount)
173+
c.clientDone <- cmd.Process.Kill()
174+
close(c.clientDone)
171175
}
172176

173177
func ciphersOpenSSL(cfg *dtls.Config) string {

e2e/e2e_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,12 @@ type comm struct {
8585
messageRecvCount *uint64 // Counter to make sure both sides got a message
8686
clientMutex *sync.Mutex
8787
clientConn net.Conn
88+
clientDone chan error
8889
serverMutex *sync.Mutex
8990
serverConn net.Conn
9091
serverListener net.Listener
9192
serverReady chan struct{}
93+
serverDone chan error
9294
errChan chan error
9395
clientChan chan string
9496
serverChan chan string
@@ -107,6 +109,8 @@ func newComm(ctx context.Context, clientConfig, serverConfig *dtls.Config, serve
107109
clientMutex: &sync.Mutex{},
108110
serverMutex: &sync.Mutex{},
109111
serverReady: make(chan struct{}),
112+
serverDone: make(chan error),
113+
clientDone: make(chan error),
110114
errChan: make(chan error),
111115
clientChan: make(chan string),
112116
serverChan: make(chan string),
@@ -172,6 +176,32 @@ func (c *comm) assert(t *testing.T) {
172176
}()
173177
}
174178

179+
func (c *comm) cleanup(t *testing.T) {
180+
clientDone, serverDone := false, false
181+
for {
182+
select {
183+
case err := <-c.clientDone:
184+
if err != nil {
185+
t.Fatal(err)
186+
}
187+
clientDone = true
188+
if clientDone && serverDone {
189+
return
190+
}
191+
case err := <-c.serverDone:
192+
if err != nil {
193+
t.Fatal(err)
194+
}
195+
serverDone = true
196+
if clientDone && serverDone {
197+
return
198+
}
199+
case <-time.After(testTimeLimit):
200+
t.Fatalf("Test timeout waiting for server shutdown")
201+
}
202+
}
203+
}
204+
175205
func clientPion(c *comm) {
176206
select {
177207
case <-c.serverReady:
@@ -194,6 +224,8 @@ func clientPion(c *comm) {
194224
}
195225

196226
simpleReadWrite(c.errChan, c.clientChan, c.clientConn, c.messageRecvCount)
227+
c.clientDone <- nil
228+
close(c.clientDone)
197229
}
198230

199231
func serverPion(c *comm) {
@@ -217,6 +249,8 @@ func serverPion(c *comm) {
217249
}
218250

219251
simpleReadWrite(c.errChan, c.serverChan, c.serverConn, c.messageRecvCount)
252+
c.serverDone <- nil
253+
close(c.serverDone)
220254
}
221255

222256
/*
@@ -254,6 +288,7 @@ func testPionE2ESimple(t *testing.T, server, client func(*comm)) {
254288
}
255289
serverPort := randomPort(t)
256290
comm := newComm(ctx, cfg, cfg, serverPort, server, client)
291+
defer comm.cleanup(t)
257292
comm.assert(t)
258293
})
259294
}
@@ -287,6 +322,7 @@ func testPionE2ESimplePSK(t *testing.T, server, client func(*comm)) {
287322
}
288323
serverPort := randomPort(t)
289324
comm := newComm(ctx, cfg, cfg, serverPort, server, client)
325+
defer comm.cleanup(t)
290326
comm.assert(t)
291327
})
292328
}
@@ -322,6 +358,7 @@ func testPionE2EMTUs(t *testing.T, server, client func(*comm)) {
322358
}
323359
serverPort := randomPort(t)
324360
comm := newComm(ctx, cfg, cfg, serverPort, server, client)
361+
defer comm.cleanup(t)
325362
comm.assert(t)
326363
})
327364
}
@@ -362,6 +399,7 @@ func testPionE2ESimpleED25519(t *testing.T, server, client func(*comm)) {
362399
}
363400
serverPort := randomPort(t)
364401
comm := newComm(ctx, cfg, cfg, serverPort, server, client)
402+
defer comm.cleanup(t)
365403
comm.assert(t)
366404
})
367405
}
@@ -407,6 +445,7 @@ func testPionE2ESimpleED25519ClientCert(t *testing.T, server, client func(*comm)
407445
}
408446
serverPort := randomPort(t)
409447
comm := newComm(ctx, ccfg, scfg, serverPort, server, client)
448+
defer comm.cleanup(t)
410449
comm.assert(t)
411450
}
412451

@@ -450,6 +489,7 @@ func testPionE2ESimpleECDSAClientCert(t *testing.T, server, client func(*comm))
450489
}
451490
serverPort := randomPort(t)
452491
comm := newComm(ctx, ccfg, scfg, serverPort, server, client)
492+
defer comm.cleanup(t)
453493
comm.assert(t)
454494
}
455495

@@ -493,6 +533,7 @@ func testPionE2ESimpleRSAClientCert(t *testing.T, server, client func(*comm)) {
493533
}
494534
serverPort := randomPort(t)
495535
comm := newComm(ctx, ccfg, scfg, serverPort, server, client)
536+
defer comm.cleanup(t)
496537
comm.assert(t)
497538
}
498539

0 commit comments

Comments
 (0)