github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xio/frame/frame_test.go (about) 1 package frame 2 3 import ( 4 "bytes" 5 "encoding/binary" 6 "fmt" 7 "io" 8 "math/rand" 9 "net" 10 "os" 11 "sync" 12 "testing" 13 "time" 14 15 "github.com/codingeasygo/util/xdebug" 16 "github.com/codingeasygo/util/xio" 17 ) 18 19 type deadlineRWC struct { 20 io.ReadWriter 21 } 22 23 func (d *deadlineRWC) SetReadDeadline(t time.Time) error { 24 return nil 25 } 26 27 func (d *deadlineRWC) SetWriteDeadline(t time.Time) error { 28 return nil 29 } 30 31 func (d *deadlineRWC) Close() (err error) { 32 if c, ok := d.ReadWriter.(io.Closer); ok { 33 err = c.Close() 34 } 35 return 36 } 37 38 func TestReadWrite(t *testing.T) { 39 tester := xdebug.CaseTester{ 40 0: 1, 41 11: 1, 42 } 43 // 44 if tester.Run() { //one frame 8 45 data1 := []byte("one") 46 buf := make([]byte, 1+len(data1)) 47 buf[0] = byte(len(data1) + 1) 48 copy(buf[1:], data1) 49 raw := bytes.NewBuffer(buf) 50 proc := NewReadWriter(nil, &deadlineRWC{ReadWriter: raw}, 256*1024) 51 proc.SetTimeout(time.Second) 52 proc.SetLengthFieldLength(1) 53 proc.SetDataOffset(1) 54 f, err := proc.ReadFrame() 55 if err != nil || !bytes.Equal(f[1:], data1) { 56 t.Error(err) 57 return 58 } 59 _, err = proc.ReadFrame() 60 if err != io.EOF { 61 t.Error(err) 62 return 63 } 64 } 65 if tester.Run() { //one frame 16 66 data1 := []byte("one") 67 buf := make([]byte, 2+len(data1)) 68 binary.BigEndian.PutUint16(buf, uint16(2+len(data1))) 69 copy(buf[2:], data1) 70 raw := bytes.NewBuffer(buf) 71 proc := NewReadWriter(nil, &deadlineRWC{ReadWriter: raw}, 256*1024) 72 proc.SetTimeout(time.Second) 73 proc.SetLengthFieldLength(2) 74 proc.SetLengthFieldMagic(0) 75 f, err := proc.ReadFrame() 76 if err != nil || !bytes.Equal(f[2:], data1) { 77 t.Error(err) 78 return 79 } 80 _, err = proc.ReadFrame() 81 if err != io.EOF { 82 t.Error(err) 83 return 84 } 85 } 86 if tester.Run() { //one frame 32 87 data1 := []byte("one") 88 buf := make([]byte, 4+len(data1)) 89 binary.BigEndian.PutUint32(buf, uint32(4+len(data1))) 90 copy(buf[4:], data1) 91 raw := bytes.NewBuffer(buf) 92 proc := NewReadWriter(nil, &deadlineRWC{ReadWriter: raw}, 256*1024) 93 proc.SetLengthFieldMagic(1) 94 proc.SetTimeout(time.Second) 95 f, err := proc.ReadFrame() 96 if err != nil || !bytes.Equal(f[4:], data1) { 97 t.Error(err) 98 return 99 } 100 _, err = proc.ReadFrame() 101 if err != io.EOF { 102 t.Error(err) 103 return 104 } 105 } 106 if tester.Run() { //one frame splice 107 data1 := []byte("one") 108 r, w, _ := os.Pipe() 109 wait := sync.WaitGroup{} 110 wait.Add(1) 111 go func() { 112 proc := NewReadWriteCloser(nil, &deadlineRWC{ReadWriter: r}, 256*1024) 113 proc.SetLengthFieldMagic(1) 114 proc.SetTimeout(time.Second) 115 f, err := proc.ReadFrame() 116 if err != nil || !bytes.Equal(f[4:], data1) { 117 t.Error(err) 118 return 119 } 120 _, err = proc.ReadFrame() 121 if err != io.EOF { 122 t.Error(err) 123 return 124 } 125 wait.Done() 126 }() 127 buf := make([]byte, uint32(4+len(data1))) 128 binary.BigEndian.PutUint32(buf, uint32(4+len(data1))) 129 copy(buf[4:], data1) 130 w.Write(buf[0:3]) 131 time.Sleep(time.Millisecond) 132 w.Write(buf[3:]) 133 time.Sleep(time.Millisecond) 134 w.Close() 135 time.Sleep(time.Millisecond) 136 wait.Wait() 137 } 138 // 139 if tester.Run() { //two frame 140 data1 := []byte("two1") 141 data2 := []byte("two2") 142 buf := make([]byte, 8+len(data1)+len(data2)) 143 binary.BigEndian.PutUint32(buf, uint32(4+len(data1))) 144 copy(buf[4:], data1) 145 binary.BigEndian.PutUint32(buf[4+len(data1):], uint32(4+len(data2))) 146 copy(buf[8+len(data1):], data2) 147 raw := bytes.NewBuffer(buf) 148 // 149 proc := NewReadWriter(nil, &deadlineRWC{ReadWriter: raw}, 256*1024) 150 proc.SetLengthFieldMagic(1) 151 proc.SetTimeout(time.Second) 152 f, err := proc.ReadFrame() 153 if err != nil || !bytes.Equal(f[4:], data1) { 154 t.Error(err) 155 return 156 } 157 f, err = proc.ReadFrame() 158 if err != nil || !bytes.Equal(f[4:], data2) { 159 t.Error(err) 160 return 161 } 162 _, err = proc.ReadFrame() 163 if err != io.EOF { 164 t.Error(err) 165 return 166 } 167 } 168 // 169 if tester.Run() { //two frame splice 170 data1 := []byte("splice1") 171 data2 := []byte("splice2") 172 r, w, _ := os.Pipe() 173 wait := sync.WaitGroup{} 174 wait.Add(1) 175 go func() { 176 proc := NewReadWriter(nil, &deadlineRWC{ReadWriter: r}, 256*1024) 177 proc.SetLengthFieldMagic(1) 178 proc.SetTimeout(time.Second) 179 f, err := proc.ReadFrame() 180 if err != nil || !bytes.Equal(f[4:], data1) { 181 t.Error(err) 182 return 183 } 184 f, err = proc.ReadFrame() 185 if err != nil || !bytes.Equal(f[4:], data2) { 186 t.Error(err) 187 return 188 } 189 _, err = proc.ReadFrame() 190 if err != io.EOF { 191 t.Error(err) 192 return 193 } 194 wait.Done() 195 }() 196 buf := make([]byte, 1024) 197 binary.BigEndian.PutUint32(buf, uint32(4+len(data1))) 198 copy(buf[4:], data1) 199 binary.BigEndian.PutUint32(buf[4+len(data1):], uint32(4+len(data2))) 200 copy(buf[8+len(data1):], data2[:1]) 201 w.Write(buf[:8+len(data1)+1]) 202 time.Sleep(time.Millisecond) 203 w.Write(data2[1:]) 204 time.Sleep(time.Millisecond) 205 w.Close() 206 time.Sleep(time.Millisecond) 207 wait.Wait() 208 } 209 // 210 if tester.Run() { //two frame splice 2 211 data1 := []byte("splice1") 212 data2 := []byte("splice2") 213 r, w, _ := os.Pipe() 214 wait := sync.WaitGroup{} 215 wait.Add(1) 216 go func() { 217 proc := NewReadWriter(nil, &deadlineRWC{ReadWriter: r}, 256*1024) 218 proc.SetLengthFieldMagic(1) 219 proc.SetTimeout(time.Second) 220 f, err := proc.ReadFrame() 221 if err != nil || !bytes.Equal(f[4:], data1) { 222 t.Error(err) 223 return 224 } 225 f, err = proc.ReadFrame() 226 if err != nil || !bytes.Equal(f[4:], data2) { 227 t.Error(err) 228 return 229 } 230 _, err = proc.ReadFrame() 231 if err != io.EOF { 232 t.Error(err) 233 return 234 } 235 wait.Done() 236 }() 237 buf := make([]byte, 1024) 238 binary.BigEndian.PutUint32(buf, uint32(4+len(data1))) 239 copy(buf[4:], data1) 240 binary.BigEndian.PutUint32(buf[4+len(data1):], uint32(4+len(data2))) 241 copy(buf[8+len(data1):], data2) 242 w.Write(buf[:4+len(data1)+3]) 243 time.Sleep(time.Millisecond) 244 w.Write(buf[4+len(data1)+3 : 4+len(data1)+4+len(data2)]) 245 time.Sleep(time.Millisecond) 246 w.Close() 247 time.Sleep(time.Millisecond) 248 wait.Wait() 249 } 250 if tester.Run() { //test frame read write 8 251 r, w, _ := os.Pipe() 252 reader := NewReader(r, 1024) 253 reader.SetLengthFieldLength(1) 254 reader.SetLengthFieldMagic(0) 255 writer := NewWriter(&deadlineRWC{ReadWriter: w}) 256 writer.SetWriteTimeout(time.Second) 257 writer.SetLengthFieldLength(1) 258 writer.SetLengthFieldMagic(0) 259 readed := bytes.NewBuffer(nil) 260 waiter := make(chan int, 1) 261 go func() { 262 io.Copy(readed, reader) 263 waiter <- 1 264 }() 265 writed := bytes.NewBuffer(nil) 266 count := rand.Intn(10) + 1 267 for i := 0; i < count; i++ { 268 fmt.Fprintf(writer, "data-%v\n", i) 269 fmt.Fprintf(writed, "data-%v\n", i) 270 } 271 w.Close() 272 <-waiter 273 if !bytes.Equal(readed.Bytes(), writed.Bytes()) { 274 fmt.Printf("readed:\n%v\n", (readed.Bytes())) 275 fmt.Printf("writed:\n%v\n", (writed.Bytes())) 276 t.Error("error") 277 return 278 } 279 } 280 if tester.Run() { //test frame read write 16 281 r, w, _ := os.Pipe() 282 reader := NewReader(r, 1024) 283 reader.SetLengthFieldLength(2) 284 reader.SetLengthFieldMagic(0) 285 writer := NewWriter(&deadlineRWC{ReadWriter: w}) 286 writer.SetWriteTimeout(time.Second) 287 writer.SetLengthFieldLength(2) 288 writer.SetLengthFieldMagic(0) 289 readed := bytes.NewBuffer(nil) 290 waiter := make(chan int, 1) 291 go func() { 292 io.Copy(readed, reader) 293 waiter <- 1 294 }() 295 writed := bytes.NewBuffer(nil) 296 count := rand.Intn(10) + 1 297 for i := 0; i < count; i++ { 298 fmt.Fprintf(writer, "data-%v\n", i) 299 fmt.Fprintf(writed, "data-%v\n", i) 300 } 301 w.Close() 302 <-waiter 303 if !bytes.Equal(readed.Bytes(), writed.Bytes()) { 304 fmt.Printf("readed:\n%v\n", (readed.Bytes())) 305 fmt.Printf("writed:\n%v\n", (writed.Bytes())) 306 t.Error("error") 307 return 308 } 309 } 310 if tester.Run() { //test copy read 311 r, w, _ := os.Pipe() 312 reader := NewReader(r, 1024) 313 reader.SetLengthFieldMagic(1) 314 writer := NewWriter(&deadlineRWC{ReadWriter: w}) 315 writer.SetLengthFieldMagic(1) 316 writer.SetWriteTimeout(time.Second) 317 readed := bytes.NewBuffer(nil) 318 waiter := make(chan int, 1) 319 go func() { 320 buf := make([]byte, 1024) 321 for { 322 n, err := reader.Read(buf) 323 if err != nil { 324 break 325 } 326 readed.Write(buf[0:n]) 327 } 328 io.Copy(readed, reader) 329 waiter <- 1 330 }() 331 writed := bytes.NewBuffer(nil) 332 count := rand.Intn(10) + 1 333 for i := 0; i < count; i++ { 334 fmt.Fprintf(writer, "data-%v\n", i) 335 fmt.Fprintf(writed, "data-%v\n", i) 336 } 337 w.Close() 338 <-waiter 339 if !bytes.Equal(readed.Bytes(), writed.Bytes()) { 340 fmt.Printf("readed:\n%v\n", (readed.Bytes())) 341 fmt.Printf("writed:\n%v\n", (writed.Bytes())) 342 t.Error("error") 343 return 344 } 345 } 346 if tester.Run() { //test copy write to 347 r, w, _ := os.Pipe() 348 reader := NewReader(r, 1024) 349 reader.SetLengthFieldMagic(1) 350 writer := NewWriter(&deadlineRWC{ReadWriter: w}) 351 writer.SetLengthFieldMagic(1) 352 writer.SetWriteTimeout(time.Second) 353 readed := bytes.NewBuffer(nil) 354 waiter := make(chan int, 1) 355 go func() { 356 io.Copy(readed, reader) 357 waiter <- 1 358 }() 359 writed := bytes.NewBuffer(nil) 360 count := rand.Intn(10) + 1 361 for i := 0; i < count; i++ { 362 fmt.Fprintf(writer, "data-%v\n", i) 363 fmt.Fprintf(writed, "data-%v\n", i) 364 } 365 w.Close() 366 <-waiter 367 if !bytes.Equal(readed.Bytes(), writed.Bytes()) { 368 fmt.Printf("readed:\n%v\n", (readed.Bytes())) 369 fmt.Printf("writed:\n%v\n", (writed.Bytes())) 370 t.Error("error") 371 return 372 } 373 } 374 if tester.Run() { //test copy write 375 cr, cw, _ := os.Pipe() 376 sr, sw, _ := os.Pipe() 377 reader := NewReader(cr, 1024) 378 reader.SetLengthFieldMagic(1) 379 writer := NewWriter(&deadlineRWC{ReadWriter: cw}) 380 writer.SetLengthFieldMagic(1) 381 writer.SetWriteTimeout(time.Second) 382 readed := bytes.NewBuffer(nil) 383 waiter := make(chan int, 1) 384 go func() { 385 io.Copy(writer, sr) 386 waiter <- 1 387 }() 388 go func() { 389 io.Copy(readed, reader) 390 waiter <- 1 391 }() 392 writed := bytes.NewBuffer(nil) 393 count := rand.Intn(10) + 1 394 for i := 0; i < count; i++ { 395 fmt.Fprintf(sw, "data-%v\n", i) 396 fmt.Fprintf(writed, "data-%v\n", i) 397 } 398 time.Sleep(500 * time.Millisecond) 399 sw.Close() 400 <-waiter 401 if !bytes.Equal(readed.Bytes(), writed.Bytes()) { 402 fmt.Printf("readed:\n%v\n", (readed.Bytes())) 403 fmt.Printf("writed:\n%v\n", (writed.Bytes())) 404 t.Error("error") 405 return 406 } 407 } 408 if tester.Run() { //test too large 409 buf := make([]byte, 1024) 410 binary.BigEndian.PutUint32(buf, 1000000) 411 proc := NewReadWriter(nil, bytes.NewBuffer(buf), 1024) 412 _, err := proc.ReadFrame() 413 if err == nil { 414 t.Error(err) 415 return 416 } 417 } 418 if tester.Run() { //test frame header invalid 419 buf := make([]byte, 1024) 420 proc := NewReadWriter(nil, bytes.NewBuffer(buf), 1024) 421 _, err := proc.ReadFrame() 422 if err == nil { 423 t.Error(err) 424 return 425 } 426 } 427 if tester.Run() { //for cover 428 NewReadWriter(nil, nil, 1024).GetByteOrder() 429 NewReadWriter(nil, nil, 1024).SetByteOrder(binary.BigEndian) 430 NewReadWriter(nil, nil, 1024).GetLengthFieldMagic() 431 NewReadWriter(nil, nil, 1024).SetLengthFieldMagic(1) 432 NewReadWriter(nil, nil, 1024).GetLengthFieldOffset() 433 NewReadWriter(nil, nil, 1024).SetLengthFieldOffset(1) 434 NewReadWriter(nil, nil, 1024).GetLengthFieldLength() 435 NewReadWriter(nil, nil, 1024).SetLengthFieldLength(1) 436 NewReadWriter(nil, nil, 1024).GetLengthAdjustment() 437 NewReadWriter(nil, nil, 1024).SetLengthAdjustment(1) 438 NewReadWriter(nil, nil, 1024).BufferSize() 439 } 440 if tester.Run() { //test close 441 NewReadWriteCloser(nil, &net.TCPConn{}, 1024).Close() 442 } 443 if tester.Run() { //test string 444 fmt.Printf("%v\n", NewReader(bytes.NewBuffer(nil), 1024)) 445 fmt.Printf("%v\n", NewWriter(bytes.NewBuffer(nil))) 446 fmt.Printf("%v\n", NewReadWriteCloser(nil, nil, 1024)) 447 } 448 } 449 450 func TestPiper(t *testing.T) { 451 piper := NewBasePiper(xio.PiperF(func(conn io.ReadWriteCloser, target string) (err error) { 452 err = fmt.Errorf("error") 453 return 454 }), 1024) 455 piper.PipeConn(nil, "target") 456 piper.Close() 457 } 458 459 func TestRaw(t *testing.T) { 460 tester := xdebug.CaseTester{ 461 0: 0, 462 3: 1, 463 } 464 if tester.Run() { //read/write frame 465 r, w, _ := os.Pipe() 466 reader := NewReader(r, DefaultBufferSize) 467 writer := NewWriter(w) 468 go func() { 469 buffer := bytes.NewBufferString("abc") 470 src := NewRawReadWriter(nil, &deadlineRWC{ReadWriter: buffer}, DefaultBufferSize) 471 src.SetTimeout(time.Second) 472 frame, err := src.ReadFrame() 473 if err != nil { 474 t.Error(err) 475 return 476 } 477 _, err = writer.WriteFrame(frame) 478 if err != nil { 479 t.Error(err) 480 return 481 } 482 src.Close() 483 }() 484 buffer := bytes.NewBuffer(nil) 485 dst := NewRawReadWriteCloser(nil, &deadlineRWC{ReadWriter: buffer}, DefaultBufferSize) 486 dst.SetTimeout(time.Second) 487 frame, err := reader.ReadFrame() 488 if err != nil { 489 t.Error(err) 490 return 491 } 492 _, err = dst.WriteFrame(frame) 493 if err != nil { 494 t.Error(err) 495 return 496 } 497 if buffer.String() != "abc" { 498 t.Error("error") 499 return 500 } 501 dst.Close() 502 } 503 if tester.Run() { //read/write from 504 src := NewRawReadWriteCloser(nil, &deadlineRWC{ReadWriter: bytes.NewBufferString("abc")}, DefaultBufferSize) 505 src.SetReadTimeout(time.Second) 506 src.WriteTo(os.Stdout) 507 508 dst := NewRawWrapWriter(&deadlineRWC{ReadWriter: os.Stdout}) 509 dst.SetWriteTimeout(time.Second) 510 dst.ReadFrom(bytes.NewBufferString("abc")) 511 512 fmt.Printf("src->%v\n", src) 513 fmt.Printf("dst->%v\n", dst) 514 515 src.BufferSize() 516 } 517 if tester.Run() { //read placeholder 518 src := NewRawReadWriteCloser(nil, &deadlineRWC{ReadWriter: bytes.NewBufferString("abc")}, DefaultBufferSize) 519 src.SetDataPrefix([]byte("123")) 520 frame, err := src.ReadFrame() 521 if err != nil || string(frame[src.GetDataOffset():]) != "123abc" { 522 t.Errorf("%v", err) 523 return 524 } 525 } 526 } 527 528 func TestPass(t *testing.T) { 529 tester := xdebug.CaseTester{ 530 0: 1, 531 9: 1, 532 } 533 if tester.Run() { 534 buffer := bytes.NewBuffer(nil) 535 wrapper := NewPassWriter(buffer, 1024) 536 writer := NewBaseWriter(wrapper) 537 n, err := writer.Write([]byte("abc")) 538 if err != nil || wrapper.length > 0 || buffer.String() != "abc" { 539 t.Errorf("%v,%v", err, n) 540 return 541 } 542 } 543 if tester.Run() { 544 buffer := bytes.NewBuffer(nil) 545 wrapper := NewPassWriter(buffer, 1024) 546 wrapper.Write([]byte{0}) 547 wrapper.Write([]byte{0, 0, 7}) 548 wrapper.Write([]byte{97, 98, 99}) 549 if wrapper.length > 0 || buffer.String() != "abc" { 550 t.Errorf("%v,%v", wrapper.length, buffer) 551 return 552 } 553 } 554 if tester.Run() { 555 buffer := bytes.NewBuffer(nil) 556 wrapper := NewPassWriter(buffer, 1024) 557 wrapper.Write([]byte{0}) 558 wrapper.Write([]byte{0, 0}) 559 wrapper.Write([]byte{7}) 560 wrapper.Write([]byte{97, 98, 99}) 561 if wrapper.length > 0 || buffer.String() != "abc" { 562 t.Errorf("%v,%v", wrapper.length, buffer) 563 return 564 } 565 } 566 if tester.Run() { 567 buffer := bytes.NewBuffer(nil) 568 wrapper := NewPassWriter(buffer, 1024) 569 wrapper.Write([]byte{0, 0, 0, 7}) 570 wrapper.Write([]byte{97, 98, 99}) 571 if wrapper.length > 0 || buffer.String() != "abc" { 572 t.Errorf("%v,%v", wrapper.length, buffer) 573 return 574 } 575 } 576 if tester.Run() { 577 buffer := bytes.NewBuffer(nil) 578 wrapper := NewPassWriter(buffer, 1024) 579 wrapper.Write([]byte{0, 0, 0, 7, 97}) 580 wrapper.Write([]byte{98, 99}) 581 if wrapper.length > 0 || buffer.String() != "abc" { 582 t.Errorf("%v,%v", wrapper.length, buffer) 583 return 584 } 585 } 586 if tester.Run() { 587 buffer := bytes.NewBuffer(nil) 588 wrapper := NewPassWriter(buffer, 1024) 589 wrapper.Write([]byte{0, 0, 0, 7, 97}) 590 wrapper.Write([]byte{98}) 591 wrapper.Write([]byte{99}) 592 if wrapper.length > 0 || buffer.String() != "abc" { 593 t.Errorf("%v,%v", wrapper.length, buffer) 594 return 595 } 596 } 597 if tester.Run() { 598 buffer := bytes.NewBuffer(nil) 599 wrapper := NewPassWriter(buffer, 1024) 600 wrapper.Write([]byte{0, 0, 0, 7, 97, 98, 99, 0, 0}) 601 wrapper.Write([]byte{0, 7, 97, 98, 99}) 602 if wrapper.length > 0 || buffer.String() != "abcabc" { 603 t.Errorf("%v,%v", wrapper.length, buffer) 604 return 605 } 606 } 607 if tester.Run() { 608 buffer := bytes.NewBuffer(nil) 609 wrapper := NewPassWriter(buffer, 1024) 610 wrapper.Write([]byte{0, 0, 0, 7, 97, 98, 99, 0, 0, 0, 7, 97, 98, 99}) 611 if wrapper.length > 0 || buffer.String() != "abcabc" { 612 t.Errorf("%v,%v", wrapper.length, buffer) 613 return 614 } 615 } 616 if tester.Run() { 617 buffer := make([]byte, 1024) 618 data := bytes.NewBuffer([]byte("abc")) 619 wrapper := NewPassReader(data) 620 reader := NewBaseReader(wrapper, 1024) 621 n, err := reader.Read(buffer) 622 if err != nil || string(buffer[0:n]) != "abc" { 623 t.Errorf("%v,%v", err, n) 624 return 625 } 626 wrapper.Close() 627 NewPassReadCloser(NewRawReadWriteCloser(nil, nil, 1024)) 628 wrapper = NewPassReader(NewRawReadWriteCloser(nil, nil, 1024)) 629 wrapper.Close() 630 } 631 // 632 //test error 633 if tester.Run() { 634 buffer := bytes.NewBuffer(nil) 635 wrapper := NewPassWriter(buffer, 1024) 636 _, err := wrapper.Write([]byte{255, 255, 255, 7, 97, 98, 99}) 637 if err != ErrFrameTooLarge { 638 t.Errorf("%v,%v", wrapper.length, buffer) 639 return 640 } 641 } 642 if tester.Run() { 643 buffer := bytes.NewBuffer(nil) 644 wrapper := NewPassWriter(buffer, 1024) 645 wrapper.Write([]byte{255, 255}) 646 _, err := wrapper.Write([]byte{255, 7, 97, 98, 99}) 647 if err != ErrFrameTooLarge { 648 t.Errorf("%v,%v", wrapper.length, buffer) 649 return 650 } 651 } 652 } 653 654 type errrWriter struct { 655 } 656 657 func (e *errrWriter) Write(p []byte) (n int, err error) { 658 err = fmt.Errorf("error") 659 return 660 } 661 662 func (e *errrWriter) Close() (err error) { 663 return 664 } 665 666 func TestError(t *testing.T) { 667 func() { 668 defer func() { 669 recover() 670 }() 671 NewBaseReader(nil, -1) 672 }() 673 func() { 674 defer func() { 675 recover() 676 }() 677 NewReadWriter(nil, nil, -1) 678 }() 679 func() { 680 defer func() { 681 recover() 682 }() 683 NewReadWriteCloser(nil, nil, -1) 684 }() 685 func() { 686 defer func() { 687 recover() 688 }() 689 rwc := NewReadWriteCloser(nil, nil, 1024) 690 rwc.SetLengthFieldLength(10) 691 rwc.WriteFrame(nil) 692 }() 693 func() { 694 defer func() { 695 recover() 696 }() 697 rwc := NewReadWriteCloser(nil, nil, 1024) 698 rwc.SetLengthFieldLength(10) 699 rwc.ReadHead([]byte("12222")) 700 }() 701 func() { 702 defer func() { 703 recover() 704 }() 705 rwc := NewReadWriteCloser(nil, nil, 1024) 706 rwc.SetLengthFieldLength(10) 707 rwc.WriteHead([]byte("12222")) 708 }() 709 func() { 710 defer func() { 711 recover() 712 }() 713 NewRawWrapReader(nil, -1) 714 }() 715 func() { 716 defer func() { 717 recover() 718 }() 719 NewRawReadWriter(nil, nil, -1) 720 }() 721 func() { 722 defer func() { 723 recover() 724 }() 725 NewRawReadWriteCloser(nil, nil, -1) 726 }() 727 func() { 728 NewPassWriter(&errrWriter{}, 1024) 729 wrapper := NewPassWriteCloser(&errrWriter{}, 1024) 730 wrapper.Write([]byte{0, 0, 0, 7, 97, 98, 99}) 731 wrapper.Write([]byte{0, 0, 0, 7}) 732 wrapper.Write([]byte{97, 98, 99}) 733 wrapper.Close() 734 }() 735 } 736 737 func TestEqual(t *testing.T) { 738 var a = bytes.NewBuffer(nil) 739 var b = bytes.NewBuffer(nil) 740 var r io.Reader 741 var w io.Writer 742 743 r, w = a, a 744 fmt.Printf("--->%v\n", interface{}(r) == interface{}(w)) 745 746 r, w = a, b 747 fmt.Printf("--->%v\n", interface{}(r) == interface{}(w)) 748 }