github.com/philippseith/signalr@v0.6.3/logger_test.go (about)

     1  package signalr
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"io"
     7  	"os"
     8  	"sync"
     9  	"testing"
    10  	"time"
    11  
    12  	"github.com/go-kit/log"
    13  )
    14  
    15  type loggerConfig struct {
    16  	Enabled bool
    17  	Debug   bool
    18  }
    19  
    20  var lConf loggerConfig
    21  
    22  var tLog StructuredLogger
    23  
    24  func testLoggerOption() func(Party) error {
    25  	testLogger()
    26  	return Logger(tLog, lConf.Debug)
    27  }
    28  
    29  func testLogger() StructuredLogger {
    30  	if tLog == nil {
    31  		lConf = loggerConfig{Enabled: false, Debug: false}
    32  		b, err := os.ReadFile("testLogConf.json")
    33  		if err == nil {
    34  			err = json.Unmarshal(b, &lConf)
    35  			if err != nil {
    36  				lConf = loggerConfig{Enabled: false, Debug: false}
    37  			}
    38  		}
    39  		writer := io.Discard
    40  		if lConf.Enabled {
    41  			writer = os.Stderr
    42  		}
    43  		tLog = log.NewLogfmtLogger(writer)
    44  	}
    45  	return tLog
    46  }
    47  
    48  type panicLogger struct {
    49  	log log.Logger
    50  }
    51  
    52  func (p *panicLogger) Log(keyVals ...interface{}) error {
    53  	_ = p.log.Log(keyVals...)
    54  	panic("panic as expected")
    55  }
    56  
    57  type testLogWriter struct {
    58  	mx sync.Mutex
    59  	p  []byte
    60  	t  *testing.T
    61  }
    62  
    63  func (t *testLogWriter) Write(p []byte) (n int, err error) {
    64  	t.mx.Lock()
    65  	defer t.mx.Unlock()
    66  	t.p = append(t.p, p...)
    67  	if len(p) > 0 && p[len(p)-1] == 10 { // Will not work on Windows, but doesn't matter. This is only to check if the logger output still looks as expected
    68  		t.t.Log(string(t.p))
    69  		t.p = nil
    70  	}
    71  	return len(p), nil
    72  }
    73  
    74  func Test_PanicLogger(t *testing.T) {
    75  	defer func() {
    76  		if err := recover(); err != nil {
    77  			t.Errorf("panic in logger: '%v'", err)
    78  		}
    79  	}()
    80  	ctx, cancel := context.WithCancel(context.Background())
    81  	server, _ := NewServer(ctx, SimpleHubFactory(&simpleHub{}),
    82  		Logger(&panicLogger{log: log.NewLogfmtLogger(&testLogWriter{t: t})}, true),
    83  		ChanReceiveTimeout(200*time.Millisecond),
    84  		StreamBufferCapacity(5))
    85  	// Create both ends of the connection
    86  	cliConn, srvConn := newClientServerConnections()
    87  	// Start the server
    88  	go func() { _ = server.Serve(srvConn) }()
    89  	// Create the Client
    90  	client, _ := NewClient(ctx, WithConnection(cliConn), Logger(&panicLogger{log: log.NewLogfmtLogger(&testLogWriter{t: t})}, true))
    91  	// Start it
    92  	client.Start()
    93  	// Do something
    94  	<-client.Send("InvokeMe")
    95  	cancel()
    96  }