github.com/sykesm/fabric@v1.1.0-preview.0.20200129034918-2aa12b1a0181/common/flogging/logging_test.go (about) 1 /* 2 Copyright IBM Corp. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package flogging_test 8 9 import ( 10 "bytes" 11 "errors" 12 "fmt" 13 "os" 14 "testing" 15 16 "github.com/hyperledger/fabric/common/flogging" 17 "github.com/hyperledger/fabric/common/flogging/mock" 18 "github.com/stretchr/testify/assert" 19 "go.uber.org/zap/zapcore" 20 ) 21 22 func TestNew(t *testing.T) { 23 logging, err := flogging.New(flogging.Config{}) 24 assert.NoError(t, err) 25 assert.Equal(t, zapcore.InfoLevel, logging.DefaultLevel()) 26 27 _, err = flogging.New(flogging.Config{ 28 LogSpec: "::=borken=::", 29 }) 30 assert.EqualError(t, err, "invalid logging specification '::=borken=::': bad segment '=borken='") 31 } 32 33 func TestNewWithEnvironment(t *testing.T) { 34 oldSpec, set := os.LookupEnv("FABRIC_LOGGING_SPEC") 35 if set { 36 defer os.Setenv("FABRIC_LOGGING_SPEC", oldSpec) 37 } 38 39 os.Setenv("FABRIC_LOGGING_SPEC", "fatal") 40 logging, err := flogging.New(flogging.Config{}) 41 assert.NoError(t, err) 42 assert.Equal(t, zapcore.FatalLevel, logging.DefaultLevel()) 43 44 os.Unsetenv("FABRIC_LOGGING_SPEC") 45 logging, err = flogging.New(flogging.Config{}) 46 assert.NoError(t, err) 47 assert.Equal(t, zapcore.InfoLevel, logging.DefaultLevel()) 48 } 49 50 //go:generate counterfeiter -o mock/write_syncer.go -fake-name WriteSyncer . writeSyncer 51 type writeSyncer interface { 52 zapcore.WriteSyncer 53 } 54 55 func TestLoggingSetWriter(t *testing.T) { 56 ws := &mock.WriteSyncer{} 57 58 w := &bytes.Buffer{} 59 logging, err := flogging.New(flogging.Config{ 60 Writer: w, 61 }) 62 assert.NoError(t, err) 63 64 old := logging.SetWriter(ws) 65 logging.SetWriter(w) 66 original := logging.SetWriter(ws) 67 68 assert.Exactly(t, old, original) 69 logging.Write([]byte("hello")) 70 assert.Equal(t, 1, ws.WriteCallCount()) 71 assert.Equal(t, []byte("hello"), ws.WriteArgsForCall(0)) 72 73 err = logging.Sync() 74 assert.NoError(t, err) 75 76 ws.SyncReturns(errors.New("welp")) 77 err = logging.Sync() 78 assert.EqualError(t, err, "welp") 79 } 80 81 func TestNamedLogger(t *testing.T) { 82 defer flogging.Reset() 83 buf := &bytes.Buffer{} 84 flogging.Global.SetWriter(buf) 85 86 t.Run("logger and named (child) logger with different levels", func(t *testing.T) { 87 defer buf.Reset() 88 logger := flogging.MustGetLogger("eugene") 89 logger2 := logger.Named("george") 90 flogging.ActivateSpec("eugene=info:eugene.george=error") 91 92 logger.Info("from eugene") 93 logger2.Info("from george") 94 assert.Contains(t, buf.String(), "from eugene") 95 assert.NotContains(t, buf.String(), "from george") 96 }) 97 98 t.Run("named logger where parent logger isn't enabled", func(t *testing.T) { 99 logger := flogging.MustGetLogger("foo") 100 logger2 := logger.Named("bar") 101 flogging.ActivateSpec("foo=fatal:foo.bar=error") 102 logger.Error("from foo") 103 logger2.Error("from bar") 104 assert.NotContains(t, buf.String(), "from foo") 105 assert.Contains(t, buf.String(), "from bar") 106 }) 107 } 108 109 func TestInvalidLoggerName(t *testing.T) { 110 names := []string{"test*", ".test", "test.", ".", ""} 111 for _, name := range names { 112 t.Run(name, func(t *testing.T) { 113 msg := fmt.Sprintf("invalid logger name: %s", name) 114 assert.PanicsWithValue(t, msg, func() { flogging.MustGetLogger(name) }) 115 }) 116 } 117 } 118 119 func TestCheck(t *testing.T) { 120 l := &flogging.Logging{} 121 observer := &mock.Observer{} 122 e := zapcore.Entry{} 123 124 // set observer 125 l.SetObserver(observer) 126 l.Check(e, nil) 127 assert.Equal(t, 1, observer.CheckCallCount()) 128 e, ce := observer.CheckArgsForCall(0) 129 assert.Equal(t, e, zapcore.Entry{}) 130 assert.Nil(t, ce) 131 132 l.WriteEntry(e, nil) 133 assert.Equal(t, 1, observer.WriteEntryCallCount()) 134 e, f := observer.WriteEntryArgsForCall(0) 135 assert.Equal(t, e, zapcore.Entry{}) 136 assert.Nil(t, f) 137 138 // remove observer 139 l.SetObserver(nil) 140 l.Check(zapcore.Entry{}, nil) 141 assert.Equal(t, 1, observer.CheckCallCount()) 142 } 143 144 func TestLoggerCoreCheck(t *testing.T) { 145 logging, err := flogging.New(flogging.Config{}) 146 assert.NoError(t, err) 147 148 logger := logging.ZapLogger("foo") 149 150 err = logging.ActivateSpec("info") 151 assert.NoError(t, err) 152 assert.False(t, logger.Core().Enabled(zapcore.DebugLevel), "debug should not be enabled at info level") 153 154 err = logging.ActivateSpec("debug") 155 assert.NoError(t, err) 156 assert.True(t, logger.Core().Enabled(zapcore.DebugLevel), "debug should now be enabled at debug level") 157 }