123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- package docker
- import (
- "bytes"
- "errors"
- "io"
- "io/ioutil"
- "testing"
- )
- func TestBufReader(t *testing.T) {
- reader, writer := io.Pipe()
- bufreader := newBufReader(reader)
- // Write everything down to a Pipe
- // Usually, a pipe should block but because of the buffered reader,
- // the writes will go through
- done := make(chan bool)
- go func() {
- writer.Write([]byte("hello world"))
- writer.Close()
- done <- true
- }()
- // Drain the reader *after* everything has been written, just to verify
- // it is indeed buffering
- <-done
- output, err := ioutil.ReadAll(bufreader)
- if err != nil {
- t.Fatal(err)
- }
- if !bytes.Equal(output, []byte("hello world")) {
- t.Error(string(output))
- }
- }
- type dummyWriter struct {
- buffer bytes.Buffer
- failOnWrite bool
- }
- func (dw *dummyWriter) Write(p []byte) (n int, err error) {
- if dw.failOnWrite {
- return 0, errors.New("Fake fail")
- }
- return dw.buffer.Write(p)
- }
- func (dw *dummyWriter) String() string {
- return dw.buffer.String()
- }
- func (dw *dummyWriter) Close() error {
- return nil
- }
- func TestWriteBroadcaster(t *testing.T) {
- writer := newWriteBroadcaster()
- // Test 1: Both bufferA and bufferB should contain "foo"
- bufferA := &dummyWriter{}
- writer.AddWriter(bufferA)
- bufferB := &dummyWriter{}
- writer.AddWriter(bufferB)
- writer.Write([]byte("foo"))
- if bufferA.String() != "foo" {
- t.Errorf("Buffer contains %v", bufferA.String())
- }
- if bufferB.String() != "foo" {
- t.Errorf("Buffer contains %v", bufferB.String())
- }
- // Test2: bufferA and bufferB should contain "foobar",
- // while bufferC should only contain "bar"
- bufferC := &dummyWriter{}
- writer.AddWriter(bufferC)
- writer.Write([]byte("bar"))
- if bufferA.String() != "foobar" {
- t.Errorf("Buffer contains %v", bufferA.String())
- }
- if bufferB.String() != "foobar" {
- t.Errorf("Buffer contains %v", bufferB.String())
- }
- if bufferC.String() != "bar" {
- t.Errorf("Buffer contains %v", bufferC.String())
- }
- // Test3: Test removal
- writer.RemoveWriter(bufferB)
- writer.Write([]byte("42"))
- if bufferA.String() != "foobar42" {
- t.Errorf("Buffer contains %v", bufferA.String())
- }
- if bufferB.String() != "foobar" {
- t.Errorf("Buffer contains %v", bufferB.String())
- }
- if bufferC.String() != "bar42" {
- t.Errorf("Buffer contains %v", bufferC.String())
- }
- // Test4: Test eviction on failure
- bufferA.failOnWrite = true
- writer.Write([]byte("fail"))
- if bufferA.String() != "foobar42" {
- t.Errorf("Buffer contains %v", bufferA.String())
- }
- if bufferC.String() != "bar42fail" {
- t.Errorf("Buffer contains %v", bufferC.String())
- }
- // Even though we reset the flag, no more writes should go in there
- bufferA.failOnWrite = false
- writer.Write([]byte("test"))
- if bufferA.String() != "foobar42" {
- t.Errorf("Buffer contains %v", bufferA.String())
- }
- if bufferC.String() != "bar42failtest" {
- t.Errorf("Buffer contains %v", bufferC.String())
- }
- writer.Close()
- }
|