github.com/mheon/docker@v0.11.2-0.20150922122814-44f47903a831/pkg/stdcopy/stdcopy_test.go (about)

     1  package stdcopy
     2  
     3  import (
     4  	"bytes"
     5  	"errors"
     6  	"io/ioutil"
     7  	"strings"
     8  	"testing"
     9  )
    10  
    11  func TestNewStdWriter(t *testing.T) {
    12  	writer := NewStdWriter(ioutil.Discard, Stdout)
    13  	if writer == nil {
    14  		t.Fatalf("NewStdWriter with an invalid StdType should not return nil.")
    15  	}
    16  }
    17  
    18  func TestWriteWithUnitializedStdWriter(t *testing.T) {
    19  	writer := StdWriter{
    20  		Writer:  nil,
    21  		prefix:  Stdout,
    22  		sizeBuf: make([]byte, 4),
    23  	}
    24  	n, err := writer.Write([]byte("Something here"))
    25  	if n != 0 || err == nil {
    26  		t.Fatalf("Should fail when given an uncomplete or uninitialized StdWriter")
    27  	}
    28  }
    29  
    30  func TestWriteWithNilBytes(t *testing.T) {
    31  	writer := NewStdWriter(ioutil.Discard, Stdout)
    32  	n, err := writer.Write(nil)
    33  	if err != nil {
    34  		t.Fatalf("Shouldn't have fail when given no data")
    35  	}
    36  	if n > 0 {
    37  		t.Fatalf("Write should have written 0 byte, but has written %d", n)
    38  	}
    39  }
    40  
    41  func TestWrite(t *testing.T) {
    42  	writer := NewStdWriter(ioutil.Discard, Stdout)
    43  	data := []byte("Test StdWrite.Write")
    44  	n, err := writer.Write(data)
    45  	if err != nil {
    46  		t.Fatalf("Error while writing with StdWrite")
    47  	}
    48  	if n != len(data) {
    49  		t.Fatalf("Write should have written %d byte but wrote %d.", len(data), n)
    50  	}
    51  }
    52  
    53  type errWriter struct {
    54  	n   int
    55  	err error
    56  }
    57  
    58  func (f *errWriter) Write(buf []byte) (int, error) {
    59  	return f.n, f.err
    60  }
    61  
    62  func TestWriteWithWriterError(t *testing.T) {
    63  	expectedError := errors.New("expected")
    64  	expectedReturnedBytes := 10
    65  	writer := NewStdWriter(&errWriter{
    66  		n:   stdWriterPrefixLen + expectedReturnedBytes,
    67  		err: expectedError}, Stdout)
    68  	data := []byte("This won't get written, sigh")
    69  	n, err := writer.Write(data)
    70  	if err != expectedError {
    71  		t.Fatalf("Didn't get expected error.")
    72  	}
    73  	if n != expectedReturnedBytes {
    74  		t.Fatalf("Didn't get expected writen bytes %d, got %d.",
    75  			expectedReturnedBytes, n)
    76  	}
    77  }
    78  
    79  func TestWriteDoesNotReturnNegativeWrittenBytes(t *testing.T) {
    80  	writer := NewStdWriter(&errWriter{n: -1}, Stdout)
    81  	data := []byte("This won't get written, sigh")
    82  	actual, _ := writer.Write(data)
    83  	if actual != 0 {
    84  		t.Fatalf("Expected returned written bytes equal to 0, got %d", actual)
    85  	}
    86  }
    87  
    88  func TestStdCopyWithInvalidInputHeader(t *testing.T) {
    89  	dstOut := NewStdWriter(ioutil.Discard, Stdout)
    90  	dstErr := NewStdWriter(ioutil.Discard, Stderr)
    91  	src := strings.NewReader("Invalid input")
    92  	_, err := StdCopy(dstOut, dstErr, src)
    93  	if err == nil {
    94  		t.Fatal("StdCopy with invalid input header should fail.")
    95  	}
    96  }
    97  
    98  func TestStdCopyWithCorruptedPrefix(t *testing.T) {
    99  	data := []byte{0x01, 0x02, 0x03}
   100  	src := bytes.NewReader(data)
   101  	written, err := StdCopy(nil, nil, src)
   102  	if err != nil {
   103  		t.Fatalf("StdCopy should not return an error with corrupted prefix.")
   104  	}
   105  	if written != 0 {
   106  		t.Fatalf("StdCopy should have written 0, but has written %d", written)
   107  	}
   108  }
   109  
   110  func BenchmarkWrite(b *testing.B) {
   111  	w := NewStdWriter(ioutil.Discard, Stdout)
   112  	data := []byte("Test line for testing stdwriter performance\n")
   113  	data = bytes.Repeat(data, 100)
   114  	b.SetBytes(int64(len(data)))
   115  	b.ResetTimer()
   116  	for i := 0; i < b.N; i++ {
   117  		if _, err := w.Write(data); err != nil {
   118  			b.Fatal(err)
   119  		}
   120  	}
   121  }