author | Alberto Bertogli
<albertito@blitiri.com.ar> 2019-07-13 13:45:59 UTC |
committer | Alberto Bertogli
<albertito@blitiri.com.ar> 2019-07-13 13:45:59 UTC |
parent | d53d97aba080d4d471039fd0d8e280d606c779f2 |
internal/maillog/maillog_test.go | +47 | -0 |
diff --git a/internal/maillog/maillog_test.go b/internal/maillog/maillog_test.go index 2a11603..78d32e1 100644 --- a/internal/maillog/maillog_test.go +++ b/internal/maillog/maillog_test.go @@ -3,10 +3,13 @@ package maillog import ( "bytes" "fmt" + "io" "net" "strings" "testing" "time" + + "blitiri.com.ar/go/log" ) var netAddr = &net.TCPAddr{ @@ -114,3 +117,47 @@ func TestDefault(t *testing.T) { expect(t, buf, "qid from=from all done") buf.Reset() } + +// io.Writer that fails all write operations, for testing. +type failedWriter struct{} + +func (w *failedWriter) Write(p []byte) (int, error) { + return 0, fmt.Errorf("test error") +} + +// nopCloser adds a Close method to an io.Writer, to turn it into a +// io.WriteCloser. This is the equivalent of ioutil.NopCloser but for +// io.Writer. +type nopCloser struct { + io.Writer +} + +func (nopCloser) Close() error { return nil } + +// Test that we complain (only once) when we can't log. +func TestFailedLogger(t *testing.T) { + // Set up a test logger, that will write to a buffer for us to check. + buf := &bytes.Buffer{} + log.Default = log.New(nopCloser{io.Writer(buf)}) + + // Set up a maillog that will use a writer which always fail, to trigger + // the condition. + failedw := &failedWriter{} + l := New(failedw) + + // Log something, which should fail. Then verify that the error message + // appears in the log. + l.printf("123 testing") + s := buf.String() + if !strings.Contains(s, "failed to write to maillog: test error") { + t.Errorf("log did not contain expected message. Log: %#v", s) + } + + // Further attempts should not generate any other errors. + buf.Reset() + l.printf("123 testing") + s = buf.String() + if s != "" { + t.Errorf("expected second attempt to not log, but log had: %#v", s) + } +}