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