acme-dns/vendor/github.com/valyala/bytebufferpool/bytebuffer_test.go
2018-01-22 11:19:33 +02:00

139 lines
3.0 KiB
Go

package bytebufferpool
import (
"bytes"
"fmt"
"io"
"testing"
"time"
)
func TestByteBufferReadFrom(t *testing.T) {
prefix := "foobar"
expectedS := "asadfsdafsadfasdfisdsdfa"
prefixLen := int64(len(prefix))
expectedN := int64(len(expectedS))
var bb ByteBuffer
bb.WriteString(prefix)
rf := (io.ReaderFrom)(&bb)
for i := 0; i < 20; i++ {
r := bytes.NewBufferString(expectedS)
n, err := rf.ReadFrom(r)
if n != expectedN {
t.Fatalf("unexpected n=%d. Expecting %d. iteration %d", n, expectedN, i)
}
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
bbLen := int64(bb.Len())
expectedLen := prefixLen + int64(i+1)*expectedN
if bbLen != expectedLen {
t.Fatalf("unexpected byteBuffer length: %d. Expecting %d", bbLen, expectedLen)
}
for j := 0; j < i; j++ {
start := prefixLen + int64(j)*expectedN
b := bb.B[start : start+expectedN]
if string(b) != expectedS {
t.Fatalf("unexpected byteBuffer contents: %q. Expecting %q", b, expectedS)
}
}
}
}
func TestByteBufferWriteTo(t *testing.T) {
expectedS := "foobarbaz"
var bb ByteBuffer
bb.WriteString(expectedS[:3])
bb.WriteString(expectedS[3:])
wt := (io.WriterTo)(&bb)
var w bytes.Buffer
for i := 0; i < 10; i++ {
n, err := wt.WriteTo(&w)
if n != int64(len(expectedS)) {
t.Fatalf("unexpected n returned from WriteTo: %d. Expecting %d", n, len(expectedS))
}
if err != nil {
t.Fatalf("unexpected error: %s", err)
}
s := string(w.Bytes())
if s != expectedS {
t.Fatalf("unexpected string written %q. Expecting %q", s, expectedS)
}
w.Reset()
}
}
func TestByteBufferGetPutSerial(t *testing.T) {
testByteBufferGetPut(t)
}
func TestByteBufferGetPutConcurrent(t *testing.T) {
concurrency := 10
ch := make(chan struct{}, concurrency)
for i := 0; i < concurrency; i++ {
go func() {
testByteBufferGetPut(t)
ch <- struct{}{}
}()
}
for i := 0; i < concurrency; i++ {
select {
case <-ch:
case <-time.After(time.Second):
t.Fatalf("timeout!")
}
}
}
func testByteBufferGetPut(t *testing.T) {
for i := 0; i < 10; i++ {
expectedS := fmt.Sprintf("num %d", i)
b := Get()
b.B = append(b.B, "num "...)
b.B = append(b.B, fmt.Sprintf("%d", i)...)
if string(b.B) != expectedS {
t.Fatalf("unexpected result: %q. Expecting %q", b.B, expectedS)
}
Put(b)
}
}
func testByteBufferGetString(t *testing.T) {
for i := 0; i < 10; i++ {
expectedS := fmt.Sprintf("num %d", i)
b := Get()
b.SetString(expectedS)
if b.String() != expectedS {
t.Fatalf("unexpected result: %q. Expecting %q", b.B, expectedS)
}
Put(b)
}
}
func TestByteBufferGetStringSerial(t *testing.T) {
testByteBufferGetString(t)
}
func TestByteBufferGetStringConcurrent(t *testing.T) {
concurrency := 10
ch := make(chan struct{}, concurrency)
for i := 0; i < concurrency; i++ {
go func() {
testByteBufferGetString(t)
ch <- struct{}{}
}()
}
for i := 0; i < concurrency; i++ {
select {
case <-ch:
case <-time.After(time.Second):
t.Fatalf("timeout!")
}
}
}