This repository was archived by the owner on Jan 9, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlogger_testing.go
More file actions
128 lines (101 loc) · 2.99 KB
/
Copy pathlogger_testing.go
File metadata and controls
128 lines (101 loc) · 2.99 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
package logur
import (
"fmt"
"sync"
)
// LogEvent represents a single log event recorded by the test logger.
type LogEvent struct {
Line string
Level Level
Fields map[string]interface{}
}
// LogEventsEqual asserts that two LogEvents are identical and returns an error with detailed information if not.
func LogEventsEqual(expected LogEvent, actual LogEvent) error {
if expected.Level != actual.Level {
return fmt.Errorf("expected log levels to be equal\ngot: %s\nwant: %s", actual.Level, expected.Level)
}
if expected.Line != actual.Line {
return fmt.Errorf("expected log lines to be equal\ngot: %q\nwant: %q", actual.Line, expected.Line)
}
if len(expected.Fields) != len(actual.Fields) {
return fmt.Errorf("expected log fields to be equal\ngot: %v\nwant: %v", actual.Fields, expected.Fields)
}
for key, value := range expected.Fields {
if actual.Fields[key] != value {
return fmt.Errorf("expected log fields to be equal\ngot: %v\nwant: %v", actual.Fields, expected.Fields)
}
}
return nil
}
// TestLogger is a simple stub for the logger interface.
//
// The TestLogger is safe for concurrent use.
type TestLogger struct {
events []LogEvent
mu sync.RWMutex
}
// NewTestLogger returns a new TestLogger.
func NewTestLogger() *TestLogger {
return &TestLogger{}
}
// Count returns the number of events recorded in the logger.
func (l *TestLogger) Count() int {
l.mu.RLock()
defer l.mu.RUnlock()
return len(l.events)
}
// LastEvent returns the last recorded event in the logger (if any).
func (l *TestLogger) LastEvent() *LogEvent {
l.mu.RLock()
defer l.mu.RUnlock()
if l.events == nil || len(l.events) < 1 {
return nil
}
event := l.events[len(l.events)-1]
return &event
}
// Events returns all recorded events in the logger.
func (l *TestLogger) Events() []LogEvent {
l.mu.RLock()
defer l.mu.RUnlock()
if l.events == nil {
return []LogEvent{}
}
return l.events[:len(l.events)]
}
func (l *TestLogger) recordEvent(event LogEvent) {
l.mu.Lock()
defer l.mu.Unlock()
l.events = append(l.events, event)
}
func (l *TestLogger) record(level Level, msg string, varfields []map[string]interface{}) {
var fields map[string]interface{}
if len(varfields) > 0 {
fields = varfields[0]
}
l.recordEvent(LogEvent{
Line: msg,
Level: level,
Fields: fields,
})
}
// Trace records a Trace level event.
func (l *TestLogger) Trace(msg string, fields ...map[string]interface{}) {
l.record(Trace, msg, fields)
}
// Debug records a Debug level event.
func (l *TestLogger) Debug(msg string, fields ...map[string]interface{}) {
l.record(Debug, msg, fields)
}
// Info records a Info level event.
func (l *TestLogger) Info(msg string, fields ...map[string]interface{}) {
l.record(Info, msg, fields)
}
// Warn records a Warn level event.
func (l *TestLogger) Warn(msg string, fields ...map[string]interface{}) {
l.record(Warn, msg, fields)
}
// Error records a Error level event.
func (l *TestLogger) Error(msg string, fields ...map[string]interface{}) {
l.record(Error, msg, fields)
}