mirror of
https://github.com/criyle/go-sandbox.git
synced 2025-11-04 14:49:53 +08:00
102 lines
1.9 KiB
Go
102 lines
1.9 KiB
Go
package pipe
|
|
|
|
import (
|
|
"io"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
func TestNewBuffer_WriteAndRead(t *testing.T) {
|
|
const max = 10
|
|
buf, err := NewBuffer(max)
|
|
if err != nil {
|
|
t.Fatalf("NewBuffer error: %v", err)
|
|
}
|
|
defer buf.W.Close()
|
|
|
|
// Write less than max bytes
|
|
input := "hello"
|
|
n, err := buf.W.Write([]byte(input))
|
|
if err != nil {
|
|
t.Fatalf("Write error: %v", err)
|
|
}
|
|
if n != len(input) {
|
|
t.Errorf("Write bytes = %d, want %d", n, len(input))
|
|
}
|
|
buf.W.Close()
|
|
<-buf.Done
|
|
|
|
got := buf.Buffer.String()
|
|
if got != input {
|
|
t.Errorf("Buffer content = %q, want %q", got, input)
|
|
}
|
|
}
|
|
|
|
func TestNewBuffer_MaxBytes(t *testing.T) {
|
|
const max = 5
|
|
buf, err := NewBuffer(max)
|
|
if err != nil {
|
|
t.Fatalf("NewBuffer error: %v", err)
|
|
}
|
|
defer buf.W.Close()
|
|
|
|
// Write more than max bytes
|
|
input := "toolonginput"
|
|
_, err = io.Copy(buf.W, strings.NewReader(input))
|
|
if err != nil {
|
|
t.Fatalf("Copy error: %v", err)
|
|
}
|
|
buf.W.Close()
|
|
<-buf.Done
|
|
|
|
got := buf.Buffer.String()
|
|
if len(got) != int(max+1) {
|
|
t.Errorf("Buffer length = %d, want %d", len(got), max+1)
|
|
}
|
|
if got != input[:max+1] {
|
|
t.Errorf("Buffer content = %q, want %q", got, input[:max+1])
|
|
}
|
|
}
|
|
|
|
func TestBuffer_String(t *testing.T) {
|
|
const max = 8
|
|
buf, err := NewBuffer(max)
|
|
if err != nil {
|
|
t.Fatalf("NewBuffer error: %v", err)
|
|
}
|
|
defer buf.W.Close()
|
|
|
|
_, _ = buf.W.Write([]byte("abc"))
|
|
buf.W.Close()
|
|
<-buf.Done
|
|
|
|
want := "Buffer[3/8]"
|
|
if buf.String() != want {
|
|
t.Errorf("String() = %q, want %q", buf.String(), want)
|
|
}
|
|
}
|
|
|
|
func TestNewBuffer_DoneCloses(t *testing.T) {
|
|
const max = 4
|
|
buf, err := NewBuffer(max)
|
|
if err != nil {
|
|
t.Fatalf("NewBuffer error: %v", err)
|
|
}
|
|
defer buf.W.Close()
|
|
|
|
done := make(chan struct{})
|
|
go func() {
|
|
_, _ = buf.W.Write([]byte("test"))
|
|
buf.W.Close()
|
|
close(done)
|
|
}()
|
|
|
|
select {
|
|
case <-buf.Done:
|
|
// ok
|
|
case <-time.After(1 * time.Second):
|
|
t.Fatal("timeout waiting for Done channel")
|
|
}
|
|
}
|