readv_test.go 1.3 KB

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