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 }