encoder_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. package zapx
  2. import (
  3. "bytes"
  4. "testing"
  5. "time"
  6. "go.uber.org/zap"
  7. "go.uber.org/zap/zapcore"
  8. )
  9. var (
  10. eventTime = time.Date(2006, 1, 2, 15, 4, 5, 0, time.UTC)
  11. caller = func(zapcore.EntryCaller) string { return "" }
  12. )
  13. func TestEncodeNestedObject(t *testing.T) {
  14. entry := zapcore.Entry{
  15. Level: zapcore.InfoLevel,
  16. Time: eventTime,
  17. LoggerName: "",
  18. Message: "msg",
  19. Caller: zapcore.EntryCaller{},
  20. Stack: "",
  21. }
  22. fields := []zapcore.Field{
  23. zap.Object("a", zapcore.ObjectMarshalerFunc(func(oe zapcore.ObjectEncoder) error {
  24. oe.AddString("a1", "v1")
  25. oe.AddArray("b", zapcore.ArrayMarshalerFunc(func(ae zapcore.ArrayEncoder) error {
  26. ae.AppendString("b1")
  27. ae.AppendObject(zapcore.ObjectMarshalerFunc(func(oe zapcore.ObjectEncoder) error {
  28. oe.AddString("c1", "v2")
  29. return nil
  30. }))
  31. return nil
  32. }))
  33. return nil
  34. })),
  35. }
  36. encoder := NewEncoder("category", caller)
  37. buf, err := encoder.EncodeEntry(entry, fields)
  38. if err != nil {
  39. t.Fatal(err)
  40. }
  41. s := buf.String()
  42. want := `{"eventTime":"2006-01-02T15:04:05Z","category":"category","level":"info","caller":"","message":"msg","stringEntries":[{"key":"a.a1","value":"v1"},{"key":"a.b[0]","value":"b1"},{"key":"a.b[1].c1","value":"v2"}],"floatEntries":[],"intEntries":[],"boolEntries":[]}`
  43. if s != want {
  44. t.Errorf("log mismatch\n got %s\nwant %s", s, want)
  45. }
  46. }
  47. func TestEncodeInt(t *testing.T) {
  48. entry := zapcore.Entry{
  49. Level: zapcore.InfoLevel,
  50. Time: eventTime,
  51. LoggerName: "",
  52. Message: "msg",
  53. Caller: zapcore.EntryCaller{},
  54. Stack: "",
  55. }
  56. fields := []zapcore.Field{
  57. zap.Int64("a1", 1),
  58. zap.Int64("b1", 2147483648), // 1 << 33 = max int32 + 1
  59. zap.Int64("c1", 9007199254740993), // 1<<53+1
  60. zap.Uint64("a2", 1),
  61. zap.Uint64("b2", 2147483648), // 1 << 33 = max int32 + 1
  62. zap.Uint64("c2", 9007199254740993), // 1<<53+1
  63. }
  64. encoder := NewEncoder("category", caller)
  65. buf, err := encoder.EncodeEntry(entry, fields)
  66. if err != nil {
  67. t.Fatal(err)
  68. }
  69. s := buf.String()
  70. want := `{"eventTime":"2006-01-02T15:04:05Z","category":"category","level":"info","caller":"","message":"msg","stringEntries":[{"key":"c1","value":"9007199254740993"},{"key":"c2","value":"9007199254740993"}],"floatEntries":[{"key":"b1","value":2147483648},{"key":"b2","value":2147483648}],"intEntries":[{"key":"a1","value":1},{"key":"a2","value":1}],"boolEntries":[]}`
  71. if s != want {
  72. t.Errorf("log mismatch\n got %s\nwant %s", s, want)
  73. }
  74. }
  75. func TestWith(t *testing.T) {
  76. var buf bytes.Buffer
  77. var clock mockClock
  78. encoder := NewEncoder("category", caller)
  79. core := zapcore.NewCore(encoder, zapcore.AddSync(&buf), zapcore.InfoLevel)
  80. logger := zap.New(core, zap.WithClock(clock))
  81. logger = logger.With(zap.String("a", "b"))
  82. logger.Info("hello", zap.String("name", "world"))
  83. want := `{"eventTime":"2006-01-02T15:04:05Z","category":"category","level":"info","caller":"","message":"hello","stringEntries":[{"key":"a","value":"b"},{"key":"name","value":"world"}],"floatEntries":[],"intEntries":[],"boolEntries":[]}`
  84. s := buf.String()
  85. if s != want {
  86. t.Errorf("log mismatch\n got %s\nwant %s", s, want)
  87. }
  88. }
  89. func TestNameSpace(t *testing.T) {
  90. var buf bytes.Buffer
  91. var clock mockClock
  92. encoder := NewEncoder("category", caller)
  93. core := zapcore.NewCore(encoder, zapcore.AddSync(&buf), zapcore.InfoLevel)
  94. logger := zap.New(core, zap.WithClock(clock))
  95. logger = logger.With(zap.Namespace("a"), zap.String("b", "c"))
  96. logger.Info("msg", zap.String("d", "e"))
  97. want := `{"eventTime":"2006-01-02T15:04:05Z","category":"category","level":"info","caller":"","message":"msg","stringEntries":[{"key":"a.b","value":"c"},{"key":"a.d","value":"e"}],"floatEntries":[],"intEntries":[],"boolEntries":[]}`
  98. s := buf.String()
  99. if s != want {
  100. t.Errorf("log mismatch\n got %s\nwant %s", s, want)
  101. }
  102. }
  103. type mockClock struct{}
  104. func (c mockClock) Now() time.Time { return eventTime }
  105. func (c mockClock) NewTicker(time.Duration) *time.Ticker { panic("not implemented") }