mcp: fix goroutine leaks in unit tests (#496)
This PR fixes goroutine leaks in all unit tests. To find the leaks I integrated https://github.com/uber-go/goleak and I suggest to keep using it to catch any future regressions. I used the folowing script to more easily find individual tests which were leaking goroutines: ``` for t in $(go test -run=Nothing -list=. ./mcp | grep -v ok); do go test ./mcp -run="$t" > /dev/null && echo -n . || echo -e "\nDetected leak: $t"; done ```
This commit is contained in:
parent
14e776db6f
commit
010bdbc64d
1 changed files with 72 additions and 54 deletions
|
|
@ -118,16 +118,6 @@ func TestEndToEnd(t *testing.T) {
|
|||
t.Errorf("after connection, Clients() has length %d, want 1", len(got))
|
||||
}
|
||||
|
||||
// Wait for the server to exit after the client closes its connection.
|
||||
var clientWG sync.WaitGroup
|
||||
clientWG.Add(1)
|
||||
go func() {
|
||||
if err := ss.Wait(); err != nil {
|
||||
t.Errorf("server failed: %v", err)
|
||||
}
|
||||
clientWG.Done()
|
||||
}()
|
||||
|
||||
loggingMessages := make(chan *LoggingMessageParams, 100) // big enough for all logging
|
||||
opts := &ClientOptions{
|
||||
CreateMessageHandler: func(context.Context, *CreateMessageRequest) (*CreateMessageResult, error) {
|
||||
|
|
@ -518,7 +508,9 @@ func TestEndToEnd(t *testing.T) {
|
|||
|
||||
// Disconnect.
|
||||
cs.Close()
|
||||
clientWG.Wait()
|
||||
if err := ss.Wait(); err != nil {
|
||||
t.Errorf("server failed: %v", err)
|
||||
}
|
||||
|
||||
// After disconnecting, neither client nor server should have any
|
||||
// connections.
|
||||
|
|
@ -626,6 +618,7 @@ func basicClientServerConnection(t *testing.T, client *Client, server *Server, c
|
|||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Cleanup(func() { _ = ss.Close() })
|
||||
|
||||
if client == nil {
|
||||
client = NewClient(testImpl, nil)
|
||||
|
|
@ -634,6 +627,8 @@ func basicClientServerConnection(t *testing.T, client *Client, server *Server, c
|
|||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Cleanup(func() { _ = cs.Close() })
|
||||
|
||||
return cs, ss, func() {
|
||||
cs.Close()
|
||||
ss.Wait()
|
||||
|
|
@ -750,11 +745,7 @@ func TestMiddleware(t *testing.T) {
|
|||
t.Fatal(err)
|
||||
}
|
||||
// Wait for the server to exit after the client closes its connection.
|
||||
defer func() {
|
||||
if err := ss.Wait(); err != nil {
|
||||
t.Errorf("server failed: %v", err)
|
||||
}
|
||||
}()
|
||||
t.Cleanup(func() { _ = ss.Close() })
|
||||
|
||||
var sbuf, cbuf bytes.Buffer
|
||||
sbuf.WriteByte('\n')
|
||||
|
|
@ -773,7 +764,7 @@ func TestMiddleware(t *testing.T) {
|
|||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
defer cs.Close()
|
||||
t.Cleanup(func() { _ = cs.Close() })
|
||||
|
||||
if _, err := cs.ListTools(ctx, nil); err != nil {
|
||||
t.Fatal(err)
|
||||
|
|
|
|||
Loading…
Reference in a new issue