/
githubmirror
/
photoprism
Обзор
Документация
Войти
/
githubmirror
/
photoprism
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
internal/event/panic_test.go
106 строк
2 KB
Michael Mayer
Backend: Report recovered panics via SystemLog, not the DB logger #5637
03 июн 2026, 11:29
03 июн 2026, 11:29
188aba7
Код
Авторство
О чём код?
package event import ( "bytes" "testing" "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" ) // newTestLogger returns a logrus logger writing to buf at error level. func newTestLogger(buf *bytes.Buffer) *logrus.Logger { logger := logrus.New() logger.SetOutput(buf) logger.SetLevel(logrus.ErrorLevel) return logger } func TestLogPanic(t *testing.T) { t.Run("Success", func(t *testing.T) { var sysBuf, logBuf bytes.Buffer origSys, origLog := SystemLog, Log SystemLog = newTestLogger(&sysBuf) Log = newTestLogger(&logBuf) t.Cleanup(func() { SystemLog = origSys; Log = origLog }) LogPanic("boom") out := sysBuf.String() assert.Contains(t, out, "panic") assert.Contains(t, out, "boom") assert.Contains(t, out, "goroutine") // Must not be routed through the default, database-persisted logger. assert.Empty(t, logBuf.String()) }) t.Run("Nil", func(t *testing.T) { var buf bytes.Buffer orig := SystemLog SystemLog = newTestLogger(&buf) t.Cleanup(func() { SystemLog = orig }) LogPanic(nil) assert.Empty(t, buf.String()) }) t.Run("NoLogger", func(t *testing.T) { orig := SystemLog SystemLog = nil t.Cleanup(func() { SystemLog = orig }) assert.NotPanics(t, func() { LogPanic("boom") }) }) } func TestRecover(t *testing.T) { t.Run("Panic", func(t *testing.T) { var buf bytes.Buffer orig := SystemLog SystemLog = newTestLogger(&buf) t.Cleanup(func() { SystemLog = orig }) func() { defer Recover() panic("kaboom") }() out := buf.String() assert.Contains(t, out, "panic") assert.Contains(t, out, "kaboom") assert.Contains(t, out, "goroutine") }) t.Run("NoPanic", func(t *testing.T) { var buf bytes.Buffer orig := SystemLog SystemLog = newTestLogger(&buf) t.Cleanup(func() { SystemLog = orig }) func() { defer Recover() }() assert.Empty(t, buf.String()) }) } func TestSafe(t *testing.T) { t.Run("RecoversAndContinues", func(t *testing.T) { var buf bytes.Buffer orig := SystemLog SystemLog = newTestLogger(&buf) t.Cleanup(func() { SystemLog = orig }) ran := 0 assert.NotPanics(t, func() { Safe(func() { panic("boom") }) Safe(func() { ran++ }) }) assert.Equal(t, 1, ran) assert.Contains(t, buf.String(), "panic") assert.Contains(t, buf.String(), "boom") }) t.Run("Success", func(t *testing.T) { called := false Safe(func() { called = true }) assert.True(t, called) }) }