1
0
mirror of https://github.com/golang/go synced 2024-11-19 02:24:41 -07:00

io: document and test MultiWriter error behavior

MultiWriter(w1, w2) only writes to w2 if w1.Write succeeds.
I did not know this, and it was not documented.
Document and test.

Change-Id: Idec2e8444d5a7aca0b95d07814a28daa454eb1d3
Reviewed-on: https://go-review.googlesource.com/78123
Run-TryBot: Russ Cox <rsc@golang.org>
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
Russ Cox 2017-11-14 14:54:10 -05:00
parent 894869e150
commit e671a552fe
2 changed files with 19 additions and 0 deletions

View File

@ -95,6 +95,10 @@ func (t *multiWriter) WriteString(s string) (n int, err error) {
// MultiWriter creates a writer that duplicates its writes to all the
// provided writers, similar to the Unix tee(1) command.
//
// Each write is written to each listed writer, one at a time.
// If a listed writer returns an error, that overall write operation
// stops and returns the error; it does not continue down the list.
func MultiWriter(writers ...Writer) Writer {
allWriters := make([]Writer, 0, len(writers))
for _, w := range writers {

View File

@ -176,6 +176,21 @@ func TestMultiWriterSingleChainFlatten(t *testing.T) {
}
}
func TestMultiWriterError(t *testing.T) {
f1 := writerFunc(func(p []byte) (int, error) {
return len(p) / 2, ErrShortWrite
})
f2 := writerFunc(func(p []byte) (int, error) {
t.Errorf("MultiWriter called f2.Write")
return len(p), nil
})
w := MultiWriter(f1, f2)
n, err := w.Write(make([]byte, 100))
if n != 50 || err != ErrShortWrite {
t.Errorf("Write = %d, %v, want 50, ErrShortWrite", n, err)
}
}
// Test that MultiReader copies the input slice and is insulated from future modification.
func TestMultiReaderCopy(t *testing.T) {
slice := []Reader{strings.NewReader("hello world")}