OSDN Git Service

new repo
[bytom/vapor.git] / vendor / github.com / tendermint / tmlibs / log / tmfmt_logger_test.go
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/tmlibs/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" }