fiber/log/default_test.go

213 lines
5.3 KiB
Go

package log
import (
"bytes"
"context"
"log"
"os"
"testing"
"github.com/gofiber/fiber/v2/utils"
)
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_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")
Panic("work panic")
utils.AssertEqual(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)
Panicf("%s panic", work)
utils.AssertEqual(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", work)
WithContext(ctx).Panicf("%s panic", work)
utils.AssertEqual(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_LogfKeyAndValues(t *testing.T) {
tests := []struct {
name string
level Level
format string
fmtArgs []interface{}
keysAndValues []interface{}
wantOutput string
}{
{
name: "test logf with debug level and key-values",
level: LevelDebug,
format: "",
fmtArgs: nil,
keysAndValues: []interface{}{"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: []interface{}{"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: []interface{}{"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: []interface{}{"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: []interface{}{"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)
utils.AssertEqual(t, tt.wantOutput, buf.String())
})
}
}
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("")
utils.AssertEqual(t, "default_test.go:169: [Info] \ndefault_test.go:170: [Info] \n", string(w.b))
}
func Test_SetLevel(t *testing.T) {
setLogger := &defaultLogger{
stdlog: log.New(os.Stderr, "", log.LstdFlags|log.Lshortfile|log.Lmicroseconds),
depth: 4,
}
setLogger.SetLevel(LevelTrace)
utils.AssertEqual(t, LevelTrace, setLogger.level)
utils.AssertEqual(t, LevelTrace.toString(), setLogger.level.toString())
setLogger.SetLevel(LevelDebug)
utils.AssertEqual(t, LevelDebug, setLogger.level)
utils.AssertEqual(t, LevelDebug.toString(), setLogger.level.toString())
setLogger.SetLevel(LevelInfo)
utils.AssertEqual(t, LevelInfo, setLogger.level)
utils.AssertEqual(t, LevelInfo.toString(), setLogger.level.toString())
setLogger.SetLevel(LevelWarn)
utils.AssertEqual(t, LevelWarn, setLogger.level)
utils.AssertEqual(t, LevelWarn.toString(), setLogger.level.toString())
setLogger.SetLevel(LevelError)
utils.AssertEqual(t, LevelError, setLogger.level)
utils.AssertEqual(t, LevelError.toString(), setLogger.level.toString())
setLogger.SetLevel(LevelFatal)
utils.AssertEqual(t, LevelFatal, setLogger.level)
utils.AssertEqual(t, LevelFatal.toString(), setLogger.level.toString())
setLogger.SetLevel(LevelPanic)
utils.AssertEqual(t, LevelPanic, setLogger.level)
utils.AssertEqual(t, LevelPanic.toString(), setLogger.level.toString())
setLogger.SetLevel(8)
utils.AssertEqual(t, 8, int(setLogger.level))
utils.AssertEqual(t, "[?8] ", setLogger.level.toString())
}