1 package ldlog
2
3 import (
4 "fmt"
5 "strings"
6 "testing"
7
8 "github.com/stretchr/testify/assert"
9 )
10
11 type logSink struct {
12 output []string
13 }
14
15 func (l *logSink) Println(values ...interface{}) {
16 l.output = append(l.output, strings.TrimSpace(fmt.Sprintln(values...)))
17 }
18
19 func (l *logSink) Printf(format string, values ...interface{}) {
20 l.output = append(l.output, fmt.Sprintf(format, values...))
21 }
22
23 func TestCanWriteToUnconfiguredLogger(t *testing.T) {
24 l := Loggers{}
25 l.Warn("test message, please ignore")
26 }
27
28 func TestLevelIsInfoByDefault(t *testing.T) {
29 ls := logSink{}
30 l := Loggers{}
31 assert.Equal(t, Info, l.GetMinLevel())
32 assert.False(t, l.IsDebugEnabled())
33
34 l.SetBaseLogger(&ls)
35 l.Debug("0")
36 l.Debugf("%s!", "1")
37 l.Info("2")
38 l.Infof("%s!", "3")
39 l.Warn("4")
40 l.Warnf("%s!", "5")
41 l.Error("6")
42 l.Errorf("%s!", "7")
43
44 assert.Equal(t, []string{"INFO: 2", "INFO: 3!", "WARN: 4", "WARN: 5!", "ERROR: 6", "ERROR: 7!"}, ls.output)
45 }
46
47 func TestCanSetLevel(t *testing.T) {
48 ls := logSink{}
49 l := Loggers{}
50
51 l.SetBaseLogger(&ls)
52 l.SetMinLevel(Error)
53 assert.Equal(t, Error, l.GetMinLevel())
54 assert.False(t, l.IsDebugEnabled())
55
56 l.Debug("0")
57 l.Debugf("%s!", "1")
58 l.Info("2")
59 l.Infof("%s!", "3")
60 l.Warn("4")
61 l.Warnf("%s!", "5")
62 l.Error("6")
63 l.Errorf("%s!", "7")
64 assert.Equal(t, []string{"ERROR: 6", "ERROR: 7!"}, ls.output)
65
66 l.SetMinLevel(Debug)
67 assert.Equal(t, Debug, l.GetMinLevel())
68 assert.True(t, l.IsDebugEnabled())
69
70 l.Debug("8")
71 l.Debugf("%s!", "9")
72 assert.Equal(t, []string{"ERROR: 6", "ERROR: 7!", "DEBUG: 8", "DEBUG: 9!"}, ls.output)
73 }
74
75 func TestCanSetLoggerForSpecificLevel(t *testing.T) {
76 lsMain := logSink{}
77 lsWarn := logSink{}
78 l := Loggers{}
79 l.SetBaseLoggerForLevel(Warn, &lsWarn)
80 l.SetBaseLogger(&lsMain)
81 l.Info("a")
82 l.Warn("b")
83 assert.Equal(t, []string{"INFO: a"}, lsMain.output)
84 assert.Equal(t, []string{"WARN: b"}, lsWarn.output)
85 }
86
87 func TestCanGetLoggerForSpecificLevel(t *testing.T) {
88 ls := logSink{}
89 l := Loggers{}
90 l.SetBaseLogger(&ls)
91 l.ForLevel(Info).Println("a")
92 l.ForLevel(Warn).Println("b")
93 l.ForLevel(LogLevel(99)).Println("ignore")
94 assert.Equal(t, []string{"INFO: a", "WARN: b"}, ls.output)
95 }
96
97 func TestSetBaseLoggerForLevelWithNilReferenceRestoresMainBaseLogger(t *testing.T) {
98 lsMain := logSink{}
99 lsWarn := logSink{}
100 l := Loggers{}
101 l.SetBaseLoggerForLevel(Warn, &lsWarn)
102 l.SetBaseLogger(&lsMain)
103 l.SetBaseLoggerForLevel(Warn, nil)
104 l.Warn("x")
105 assert.Equal(t, []string{"WARN: x"}, lsMain.output)
106 }
107
108 func TestSetBaseLoggerWithNilReferenceDoesNothing(t *testing.T) {
109 ls := logSink{}
110 l := Loggers{}
111 l.SetBaseLogger(&ls)
112 l.SetBaseLogger(nil)
113 l.Info("x")
114 assert.Equal(t, []string{"INFO: x"}, ls.output)
115 }
116
117 func TestInit(t *testing.T) {
118 l := Loggers{}
119 assert.False(t, l.inited)
120 l.Init()
121 assert.True(t, l.inited)
122 }
123
124 func TestCallingInitAgainDoesNotOverrideMinLevel(t *testing.T) {
125 l := Loggers{}
126 l.SetMinLevel(Error)
127 l.Init()
128 assert.Equal(t, Error, l.minLevel)
129 }
130
131 func TestNewDefaultLoggers(t *testing.T) {
132 l := NewDefaultLoggers()
133 assert.Equal(t, Info, l.minLevel)
134 assert.True(t, l.inited)
135 }
136
137 func TestNewDisabledLoggers(t *testing.T) {
138 l := NewDisabledLoggers()
139 assert.Equal(t, None, l.minLevel)
140 }
141
142 func TestSetPrefix(t *testing.T) {
143 ls := logSink{}
144 l := Loggers{}
145 l.SetBaseLogger(&ls)
146 l.SetPrefix("my-prefix")
147 l.Info("here's a message")
148 assert.Equal(t, []string{"INFO: my-prefix here's a message"}, ls.output)
149 }
150
151 func TestPrintlnWithMultipleValues(t *testing.T) {
152 ls := logSink{}
153 l := Loggers{}
154 l.SetBaseLogger(&ls)
155 l.Info("a", "b", "c")
156 assert.Equal(t, []string{"INFO: a b c"}, ls.output)
157 }
158
159 func TestLevelName(t *testing.T) {
160 for level, s := range map[LogLevel]string{
161 Debug: "Debug",
162 Info: "Info",
163 Warn: "Warn",
164 Error: "Error",
165 None: "None",
166 LogLevel(999): "?",
167 } {
168 assert.Equal(t, s, level.Name())
169 assert.Equal(t, s, level.String())
170 }
171 }
172
View as plain text