diff --git a/smtpd/filestore_test.go b/smtpd/filestore_test.go index 1e5abe3..922b13b 100644 --- a/smtpd/filestore_test.go +++ b/smtpd/filestore_test.go @@ -1,9 +1,12 @@ package smtpd import ( + "bytes" "fmt" "github.com/stretchr/testify/assert" + "io" "io/ioutil" + "log" "os" "path/filepath" "testing" @@ -12,7 +15,7 @@ import ( // Test directory structure created by filestore func TestFSDirStructure(t *testing.T) { - ds := setupDataStore() + ds, logbuf := setupDataStore() defer teardownDataStore(ds) root := ds.path @@ -85,11 +88,16 @@ func TestFSDirStructure(t *testing.T) { assert.False(t, isPresent(expect), "Did not expect %q to exist", expect) expect = mbPath assert.False(t, isPresent(expect), "Did not expect %q to exist", expect) + + if t.Failed() { + // Dump buffered log data if there was a failure + io.Copy(os.Stderr, logbuf) + } } // Test FileDataStore.AllMailboxes() func TestFSAllMailboxes(t *testing.T) { - ds := setupDataStore() + ds, logbuf := setupDataStore() defer teardownDataStore(ds) for _, name := range []string{"abby", "bill", "christa", "donald", "evelyn"} { @@ -105,12 +113,17 @@ func TestFSAllMailboxes(t *testing.T) { mboxes, err := ds.AllMailboxes() assert.Nil(t, err) assert.Equal(t, len(mboxes), 5) + + if t.Failed() { + // Dump buffered log data if there was a failure + io.Copy(os.Stderr, logbuf) + } } // Test delivering several messages to the same mailbox, meanwhile querying its // contents with a new mailbox object each time func TestFSDeliverMany(t *testing.T) { - ds := setupDataStore() + ds, logbuf := setupDataStore() defer teardownDataStore(ds) mbName := "fred" @@ -148,11 +161,16 @@ func TestFSDeliverMany(t *testing.T) { subj := msgs[i].Subject() assert.Equal(t, expect, subj, "Expected subject %q, got %q", expect, subj) } + + if t.Failed() { + // Dump buffered log data if there was a failure + io.Copy(os.Stderr, logbuf) + } } // Test deleting messages func TestFSDelete(t *testing.T) { - ds := setupDataStore() + ds, logbuf := setupDataStore() defer teardownDataStore(ds) mbName := "fred" @@ -216,11 +234,15 @@ func TestFSDelete(t *testing.T) { assert.Equal(t, expect, subj, "Expected subject %q, got %q", expect, subj) } + if t.Failed() { + // Dump buffered log data if there was a failure + io.Copy(os.Stderr, logbuf) + } } // Test purging a mailbox func TestFSPurge(t *testing.T) { - ds := setupDataStore() + ds, logbuf := setupDataStore() defer teardownDataStore(ds) mbName := "fred" @@ -257,11 +279,16 @@ func TestFSPurge(t *testing.T) { } assert.Equal(t, len(msgs), 0, "Expected mailbox to have zero messages, got %v", len(msgs)) + + if t.Failed() { + // Dump buffered log data if there was a failure + io.Copy(os.Stderr, logbuf) + } } // Test message size calculation func TestFSSize(t *testing.T) { - ds := setupDataStore() + ds, logbuf := setupDataStore() defer teardownDataStore(ds) mbName := "fred" @@ -288,15 +315,25 @@ func TestFSSize(t *testing.T) { size := msg.Size() assert.Equal(t, expect, size, "Expected size of %v, got %v", expect, size) } + + if t.Failed() { + // Dump buffered log data if there was a failure + io.Copy(os.Stderr, logbuf) + } } // setupDataStore creates a new FileDataStore in a temporary directory -func setupDataStore() *FileDataStore { +func setupDataStore() (*FileDataStore, *bytes.Buffer) { path, err := ioutil.TempDir("", "inbucket") if err != nil { panic(err) } - return NewFileDataStore(path).(*FileDataStore) + + // Capture log output + buf := new(bytes.Buffer) + log.SetOutput(buf) + + return NewFileDataStore(path).(*FileDataStore), buf } // deliverMessage creates and delivers a message to the specific mailbox, returning diff --git a/smtpd/handler_test.go b/smtpd/handler_test.go index 33b6c9d..5f7b7b1 100644 --- a/smtpd/handler_test.go +++ b/smtpd/handler_test.go @@ -1,9 +1,12 @@ package smtpd import ( + "bytes" "fmt" "github.com/jhillyerd/inbucket/config" + "io" "io/ioutil" + "log" "net" "net/textproto" "os" @@ -18,7 +21,7 @@ type scriptStep struct { // Test commands in GREET state func TestGreetState(t *testing.T) { - server := setupSmtpServer() + server, logbuf := setupSmtpServer() defer teardownSmtpServer(server) var script []scriptStep @@ -46,11 +49,16 @@ func TestGreetState(t *testing.T) { if err := playSession(t, server, []scriptStep{{"HelO mydom.com", 250}}); err != nil { t.Error(err) } + + if t.Failed() { + // Dump buffered log data if there was a failure + io.Copy(os.Stderr, logbuf) + } } // Test commands in READY state func TestReadyState(t *testing.T) { - server := setupSmtpServer() + server, logbuf := setupSmtpServer() defer teardownSmtpServer(server) var script []scriptStep @@ -84,11 +92,16 @@ func TestReadyState(t *testing.T) { if err := playSession(t, server, script); err != nil { t.Error(err) } + + if t.Failed() { + // Dump buffered log data if there was a failure + io.Copy(os.Stderr, logbuf) + } } // Test commands in MAIL state func TestMailState(t *testing.T) { - server := setupSmtpServer() + server, logbuf := setupSmtpServer() defer teardownSmtpServer(server) var script []scriptStep @@ -170,6 +183,11 @@ func TestMailState(t *testing.T) { if err := playSession(t, server, script); err != nil { t.Error(err) } + + if t.Failed() { + // Dump buffered log data if there was a failure + io.Copy(os.Stderr, logbuf) + } } // playSession creates a new session, reads the greeting and then plays the script @@ -222,7 +240,7 @@ func (m *mockConn) SetDeadline(t time.Time) error { return nil } func (m *mockConn) SetReadDeadline(t time.Time) error { return nil } func (m *mockConn) SetWriteDeadline(t time.Time) error { return nil } -func setupSmtpServer() *Server { +func setupSmtpServer() (*Server, *bytes.Buffer) { // Setup datastore path, err := ioutil.TempDir("", "inbucket") if err != nil { @@ -242,8 +260,12 @@ func setupSmtpServer() *Server { StoreMessages: true, } + // Capture log output + buf := new(bytes.Buffer) + log.SetOutput(buf) + // Create a server, don't start it - return NewSmtpServer(cfg, ds) + return NewSmtpServer(cfg, ds), buf } var sessionNum int @@ -264,4 +286,5 @@ func teardownSmtpServer(server *Server) { if err := os.RemoveAll(ds.path); err != nil { panic(err) } + //log.SetOutput(os.Stderr) }