package buf_test import ( "bytes" "crypto/rand" "testing" "v2ray.com/core/common" . "v2ray.com/core/common/buf" "v2ray.com/core/common/compare" . "v2ray.com/ext/assert" ) func TestBufferClear(t *testing.T) { assert := With(t) buffer := New() defer buffer.Release() payload := "Bytes" buffer.Write([]byte(payload)) assert(buffer.Len(), Equals, int32(len(payload))) buffer.Clear() assert(buffer.Len(), Equals, int32(0)) } func TestBufferIsEmpty(t *testing.T) { assert := With(t) buffer := New() defer buffer.Release() assert(buffer.IsEmpty(), IsTrue) } func TestBufferString(t *testing.T) { assert := With(t) buffer := New() defer buffer.Release() common.Must2(buffer.WriteString("Test String")) assert(buffer.String(), Equals, "Test String") } func TestBufferSlice(t *testing.T) { { b := New() common.Must2(b.Write([]byte("abcd"))) bytes := b.BytesFrom(-2) if err := compare.BytesEqualWithDetail(bytes, []byte{'c', 'd'}); err != nil { t.Error(err) } } { b := New() common.Must2(b.Write([]byte("abcd"))) bytes := b.BytesTo(-2) if err := compare.BytesEqualWithDetail(bytes, []byte{'a', 'b'}); err != nil { t.Error(err) } } { b := New() common.Must2(b.Write([]byte("abcd"))) bytes := b.BytesRange(-3, -1) if err := compare.BytesEqualWithDetail(bytes, []byte{'b', 'c'}); err != nil { t.Error(err) } } } func TestBufferReadFullFrom(t *testing.T) { payload := make([]byte, 1024) common.Must2(rand.Read(payload)) reader := bytes.NewReader(payload) b := New() n, err := b.ReadFullFrom(reader, 1024) common.Must(err) if n != 1024 { t.Error("expect reading 1024 bytes, but actually ", n) } if err := compare.BytesEqualWithDetail(payload, b.Bytes()); err != nil { t.Error(err) } } func BenchmarkNewBuffer(b *testing.B) { for i := 0; i < b.N; i++ { buffer := New() buffer.Release() } } func BenchmarkWrite2(b *testing.B) { buffer := New() b.ResetTimer() for i := 0; i < b.N; i++ { _, _ = buffer.Write([]byte{'a', 'b'}) buffer.Clear() } } func BenchmarkWrite8(b *testing.B) { buffer := New() b.ResetTimer() for i := 0; i < b.N; i++ { _, _ = buffer.Write([]byte{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'}) buffer.Clear() } } func BenchmarkWrite32(b *testing.B) { buffer := New() payload := make([]byte, 32) rand.Read(payload) b.ResetTimer() for i := 0; i < b.N; i++ { _, _ = buffer.Write(payload) buffer.Clear() } } func BenchmarkWriteByte2(b *testing.B) { buffer := New() b.ResetTimer() for i := 0; i < b.N; i++ { _ = buffer.WriteByte('a') _ = buffer.WriteByte('b') buffer.Clear() } } func BenchmarkWriteByte8(b *testing.B) { buffer := New() b.ResetTimer() for i := 0; i < b.N; i++ { _ = buffer.WriteByte('a') _ = buffer.WriteByte('b') _ = buffer.WriteByte('c') _ = buffer.WriteByte('d') _ = buffer.WriteByte('e') _ = buffer.WriteByte('f') _ = buffer.WriteByte('g') _ = buffer.WriteByte('h') buffer.Clear() } }