1 package zap_test
2
3 import (
4 "encoding/json"
5 kitzap "github.com/go-kit/kit/log/zap"
6 "go.uber.org/zap"
7 "go.uber.org/zap/zapcore"
8 "strings"
9 "testing"
10 )
11
12 func TestZapSugarLogger(t *testing.T) {
13
14 encoderConfig := zap.NewDevelopmentEncoderConfig()
15 encoder := zapcore.NewJSONEncoder(encoderConfig)
16 levelKey := encoderConfig.LevelKey
17
18 type testCase struct {
19 level zapcore.Level
20 kvs []interface{}
21 want map[string]string
22 }
23 testCases := []testCase{
24 {level: zapcore.DebugLevel, kvs: []interface{}{"key1", "value1"},
25 want: map[string]string{levelKey: "DEBUG", "key1": "value1"}},
26
27 {level: zapcore.InfoLevel, kvs: []interface{}{"key2", "value2"},
28 want: map[string]string{levelKey: "INFO", "key2": "value2"}},
29
30 {level: zapcore.WarnLevel, kvs: []interface{}{"key3", "value3"},
31 want: map[string]string{levelKey: "WARN", "key3": "value3"}},
32
33 {level: zapcore.ErrorLevel, kvs: []interface{}{"key4", "value4"},
34 want: map[string]string{levelKey: "ERROR", "key4": "value4"}},
35
36 {level: zapcore.DPanicLevel, kvs: []interface{}{"key5", "value5"},
37 want: map[string]string{levelKey: "DPANIC", "key5": "value5"}},
38
39 {level: zapcore.PanicLevel, kvs: []interface{}{"key6", "value6"},
40 want: map[string]string{levelKey: "PANIC", "key6": "value6"}},
41 }
42
43 for _, testCase := range testCases {
44 t.Run(testCase.level.String(), func(t *testing.T) {
45
46 writer := &tbWriter{tb: t}
47 logger := zap.New(
48 zapcore.NewCore(encoder, zapcore.AddSync(writer), zap.DebugLevel),
49 zap.Development())
50
51 shouldPanic := testCase.level >= zapcore.DPanicLevel
52 kitLogger := kitzap.NewZapSugarLogger(logger, testCase.level)
53 defer func() {
54 isPanic := recover() != nil
55 if shouldPanic != isPanic {
56 t.Errorf("test level %v should panic(%v), but %v", testCase.level, shouldPanic, isPanic)
57 }
58
59 logMap := make(map[string]string)
60 err := json.Unmarshal([]byte(writer.sb.String()), &logMap)
61 if err != nil {
62 t.Errorf("unmarshal error: %v", err)
63 } else {
64 for k, v := range testCase.want {
65 vv, ok := logMap[k]
66 if !ok || v != vv {
67 t.Error("error log")
68 }
69 }
70 }
71 }()
72 kitLogger.Log(testCase.kvs...)
73 })
74 }
75 }
76
77 type tbWriter struct {
78 tb testing.TB
79 sb strings.Builder
80 }
81
82 func (w *tbWriter) Write(b []byte) (n int, err error) {
83 w.tb.Logf(string(b))
84 w.sb.Write(b)
85 return len(b), nil
86 }
87
View as plain text