mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Add more ioutils tests.
Closes #11595 Signed-off-by: Vincent Demeester <vincent@sbr.pm>
This commit is contained in:
parent
fe221852b7
commit
815b472a02
2 changed files with 149 additions and 0 deletions
|
@ -2,11 +2,92 @@ package ioutils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// Implement io.Reader
|
||||||
|
type errorReader struct{}
|
||||||
|
|
||||||
|
func (r *errorReader) Read(p []byte) (int, error) {
|
||||||
|
return 0, fmt.Errorf("Error reader always fail.")
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReadCloserWrapperClose(t *testing.T) {
|
||||||
|
reader := strings.NewReader("A string reader")
|
||||||
|
wrapper := NewReadCloserWrapper(reader, func() error {
|
||||||
|
return fmt.Errorf("This will be called when closing")
|
||||||
|
})
|
||||||
|
err := wrapper.Close()
|
||||||
|
if err == nil || !strings.Contains(err.Error(), "This will be called when closing") {
|
||||||
|
t.Fatalf("readCloserWrapper should have call the anonymous func and thus, fail.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReaderErrWrapperReadOnError(t *testing.T) {
|
||||||
|
called := false
|
||||||
|
reader := &errorReader{}
|
||||||
|
wrapper := NewReaderErrWrapper(reader, func() {
|
||||||
|
called = true
|
||||||
|
})
|
||||||
|
_, err := wrapper.Read([]byte{})
|
||||||
|
if err == nil || !strings.Contains(err.Error(), "Error reader always fail.") {
|
||||||
|
t.Fatalf("readErrWrapper should returned an error")
|
||||||
|
}
|
||||||
|
if !called {
|
||||||
|
t.Fatalf("readErrWrapper should have call the anonymous function on failure")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestReaderErrWrapperRead(t *testing.T) {
|
||||||
|
called := false
|
||||||
|
reader := strings.NewReader("a string reader.")
|
||||||
|
wrapper := NewReaderErrWrapper(reader, func() {
|
||||||
|
called = true // Should not be called
|
||||||
|
})
|
||||||
|
// Read 20 byte (should be ok with the string above)
|
||||||
|
num, err := wrapper.Read(make([]byte, 20))
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if num != 16 {
|
||||||
|
t.Fatalf("readerErrWrapper should have read 16 byte, but read %d", num)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNewBufReaderWithDrainbufAndBuffer(t *testing.T) {
|
||||||
|
reader, writer := io.Pipe()
|
||||||
|
|
||||||
|
drainBuffer := make([]byte, 1024)
|
||||||
|
buffer := bytes.Buffer{}
|
||||||
|
bufreader := NewBufReaderWithDrainbufAndBuffer(reader, drainBuffer, &buffer)
|
||||||
|
|
||||||
|
// 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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func TestBufReader(t *testing.T) {
|
func TestBufReader(t *testing.T) {
|
||||||
reader, writer := io.Pipe()
|
reader, writer := io.Pipe()
|
||||||
bufreader := NewBufReader(reader)
|
bufreader := NewBufReader(reader)
|
||||||
|
@ -33,6 +114,50 @@ func TestBufReader(t *testing.T) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestBufReaderCloseWithNonReaderCloser(t *testing.T) {
|
||||||
|
reader := strings.NewReader("buffer")
|
||||||
|
bufreader := NewBufReader(reader)
|
||||||
|
|
||||||
|
if err := bufreader.Close(); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// implements io.ReadCloser
|
||||||
|
type simpleReaderCloser struct{}
|
||||||
|
|
||||||
|
func (r *simpleReaderCloser) Read(p []byte) (n int, err error) {
|
||||||
|
return 0, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *simpleReaderCloser) Close() error {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestBufReaderCloseWithReaderCloser(t *testing.T) {
|
||||||
|
reader := &simpleReaderCloser{}
|
||||||
|
bufreader := NewBufReader(reader)
|
||||||
|
|
||||||
|
err := bufreader.Close()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestHashData(t *testing.T) {
|
||||||
|
reader := strings.NewReader("hash-me")
|
||||||
|
actual, err := HashData(reader)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
expected := "sha256:4d11186aed035cc624d553e10db358492c84a7cd6b9670d92123c144930450aa"
|
||||||
|
if actual != expected {
|
||||||
|
t.Fatalf("Expecting %s, got %s", expected, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type repeatedReader struct {
|
type repeatedReader struct {
|
||||||
readCount int
|
readCount int
|
||||||
maxReads int
|
maxReads int
|
||||||
|
|
|
@ -6,6 +6,30 @@ import (
|
||||||
"testing"
|
"testing"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func TestWriteCloserWrapperClose(t *testing.T) {
|
||||||
|
called := false
|
||||||
|
writer := bytes.NewBuffer([]byte{})
|
||||||
|
wrapper := NewWriteCloserWrapper(writer, func() error {
|
||||||
|
called = true
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
if err := wrapper.Close(); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if !called {
|
||||||
|
t.Fatalf("writeCloserWrapper should have call the anonymous function.")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestNopWriteCloser(t *testing.T) {
|
||||||
|
writer := bytes.NewBuffer([]byte{})
|
||||||
|
wrapper := NopWriteCloser(writer)
|
||||||
|
if err := wrapper.Close(); err != nil {
|
||||||
|
t.Fatal("NopWriteCloser always return nil on Close.")
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func TestNopWriter(t *testing.T) {
|
func TestNopWriter(t *testing.T) {
|
||||||
nw := &NopWriter{}
|
nw := &NopWriter{}
|
||||||
l, err := nw.Write([]byte{'c'})
|
l, err := nw.Write([]byte{'c'})
|
||||||
|
|
Loading…
Reference in a new issue