github.com/ph/moby@v1.13.1/pkg/pools/pools_test.go (about) 1 package pools 2 3 import ( 4 "bufio" 5 "bytes" 6 "io" 7 "strings" 8 "testing" 9 ) 10 11 func TestBufioReaderPoolGetWithNoReaderShouldCreateOne(t *testing.T) { 12 reader := BufioReader32KPool.Get(nil) 13 if reader == nil { 14 t.Fatalf("BufioReaderPool should have create a bufio.Reader but did not.") 15 } 16 } 17 18 func TestBufioReaderPoolPutAndGet(t *testing.T) { 19 sr := bufio.NewReader(strings.NewReader("foobar")) 20 reader := BufioReader32KPool.Get(sr) 21 if reader == nil { 22 t.Fatalf("BufioReaderPool should not return a nil reader.") 23 } 24 // verify the first 3 byte 25 buf1 := make([]byte, 3) 26 _, err := reader.Read(buf1) 27 if err != nil { 28 t.Fatal(err) 29 } 30 if actual := string(buf1); actual != "foo" { 31 t.Fatalf("The first letter should have been 'foo' but was %v", actual) 32 } 33 BufioReader32KPool.Put(reader) 34 // Try to read the next 3 bytes 35 _, err = sr.Read(make([]byte, 3)) 36 if err == nil || err != io.EOF { 37 t.Fatalf("The buffer should have been empty, issue an EOF error.") 38 } 39 } 40 41 type simpleReaderCloser struct { 42 io.Reader 43 closed bool 44 } 45 46 func (r *simpleReaderCloser) Close() error { 47 r.closed = true 48 return nil 49 } 50 51 func TestNewReadCloserWrapperWithAReadCloser(t *testing.T) { 52 br := bufio.NewReader(strings.NewReader("")) 53 sr := &simpleReaderCloser{ 54 Reader: strings.NewReader("foobar"), 55 closed: false, 56 } 57 reader := BufioReader32KPool.NewReadCloserWrapper(br, sr) 58 if reader == nil { 59 t.Fatalf("NewReadCloserWrapper should not return a nil reader.") 60 } 61 // Verify the content of reader 62 buf := make([]byte, 3) 63 _, err := reader.Read(buf) 64 if err != nil { 65 t.Fatal(err) 66 } 67 if actual := string(buf); actual != "foo" { 68 t.Fatalf("The first 3 letter should have been 'foo' but were %v", actual) 69 } 70 reader.Close() 71 // Read 3 more bytes "bar" 72 _, err = reader.Read(buf) 73 if err != nil { 74 t.Fatal(err) 75 } 76 if actual := string(buf); actual != "bar" { 77 t.Fatalf("The first 3 letter should have been 'bar' but were %v", actual) 78 } 79 if !sr.closed { 80 t.Fatalf("The ReaderCloser should have been closed, it is not.") 81 } 82 } 83 84 func TestBufioWriterPoolGetWithNoReaderShouldCreateOne(t *testing.T) { 85 writer := BufioWriter32KPool.Get(nil) 86 if writer == nil { 87 t.Fatalf("BufioWriterPool should have create a bufio.Writer but did not.") 88 } 89 } 90 91 func TestBufioWriterPoolPutAndGet(t *testing.T) { 92 buf := new(bytes.Buffer) 93 bw := bufio.NewWriter(buf) 94 writer := BufioWriter32KPool.Get(bw) 95 if writer == nil { 96 t.Fatalf("BufioReaderPool should not return a nil writer.") 97 } 98 written, err := writer.Write([]byte("foobar")) 99 if err != nil { 100 t.Fatal(err) 101 } 102 if written != 6 { 103 t.Fatalf("Should have written 6 bytes, but wrote %v bytes", written) 104 } 105 // Make sure we Flush all the way ? 106 writer.Flush() 107 bw.Flush() 108 if len(buf.Bytes()) != 6 { 109 t.Fatalf("The buffer should contain 6 bytes ('foobar') but contains %v ('%v')", buf.Bytes(), string(buf.Bytes())) 110 } 111 // Reset the buffer 112 buf.Reset() 113 BufioWriter32KPool.Put(writer) 114 // Try to write something 115 if _, err = writer.Write([]byte("barfoo")); err != nil { 116 t.Fatal(err) 117 } 118 // If we now try to flush it, it should panic (the writer is nil) 119 // recover it 120 defer func() { 121 if r := recover(); r == nil { 122 t.Fatal("Trying to flush the writter should have 'paniced', did not.") 123 } 124 }() 125 writer.Flush() 126 } 127 128 type simpleWriterCloser struct { 129 io.Writer 130 closed bool 131 } 132 133 func (r *simpleWriterCloser) Close() error { 134 r.closed = true 135 return nil 136 } 137 138 func TestNewWriteCloserWrapperWithAWriteCloser(t *testing.T) { 139 buf := new(bytes.Buffer) 140 bw := bufio.NewWriter(buf) 141 sw := &simpleWriterCloser{ 142 Writer: new(bytes.Buffer), 143 closed: false, 144 } 145 bw.Flush() 146 writer := BufioWriter32KPool.NewWriteCloserWrapper(bw, sw) 147 if writer == nil { 148 t.Fatalf("BufioReaderPool should not return a nil writer.") 149 } 150 written, err := writer.Write([]byte("foobar")) 151 if err != nil { 152 t.Fatal(err) 153 } 154 if written != 6 { 155 t.Fatalf("Should have written 6 bytes, but wrote %v bytes", written) 156 } 157 writer.Close() 158 if !sw.closed { 159 t.Fatalf("The ReaderCloser should have been closed, it is not.") 160 } 161 }