@@ -322,6 +322,8 @@ func TestStreamableServerShutdown(t *testing.T) {
322322// network failure and receive replayed messages (if replay is configured). It
323323// uses a proxy that is killed and restarted to simulate a recoverable network
324324// outage.
325+ //
326+ // TODO: Until we have a way to clean up abandoned sessions, this test will leak goroutines (see #499)
325327func TestClientReplay (t * testing.T ) {
326328 for _ , test := range []clientReplayTest {
327329 {"default" , 0 , true },
@@ -369,7 +371,10 @@ func testClientReplay(t *testing.T, test clientReplayTest) {
369371 })
370372
371373 realServer := httptest .NewServer (mustNotPanic (t , NewStreamableHTTPHandler (func (* http.Request ) * Server { return server }, nil )))
372- defer realServer .Close ()
374+ t .Cleanup (func () {
375+ t .Log ("Closing real HTTP server" )
376+ realServer .Close ()
377+ })
373378 realServerURL , err := url .Parse (realServer .URL )
374379 if err != nil {
375380 t .Fatalf ("Failed to parse real server URL: %v" , err )
@@ -396,21 +401,20 @@ func testClientReplay(t *testing.T, test clientReplayTest) {
396401 if err != nil {
397402 t .Fatalf ("client.Connect() failed: %v" , err )
398403 }
399- defer clientSession .Close ()
404+ t .Cleanup (func () {
405+ t .Log ("Closing clientSession" )
406+ clientSession .Close ()
407+ })
400408
401- var (
402- wg sync.WaitGroup
403- callErr error
404- )
405- wg .Add (1 )
409+ toolCallResult := make (chan error , 1 )
406410 go func () {
407- defer wg . Done ( )
408- _ , callErr = clientSession . CallTool ( ctx , & CallToolParams { Name : "multiMessageTool" })
411+ _ , callErr := clientSession . CallTool ( ctx , & CallToolParams { Name : "multiMessageTool" } )
412+ toolCallResult <- callErr
409413 }()
410414
411415 select {
412416 case <- serverReadyToKillProxy :
413- // Server has sent the first two messages and is paused.
417+ t . Log ( " Server has sent the first two messages and is paused." )
414418 case <- ctx .Done ():
415419 t .Fatalf ("Context timed out before server was ready to kill proxy" )
416420 }
@@ -438,9 +442,9 @@ func testClientReplay(t *testing.T, test clientReplayTest) {
438442
439443 restartedProxy := & http.Server {Handler : proxyHandler }
440444 go restartedProxy .Serve (listener )
441- defer restartedProxy .Close ()
445+ t . Cleanup ( func () { restartedProxy .Close () } )
442446
443- wg . Wait ()
447+ callErr := <- toolCallResult
444448
445449 if test .wantRecovered {
446450 // If we've recovered, we should get all 4 notifications and the tool call
@@ -514,14 +518,15 @@ func TestServerTransportCleanup(t *testing.T) {
514518 if err != nil {
515519 t .Fatalf ("client.Connect() failed: %v" , err )
516520 }
517- defer clientSession .Close ()
521+ t . Cleanup ( func () { _ = clientSession .Close () } )
518522 }
519523
520524 for _ , ch := range chans {
521525 select {
522526 case <- ctx .Done ():
523527 t .Errorf ("did not capture transport deletion event from all session in 10 seconds" )
524- case <- ch : // Received transport deletion signal of this session
528+ case <- ch :
529+ t .Log ("Received session transport deletion signal" )
525530 }
526531 }
527532
@@ -1307,6 +1312,7 @@ func TestStreamableStateless(t *testing.T) {
13071312 if err != nil {
13081313 t .Fatal (err )
13091314 }
1315+ t .Cleanup (func () { cs .Close () })
13101316 res , err := cs .CallTool (ctx , & CallToolParams {Name : "greet" , Arguments : hiParams {Name : "bar" }})
13111317 if err != nil {
13121318 t .Fatal (err )
@@ -1485,6 +1491,18 @@ func TestStreamableGET(t *testing.T) {
14851491 if got , want := resp .StatusCode , http .StatusOK ; got != want {
14861492 t .Errorf ("GET with session ID: got status %d, want %d" , got , want )
14871493 }
1494+
1495+ t .Log ("Sending final DELETE request to close session and release resources" )
1496+ del := newReq ("DELETE" , nil )
1497+ del .Header .Set (sessionIDHeader , sessionID )
1498+ resp , err = http .DefaultClient .Do (del )
1499+ if err != nil {
1500+ t .Fatal (err )
1501+ }
1502+ defer resp .Body .Close ()
1503+ if got , want := resp .StatusCode , http .StatusNoContent ; got != want {
1504+ t .Errorf ("DELETE with session ID: got status %d, want %d" , got , want )
1505+ }
14881506}
14891507
14901508func TestStreamableClientContextPropagation (t * testing.T ) {
0 commit comments