Browse Source

Fix a bug in Output.Write, and improve testing coverage of error cases.

Solomon Hykes 11 years ago
parent
commit
35d54c6655
2 changed files with 23 additions and 1 deletions
  1. 1 1
      engine/streams.go
  2. 22 0
      engine/streams_test.go

+ 1 - 1
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

+ 22 - 0
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