mirror of
https://github.com/jhillyerd/inbucket.git
synced 2025-12-18 01:57:02 +00:00
Capture log output during unit tests
This commit is contained in:
@@ -1,9 +1,12 @@
|
|||||||
package smtpd
|
package smtpd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -12,7 +15,7 @@ import (
|
|||||||
|
|
||||||
// Test directory structure created by filestore
|
// Test directory structure created by filestore
|
||||||
func TestFSDirStructure(t *testing.T) {
|
func TestFSDirStructure(t *testing.T) {
|
||||||
ds := setupDataStore()
|
ds, logbuf := setupDataStore()
|
||||||
defer teardownDataStore(ds)
|
defer teardownDataStore(ds)
|
||||||
root := ds.path
|
root := ds.path
|
||||||
|
|
||||||
@@ -85,11 +88,16 @@ func TestFSDirStructure(t *testing.T) {
|
|||||||
assert.False(t, isPresent(expect), "Did not expect %q to exist", expect)
|
assert.False(t, isPresent(expect), "Did not expect %q to exist", expect)
|
||||||
expect = mbPath
|
expect = mbPath
|
||||||
assert.False(t, isPresent(expect), "Did not expect %q to exist", expect)
|
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()
|
// Test FileDataStore.AllMailboxes()
|
||||||
func TestFSAllMailboxes(t *testing.T) {
|
func TestFSAllMailboxes(t *testing.T) {
|
||||||
ds := setupDataStore()
|
ds, logbuf := setupDataStore()
|
||||||
defer teardownDataStore(ds)
|
defer teardownDataStore(ds)
|
||||||
|
|
||||||
for _, name := range []string{"abby", "bill", "christa", "donald", "evelyn"} {
|
for _, name := range []string{"abby", "bill", "christa", "donald", "evelyn"} {
|
||||||
@@ -105,12 +113,17 @@ func TestFSAllMailboxes(t *testing.T) {
|
|||||||
mboxes, err := ds.AllMailboxes()
|
mboxes, err := ds.AllMailboxes()
|
||||||
assert.Nil(t, err)
|
assert.Nil(t, err)
|
||||||
assert.Equal(t, len(mboxes), 5)
|
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
|
// Test delivering several messages to the same mailbox, meanwhile querying its
|
||||||
// contents with a new mailbox object each time
|
// contents with a new mailbox object each time
|
||||||
func TestFSDeliverMany(t *testing.T) {
|
func TestFSDeliverMany(t *testing.T) {
|
||||||
ds := setupDataStore()
|
ds, logbuf := setupDataStore()
|
||||||
defer teardownDataStore(ds)
|
defer teardownDataStore(ds)
|
||||||
|
|
||||||
mbName := "fred"
|
mbName := "fred"
|
||||||
@@ -148,11 +161,16 @@ func TestFSDeliverMany(t *testing.T) {
|
|||||||
subj := msgs[i].Subject()
|
subj := msgs[i].Subject()
|
||||||
assert.Equal(t, expect, subj, "Expected subject %q, got %q", expect, subj)
|
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
|
// Test deleting messages
|
||||||
func TestFSDelete(t *testing.T) {
|
func TestFSDelete(t *testing.T) {
|
||||||
ds := setupDataStore()
|
ds, logbuf := setupDataStore()
|
||||||
defer teardownDataStore(ds)
|
defer teardownDataStore(ds)
|
||||||
|
|
||||||
mbName := "fred"
|
mbName := "fred"
|
||||||
@@ -216,11 +234,15 @@ func TestFSDelete(t *testing.T) {
|
|||||||
assert.Equal(t, expect, subj, "Expected subject %q, got %q", expect, subj)
|
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
|
// Test purging a mailbox
|
||||||
func TestFSPurge(t *testing.T) {
|
func TestFSPurge(t *testing.T) {
|
||||||
ds := setupDataStore()
|
ds, logbuf := setupDataStore()
|
||||||
defer teardownDataStore(ds)
|
defer teardownDataStore(ds)
|
||||||
|
|
||||||
mbName := "fred"
|
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))
|
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
|
// Test message size calculation
|
||||||
func TestFSSize(t *testing.T) {
|
func TestFSSize(t *testing.T) {
|
||||||
ds := setupDataStore()
|
ds, logbuf := setupDataStore()
|
||||||
defer teardownDataStore(ds)
|
defer teardownDataStore(ds)
|
||||||
|
|
||||||
mbName := "fred"
|
mbName := "fred"
|
||||||
@@ -288,15 +315,25 @@ func TestFSSize(t *testing.T) {
|
|||||||
size := msg.Size()
|
size := msg.Size()
|
||||||
assert.Equal(t, expect, size, "Expected size of %v, got %v", expect, 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
|
// setupDataStore creates a new FileDataStore in a temporary directory
|
||||||
func setupDataStore() *FileDataStore {
|
func setupDataStore() (*FileDataStore, *bytes.Buffer) {
|
||||||
path, err := ioutil.TempDir("", "inbucket")
|
path, err := ioutil.TempDir("", "inbucket")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
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
|
// deliverMessage creates and delivers a message to the specific mailbox, returning
|
||||||
|
|||||||
@@ -1,9 +1,12 @@
|
|||||||
package smtpd
|
package smtpd
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/jhillyerd/inbucket/config"
|
"github.com/jhillyerd/inbucket/config"
|
||||||
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
"net"
|
"net"
|
||||||
"net/textproto"
|
"net/textproto"
|
||||||
"os"
|
"os"
|
||||||
@@ -18,7 +21,7 @@ type scriptStep struct {
|
|||||||
|
|
||||||
// Test commands in GREET state
|
// Test commands in GREET state
|
||||||
func TestGreetState(t *testing.T) {
|
func TestGreetState(t *testing.T) {
|
||||||
server := setupSmtpServer()
|
server, logbuf := setupSmtpServer()
|
||||||
defer teardownSmtpServer(server)
|
defer teardownSmtpServer(server)
|
||||||
var script []scriptStep
|
var script []scriptStep
|
||||||
|
|
||||||
@@ -46,11 +49,16 @@ func TestGreetState(t *testing.T) {
|
|||||||
if err := playSession(t, server, []scriptStep{{"HelO mydom.com", 250}}); err != nil {
|
if err := playSession(t, server, []scriptStep{{"HelO mydom.com", 250}}); err != nil {
|
||||||
t.Error(err)
|
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
|
// Test commands in READY state
|
||||||
func TestReadyState(t *testing.T) {
|
func TestReadyState(t *testing.T) {
|
||||||
server := setupSmtpServer()
|
server, logbuf := setupSmtpServer()
|
||||||
defer teardownSmtpServer(server)
|
defer teardownSmtpServer(server)
|
||||||
var script []scriptStep
|
var script []scriptStep
|
||||||
|
|
||||||
@@ -84,11 +92,16 @@ func TestReadyState(t *testing.T) {
|
|||||||
if err := playSession(t, server, script); err != nil {
|
if err := playSession(t, server, script); err != nil {
|
||||||
t.Error(err)
|
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
|
// Test commands in MAIL state
|
||||||
func TestMailState(t *testing.T) {
|
func TestMailState(t *testing.T) {
|
||||||
server := setupSmtpServer()
|
server, logbuf := setupSmtpServer()
|
||||||
defer teardownSmtpServer(server)
|
defer teardownSmtpServer(server)
|
||||||
var script []scriptStep
|
var script []scriptStep
|
||||||
|
|
||||||
@@ -170,6 +183,11 @@ func TestMailState(t *testing.T) {
|
|||||||
if err := playSession(t, server, script); err != nil {
|
if err := playSession(t, server, script); err != nil {
|
||||||
t.Error(err)
|
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
|
// 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) SetReadDeadline(t time.Time) error { return nil }
|
||||||
func (m *mockConn) SetWriteDeadline(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
|
// Setup datastore
|
||||||
path, err := ioutil.TempDir("", "inbucket")
|
path, err := ioutil.TempDir("", "inbucket")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -242,8 +260,12 @@ func setupSmtpServer() *Server {
|
|||||||
StoreMessages: true,
|
StoreMessages: true,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Capture log output
|
||||||
|
buf := new(bytes.Buffer)
|
||||||
|
log.SetOutput(buf)
|
||||||
|
|
||||||
// Create a server, don't start it
|
// Create a server, don't start it
|
||||||
return NewSmtpServer(cfg, ds)
|
return NewSmtpServer(cfg, ds), buf
|
||||||
}
|
}
|
||||||
|
|
||||||
var sessionNum int
|
var sessionNum int
|
||||||
@@ -264,4 +286,5 @@ func teardownSmtpServer(server *Server) {
|
|||||||
if err := os.RemoveAll(ds.path); err != nil {
|
if err := os.RemoveAll(ds.path); err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
//log.SetOutput(os.Stderr)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user