github.com/adacta-ru/mattermost-server/v5@v5.31.1/mlog/testing.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package mlog
     5  
     6  import (
     7  	"io"
     8  	"strings"
     9  	"sync"
    10  	"testing"
    11  
    12  	"go.uber.org/zap"
    13  	"go.uber.org/zap/zapcore"
    14  )
    15  
    16  // testingWriter is an io.Writer that writes through t.Log
    17  type testingWriter struct {
    18  	tb testing.TB
    19  }
    20  
    21  func (tw *testingWriter) Write(b []byte) (int, error) {
    22  	tw.tb.Log(strings.TrimSpace(string(b)))
    23  	return len(b), nil
    24  }
    25  
    26  // NewTestingLogger creates a Logger that proxies logs through a testing interface.
    27  // This allows tests that spin up App instances to avoid spewing logs unless the test fails or -verbose is specified.
    28  func NewTestingLogger(tb testing.TB, writer io.Writer) *Logger {
    29  	logWriter := &testingWriter{tb}
    30  	multiWriter := io.MultiWriter(logWriter, writer)
    31  	logWriterSync := zapcore.AddSync(multiWriter)
    32  
    33  	testingLogger := &Logger{
    34  		consoleLevel: zap.NewAtomicLevelAt(getZapLevel("debug")),
    35  		fileLevel:    zap.NewAtomicLevelAt(getZapLevel("info")),
    36  		logrLogger:   newLogr(),
    37  		mutex:        &sync.RWMutex{},
    38  	}
    39  
    40  	logWriterCore := zapcore.NewCore(makeEncoder(true), zapcore.Lock(logWriterSync), testingLogger.consoleLevel)
    41  
    42  	testingLogger.zap = zap.New(logWriterCore,
    43  		zap.AddCaller(),
    44  	)
    45  	return testingLogger
    46  }