1
0

readv_test.go 1.3 KB

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