error_test.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package util
  2. import (
  3. "errors"
  4. "fmt"
  5. "testing"
  6. "github.com/sirupsen/logrus"
  7. "github.com/stretchr/testify/assert"
  8. )
  9. type m = map[string]any
  10. type TestLogWriter struct {
  11. Logs []string
  12. }
  13. func NewTestLogWriter() *TestLogWriter {
  14. return &TestLogWriter{Logs: make([]string, 0)}
  15. }
  16. func (tl *TestLogWriter) Write(p []byte) (n int, err error) {
  17. tl.Logs = append(tl.Logs, string(p))
  18. return len(p), nil
  19. }
  20. func (tl *TestLogWriter) Reset() {
  21. tl.Logs = tl.Logs[:0]
  22. }
  23. func TestContextualError_Log(t *testing.T) {
  24. l := logrus.New()
  25. l.Formatter = &logrus.TextFormatter{
  26. DisableTimestamp: true,
  27. DisableColors: true,
  28. }
  29. tl := NewTestLogWriter()
  30. l.Out = tl
  31. // Test a full context line
  32. tl.Reset()
  33. e := NewContextualError("test message", m{"field": "1"}, errors.New("error"))
  34. e.Log(l)
  35. assert.Equal(t, []string{"level=error msg=\"test message\" error=error field=1\n"}, tl.Logs)
  36. // Test a line with an error and msg but no fields
  37. tl.Reset()
  38. e = NewContextualError("test message", nil, errors.New("error"))
  39. e.Log(l)
  40. assert.Equal(t, []string{"level=error msg=\"test message\" error=error\n"}, tl.Logs)
  41. // Test just a context and fields
  42. tl.Reset()
  43. e = NewContextualError("test message", m{"field": "1"}, nil)
  44. e.Log(l)
  45. assert.Equal(t, []string{"level=error msg=\"test message\" field=1\n"}, tl.Logs)
  46. // Test just a context
  47. tl.Reset()
  48. e = NewContextualError("test message", nil, nil)
  49. e.Log(l)
  50. assert.Equal(t, []string{"level=error msg=\"test message\"\n"}, tl.Logs)
  51. // Test just an error
  52. tl.Reset()
  53. e = NewContextualError("", nil, errors.New("error"))
  54. e.Log(l)
  55. assert.Equal(t, []string{"level=error error=error\n"}, tl.Logs)
  56. }
  57. func TestLogWithContextIfNeeded(t *testing.T) {
  58. l := logrus.New()
  59. l.Formatter = &logrus.TextFormatter{
  60. DisableTimestamp: true,
  61. DisableColors: true,
  62. }
  63. tl := NewTestLogWriter()
  64. l.Out = tl
  65. // Test ignoring fallback context
  66. tl.Reset()
  67. e := NewContextualError("test message", m{"field": "1"}, errors.New("error"))
  68. LogWithContextIfNeeded("This should get thrown away", e, l)
  69. assert.Equal(t, []string{"level=error msg=\"test message\" error=error field=1\n"}, tl.Logs)
  70. // Test using fallback context
  71. tl.Reset()
  72. err := fmt.Errorf("this is a normal error")
  73. LogWithContextIfNeeded("Fallback context woo", err, l)
  74. assert.Equal(t, []string{"level=error msg=\"Fallback context woo\" error=\"this is a normal error\"\n"}, tl.Logs)
  75. }
  76. func TestContextualizeIfNeeded(t *testing.T) {
  77. // Test ignoring fallback context
  78. e := NewContextualError("test message", m{"field": "1"}, errors.New("error"))
  79. assert.Same(t, e, ContextualizeIfNeeded("should be ignored", e))
  80. // Test using fallback context
  81. err := fmt.Errorf("this is a normal error")
  82. cErr := ContextualizeIfNeeded("Fallback context woo", err)
  83. switch v := cErr.(type) {
  84. case *ContextualError:
  85. assert.Equal(t, err, v.RealError)
  86. default:
  87. t.Error("Error was not wrapped")
  88. t.Fail()
  89. }
  90. }