From 35d54c665575d48954db9422702c0324f00ebc62 Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Fri, 22 Nov 2013 02:28:56 +0000 Subject: [PATCH] Fix a bug in Output.Write, and improve testing coverage of error cases. --- engine/streams.go | 2 +- engine/streams_test.go | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/engine/streams.go b/engine/streams.go index 697407f1f4..ff7049074a 100644 --- a/engine/streams.go +++ b/engine/streams.go @@ -89,7 +89,7 @@ func (o *Output) Write(p []byte) (n int, err error) { firstErr = err } } - return len(p), err + return len(p), firstErr } // Close unregisters all destinations and waits for all background diff --git a/engine/streams_test.go b/engine/streams_test.go index d7faf229af..108c9850a5 100644 --- a/engine/streams_test.go +++ b/engine/streams_test.go @@ -4,6 +4,7 @@ import ( "bufio" "bytes" "fmt" + "io" "io/ioutil" "strings" "testing" @@ -208,6 +209,27 @@ func TestOutputAdd(t *testing.T) { } } +func TestOutputWriteError(t *testing.T) { + o := NewOutput() + buf := &bytes.Buffer{} + o.Add(buf) + r, w := io.Pipe() + input := "Hello there" + expectedErr := fmt.Errorf("This is an error") + r.CloseWithError(expectedErr) + o.Add(w) + n, err := o.Write([]byte(input)) + if err != expectedErr { + t.Fatalf("Output.Write() should return the first error encountered, if any") + } + if buf.String() != input { + t.Fatalf("Output.Write() should attempt write on all destinations, even after encountering an error") + } + if n != len(input) { + t.Fatalf("Output.Write() should return the size of the input if it successfully writes to at least one destination") + } +} + func TestInputAddEmpty(t *testing.T) { i := NewInput() var b bytes.Buffer