github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/logging/loggers/shared_test.go (about)

     1  package loggers
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"time"
     7  
     8  	"github.com/go-kit/kit/log"
     9  )
    10  
    11  const logLineTimeout = time.Second
    12  
    13  type testLogger struct {
    14  	channelLogger *ChannelLogger
    15  	logLineCh     chan ([]interface{})
    16  	err           error
    17  }
    18  
    19  func (tl *testLogger) empty() bool {
    20  	return tl.channelLogger.BufferLength() == 0
    21  }
    22  
    23  func (tl *testLogger) logLines(numberOfLines int) ([][]interface{}, error) {
    24  	logLines := make([][]interface{}, numberOfLines)
    25  	for i := 0; i < numberOfLines; i++ {
    26  		select {
    27  		case logLine := <-tl.logLineCh:
    28  			logLines[i] = logLine
    29  		case <-time.After(logLineTimeout):
    30  			return logLines, fmt.Errorf("timed out waiting for log line "+
    31  				"(waited %s)", logLineTimeout)
    32  		}
    33  	}
    34  	return logLines, nil
    35  }
    36  
    37  func (tl *testLogger) Log(keyvals ...interface{}) error {
    38  	tl.channelLogger.Log(keyvals...)
    39  	return tl.err
    40  }
    41  
    42  func newErrorLogger(errMessage string) *testLogger {
    43  	return makeTestLogger(errors.New(errMessage))
    44  }
    45  
    46  func newTestLogger() *testLogger {
    47  	return makeTestLogger(nil)
    48  }
    49  
    50  func makeTestLogger(err error) *testLogger {
    51  	cl := NewChannelLogger(100)
    52  	logLineCh := make(chan []interface{})
    53  	go cl.DrainForever(log.LoggerFunc(func(keyvals ...interface{}) error {
    54  		logLineCh <- keyvals
    55  		return nil
    56  	}), nil)
    57  	return &testLogger{
    58  		channelLogger: cl,
    59  		logLineCh:     logLineCh,
    60  		err:           err,
    61  	}
    62  }
    63  
    64  // Utility function that returns a slice of log lines.
    65  // Takes a variadic argument of log lines as a list of key value pairs delimited
    66  // by the empty string and splits
    67  func logLines(keyvals ...string) [][]interface{} {
    68  	llines := make([][]interface{}, 0)
    69  	line := make([]interface{}, 0)
    70  	for _, kv := range keyvals {
    71  		if kv == "" {
    72  			llines = append(llines, line)
    73  			line = make([]interface{}, 0)
    74  		} else {
    75  			line = append(line, kv)
    76  		}
    77  	}
    78  	if len(line) > 0 {
    79  		llines = append(llines, line)
    80  	}
    81  	return llines
    82  }