1// Copyright © 2016 Steve Francia <spf@spf13.com>.
2//
3// Use of this source code is governed by an MIT-style
4// license that can be found in the LICENSE file.
5
6package jwalterweatherman
7
8import (
9	"bytes"
10	"io/ioutil"
11	"sync"
12	"testing"
13
14	"github.com/stretchr/testify/require"
15)
16
17func TestThresholds(t *testing.T) {
18	SetStdoutThreshold(LevelError)
19	require.Equal(t, StdoutThreshold(), LevelError)
20	SetLogThreshold(LevelCritical)
21	require.Equal(t, LogThreshold(), LevelCritical)
22	require.NotEqual(t, StdoutThreshold(), LevelCritical)
23	SetStdoutThreshold(LevelWarn)
24	require.Equal(t, StdoutThreshold(), LevelWarn)
25}
26
27func TestDefaultLogging(t *testing.T) {
28	var outputBuf, logBuf bytes.Buffer
29
30	defaultNotepad.logHandle = &logBuf
31	defaultNotepad.outHandle = &outputBuf
32
33	SetLogThreshold(LevelWarn)
34	SetStdoutThreshold(LevelError)
35
36	FATAL.Println("fatal err")
37	CRITICAL.Println("critical err")
38	ERROR.Println("an error")
39	WARN.Println("a warning")
40	INFO.Println("information")
41	DEBUG.Println("debugging info")
42	TRACE.Println("trace")
43
44	require.Contains(t, logBuf.String(), "fatal err")
45	require.Contains(t, logBuf.String(), "critical err")
46	require.Contains(t, logBuf.String(), "an error")
47	require.Contains(t, logBuf.String(), "a warning")
48	require.NotContains(t, logBuf.String(), "information")
49	require.NotContains(t, logBuf.String(), "debugging info")
50	require.NotContains(t, logBuf.String(), "trace")
51
52	require.Contains(t, outputBuf.String(), "fatal err")
53	require.Contains(t, outputBuf.String(), "critical err")
54	require.Contains(t, outputBuf.String(), "an error")
55	require.NotContains(t, outputBuf.String(), "a warning")
56	require.NotContains(t, outputBuf.String(), "information")
57	require.NotContains(t, outputBuf.String(), "debugging info")
58	require.NotContains(t, outputBuf.String(), "trace")
59}
60
61func TestLogCounter(t *testing.T) {
62	assert := require.New(t)
63
64	defaultNotepad.logHandle = ioutil.Discard
65	defaultNotepad.outHandle = ioutil.Discard
66
67	errorCounter := &Counter{}
68
69	SetLogThreshold(LevelTrace)
70	SetStdoutThreshold(LevelTrace)
71	SetLogListeners(LogCounter(errorCounter, LevelError))
72
73	FATAL.Println("fatal err")
74	CRITICAL.Println("critical err")
75	WARN.Println("a warning")
76	WARN.Println("another warning")
77	INFO.Println("information")
78	DEBUG.Println("debugging info")
79	TRACE.Println("trace")
80
81	wg := &sync.WaitGroup{}
82
83	for i := 0; i < 10; i++ {
84		wg.Add(1)
85		go func() {
86			defer wg.Done()
87			for j := 0; j < 10; j++ {
88				ERROR.Println("error", j)
89				// check for data races
90				assert.True(errorCounter.Count() > uint64(j))
91			}
92		}()
93
94	}
95
96	wg.Wait()
97
98	assert.Equal(uint64(102), errorCounter.Count())
99}
100