@@ -505,6 +505,73 @@ func TestReadThresholdOption(t *testing.T) {
505505 wg .Wait ()
506506}
507507
508+ func TestReadThresholdClosed (t * testing.T ) {
509+ /*
510+ client => server: 102400 bytes + 5 bytes
511+ client => server: close connection
512+ server cached: 102400 bytes, and throttled
513+ server read: 102400 bytes, and unthrottled
514+ server cached: 5 bytes
515+ server read: 5 bytes
516+ */
517+ readThreshold := 1024 * 100
518+ trigger := make (chan struct {})
519+ msg1 := make ([]byte , readThreshold )
520+ msg2 := []byte ("hello" )
521+
522+ // server
523+ ln , err := CreateListener ("tcp" , ":12345" )
524+ MustNil (t , err )
525+ svr , _ := NewEventLoop (func (ctx context.Context , connection Connection ) error {
526+ if connection .Reader ().Len () < readThreshold {
527+ return nil
528+ }
529+ // server read
530+ t .Logf ("server reading msg1" )
531+ trigger <- struct {}{} // let client send msg2
532+ <- trigger // ensure client send msg2 and closed
533+ total := 0
534+ for {
535+ msg , err := connection .Reader ().Next (1 )
536+ total += len (msg )
537+ if errors .Is (err , ErrEOF ) {
538+ break
539+ }
540+ _ = msg
541+ }
542+ Equal (t , total , readThreshold + 5 )
543+ close (trigger )
544+ return nil
545+ }, WithReadBufferThreshold (int64 (readThreshold )))
546+ defer svr .Shutdown (context .Background ())
547+ go func () {
548+ svr .Serve (ln )
549+ }()
550+ time .Sleep (time .Millisecond * 100 )
551+
552+ // client write
553+ dialer := NewDialer (WithReadBufferThreshold (int64 (readThreshold )))
554+ cli , err := dialer .DialConnection ("tcp" , "127.0.0.1:12345" , time .Second )
555+ MustNil (t , err )
556+ t .Logf ("client writing msg1" )
557+ _ , err = cli .Writer ().WriteBinary (msg1 )
558+ MustNil (t , err )
559+ err = cli .Writer ().Flush ()
560+ MustNil (t , err )
561+ <- trigger
562+ time .Sleep (time .Millisecond * 100 )
563+ t .Logf ("client writing msg2" )
564+ _ , err = cli .Writer ().WriteBinary (msg2 )
565+ MustNil (t , err )
566+ err = cli .Writer ().Flush ()
567+ MustNil (t , err )
568+ err = cli .Close ()
569+ MustNil (t , err )
570+ t .Logf ("client closed" )
571+ trigger <- struct {}{}
572+ <- trigger
573+ }
574+
508575func createTestListener (network , address string ) (Listener , error ) {
509576 for {
510577 ln , err := CreateListener (network , address )
0 commit comments