github.com/supragya/TendermintConnector@v0.0.0-20210619045051-113e32b84fb1/_deprecated_chains/cosmos/libs/log/tmfmt_logger_test.go (about) 1 package log_test 2 3 import ( 4 "bytes" 5 "errors" 6 "io/ioutil" 7 "math" 8 "regexp" 9 "testing" 10 11 kitlog "github.com/go-kit/kit/log" 12 "github.com/stretchr/testify/assert" 13 "github.com/tendermint/tendermint/libs/log" 14 ) 15 16 func TestTMFmtLogger(t *testing.T) { 17 t.Parallel() 18 buf := &bytes.Buffer{} 19 logger := log.NewTMFmtLogger(buf) 20 21 if err := logger.Log("hello", "world"); err != nil { 22 t.Fatal(err) 23 } 24 assert.Regexp(t, regexp.MustCompile(`N\[.+\] unknown \s+ hello=world\n$`), buf.String()) 25 26 buf.Reset() 27 if err := logger.Log("a", 1, "err", errors.New("error")); err != nil { 28 t.Fatal(err) 29 } 30 assert.Regexp(t, regexp.MustCompile(`N\[.+\] unknown \s+ a=1 err=error\n$`), buf.String()) 31 32 buf.Reset() 33 if err := logger.Log("std_map", map[int]int{1: 2}, "my_map", mymap{0: 0}); err != nil { 34 t.Fatal(err) 35 } 36 assert.Regexp(t, regexp.MustCompile(`N\[.+\] unknown \s+ std_map=map\[1:2\] my_map=special_behavior\n$`), buf.String()) 37 38 buf.Reset() 39 if err := logger.Log("level", "error"); err != nil { 40 t.Fatal(err) 41 } 42 assert.Regexp(t, regexp.MustCompile(`E\[.+\] unknown \s+\n$`), buf.String()) 43 44 buf.Reset() 45 if err := logger.Log("_msg", "Hello"); err != nil { 46 t.Fatal(err) 47 } 48 assert.Regexp(t, regexp.MustCompile(`N\[.+\] Hello \s+\n$`), buf.String()) 49 50 buf.Reset() 51 if err := logger.Log("module", "main", "module", "crypto", "module", "wire"); err != nil { 52 t.Fatal(err) 53 } 54 assert.Regexp(t, regexp.MustCompile(`N\[.+\] unknown \s+module=wire\s+\n$`), buf.String()) 55 } 56 57 func BenchmarkTMFmtLoggerSimple(b *testing.B) { 58 benchmarkRunnerKitlog(b, log.NewTMFmtLogger(ioutil.Discard), baseMessage) 59 } 60 61 func BenchmarkTMFmtLoggerContextual(b *testing.B) { 62 benchmarkRunnerKitlog(b, log.NewTMFmtLogger(ioutil.Discard), withMessage) 63 } 64 65 func TestTMFmtLoggerConcurrency(t *testing.T) { 66 t.Parallel() 67 testConcurrency(t, log.NewTMFmtLogger(ioutil.Discard), 10000) 68 } 69 70 func benchmarkRunnerKitlog(b *testing.B, logger kitlog.Logger, f func(kitlog.Logger)) { 71 lc := kitlog.With(logger, "common_key", "common_value") 72 b.ReportAllocs() 73 b.ResetTimer() 74 for i := 0; i < b.N; i++ { 75 f(lc) 76 } 77 } 78 79 var ( 80 baseMessage = func(logger kitlog.Logger) { logger.Log("foo_key", "foo_value") } 81 withMessage = func(logger kitlog.Logger) { kitlog.With(logger, "a", "b").Log("d", "f") } 82 ) 83 84 // These test are designed to be run with the race detector. 85 86 func testConcurrency(t *testing.T, logger kitlog.Logger, total int) { 87 n := int(math.Sqrt(float64(total))) 88 share := total / n 89 90 errC := make(chan error, n) 91 92 for i := 0; i < n; i++ { 93 go func() { 94 errC <- spam(logger, share) 95 }() 96 } 97 98 for i := 0; i < n; i++ { 99 err := <-errC 100 if err != nil { 101 t.Fatalf("concurrent logging error: %v", err) 102 } 103 } 104 } 105 106 func spam(logger kitlog.Logger, count int) error { 107 for i := 0; i < count; i++ { 108 err := logger.Log("key", i) 109 if err != nil { 110 return err 111 } 112 } 113 return nil 114 } 115 116 type mymap map[int]int 117 118 func (m mymap) String() string { return "special_behavior" }