@@ -491,3 +491,85 @@ func TestWakeConnImmediately(t *testing.T) {
491
491
err = Run (serverEV , serverEV .network + "://" + serverEV .addr , WithTicker (true ))
492
492
assert .NoError (t , err )
493
493
}
494
+
495
+ func TestClientReadOnEOF (t * testing.T ) {
496
+ ln , err := net .Listen ("tcp" , "127.0.0.1:9999" )
497
+ assert .NoError (t , err )
498
+ defer ln .Close ()
499
+
500
+ go func () {
501
+ for {
502
+ conn , err := ln .Accept ()
503
+ if err != nil {
504
+ break
505
+ }
506
+ go process (conn )
507
+ }
508
+ }()
509
+
510
+ ev := & clientReadOnEOF {
511
+ result : make (chan struct {
512
+ data []byte
513
+ err error
514
+ }, 1 ),
515
+ data : []byte ("test" ),
516
+ }
517
+ cli , err := NewClient (ev )
518
+ assert .NoError (t , err )
519
+ defer cli .Stop () //nolint:errcheck
520
+
521
+ err = cli .Start ()
522
+ assert .NoError (t , err )
523
+
524
+ _ , err = cli .Dial ("tcp" , "127.0.0.1:9999" )
525
+ assert .NoError (t , err )
526
+
527
+ select {
528
+ case res := <- ev .result :
529
+ assert .NoError (t , res .err )
530
+ assert .EqualValuesf (t , ev .data , res .data , "expected: %v, but got: %v" , ev .data , res .data )
531
+ case <- time .After (5 * time .Second ):
532
+ t .Errorf ("timeout waiting for the result" )
533
+ }
534
+ }
535
+
536
+ func process (conn net.Conn ) {
537
+ defer conn .Close () //noliint:errcheck
538
+ buf := make ([]byte , 8 )
539
+ n , err := conn .Read (buf )
540
+ if err != nil {
541
+ return
542
+ }
543
+ _ , _ = conn .Write (buf [:n ])
544
+ _ = conn .Close ()
545
+ }
546
+
547
+ type clientReadOnEOF struct {
548
+ BuiltinEventEngine
549
+ data []byte
550
+ result chan struct {
551
+ data []byte
552
+ err error
553
+ }
554
+ }
555
+
556
+ func (clientReadOnEOF ) OnBoot (Engine ) (action Action ) {
557
+ return None
558
+ }
559
+
560
+ func (cli clientReadOnEOF ) OnOpen (Conn ) (out []byte , action Action ) {
561
+ return cli .data , None
562
+ }
563
+
564
+ func (clientReadOnEOF ) OnClose (Conn , error ) (action Action ) {
565
+ return Close
566
+ }
567
+
568
+ func (cli clientReadOnEOF ) OnTraffic (c Conn ) (action Action ) {
569
+ data , err := c .Next (- 1 )
570
+ cli .result <- struct {
571
+ data []byte
572
+ err error
573
+ }{data : data , err : err }
574
+ return None
575
+ }
0 commit comments