| 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 |
| }) |
| } |