-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathlogger_test.go
More file actions
336 lines (302 loc) · 7.74 KB
/
logger_test.go
File metadata and controls
336 lines (302 loc) · 7.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
package featurevisor
import (
"bytes"
"log"
"os"
"strings"
"testing"
)
func TestLogLevels(t *testing.T) {
levels := []LogLevel{
LogLevelFatal,
LogLevelError,
LogLevelWarn,
LogLevelInfo,
LogLevelDebug,
}
for _, level := range levels {
t.Run(string(level), func(t *testing.T) {
if level == "" {
t.Error("Log level should not be empty")
}
})
}
}
func TestAllLevelsOrder(t *testing.T) {
expectedOrder := []LogLevel{
LogLevelFatal,
LogLevelError,
LogLevelWarn,
LogLevelInfo,
LogLevelDebug,
}
if len(AllLevels) != len(expectedOrder) {
t.Errorf("AllLevels length = %d, expected %d", len(AllLevels), len(expectedOrder))
}
for i, level := range AllLevels {
if level != expectedOrder[i] {
t.Errorf("AllLevels[%d] = %s, expected %s", i, level, expectedOrder[i])
}
}
}
func TestNewLogger(t *testing.T) {
// Test default logger
logger := NewLogger(CreateLoggerOptions{})
if logger.GetLevel() != DefaultLevel {
t.Errorf("Default level = %s, expected %s", logger.GetLevel(), DefaultLevel)
}
// Test logger with custom level
customLevel := LogLevelDebug
logger = NewLogger(CreateLoggerOptions{
Level: &customLevel,
})
if logger.GetLevel() != customLevel {
t.Errorf("Custom level = %s, expected %s", logger.GetLevel(), customLevel)
}
}
func TestLoggerSetLevel(t *testing.T) {
logger := NewLogger(CreateLoggerOptions{})
// Test setting different levels
testLevels := []LogLevel{LogLevelDebug, LogLevelInfo, LogLevelWarn, LogLevelError, LogLevelFatal}
for _, level := range testLevels {
logger.SetLevel(level)
if logger.GetLevel() != level {
t.Errorf("Set level = %s, but GetLevel() returned %s", level, logger.GetLevel())
}
}
}
func TestLoggerShouldHandle(t *testing.T) {
logger := NewLogger(CreateLoggerOptions{})
tests := []struct {
name string
currentLevel LogLevel
targetLevel LogLevel
shouldHandle bool
}{
{
name: "info level should handle info",
currentLevel: LogLevelInfo,
targetLevel: LogLevelInfo,
shouldHandle: true,
},
{
name: "info level should handle warn",
currentLevel: LogLevelInfo,
targetLevel: LogLevelWarn,
shouldHandle: true,
},
{
name: "info level should handle error",
currentLevel: LogLevelInfo,
targetLevel: LogLevelError,
shouldHandle: true,
},
{
name: "info level should handle fatal",
currentLevel: LogLevelInfo,
targetLevel: LogLevelFatal,
shouldHandle: true,
},
{
name: "info level should not handle debug",
currentLevel: LogLevelInfo,
targetLevel: LogLevelDebug,
shouldHandle: false,
},
{
name: "debug level should handle debug",
currentLevel: LogLevelDebug,
targetLevel: LogLevelDebug,
shouldHandle: true,
},
{
name: "debug level should handle info",
currentLevel: LogLevelDebug,
targetLevel: LogLevelInfo,
shouldHandle: true,
},
{
name: "warn level should not handle debug",
currentLevel: LogLevelWarn,
targetLevel: LogLevelDebug,
shouldHandle: false,
},
{
name: "warn level should not handle info",
currentLevel: LogLevelWarn,
targetLevel: LogLevelInfo,
shouldHandle: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
logger.SetLevel(tt.currentLevel)
result := logger.shouldHandle(tt.targetLevel)
if result != tt.shouldHandle {
t.Errorf("shouldHandle(%s) with level %s = %v, expected %v",
tt.targetLevel, tt.currentLevel, result, tt.shouldHandle)
}
})
}
}
func TestDefaultLogHandler(t *testing.T) {
// Capture log output
var buf bytes.Buffer
log.SetOutput(&buf)
defer log.SetOutput(os.Stderr)
// Test different log levels
testCases := []struct {
level LogLevel
message LogMessage
details LogDetails
expect string
}{
{
level: LogLevelInfo,
message: "Test info message",
details: LogDetails{"key": "value"},
expect: "[INFO]",
},
{
level: LogLevelWarn,
message: "Test warning message",
details: LogDetails{"warning": true},
expect: "[WARN]",
},
{
level: LogLevelError,
message: "Test error message",
details: LogDetails{"error": "test"},
expect: "[ERROR]",
},
{
level: LogLevelDebug,
message: "Test debug message",
details: LogDetails{"debug": "info"},
expect: "[DEBUG]",
},
}
for _, tc := range testCases {
t.Run(string(tc.level), func(t *testing.T) {
buf.Reset()
DefaultLogHandler(tc.level, tc.message, tc.details)
output := buf.String()
if !strings.Contains(output, tc.expect) {
t.Errorf("Expected output to contain %s, got: %s", tc.expect, output)
}
if !strings.Contains(output, string(tc.message)) {
t.Errorf("Expected output to contain message '%s', got: %s", tc.message, output)
}
})
}
}
func TestLoggerMethods(t *testing.T) {
// Capture log output
var buf bytes.Buffer
log.SetOutput(&buf)
defer log.SetOutput(os.Stderr)
level := LogLevelInfo
logger := NewLogger(CreateLoggerOptions{
Level: &level,
})
// Test all logging methods
testCases := []struct {
name string
method func()
expect string
}{
{
name: "Debug",
method: func() {
logger.Debug("debug message", LogDetails{"debug": true})
},
expect: "", // Debug messages should be filtered out at info level
},
{
name: "Info",
method: func() {
logger.Info("info message", LogDetails{"info": true})
},
expect: "info",
},
{
name: "Warn",
method: func() {
logger.Warn("warn message", LogDetails{"warn": true})
},
expect: "warn",
},
{
name: "Error",
method: func() {
logger.Error("error message", LogDetails{"error": true})
},
expect: "error",
},
}
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
buf.Reset()
tc.method()
output := buf.String()
if tc.expect == "" {
// If no output is expected, check that nothing was logged
if output != "" {
t.Errorf("Expected no output, got: %s", output)
}
} else {
// If output is expected, check that it contains the expected string
if !strings.Contains(strings.ToLower(output), tc.expect) {
t.Errorf("Expected output to contain '%s', got: %s", tc.expect, output)
}
}
})
}
}
func TestCustomLogHandler(t *testing.T) {
var capturedLevel LogLevel
var capturedMessage LogMessage
var capturedDetails LogDetails
var customHandler LogHandler = func(level LogLevel, message LogMessage, details LogDetails) {
capturedLevel = level
capturedMessage = message
capturedDetails = details
}
logger := NewLogger(CreateLoggerOptions{
Handler: &customHandler,
})
expectedMessage := LogMessage("test message")
expectedDetails := LogDetails{"key": "value"}
logger.Info(expectedMessage, expectedDetails)
if capturedLevel != LogLevelInfo {
t.Errorf("Captured level = %s, expected %s", capturedLevel, LogLevelInfo)
}
if capturedMessage != expectedMessage {
t.Errorf("Captured message = %s, expected %s", capturedMessage, expectedMessage)
}
if capturedDetails["key"] != expectedDetails["key"] {
t.Errorf("Captured details = %v, expected %v", capturedDetails, expectedDetails)
}
}
func TestCreateLogger(t *testing.T) {
// Test with no options
logger := CreateLogger(CreateLoggerOptions{})
if logger.GetLevel() != DefaultLevel {
t.Errorf("CreateLogger default level = %s, expected %s", logger.GetLevel(), DefaultLevel)
}
// Test with custom options
customLevel := LogLevelDebug
logger = CreateLogger(CreateLoggerOptions{
Level: &customLevel,
})
if logger.GetLevel() != customLevel {
t.Errorf("CreateLogger custom level = %s, expected %s", logger.GetLevel(), customLevel)
}
}
func BenchmarkLoggerInfo(b *testing.B) {
logger := NewLogger(CreateLoggerOptions{})
b.ResetTimer()
for i := 0; i < b.N; i++ {
logger.Info("benchmark message", LogDetails{"benchmark": i})
}
}