1
0

error_test.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package util
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "testing"
  7. "github.com/slackhq/nebula/test"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. type m = map[string]any
  11. func TestContextualError_Log(t *testing.T) {
  12. buf := &bytes.Buffer{}
  13. l := test.NewLoggerWithOutput(buf)
  14. // Test a full context line
  15. buf.Reset()
  16. e := NewContextualError("test message", m{"field": "1"}, errors.New("error"))
  17. e.Log(l)
  18. assert.Equal(t, "level=ERROR msg=\"test message\" field=1 error=error\n", buf.String())
  19. // Test a line with an error and msg but no fields
  20. buf.Reset()
  21. e = NewContextualError("test message", nil, errors.New("error"))
  22. e.Log(l)
  23. assert.Equal(t, "level=ERROR msg=\"test message\" error=error\n", buf.String())
  24. // Test just a context and fields
  25. buf.Reset()
  26. e = NewContextualError("test message", m{"field": "1"}, nil)
  27. e.Log(l)
  28. assert.Equal(t, "level=ERROR msg=\"test message\" field=1\n", buf.String())
  29. // Test just a context
  30. buf.Reset()
  31. e = NewContextualError("test message", nil, nil)
  32. e.Log(l)
  33. assert.Equal(t, "level=ERROR msg=\"test message\"\n", buf.String())
  34. // Test just an error
  35. buf.Reset()
  36. e = NewContextualError("", nil, errors.New("error"))
  37. e.Log(l)
  38. assert.Equal(t, "level=ERROR msg=\"\" error=error\n", buf.String())
  39. }
  40. func TestLogWithContextIfNeeded(t *testing.T) {
  41. buf := &bytes.Buffer{}
  42. l := test.NewLoggerWithOutput(buf)
  43. // Test ignoring fallback context
  44. buf.Reset()
  45. e := NewContextualError("test message", m{"field": "1"}, errors.New("error"))
  46. LogWithContextIfNeeded("This should get thrown away", e, l)
  47. assert.Equal(t, "level=ERROR msg=\"test message\" field=1 error=error\n", buf.String())
  48. // Test using fallback context
  49. buf.Reset()
  50. err := fmt.Errorf("this is a normal error")
  51. LogWithContextIfNeeded("Fallback context woo", err, l)
  52. assert.Equal(t, "level=ERROR msg=\"Fallback context woo\" error=\"this is a normal error\"\n", buf.String())
  53. }
  54. func TestContextualizeIfNeeded(t *testing.T) {
  55. // Test ignoring fallback context
  56. e := NewContextualError("test message", m{"field": "1"}, errors.New("error"))
  57. assert.Same(t, e, ContextualizeIfNeeded("should be ignored", e))
  58. // Test using fallback context
  59. err := fmt.Errorf("this is a normal error")
  60. cErr := ContextualizeIfNeeded("Fallback context woo", err)
  61. switch v := cErr.(type) {
  62. case *ContextualError:
  63. assert.Equal(t, err, v.RealError)
  64. default:
  65. t.Error("Error was not wrapped")
  66. t.Fail()
  67. }
  68. }