package logger import ( "XProxy/mocks" "fmt" "github.com/magiconair/properties/assert" "github.com/petermattis/goid" "github.com/stretchr/testify/mock" "go.uber.org/zap/zapcore" "runtime" "strings" "testing" "time" ) var testTime = time.Date(2000, time.January, 1, 0, 0, 0, 0, time.UTC) // zapCaller build fake caller with the absolute path of current code. func zapCaller() zapcore.EntryCaller { _, srcPath, _, _ := runtime.Caller(0) return zapcore.EntryCaller{ File: srcPath, Line: 0, } } // encoderTest is a helper function to test buffer output of mock encoder. func encoderTest(t *testing.T, exec func(*mocks.PrimitiveArrayEncoder), expect string) { encoder := mocks.NewPrimitiveArrayEncoder(t) encoder.On("AppendInt64", mock.Anything).Maybe() // only enroll used method encoder.On("AppendString", mock.Anything).Maybe() exec(encoder) var values []string for _, call := range encoder.Calls { values = append(values, fmt.Sprintf("%v", call.Arguments.Get(0))) } assert.Equal(t, strings.Join(values, " "), expect) } func Test_getCaller(t *testing.T) { caller := zapCaller() caller.File = "Invalid Path" assert.Equal(t, getCaller(caller, true), "unknown") assert.Equal(t, getCaller(caller, false), "unknown") assert.Equal(t, getCaller(zapCaller(), false), "logger/encoder_test") assert.Equal(t, getCaller(zapCaller(), true), "logger/encoder_test.go:0") } func Test_timeEncoder(t *testing.T) { encoderTest(t, func(encoder *mocks.PrimitiveArrayEncoder) { timeEncoder(testTime, encoder) }, "2000-01-01 00:00:00.000") encoderTest(t, func(encoder *mocks.PrimitiveArrayEncoder) { timeColoredEncoder(testTime, encoder) }, "\x1b[36m"+logger.prefix+"\x1b[0m \x1b[90m2000-01-01 00:00:00.000\x1b[0m") } func Test_callerEncoder(t *testing.T) { verboseVal := logger.verbose callerTest := func(entry func(zapcore.EntryCaller, zapcore.PrimitiveArrayEncoder), expect string) { encoderTest(t, func(encoder *mocks.PrimitiveArrayEncoder) { entry(zapCaller(), encoder) }, expect) } logger.verbose = false callerTest(callerEncoder, "[logger/encoder_test]") callerTest(callerColoredEncoder, "\x1b[35m[logger/encoder_test]\x1b[0m") logger.verbose = true gid := fmt.Sprintf("[%d]", goid.Get()) callerTest(callerEncoder, gid+" [logger/encoder_test.go:0]") callerTest(callerColoredEncoder, "\x1b[34m"+gid+"\x1b[0m \x1b[35m[logger/encoder_test.go:0]\x1b[0m") logger.verbose = verboseVal } func Test_levelEncoder(t *testing.T) { levelTest := func(entry func(zapcore.Level, zapcore.PrimitiveArrayEncoder), level zapcore.Level, expect string) { encoderTest(t, func(encoder *mocks.PrimitiveArrayEncoder) { entry(level, encoder) }, expect) } levelTest(levelEncoder, zapcore.DebugLevel, "[DEBUG]") levelTest(levelEncoder, zapcore.InfoLevel, "[INFO]") levelTest(levelEncoder, zapcore.WarnLevel, "[WARN]") levelTest(levelEncoder, zapcore.ErrorLevel, "[ERROR]") levelTest(levelEncoder, zapcore.PanicLevel, "[PANIC]") levelTest(levelColoredEncoder, zapcore.DebugLevel, "\x1b[39m[DEBUG]\x1b[0m") levelTest(levelColoredEncoder, zapcore.InfoLevel, "\x1b[32m[INFO]\x1b[0m") levelTest(levelColoredEncoder, zapcore.WarnLevel, "\x1b[33m[WARN]\x1b[0m") levelTest(levelColoredEncoder, zapcore.ErrorLevel, "\x1b[31m[ERROR]\x1b[0m") levelTest(levelColoredEncoder, zapcore.PanicLevel, "\x1b[91m[PANIC]\x1b[0m") }