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!") } } }