package buf_test import ( "bufio" "bytes" "crypto/rand" "io" "testing" "v2ray.com/core/common" . "v2ray.com/core/common/buf" "v2ray.com/core/transport/pipe" . "v2ray.com/ext/assert" ) func TestWriter(t *testing.T) { assert := With(t) lb := New() common.Must2(lb.ReadFrom(rand.Reader)) expectedBytes := append([]byte(nil), lb.Bytes()...) writeBuffer := bytes.NewBuffer(make([]byte, 0, 1024*1024)) writer := NewBufferedWriter(NewWriter(writeBuffer)) writer.SetBuffered(false) err := writer.WriteMultiBuffer(MultiBuffer{lb}) common.Must(err) assert(writer.Flush(), IsNil) assert(expectedBytes, Equals, writeBuffer.Bytes()) } func TestBytesWriterReadFrom(t *testing.T) { assert := With(t) const size = 50000 pReader, pWriter := pipe.New(pipe.WithSizeLimit(size)) reader := bufio.NewReader(io.LimitReader(rand.Reader, size)) writer := NewBufferedWriter(pWriter) writer.SetBuffered(false) nBytes, err := reader.WriteTo(writer) assert(nBytes, Equals, int64(size)) if err != nil { t.Fatal("expect success, but actually error: ", err.Error()) } mb, err := pReader.ReadMultiBuffer() common.Must(err) assert(mb.Len(), Equals, int32(size)) } func TestDiscardBytes(t *testing.T) { assert := With(t) b := New() common.Must2(b.ReadFullFrom(rand.Reader, Size)) nBytes, err := io.Copy(DiscardBytes, b) assert(nBytes, Equals, int64(Size)) common.Must(err) } func TestDiscardBytesMultiBuffer(t *testing.T) { assert := With(t) const size = 10240*1024 + 1 buffer := bytes.NewBuffer(make([]byte, 0, size)) common.Must2(buffer.ReadFrom(io.LimitReader(rand.Reader, size))) r := NewReader(buffer) nBytes, err := io.Copy(DiscardBytes, &BufferedReader{Reader: r}) assert(nBytes, Equals, int64(size)) common.Must(err) } func TestWriterInterface(t *testing.T) { { var writer interface{} = (*BufferToBytesWriter)(nil) switch writer.(type) { case Writer, io.Writer, io.ReaderFrom: default: t.Error("BufferToBytesWriter is not Writer, io.Writer or io.ReaderFrom") } } { var writer interface{} = (*BufferedWriter)(nil) switch writer.(type) { case Writer, io.Writer, io.ReaderFrom, io.ByteWriter: default: t.Error("BufferedWriter is not Writer, io.Writer, io.ReaderFrom or io.ByteWriter") } } }