readv_test.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // +build !wasm
  2. package buf_test
  3. import (
  4. "crypto/rand"
  5. "net"
  6. "testing"
  7. "v2ray.com/core/common"
  8. . "v2ray.com/core/common/buf"
  9. "v2ray.com/core/common/compare"
  10. "v2ray.com/core/testing/servers/tcp"
  11. )
  12. func TestReadvReader(t *testing.T) {
  13. tcpServer := &tcp.Server{
  14. MsgProcessor: func(b []byte) []byte {
  15. return b
  16. },
  17. }
  18. dest, err := tcpServer.Start()
  19. common.Must(err)
  20. defer tcpServer.Close() // nolint: errcheck
  21. conn, err := net.Dial("tcp", dest.NetAddr())
  22. common.Must(err)
  23. defer conn.Close() // nolint: errcheck
  24. const size = 8192
  25. data := make([]byte, 8192)
  26. common.Must2(rand.Read(data))
  27. go func() {
  28. writer := NewWriter(conn)
  29. mb := MergeBytes(nil, data)
  30. if err := writer.WriteMultiBuffer(mb); err != nil {
  31. t.Fatal("failed to write data: ", err)
  32. }
  33. }()
  34. rawConn, err := conn.(*net.TCPConn).SyscallConn()
  35. common.Must(err)
  36. reader := NewReadVReader(conn, rawConn)
  37. var rmb MultiBuffer
  38. for {
  39. mb, err := reader.ReadMultiBuffer()
  40. if err != nil {
  41. t.Fatal("unexpected error: ", err)
  42. }
  43. rmb, _ = MergeMulti(rmb, mb)
  44. if rmb.Len() == size {
  45. break
  46. }
  47. }
  48. rdata := make([]byte, size)
  49. SplitBytes(rmb, rdata)
  50. if err := compare.BytesEqualWithDetail(data, rdata); err != nil {
  51. t.Fatal(err)
  52. }
  53. }