github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xio/listener_test.go (about)

     1  package xio
     2  
     3  import (
     4  	"fmt"
     5  	"io"
     6  	"net"
     7  	"testing"
     8  	"time"
     9  )
    10  
    11  func TestTimeoutListener(t *testing.T) {
    12  	var err error
    13  	var conn net.Conn
    14  	{ //test timeout
    15  		ln, _ := net.Listen("tcp", ":0")
    16  		listener := NewTimeoutListener(ln, 100*time.Millisecond)
    17  		listener.Delay = time.Millisecond
    18  		var doneCount = 0
    19  		go func() {
    20  			conn, err := listener.Accept()
    21  			if err != nil {
    22  				panic(err)
    23  			}
    24  			conn.Read(make([]byte, 1024))
    25  			doneCount++
    26  		}()
    27  		go func() {
    28  			conn, err = net.Dial("tcp", ln.Addr().String())
    29  			if err != nil {
    30  				panic(err)
    31  			}
    32  			conn.Read(make([]byte, 1024))
    33  			conn.Close()
    34  			doneCount++
    35  		}()
    36  		time.Sleep(150 * time.Millisecond)
    37  		if doneCount != 2 {
    38  			t.Error("error")
    39  			return
    40  		}
    41  		listener.Close()
    42  	}
    43  	{ //test read write close
    44  		ln, _ := net.Listen("tcp", ":0")
    45  		listener := NewTimeoutListener(ln, 100*time.Millisecond)
    46  		listener.Delay = time.Millisecond
    47  		var doneCount = 0
    48  		go func() {
    49  			conn, err := listener.Accept()
    50  			if err != nil {
    51  				panic(err)
    52  			}
    53  			io.Copy(conn, conn)
    54  			conn.Close()
    55  			doneCount++
    56  		}()
    57  		go func() {
    58  			conn, err = net.Dial("tcp", ln.Addr().String())
    59  			if err != nil {
    60  				panic(err)
    61  			}
    62  			for {
    63  				_, err = fmt.Fprintf(conn, "abc")
    64  				if err != nil {
    65  					break
    66  				}
    67  				buf := make([]byte, 3)
    68  				_, err = conn.Read(buf)
    69  				if err != nil {
    70  					break
    71  				}
    72  				if string(buf) != "abc" {
    73  					t.Error("error")
    74  					return
    75  				}
    76  				time.Sleep(80 * time.Millisecond)
    77  			}
    78  			conn.Close()
    79  			doneCount++
    80  		}()
    81  		time.Sleep(300 * time.Millisecond)
    82  		if doneCount != 0 {
    83  			t.Error("error")
    84  			return
    85  		}
    86  		conn.Close()
    87  		listener.Close()
    88  	}
    89  }