go_study/fabric-main/common/flogging/loggerlevels_test.go

194 lines
5.8 KiB
Go

/*
Copyright IBM Corp. All Rights Reserved.
SPDX-License-Identifier: Apache-2.0
*/
package flogging_test
import (
"errors"
"strconv"
"testing"
"github.com/hyperledger/fabric/common/flogging"
"github.com/stretchr/testify/require"
"go.uber.org/zap/zapcore"
)
func TestLoggerLevelsActivateSpec(t *testing.T) {
tests := []struct {
spec string
expectedLevels map[string]zapcore.Level
expectedDefaultLevel zapcore.Level
}{
{
spec: "DEBUG",
expectedLevels: map[string]zapcore.Level{},
expectedDefaultLevel: zapcore.DebugLevel,
},
{
spec: "INFO",
expectedLevels: map[string]zapcore.Level{},
expectedDefaultLevel: zapcore.InfoLevel,
},
{
spec: "logger=info:DEBUG",
expectedLevels: map[string]zapcore.Level{
"logger": zapcore.InfoLevel,
"logger.a": zapcore.InfoLevel,
"logger.b": zapcore.InfoLevel,
"logger.a.b": zapcore.InfoLevel,
},
expectedDefaultLevel: zapcore.DebugLevel,
},
{
spec: "logger=info:logger.=error:DEBUG",
expectedLevels: map[string]zapcore.Level{
"logger": zapcore.ErrorLevel,
"logger.a": zapcore.InfoLevel,
"logger.b": zapcore.InfoLevel,
"logger.a.b": zapcore.InfoLevel,
},
expectedDefaultLevel: zapcore.DebugLevel,
},
{
spec: "logger.a,logger.b=info:logger.c=WARN:DEBUG",
expectedLevels: map[string]zapcore.Level{
"logger.a": zapcore.InfoLevel,
"logger.b": zapcore.InfoLevel,
"logger.c": zapcore.WarnLevel,
},
expectedDefaultLevel: zapcore.DebugLevel,
},
{
spec: "a.b=info:a,z=error:c.b=info:c.=warn:debug",
expectedLevels: map[string]zapcore.Level{
"a": zapcore.ErrorLevel,
"z": zapcore.ErrorLevel,
"a.b": zapcore.InfoLevel,
"a.b.c": zapcore.InfoLevel,
"a.b.c.d": zapcore.InfoLevel,
"a.c": zapcore.ErrorLevel,
"c": zapcore.WarnLevel,
"c.a": zapcore.DebugLevel,
"c.b": zapcore.InfoLevel,
"d": zapcore.DebugLevel,
"ab.c": zapcore.DebugLevel,
"c.b.a": zapcore.InfoLevel,
"c.b.a.b": zapcore.InfoLevel,
},
expectedDefaultLevel: zapcore.DebugLevel,
},
{
spec: "info:warn",
expectedLevels: map[string]zapcore.Level{
"a": zapcore.WarnLevel,
"a.b": zapcore.WarnLevel,
"b": zapcore.WarnLevel,
"c": zapcore.WarnLevel,
"d": zapcore.WarnLevel,
},
expectedDefaultLevel: zapcore.WarnLevel,
},
}
for _, tc := range tests {
t.Run(tc.spec, func(t *testing.T) {
ll := &flogging.LoggerLevels{}
err := ll.ActivateSpec(tc.spec)
require.NoError(t, err)
require.Equal(t, tc.expectedDefaultLevel, ll.DefaultLevel())
for name, lvl := range tc.expectedLevels {
require.Equal(t, lvl, ll.Level(name))
}
})
}
}
func TestLoggerLevelsActivateSpecErrors(t *testing.T) {
tests := []struct {
spec string
err error
}{
{spec: "=INFO:DEBUG", err: errors.New("invalid logging specification '=INFO:DEBUG': no logger specified in segment '=INFO'")},
{spec: "=INFO=:DEBUG", err: errors.New("invalid logging specification '=INFO=:DEBUG': bad segment '=INFO='")},
{spec: "bogus", err: errors.New("invalid logging specification 'bogus': bad segment 'bogus'")},
{spec: "a.b=info:a=broken:c.b=info:c.=warn:debug", err: errors.New("invalid logging specification 'a.b=info:a=broken:c.b=info:c.=warn:debug': bad segment 'a=broken'")},
{spec: "a*=info:debug", err: errors.New("invalid logging specification 'a*=info:debug': bad logger name 'a*'")},
{spec: ".a=info:debug", err: errors.New("invalid logging specification '.a=info:debug': bad logger name '.a'")},
}
for _, tc := range tests {
t.Run(tc.spec, func(t *testing.T) {
ll := &flogging.LoggerLevels{}
err := ll.ActivateSpec("fatal:a=warn")
require.Nil(t, err)
err = ll.ActivateSpec(tc.spec)
require.EqualError(t, err, tc.err.Error())
require.Equal(t, zapcore.FatalLevel, ll.DefaultLevel(), "default should not change")
require.Equal(t, zapcore.WarnLevel, ll.Level("a.b"), "log levels should not change")
})
}
}
func TestSpec(t *testing.T) {
tests := []struct {
input string
output string
}{
{input: "", output: "info"},
{input: "debug", output: "debug"},
{input: "a.=info:warning", output: "a.=info:warn"},
{input: "a-b=error", output: "a-b=error:info"},
{input: "a#b=error", output: "a#b=error:info"},
{input: "a_b=error", output: "a_b=error:info"},
{input: "debug:a=info:b=warn", output: "a=info:b=warn:debug"},
{input: "b=warn:a=error", output: "a=error:b=warn:info"},
}
for _, tc := range tests {
ll := &flogging.LoggerLevels{}
err := ll.ActivateSpec(tc.input)
require.NoError(t, err)
require.Equal(t, tc.output, ll.Spec())
}
}
func TestEnabled(t *testing.T) {
tests := []struct {
spec string
enabledAt zapcore.Level
}{
{spec: "payload", enabledAt: flogging.PayloadLevel},
{spec: "debug", enabledAt: zapcore.DebugLevel},
{spec: "info", enabledAt: zapcore.InfoLevel},
{spec: "warn", enabledAt: zapcore.WarnLevel},
{spec: "panic", enabledAt: zapcore.PanicLevel},
{spec: "fatal", enabledAt: zapcore.FatalLevel},
{spec: "fatal:a=debug", enabledAt: zapcore.DebugLevel},
{spec: "a=fatal:b=warn", enabledAt: zapcore.InfoLevel},
{spec: "a=warn", enabledAt: zapcore.InfoLevel},
{spec: "a=debug", enabledAt: zapcore.DebugLevel},
}
for i, tc := range tests {
t.Run(strconv.Itoa(i), func(t *testing.T) {
ll := &flogging.LoggerLevels{}
err := ll.ActivateSpec(tc.spec)
require.NoError(t, err)
for i := flogging.PayloadLevel; i <= zapcore.FatalLevel; i++ {
if tc.enabledAt <= i {
require.Truef(t, ll.Enabled(i), "expected level %s and spec %s to be enabled", zapcore.Level(i), tc.spec)
} else {
require.False(t, ll.Enabled(i), "expected level %s and spec %s to be disabled", zapcore.Level(i), tc.spec)
}
}
})
}
}