go-kit/log/logctx_test.go

106 lines
2.1 KiB
Go
Raw Normal View History

package log_test
import (
"bytes"
"fmt"
"strings"
"testing"
"git.sr.ht/~ewintr/go-kit/log"
"git.sr.ht/~ewintr/go-kit/test"
)
type (
ContextA string
ContextB string
)
func (l ContextA) ContextName() string { return "context_a" }
func (l ContextB) ContextName() string { return "context_b" }
func TestLogContext(t *testing.T) {
t.Run("new caller", func(t *testing.T) {
caller := log.NewCaller(1)
s := caller()
test.Includes(t, "logctx_test.go:", s)
})
t.Run("add context", func(t *testing.T) {
var buff bytes.Buffer
logger := log.NewLogger(&buff)
for _, tc := range []struct {
m string
cc []log.Contexter
}{
{
m: "single context",
cc: []log.Contexter{ContextA("AA")},
},
{
m: "multiple context",
cc: []log.Contexter{ContextA("AA"), ContextB("BB")},
},
{
m: "with caller context",
cc: []log.Contexter{ContextA("AA"), log.NewCaller(0)},
},
} {
t.Run(tc.m, func(t *testing.T) {
log.Add(logger, tc.cc...).Info("something")
for _, context := range tc.cc {
switch s := context.(type) {
case ContextA, ContextB:
test.Includes(t, fmt.Sprintf("%q:%q", s.ContextName(), s), buff.String())
case log.Caller:
file := s()
i := strings.LastIndexByte(file, ':')
test.Includes(t, fmt.Sprintf(`%q:"%s`, s.ContextName(), file[:i+1]), buff.String())
}
}
})
}
})
t.Run("attach error", func(t *testing.T) {
var (
errOne = fmt.Errorf("error one")
errTwo = fmt.Errorf("error two")
)
for _, tc := range []struct {
m string
errs []error
err error
}{
{
m: "single call",
errs: []error{errOne},
err: errOne,
},
{
m: "multiple calls overwrite",
errs: []error{errOne, errTwo},
err: errTwo,
},
} {
t.Run(tc.m, func(t *testing.T) {
var buff bytes.Buffer
logger := log.NewLogger(&buff)
currentLogger := logger
for _, err := range tc.errs {
currentLogger = log.AttachError(currentLogger, err)
}
currentLogger.Info("something")
test.Includes(t,
fmt.Sprintf("\"attached_error\":%q", tc.err.Error()), buff.String())
})
}
})
}