@@ -80,6 +80,10 @@ func runTest(
8080 }()
8181 // Run test inner function
8282 innerFunc (t , oConn )
83+ // Stop the client to clean up goroutines
84+ if client := oConn .ChainSync ().Client ; client != nil {
85+ client .Stop ()
86+ }
8387 // Wait for mock connection shutdown
8488 select {
8589 case err , ok := <- asyncErrChan :
@@ -275,3 +279,58 @@ func TestGetAvailableBlockRange(t *testing.T) {
275279 },
276280 )
277281}
282+
283+ func TestClientShutdown (t * testing.T ) {
284+ defer goleak .VerifyNone (t )
285+ mockConn := ouroboros_mock .NewConnection (
286+ ouroboros_mock .ProtocolRoleClient ,
287+ []ouroboros_mock.ConversationEntry {
288+ ouroboros_mock .ConversationEntryHandshakeRequestGeneric ,
289+ ouroboros_mock .ConversationEntryHandshakeNtCResponse ,
290+ },
291+ )
292+ asyncErrChan := make (chan error , 1 )
293+ go func () {
294+ err := <- mockConn .(* ouroboros_mock.Connection ).ErrorChan ()
295+ if err != nil {
296+ asyncErrChan <- fmt .Errorf ("received unexpected error: %w" , err )
297+ }
298+ close (asyncErrChan )
299+ }()
300+ oConn , err := ouroboros .New (
301+ ouroboros .WithConnection (mockConn ),
302+ ouroboros .WithNetworkMagic (ouroboros_mock .MockNetworkMagic ),
303+ ouroboros .WithChainSyncConfig (chainsync .NewConfig ()),
304+ )
305+ if err != nil {
306+ t .Fatalf ("unexpected error when creating Ouroboros object: %s" , err )
307+ }
308+ if oConn .ChainSync () == nil {
309+ t .Fatalf ("ChainSync client is nil" )
310+ }
311+ // Start the client
312+ oConn .ChainSync ().Client .Start ()
313+ // Stop the client
314+ if err := oConn .ChainSync ().Client .Stop (); err != nil {
315+ t .Fatalf ("unexpected error when stopping client: %s" , err )
316+ }
317+ // Wait for mock connection shutdown
318+ select {
319+ case err , ok := <- asyncErrChan :
320+ if ok {
321+ t .Fatal (err .Error ())
322+ }
323+ case <- time .After (2 * time .Second ):
324+ t .Fatalf ("did not complete within timeout" )
325+ }
326+ // Close Ouroboros connection
327+ if err := oConn .Close (); err != nil {
328+ t .Fatalf ("unexpected error when closing Ouroboros object: %s" , err )
329+ }
330+ // Wait for connection shutdown
331+ select {
332+ case <- oConn .ErrorChan ():
333+ case <- time .After (10 * time .Second ):
334+ t .Errorf ("did not shutdown within timeout" )
335+ }
336+ }
0 commit comments