readv_test.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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. var mb MultiBuffer
  30. common.Must2(mb.Write(data))
  31. if err := writer.WriteMultiBuffer(mb); err != nil {
  32. t.Fatal("failed to write data: ", err)
  33. }
  34. }()
  35. rawConn, err := conn.(*net.TCPConn).SyscallConn()
  36. common.Must(err)
  37. reader := NewReadVReader(conn, rawConn)
  38. var rmb MultiBuffer
  39. for {
  40. mb, err := reader.ReadMultiBuffer()
  41. if err != nil {
  42. t.Fatal("unexpected error: ", err)
  43. }
  44. rmb.AppendMulti(mb)
  45. if rmb.Len() == size {
  46. break
  47. }
  48. }
  49. rdata := make([]byte, size)
  50. common.Must2(rmb.Read(rdata))
  51. if err := compare.BytesEqualWithDetail(data, rdata); err != nil {
  52. t.Fatal(err)
  53. }
  54. }