-
Notifications
You must be signed in to change notification settings - Fork 28
/
test_sink.go
91 lines (73 loc) · 1.69 KB
/
test_sink.go
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
package lagertest
import (
"bytes"
"context"
"encoding/json"
"io"
"sync"
"github.com/onsi/ginkgo"
"github.com/onsi/gomega/gbytes"
"code.cloudfoundry.org/lager"
"code.cloudfoundry.org/lager/lagerctx"
)
type TestLogger struct {
lager.Logger
*TestSink
}
type TestSink struct {
writeLock *sync.Mutex
lager.Sink
buffer *gbytes.Buffer
Errors []error
}
func NewTestLogger(component string) *TestLogger {
logger := lager.NewLogger(component)
testSink := NewTestSink()
logger.RegisterSink(testSink)
logger.RegisterSink(lager.NewWriterSink(ginkgo.GinkgoWriter, lager.DEBUG))
return &TestLogger{logger, testSink}
}
func NewContext(parent context.Context, name string) context.Context {
return lagerctx.NewContext(parent, NewTestLogger(name))
}
func NewTestSink() *TestSink {
buffer := gbytes.NewBuffer()
return &TestSink{
writeLock: new(sync.Mutex),
Sink: lager.NewWriterSink(buffer, lager.DEBUG),
buffer: buffer,
}
}
func (s *TestSink) Buffer() *gbytes.Buffer {
return s.buffer
}
func (s *TestSink) Logs() []lager.LogFormat {
logs := []lager.LogFormat{}
decoder := json.NewDecoder(bytes.NewBuffer(s.buffer.Contents()))
for {
var log lager.LogFormat
if err := decoder.Decode(&log); err == io.EOF {
return logs
} else if err != nil {
panic(err)
}
logs = append(logs, log)
}
return logs
}
func (s *TestSink) LogMessages() []string {
logs := s.Logs()
messages := make([]string, 0, len(logs))
for _, log := range logs {
messages = append(messages, log.Message)
}
return messages
}
func (s *TestSink) Log(log lager.LogFormat) {
s.writeLock.Lock()
defer s.writeLock.Unlock()
if log.Error != nil {
s.Errors = append(s.Errors, log.Error)
}
s.Sink.Log(log)
}