mlog: clean up component code and add tests for it

This commit is contained in:
Brian Picciano 2019-06-23 11:39:36 -06:00
parent 752e266685
commit 1a6b8e3166
2 changed files with 92 additions and 5 deletions

View File

@ -7,6 +7,11 @@ import (
type cmpKey int type cmpKey int
const (
cmpKeyLogger cmpKey = iota
cmpKeyCachedLogger
)
// SetLogger sets the given logger onto the Component. The logger can later be // SetLogger sets the given logger onto the Component. The logger can later be
// retrieved from the Component, or any of its children, using From. // retrieved from the Component, or any of its children, using From.
// //
@ -15,14 +20,14 @@ type cmpKey int
// should still be called. This is due to some caching that From does for // should still be called. This is due to some caching that From does for
// performance. // performance.
func SetLogger(cmp *mcmp.Component, l *Logger) { func SetLogger(cmp *mcmp.Component, l *Logger) {
cmp.SetValue(cmpKey(0), l) cmp.SetValue(cmpKeyLogger, l)
// If the base Logger on this Component gets changed, then the cached Logger // If the base Logger on this Component gets changed, then the cached Logger
// from From on this Component, and all of its Children, ought to be reset, // from From on this Component, and all of its Children, ought to be reset,
// so that any changes can be reflected in their loggers. // so that any changes can be reflected in their loggers.
var resetFromLogger func(*mcmp.Component) var resetFromLogger func(*mcmp.Component)
resetFromLogger = func(cmp *mcmp.Component) { resetFromLogger = func(cmp *mcmp.Component) {
cmp.SetValue(cmpKey(1), nil) cmp.SetValue(cmpKeyCachedLogger, nil)
for _, childCmp := range cmp.Children() { for _, childCmp := range cmp.Children() {
resetFromLogger(childCmp) resetFromLogger(childCmp)
} }
@ -38,7 +43,7 @@ var DefaultLogger = NewLogger()
// ancestors, using SetLogger. If no Logger was ever set then DefaultLogger is // ancestors, using SetLogger. If no Logger was ever set then DefaultLogger is
// returned. // returned.
func GetLogger(cmp *mcmp.Component) *Logger { func GetLogger(cmp *mcmp.Component) *Logger {
if l, ok := cmp.InheritedValue(cmpKey(0)); ok { if l, ok := mcmp.InheritedValue(cmp, cmpKeyLogger); ok {
return l.(*Logger) return l.(*Logger)
} }
return DefaultLogger return DefaultLogger
@ -48,7 +53,7 @@ func GetLogger(cmp *mcmp.Component) *Logger {
// some annotations related to the Component itself to all Messages being // some annotations related to the Component itself to all Messages being
// logged. // logged.
func From(cmp *mcmp.Component) *Logger { func From(cmp *mcmp.Component) *Logger {
if l, _ := cmp.Value(cmpKey(1)).(*Logger); l != nil { if l, _ := cmp.Value(cmpKeyCachedLogger).(*Logger); l != nil {
return l return l
} }
@ -61,7 +66,7 @@ func From(cmp *mcmp.Component) *Logger {
msg.Contexts = append(msg.Contexts[:0], ctx) msg.Contexts = append(msg.Contexts[:0], ctx)
return oldHandler(msg) return oldHandler(msg)
}) })
cmp.SetValue(cmpKey(1), l) cmp.SetValue(cmpKeyCachedLogger, l)
return l return l
} }

82
mlog/cmp_test.go Normal file
View File

@ -0,0 +1,82 @@
package mlog
import (
"fmt"
. "testing"
"github.com/mediocregopher/mediocre-go-lib/mcmp"
"github.com/mediocregopher/mediocre-go-lib/mctx"
"github.com/mediocregopher/mediocre-go-lib/mtest/massert"
)
func TestGetSetLogger(t *T) {
cmp := new(mcmp.Component)
cmpChild := cmp.Child("child")
ctx := mctx.Annotated("foo", "bar")
var msgs []string
l := NewLogger()
l.SetHandler(func(msg Message) error {
msgStr := fmt.Sprintf("%s %q", msg.Level, msg.Description)
for _, ctx := range msg.Contexts {
for _, kv := range mctx.Annotations(ctx).StringSlice(true) {
msgStr += fmt.Sprintf(" %s=%s", kv[0], kv[1])
}
}
msgs = append(msgs, msgStr)
return nil
})
SetLogger(cmp, l)
msgs = msgs[:0]
GetLogger(cmp).Info("get-cmp", ctx)
GetLogger(cmpChild).Info("get-cmpChild", ctx)
From(cmp).Info("from-cmp", ctx)
From(cmpChild).Info("from-cmpChild", ctx)
massert.Require(t,
massert.Equal(`INFO "get-cmp" foo=bar`, msgs[0]),
massert.Equal(`INFO "get-cmpChild" foo=bar`, msgs[1]),
massert.Equal(`INFO "from-cmp" componentPath=/ foo=bar`, msgs[2]),
massert.Equal(`INFO "from-cmpChild" componentPath=/child foo=bar`, msgs[3]),
)
l2 := l.Clone()
l2.SetHandler(func(msg Message) error {
msg.Description += " (2)"
return l.Handler()(msg)
})
SetLogger(cmp, l2)
msgs = msgs[:0]
GetLogger(cmp).Info("get-cmp", ctx)
GetLogger(cmpChild).Info("get-cmpChild", ctx)
From(cmp).Info("from-cmp", ctx)
From(cmpChild).Info("from-cmpChild", ctx)
massert.Require(t,
massert.Equal(`INFO "get-cmp (2)" foo=bar`, msgs[0]),
massert.Equal(`INFO "get-cmpChild (2)" foo=bar`, msgs[1]),
massert.Equal(`INFO "from-cmp (2)" componentPath=/ foo=bar`, msgs[2]),
massert.Equal(`INFO "from-cmpChild (2)" componentPath=/child foo=bar`, msgs[3]),
)
// If a Logger is set on the child, that shouldn't affect the parent
l3 := l.Clone()
l3.SetHandler(func(msg Message) error {
msg.Description += " (3)"
return l.Handler()(msg)
})
SetLogger(cmpChild, l3)
msgs = msgs[:0]
GetLogger(cmp).Info("get-cmp", ctx)
GetLogger(cmpChild).Info("get-cmpChild", ctx)
From(cmp).Info("from-cmp", ctx)
From(cmpChild).Info("from-cmpChild", ctx)
massert.Require(t,
massert.Equal(`INFO "get-cmp (2)" foo=bar`, msgs[0]),
massert.Equal(`INFO "get-cmpChild (3)" foo=bar`, msgs[1]),
massert.Equal(`INFO "from-cmp (2)" componentPath=/ foo=bar`, msgs[2]),
massert.Equal(`INFO "from-cmpChild (3)" componentPath=/child foo=bar`, msgs[3]),
)
}