@@ -310,3 +310,68 @@ func TestShutdownAction(t *testing.T) {
310310 action := rh .OnTraffic (mock )
311311 assert .Equal (t , gnet .Close , action )
312312}
313+
314+ func TestClose_NotRunning (t * testing.T ) {
315+ rh := NewRedHub (nil , nil , func (cmd resp.Command , out []byte ) ([]byte , Action ) {
316+ return out , None
317+ })
318+
319+ err := rh .Close ()
320+ assert .Error (t , err )
321+ assert .Contains (t , err .Error (), "server not running" )
322+ }
323+
324+ func TestClose_Integration (t * testing.T ) {
325+ if testing .Short () {
326+ t .Skip ("skipping integration test in short mode" )
327+ }
328+
329+ rh := NewRedHub (
330+ func (c * Conn ) (out []byte , action Action ) {
331+ return nil , None
332+ },
333+ func (c * Conn , err error ) (action Action ) {
334+ return None
335+ },
336+ func (cmd resp.Command , out []byte ) ([]byte , Action ) {
337+ return resp .AppendString (out , "OK" ), None
338+ },
339+ )
340+
341+ // Start server in a goroutine
342+ serverErr := make (chan error , 1 )
343+ go func () {
344+ serverErr <- ListenAndServe ("tcp://127.0.0.1:16379" , Options {Multicore : false }, rh )
345+ }()
346+
347+ // Wait for server to start
348+ time .Sleep (100 * time .Millisecond )
349+
350+ // Test that server is running
351+ conn , err := net .DialTimeout ("tcp" , "127.0.0.1:16379" , time .Second )
352+ assert .NoError (t , err )
353+ assert .NotNil (t , conn )
354+ conn .Close ()
355+
356+ // Close the server
357+ err = rh .Close ()
358+ assert .NoError (t , err )
359+
360+ // Wait a moment for server to stop
361+ time .Sleep (200 * time .Millisecond )
362+
363+ // Verify connection fails after close
364+ conn , err = net .DialTimeout ("tcp" , "127.0.0.1:16379" , 200 * time .Millisecond )
365+ if err == nil {
366+ conn .Close ()
367+ t .Error ("Expected connection error after server close" )
368+ }
369+
370+ // Verify server goroutine returns gracefully (no error when stopped via Close)
371+ select {
372+ case err := <- serverErr :
373+ assert .NoError (t , err )
374+ case <- time .After (2 * time .Second ):
375+ t .Error ("Server did not stop within timeout" )
376+ }
377+ }
0 commit comments