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 }