readv_test.go 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package buf_test
  2. import (
  3. "crypto/rand"
  4. "net"
  5. "testing"
  6. "v2ray.com/core/common"
  7. . "v2ray.com/core/common/buf"
  8. "v2ray.com/core/common/compare"
  9. "v2ray.com/core/testing/servers/tcp"
  10. )
  11. func TestReadvReader(t *testing.T) {
  12. tcpServer := &tcp.Server{
  13. MsgProcessor: func(b []byte) []byte {
  14. return b
  15. },
  16. }
  17. dest, err := tcpServer.Start()
  18. common.Must(err)
  19. defer tcpServer.Close() // nolint: errcheck
  20. conn, err := net.Dial("tcp", dest.NetAddr())
  21. common.Must(err)
  22. defer conn.Close() // nolint: errcheck
  23. const size = 8192
  24. data := make([]byte, 8192)
  25. common.Must2(rand.Read(data))
  26. go func() {
  27. writer := NewWriter(conn)
  28. var mb MultiBuffer
  29. common.Must2(mb.Write(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.AppendMulti(mb)
  44. if rmb.Len() == size {
  45. break
  46. }
  47. }
  48. rdata := make([]byte, size)
  49. common.Must2(rmb.Read(rdata))
  50. if err := compare.BytesEqualWithDetail(data, rdata); err != nil {
  51. t.Fatal(err)
  52. }
  53. }