From ab2de9ffb1df145ad7ab5326354909854534fa1d Mon Sep 17 00:00:00 2001 From: Jonathan Hall Date: Thu, 20 Apr 2017 09:29:15 +0200 Subject: [PATCH 1/3] Fix a few comments to conform to Go standards --- hooks/test/test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/hooks/test/test.go b/hooks/test/test.go index 0688125..0190ba0 100644 --- a/hooks/test/test.go +++ b/hooks/test/test.go @@ -6,12 +6,12 @@ import ( "github.com/Sirupsen/logrus" ) -// test.Hook is a hook designed for dealing with logs in test scenarios. +// Hook is a hook designed for dealing with logs in test scenarios. type Hook struct { Entries []*logrus.Entry } -// Installs a test hook for the global logger. +// NewGlobal installs a test hook for the global logger. func NewGlobal() *Hook { hook := new(Hook) @@ -21,7 +21,7 @@ func NewGlobal() *Hook { } -// Installs a test hook for a given local logger. +// NewLocal installs a test hook for a given local logger. func NewLocal(logger *logrus.Logger) *Hook { hook := new(Hook) @@ -31,7 +31,7 @@ func NewLocal(logger *logrus.Logger) *Hook { } -// Creates a discarding logger and installs the test hook. +// NewNullLogger creates a discarding logger and installs the test hook. func NewNullLogger() (*logrus.Logger, *Hook) { logger := logrus.New() From cc6ca6f305195f1bc8bef5ae2f82cdc8b08e5265 Mon Sep 17 00:00:00 2001 From: Jonathan Hall Date: Thu, 20 Apr 2017 09:33:10 +0200 Subject: [PATCH 2/3] Protect test entries with a mutex --- hooks/test/test.go | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/hooks/test/test.go b/hooks/test/test.go index 0190ba0..78d75ff 100644 --- a/hooks/test/test.go +++ b/hooks/test/test.go @@ -2,6 +2,7 @@ package test import ( "io/ioutil" + "sync" "github.com/Sirupsen/logrus" ) @@ -9,6 +10,7 @@ import ( // Hook is a hook designed for dealing with logs in test scenarios. type Hook struct { Entries []*logrus.Entry + mu sync.RWMutex } // NewGlobal installs a test hook for the global logger. @@ -42,6 +44,8 @@ func NewNullLogger() (*logrus.Logger, *Hook) { } func (t *Hook) Fire(e *logrus.Entry) error { + t.mu.Lock() + defer t.mu.Unlock() t.Entries = append(t.Entries, e) return nil } @@ -51,17 +55,35 @@ func (t *Hook) Levels() []logrus.Level { } // LastEntry returns the last entry that was logged or nil. -func (t *Hook) LastEntry() (l *logrus.Entry) { - - if i := len(t.Entries) - 1; i < 0 { +func (t *Hook) LastEntry() *logrus.Entry { + t.mu.RLock() + defer t.mu.RUnlock() + i := len(t.Entries) - 1 + if i < 0 { return nil - } else { - return t.Entries[i] } + // Make a copy, for safety + e := *t.Entries[i] + return &e +} +// AllEntries returns all entries that were logged. +func (t *Hook) AllEntries() []*logrus.Entry { + t.mu.RLock() + defer t.mu.RUnlock() + // Make a copy so the returned value won't race with future log requests + entries := make([]*logrus.Entry, len(t.Entries)) + for i, entry := range t.Entries { + // Make a copy, for safety + e := *entry + entries[i] = &e + } + return entries } // Reset removes all Entries from this test hook. func (t *Hook) Reset() { + t.mu.Lock() + defer t.mu.Unlock() t.Entries = make([]*logrus.Entry, 0) } From 7e4197a54fa63f4dcc875450bfa4e8609f3bfecc Mon Sep 17 00:00:00 2001 From: Jonathan Hall Date: Thu, 20 Apr 2017 09:37:32 +0200 Subject: [PATCH 3/3] Add a small warning comment --- hooks/test/test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/hooks/test/test.go b/hooks/test/test.go index 78d75ff..a94a6f9 100644 --- a/hooks/test/test.go +++ b/hooks/test/test.go @@ -9,6 +9,9 @@ import ( // Hook is a hook designed for dealing with logs in test scenarios. type Hook struct { + // Entries is an array of all entries that have been received by this hook. + // For safe access, use the AllEntries() method, rather than reading this + // value directly. Entries []*logrus.Entry mu sync.RWMutex }