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 }