145 lines
2.5 KiB
Go
145 lines
2.5 KiB
Go
package logrus
|
|
|
|
import (
|
|
"sync"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
type TestHook struct {
|
|
Fired bool
|
|
}
|
|
|
|
func (hook *TestHook) Fire(entry *Entry) error {
|
|
hook.Fired = true
|
|
return nil
|
|
}
|
|
|
|
func (hook *TestHook) Levels() []Level {
|
|
return []Level{
|
|
DebugLevel,
|
|
InfoLevel,
|
|
WarnLevel,
|
|
ErrorLevel,
|
|
FatalLevel,
|
|
PanicLevel,
|
|
}
|
|
}
|
|
|
|
func TestHookFires(t *testing.T) {
|
|
hook := new(TestHook)
|
|
|
|
LogAndAssertJSON(t, func(log *Logger) {
|
|
log.Hooks.Add(hook)
|
|
assert.Equal(t, hook.Fired, false)
|
|
|
|
log.Print("test")
|
|
}, func(fields Fields) {
|
|
assert.Equal(t, hook.Fired, true)
|
|
})
|
|
}
|
|
|
|
type ModifyHook struct {
|
|
}
|
|
|
|
func (hook *ModifyHook) Fire(entry *Entry) error {
|
|
entry.Data["wow"] = "whale"
|
|
return nil
|
|
}
|
|
|
|
func (hook *ModifyHook) Levels() []Level {
|
|
return []Level{
|
|
DebugLevel,
|
|
InfoLevel,
|
|
WarnLevel,
|
|
ErrorLevel,
|
|
FatalLevel,
|
|
PanicLevel,
|
|
}
|
|
}
|
|
|
|
func TestHookCanModifyEntry(t *testing.T) {
|
|
hook := new(ModifyHook)
|
|
|
|
LogAndAssertJSON(t, func(log *Logger) {
|
|
log.Hooks.Add(hook)
|
|
log.WithField("wow", "elephant").Print("test")
|
|
}, func(fields Fields) {
|
|
assert.Equal(t, fields["wow"], "whale")
|
|
})
|
|
}
|
|
|
|
func TestCanFireMultipleHooks(t *testing.T) {
|
|
hook1 := new(ModifyHook)
|
|
hook2 := new(TestHook)
|
|
|
|
LogAndAssertJSON(t, func(log *Logger) {
|
|
log.Hooks.Add(hook1)
|
|
log.Hooks.Add(hook2)
|
|
|
|
log.WithField("wow", "elephant").Print("test")
|
|
}, func(fields Fields) {
|
|
assert.Equal(t, fields["wow"], "whale")
|
|
assert.Equal(t, hook2.Fired, true)
|
|
})
|
|
}
|
|
|
|
type ErrorHook struct {
|
|
Fired bool
|
|
}
|
|
|
|
func (hook *ErrorHook) Fire(entry *Entry) error {
|
|
hook.Fired = true
|
|
return nil
|
|
}
|
|
|
|
func (hook *ErrorHook) Levels() []Level {
|
|
return []Level{
|
|
ErrorLevel,
|
|
}
|
|
}
|
|
|
|
func TestErrorHookShouldntFireOnInfo(t *testing.T) {
|
|
hook := new(ErrorHook)
|
|
|
|
LogAndAssertJSON(t, func(log *Logger) {
|
|
log.Hooks.Add(hook)
|
|
log.Info("test")
|
|
}, func(fields Fields) {
|
|
assert.Equal(t, hook.Fired, false)
|
|
})
|
|
}
|
|
|
|
func TestErrorHookShouldFireOnError(t *testing.T) {
|
|
hook := new(ErrorHook)
|
|
|
|
LogAndAssertJSON(t, func(log *Logger) {
|
|
log.Hooks.Add(hook)
|
|
log.Error("test")
|
|
}, func(fields Fields) {
|
|
assert.Equal(t, hook.Fired, true)
|
|
})
|
|
}
|
|
|
|
func TestAddHookRace(t *testing.T) {
|
|
var wg sync.WaitGroup
|
|
wg.Add(2)
|
|
hook := new(ErrorHook)
|
|
LogAndAssertJSON(t, func(log *Logger) {
|
|
go func() {
|
|
defer wg.Done()
|
|
log.AddHook(hook)
|
|
}()
|
|
go func() {
|
|
defer wg.Done()
|
|
log.Error("test")
|
|
}()
|
|
wg.Wait()
|
|
}, func(fields Fields) {
|
|
// the line may have been logged
|
|
// before the hook was added, so we can't
|
|
// actually assert on the hook
|
|
})
|
|
}
|