...
1 package term_test
2
3 import (
4 "bytes"
5 "io"
6 "io/ioutil"
7 "strconv"
8 "sync"
9 "testing"
10
11 "github.com/go-kit/log"
12 "github.com/go-kit/log/term"
13 )
14
15 func TestColorLogger(t *testing.T) {
16 var buf bytes.Buffer
17 logger := newColorLogger(&buf)
18
19 if err := logger.Log("hello", "world"); err != nil {
20 t.Fatal(err)
21 }
22 if want, have := "hello=world\n", buf.String(); want != have {
23 t.Errorf("\nwant %#v\nhave %#v", want, have)
24 }
25
26 buf.Reset()
27 if err := logger.Log("a", 1); err != nil {
28 t.Fatal(err)
29 }
30 if want, have := "\x1b[32;1m\x1b[47;1ma=1\n\x1b[39;49;22m", buf.String(); want != have {
31 t.Errorf("\nwant %#v\nhave %#v", want, have)
32 }
33 }
34
35 func newColorLogger(w io.Writer) log.Logger {
36 return term.NewColorLogger(w, log.NewLogfmtLogger,
37 func(keyvals ...interface{}) term.FgBgColor {
38 if keyvals[0] == "a" {
39 return term.FgBgColor{Fg: term.Green, Bg: term.White}
40 }
41 return term.FgBgColor{}
42 })
43 }
44
45 func BenchmarkColorLoggerSimple(b *testing.B) {
46 benchmarkRunner(b, newColorLogger(ioutil.Discard), baseMessage)
47 }
48
49 func BenchmarkColorLoggerContextual(b *testing.B) {
50 benchmarkRunner(b, newColorLogger(ioutil.Discard), withMessage)
51 }
52
53 func TestColorLoggerConcurrency(t *testing.T) {
54 testConcurrency(t, newColorLogger(ioutil.Discard))
55 }
56
57
58 func benchmarkRunner(b *testing.B, logger log.Logger, f func(log.Logger)) {
59 lc := log.With(logger, "common_key", "common_value")
60 b.ReportAllocs()
61 b.ResetTimer()
62 for i := 0; i < b.N; i++ {
63 f(lc)
64 }
65 }
66
67 var (
68 baseMessage = func(logger log.Logger) { logger.Log("foo_key", "foo_value") }
69 withMessage = func(logger log.Logger) { log.With(logger, "a", "b").Log("c", "d") }
70 )
71
72
73 func testConcurrency(t *testing.T, logger log.Logger) {
74 for _, n := range []int{10, 100, 500} {
75 wg := sync.WaitGroup{}
76 wg.Add(n)
77 for i := 0; i < n; i++ {
78 go func() { spam(logger); wg.Done() }()
79 }
80 wg.Wait()
81 }
82 }
83
84 func spam(logger log.Logger) {
85 for i := 0; i < 100; i++ {
86 logger.Log("a", strconv.FormatInt(int64(i), 10))
87 }
88 }
89
View as plain text