zwrap/wrap_test.go

124 lines
2.6 KiB
Go

package zwrap
import (
"errors"
"log"
"os"
"strings"
"testing"
"github.com/rs/zerolog"
)
type testWriter struct {
t *testing.T
needsPrefix string
mustNotHavePrefix string
}
var ErrPrefixMismatch = errors.New("prefix mismatch")
func (w *testWriter) Write(p []byte) (n int, err error) {
w.t.Helper()
line := strings.TrimSuffix(string(p), "\n")
if w.needsPrefix != "" && !strings.Contains(line, w.needsPrefix) {
w.t.Errorf("expected prefix %q, got %q", w.needsPrefix, line)
return 0, ErrPrefixMismatch
}
if w.mustNotHavePrefix != "" && strings.Contains(line, w.mustNotHavePrefix) {
w.t.Errorf("unexpected prefix %q, got %q", w.mustNotHavePrefix, line)
return 0, ErrPrefixMismatch
}
w.t.Log(line)
return len(p), nil
}
type aLogger interface {
Println(...interface{})
}
type needsLogger struct {
logger aLogger
}
func (n *needsLogger) SetLogger(logger aLogger) {
n.logger = logger
}
func (n *needsLogger) DoSomething() {
n.logger.Println("Hello, world!")
}
func TestWrap(t *testing.T) {
ExampleWrap()
writah := &testWriter{t: t}
zl := zerolog.New(writah).With().Timestamp().Logger()
wrapped := Wrap(zl)
myThing := &needsLogger{}
myThing.SetLogger(wrapped)
multiLog := func(v ...interface{}) {
t.Helper()
wrapped.Print(v...)
wrapped.Printf("%v", v)
wrapped.Println(v...)
wrapped.Error(v...)
wrapped.Errorf("%v", v)
wrapped.Errorln(v...)
wrapped.Debug(v...)
wrapped.Debugf("%v", v)
wrapped.Debugln(v...)
wrapped.Warn(v...)
wrapped.Warnf("%v", v)
wrapped.Warnln(v...)
wrapped.Info(v...)
wrapped.Infof("%v", v)
wrapped.Infoln(v...)
wrapped.Tracef("%v", v)
wrapped.Trace(v...)
wrapped.Traceln(v...)
}
t.Run("generic", func(t *testing.T) {
multiLog("Hello, world!")
})
t.Run("prefix", func(t *testing.T) {
writah.needsPrefix = "prefix: "
wrapped.SetPrefix("prefix: ")
multiLog("Hello, world!")
})
t.Run("remove prefix", func(t *testing.T) {
writah.needsPrefix = ""
writah.mustNotHavePrefix = "prefix: "
wrapped.SetPrefix("")
multiLog("Hello, world!")
})
}
func ExampleWrap() {
// Create a new zerolog.Logger
logger := zerolog.New(os.Stderr).With().Timestamp().Logger()
// Demonstrate that we can use the stdlib logger
myThing := &needsLogger{}
myThing.SetLogger(log.New(os.Stderr, "stdlog: ", log.LstdFlags))
myThing.DoSomething()
// Demonstrate that we can use zerolog when wrapped
/* Before, does not compile:
myThing.SetLogger(logger)
myThing.DoSomething()
*/
// The zwrap solution, wrap the logger:
zl := Wrap(logger)
myThing.SetLogger(zl)
myThing.DoSomething()
}