github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xio/xio_test.go (about) 1 package xio 2 3 import ( 4 "bytes" 5 "fmt" 6 "io" 7 "io/ioutil" 8 "net" 9 "net/http" 10 _ "net/http/pprof" 11 "os" 12 "testing" 13 "time" 14 ) 15 16 func init() { 17 go http.ListenAndServe(":6060", nil) 18 } 19 20 func TestCopyPacketConn(t *testing.T) { 21 packet1, _ := net.ListenPacket("udp", ":12332") 22 go CopyPacketConn(packet1, packet1) 23 raw, err := net.Dial("udp", "127.0.0.1:12332") 24 if err != nil { 25 t.Error(err) 26 return 27 } 28 defer raw.Close() 29 udp := raw.(*net.UDPConn) 30 _, err = udp.Write([]byte("123")) 31 if err != nil { 32 t.Error(err) 33 return 34 } 35 buffer := make([]byte, 123) 36 n, err := udp.Read(buffer) 37 if err != nil { 38 t.Error(err) 39 return 40 } 41 if string(buffer[0:n]) != "123" { 42 t.Error("error") 43 return 44 } 45 packet1.Close() 46 time.Sleep(100 * time.Millisecond) 47 } 48 49 func TestCopyPacketConnToWriter(t *testing.T) { 50 packet1, _ := net.ListenPacket("udp", ":12332") 51 buffer := bytes.NewBuffer(nil) 52 go CopyPacketConn(buffer, packet1) 53 raw, err := net.Dial("udp", "127.0.0.1:12332") 54 if err != nil { 55 t.Error(err) 56 return 57 } 58 defer raw.Close() 59 udp := raw.(*net.UDPConn) 60 _, err = udp.Write([]byte("123")) 61 if err != nil { 62 t.Error(err) 63 return 64 } 65 time.Sleep(100 * time.Millisecond) 66 if buffer.String() != "123" { 67 t.Error("error") 68 return 69 } 70 packet1.Close() 71 time.Sleep(100 * time.Millisecond) 72 } 73 74 func TestCopyPacketConnErrorNotSupported(t *testing.T) { 75 packet1, _ := net.ListenPacket("udp", ":12332") 76 raw, err := net.Dial("udp", "127.0.0.1:12332") 77 if err != nil { 78 t.Error(err) 79 return 80 } 81 defer raw.Close() 82 udp := raw.(*net.UDPConn) 83 _, err = udp.Write([]byte("123")) 84 if err != nil { 85 t.Error(err) 86 return 87 } 88 _, err = CopyPacketConn(t, packet1) 89 if err == nil { 90 t.Error(nil) 91 } 92 packet1.Close() 93 time.Sleep(100 * time.Millisecond) 94 } 95 96 func TestCopyPacketTo(t *testing.T) { 97 packet1, _ := net.ListenPacket("udp", ":12332") 98 raw, err := net.Dial("udp", "127.0.0.1:12332") 99 if err != nil { 100 t.Error(err) 101 return 102 } 103 defer raw.Close() 104 105 // 106 udp := raw.(*net.UDPConn) 107 _, err = CopyPacketTo(packet1, udp.LocalAddr(), bytes.NewBuffer([]byte("123"))) 108 if err != io.EOF { 109 t.Error(err) 110 return 111 } 112 buffer := make([]byte, 1024) 113 n, err := udp.Read(buffer) 114 if err != nil { 115 t.Error(err) 116 return 117 } 118 time.Sleep(100 * time.Millisecond) 119 if string(buffer[0:n]) != "123" { 120 t.Error("error") 121 return 122 } 123 packet1.Close() 124 time.Sleep(100 * time.Millisecond) 125 } 126 127 func TestCopyPacketToError(t *testing.T) { 128 packet1, _ := net.ListenPacket("udp", ":12332") 129 packet1.Close() 130 _, err := CopyPacketTo(packet1, packet1.LocalAddr(), bytes.NewBuffer([]byte("123"))) 131 if err == nil { 132 t.Error(err) 133 return 134 } 135 } 136 137 type copyMultiTestReader struct { 138 } 139 140 func (c *copyMultiTestReader) Read(p []byte) (n int, err error) { 141 err = fmt.Errorf("test error") 142 return 143 } 144 145 func (c *copyMultiTestReader) Close() (err error) { 146 return 147 } 148 149 type copyMultiTestWriter struct { 150 n int 151 } 152 153 func (c *copyMultiTestWriter) Write(p []byte) (n int, err error) { 154 switch c.n { 155 case 0: 156 n = len(p) 157 case 1: 158 n = len(p) - 1 159 case 2: 160 err = fmt.Errorf("test error") 161 } 162 return 163 } 164 165 func (c *copyMultiTestWriter) Close() (err error) { 166 return 167 } 168 169 func TestCopyMulti(t *testing.T) { 170 var err error 171 writer1 := ©MultiTestWriter{} 172 writer2 := ©MultiTestWriter{} 173 // 174 writer1.n, writer2.n = 0, 0 175 _, err = CopyMulti([]io.Writer{writer1, writer2}, bytes.NewBufferString("123")) 176 if err != nil { 177 t.Error(err) 178 return 179 } 180 // 181 writer1.n, writer2.n = 0, 0 182 _, err = CopyMulti([]io.Writer{writer1, writer2}, ©MultiTestReader{}) 183 if err == nil { 184 t.Error(err) 185 return 186 } 187 // 188 writer1.n, writer2.n = 1, 1 189 _, err = CopyMulti([]io.Writer{writer1, writer2}, bytes.NewBufferString("123")) 190 if err != io.ErrShortWrite { 191 t.Error(err) 192 return 193 } 194 // 195 writer1.n, writer2.n = 2, 2 196 _, err = CopyMulti([]io.Writer{writer1, writer2}, bytes.NewBufferString("123")) 197 if err == nil { 198 t.Error(err) 199 return 200 } 201 } 202 203 func TestCopyMax(t *testing.T) { 204 var err error 205 // 206 _, err = CopyMax(bytes.NewBuffer(nil), bytes.NewBufferString("abc"), 10) 207 if err != nil { 208 t.Error(err) 209 return 210 } 211 // 212 _, err = CopyMax(bytes.NewBuffer(nil), bytes.NewBufferString("abc"), 2) 213 if err == nil { 214 t.Error(err) 215 return 216 } 217 // 218 _, err = CopyBufferMax(bytes.NewBuffer(nil), bytes.NewBufferString("abc"), 10, make([]byte, 2)) 219 if err != nil { 220 t.Error(err) 221 return 222 } 223 // 224 writer1 := ©MultiTestWriter{} 225 // 226 writer1.n = 1 227 _, err = CopyMax(writer1, bytes.NewBufferString("abc"), 1024) 228 if err == nil { 229 t.Error(err) 230 return 231 } 232 // 233 writer1.n = 2 234 _, err = CopyMax(writer1, bytes.NewBufferString("abc"), 1024) 235 if err == nil { 236 t.Error(err) 237 return 238 } 239 // 240 writer1.n = 0 241 _, err = CopyMax(ioutil.Discard, ©MultiTestReader{}, 1024) 242 if err == nil { 243 t.Error(err) 244 return 245 } 246 } 247 248 func TestFullBuffer(t *testing.T) { 249 var err error 250 var latest time.Time 251 wait := make(chan int, 1) 252 reader, writer, _ := os.Pipe() 253 buf := make([]byte, 1024) 254 go func() { 255 err = FullBuffer(reader, buf, 9, &latest) 256 if err != nil { 257 t.Error(err) 258 return 259 } 260 err = FullBuffer(reader, buf, 9, &latest) 261 if err == nil { 262 t.Error(err) 263 return 264 } 265 wait <- 1 266 }() 267 writer.Write([]byte("1234")) 268 time.Sleep(10 * time.Millisecond) 269 writer.Write([]byte("56789")) 270 time.Sleep(10 * time.Millisecond) 271 writer.Close() 272 <-wait 273 if string(buf[0:9]) != "123456789" { 274 t.Error("error") 275 return 276 } 277 } 278 279 func TestStringConn(t *testing.T) { 280 netRaw := &net.TCPConn{} 281 fmt.Printf("%v\n", NewStringConn(netRaw)) 282 fmt.Printf("%v\n", NewStringConn(os.Stdout)) 283 conn := NewStringConn(os.Stdout) 284 conn.Name = "stdout" 285 fmt.Printf("%v\n", conn) 286 } 287 288 func TestTCPKeepAliveListener(t *testing.T) { 289 wait := make(chan int, 1) 290 listner, _ := net.Listen("tcp", ":0") 291 l := NewTCPKeepAliveListener(listner.(*net.TCPListener)) 292 go func() { 293 c, err := l.Accept() 294 if err != nil { 295 t.Error(err) 296 return 297 } 298 ioutil.ReadAll(c) 299 wait <- 1 300 }() 301 conn, err := net.Dial("tcp", listner.Addr().String()) 302 if err != nil { 303 t.Error(err) 304 return 305 } 306 conn.Close() 307 <-wait 308 }