1package term_test
2
3import (
4	"bytes"
5	"io"
6	"io/ioutil"
7	"strconv"
8	"sync"
9	"testing"
10
11	"github.com/go-kit/kit/log"
12	"github.com/go-kit/kit/log/term"
13)
14
15func 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
35func 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
45func BenchmarkColorLoggerSimple(b *testing.B) {
46	benchmarkRunner(b, newColorLogger(ioutil.Discard), baseMessage)
47}
48
49func BenchmarkColorLoggerContextual(b *testing.B) {
50	benchmarkRunner(b, newColorLogger(ioutil.Discard), withMessage)
51}
52
53func TestColorLoggerConcurrency(t *testing.T) {
54	testConcurrency(t, newColorLogger(ioutil.Discard))
55}
56
57// copied from log/benchmark_test.go
58func 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
67var (
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// copied from log/concurrency_test.go
73func 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
84func spam(logger log.Logger) {
85	for i := 0; i < 100; i++ {
86		logger.Log("a", strconv.FormatInt(int64(i), 10))
87	}
88}
89