fiber/log/default_test.go

277 lines
6.6 KiB
Go

package log
import (
"bytes"
"context"
"log"
"os"
"testing"
"github.com/stretchr/testify/require"
)
const work = "work"
func initDefaultLogger() {
logger = &defaultLogger{
stdlog: log.New(os.Stderr, "", 0),
depth: 4,
}
}
type byteSliceWriter struct {
b []byte
}
func (w *byteSliceWriter) Write(p []byte) (int, error) {
w.b = append(w.b, p...)
return len(p), nil
}
func Test_WithContextCaller(t *testing.T) {
logger = &defaultLogger{
stdlog: log.New(os.Stderr, "", log.Lshortfile),
depth: 4,
}
var w byteSliceWriter
SetOutput(&w)
ctx := context.TODO()
WithContext(ctx).Info("")
Info("")
require.Equal(t, "default_test.go:41: [Info] \ndefault_test.go:42: [Info] \n", string(w.b))
}
func Test_DefaultLogger(t *testing.T) {
initDefaultLogger()
var w byteSliceWriter
SetOutput(&w)
Trace("trace work")
Debug("received work order")
Info("starting work")
Warn("work may fail")
Error("work failed")
require.Panics(t, func() {
Panic("work panic")
})
require.Equal(t, "[Trace] trace work\n"+
"[Debug] received work order\n"+
"[Info] starting work\n"+
"[Warn] work may fail\n"+
"[Error] work failed\n"+
"[Panic] work panic\n", string(w.b))
}
func Test_DefaultFormatLogger(t *testing.T) {
initDefaultLogger()
var w byteSliceWriter
SetOutput(&w)
Tracef("trace %s", work)
Debugf("received %s order", work)
Infof("starting %s", work)
Warnf("%s may fail", work)
Errorf("%s failed", work)
require.Panics(t, func() {
Panicf("%s panic", work)
})
require.Equal(t, "[Trace] trace work\n"+
"[Debug] received work order\n"+
"[Info] starting work\n"+
"[Warn] work may fail\n"+
"[Error] work failed\n"+
"[Panic] work panic\n", string(w.b))
}
func Test_CtxLogger(t *testing.T) {
initDefaultLogger()
var w byteSliceWriter
SetOutput(&w)
ctx := context.Background()
WithContext(ctx).Tracef("trace %s", work)
WithContext(ctx).Debugf("received %s order", work)
WithContext(ctx).Infof("starting %s", work)
WithContext(ctx).Warnf("%s may fail", work)
WithContext(ctx).Errorf("%s failed %d", work, 50)
require.Panics(t, func() {
WithContext(ctx).Panicf("%s panic", work)
})
require.Equal(t, "[Trace] trace work\n"+
"[Debug] received work order\n"+
"[Info] starting work\n"+
"[Warn] work may fail\n"+
"[Error] work failed 50\n"+
"[Panic] work panic\n", string(w.b))
}
func Test_LogfKeyAndValues(t *testing.T) {
tests := []struct {
name string
level Level
format string
fmtArgs []any
keysAndValues []any
wantOutput string
}{
{
name: "test logf with debug level and key-values",
level: LevelDebug,
format: "",
fmtArgs: nil,
keysAndValues: []any{"name", "Bob", "age", 30},
wantOutput: "[Debug] name=Bob age=30\n",
},
{
name: "test logf with info level and key-values",
level: LevelInfo,
format: "",
fmtArgs: nil,
keysAndValues: []any{"status", "ok", "code", 200},
wantOutput: "[Info] status=ok code=200\n",
},
{
name: "test logf with warn level and key-values",
level: LevelWarn,
format: "",
fmtArgs: nil,
keysAndValues: []any{"error", "not found", "id", 123},
wantOutput: "[Warn] error=not found id=123\n",
},
{
name: "test logf with format and key-values",
level: LevelWarn,
format: "test",
fmtArgs: nil,
keysAndValues: []any{"error", "not found", "id", 123},
wantOutput: "[Warn] test error=not found id=123\n",
},
{
name: "test logf with one key",
level: LevelWarn,
format: "",
fmtArgs: nil,
keysAndValues: []any{"error"},
wantOutput: "[Warn] error=KEYVALS UNPAIRED\n",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
var buf bytes.Buffer
l := &defaultLogger{
stdlog: log.New(&buf, "", 0),
level: tt.level,
depth: 4,
}
l.privateLogw(tt.level, tt.format, tt.keysAndValues)
require.Equal(t, tt.wantOutput, buf.String())
})
}
}
func BenchmarkLogfKeyAndValues(b *testing.B) {
tests := []struct {
name string
level Level
format string
keysAndValues []any
}{
{
name: "test logf with debug level and key-values",
level: LevelDebug,
format: "",
keysAndValues: []any{"name", "Bob", "age", 30},
},
{
name: "test logf with info level and key-values",
level: LevelInfo,
format: "",
keysAndValues: []any{"status", "ok", "code", 200},
},
{
name: "test logf with warn level and key-values",
level: LevelWarn,
format: "",
keysAndValues: []any{"error", "not found", "id", 123},
},
{
name: "test logf with format and key-values",
level: LevelWarn,
format: "test",
keysAndValues: []any{"error", "not found", "id", 123},
},
{
name: "test logf with one key",
level: LevelWarn,
format: "",
keysAndValues: []any{"error"},
},
}
for _, tt := range tests {
b.Run(tt.name, func(b *testing.B) {
var buf bytes.Buffer
l := &defaultLogger{
stdlog: log.New(&buf, "", 0),
level: tt.level,
depth: 4,
}
for i := 0; i < b.N; i++ {
l.privateLogw(tt.level, tt.format, tt.keysAndValues)
}
})
}
}
func Test_SetLevel(t *testing.T) {
setLogger := &defaultLogger{
stdlog: log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile|log.Lmicroseconds),
depth: 4,
}
setLogger.SetLevel(LevelTrace)
require.Equal(t, LevelTrace, setLogger.level)
require.Equal(t, LevelTrace.toString(), setLogger.level.toString())
setLogger.SetLevel(LevelDebug)
require.Equal(t, LevelDebug, setLogger.level)
require.Equal(t, LevelDebug.toString(), setLogger.level.toString())
setLogger.SetLevel(LevelInfo)
require.Equal(t, LevelInfo, setLogger.level)
require.Equal(t, LevelInfo.toString(), setLogger.level.toString())
setLogger.SetLevel(LevelWarn)
require.Equal(t, LevelWarn, setLogger.level)
require.Equal(t, LevelWarn.toString(), setLogger.level.toString())
setLogger.SetLevel(LevelError)
require.Equal(t, LevelError, setLogger.level)
require.Equal(t, LevelError.toString(), setLogger.level.toString())
setLogger.SetLevel(LevelFatal)
require.Equal(t, LevelFatal, setLogger.level)
require.Equal(t, LevelFatal.toString(), setLogger.level.toString())
setLogger.SetLevel(LevelPanic)
require.Equal(t, LevelPanic, setLogger.level)
require.Equal(t, LevelPanic.toString(), setLogger.level.toString())
setLogger.SetLevel(8)
require.Equal(t, 8, int(setLogger.level))
require.Equal(t, "[?8] ", setLogger.level.toString())
}