7
. "launchpad.net/gocheck"
11
type writerBasicsSuite struct{}
13
var _ = Suite(&writerBasicsSuite{})
15
func (s *writerBasicsSuite) TearDownTest(c *C) {
19
func (*writerBasicsSuite) TestRemoveDefaultWriter(c *C) {
20
defaultWriter, level, err := loggo.RemoveWriter("default")
22
c.Assert(level, Equals, loggo.TRACE)
23
c.Assert(defaultWriter, Not(IsNil))
25
// Trying again fails.
26
defaultWriter, level, err = loggo.RemoveWriter("default")
27
c.Assert(err, ErrorMatches, `Writer "default" is not registered`)
28
c.Assert(level, Equals, loggo.UNSPECIFIED)
29
c.Assert(defaultWriter, IsNil)
32
func (*writerBasicsSuite) TestRegisterWriterExistingName(c *C) {
33
err := loggo.RegisterWriter("default", &loggo.TestWriter{}, loggo.INFO)
34
c.Assert(err, ErrorMatches, `there is already a Writer registered with the name "default"`)
37
func (*writerBasicsSuite) TestRegisterNilWriter(c *C) {
38
err := loggo.RegisterWriter("nil", nil, loggo.INFO)
39
c.Assert(err, ErrorMatches, `Writer cannot be nil`)
42
func (*writerBasicsSuite) TestRegisterWriterTypedNil(c *C) {
43
// If the interface is a typed nil, we have to trust the user.
44
var writer *loggo.TestWriter
45
err := loggo.RegisterWriter("nil", writer, loggo.INFO)
49
func (*writerBasicsSuite) TestReplaceDefaultWriter(c *C) {
50
oldWriter, err := loggo.ReplaceDefaultWriter(&loggo.TestWriter{})
51
c.Assert(oldWriter, NotNil)
55
func (*writerBasicsSuite) TestReplaceDefaultWriterWithNil(c *C) {
56
oldWriter, err := loggo.ReplaceDefaultWriter(nil)
57
c.Assert(oldWriter, IsNil)
58
c.Assert(err, ErrorMatches, "Writer cannot be nil")
61
func (*writerBasicsSuite) TestReplaceDefaultWriterNoDefault(c *C) {
62
loggo.RemoveWriter("default")
63
oldWriter, err := loggo.ReplaceDefaultWriter(&loggo.TestWriter{})
64
c.Assert(oldWriter, IsNil)
65
c.Assert(err, ErrorMatches, `there is no "default" writer`)
68
func (s *writerBasicsSuite) TestWillWrite(c *C) {
69
// By default, the root logger watches TRACE messages
70
c.Assert(loggo.WillWrite(loggo.TRACE), Equals, true)
71
// Note: ReplaceDefaultWriter doesn't let us change the default log
73
writer, _, err := loggo.RemoveWriter("default")
75
c.Assert(writer, NotNil)
76
err = loggo.RegisterWriter("default", writer, loggo.CRITICAL)
78
c.Assert(loggo.WillWrite(loggo.TRACE), Equals, false)
79
c.Assert(loggo.WillWrite(loggo.DEBUG), Equals, false)
80
c.Assert(loggo.WillWrite(loggo.INFO), Equals, false)
81
c.Assert(loggo.WillWrite(loggo.WARNING), Equals, false)
82
c.Assert(loggo.WillWrite(loggo.CRITICAL), Equals, true)
85
type writerSuite struct {
89
var _ = Suite(&writerSuite{})
91
func (s *writerSuite) SetUpTest(c *C) {
93
loggo.RemoveWriter("default")
94
s.logger = loggo.GetLogger("test.writer")
95
// Make it so the logger itself writes all messages.
96
s.logger.SetLogLevel(loggo.TRACE)
99
func (s *writerSuite) TearDownTest(c *C) {
103
func (s *writerSuite) TearDownSuite(c *C) {
107
func (s *writerSuite) TestWritingCapturesFileAndLineAndModule(c *C) {
108
writer := &loggo.TestWriter{}
109
err := loggo.RegisterWriter("test", writer, loggo.INFO)
112
s.logger.Infof("Info message")
114
// WARNING: test checks the line number of the above logger lines, this
115
// will mean that if the above line moves, the test will fail unless
117
c.Assert(writer.Log, HasLen, 1)
118
c.Assert(writer.Log[0].Filename, Equals, "writer_test.go")
119
c.Assert(writer.Log[0].Line, Equals, 112)
120
c.Assert(writer.Log[0].Module, Equals, "test.writer")
123
func (s *writerSuite) TestWritingLimitWarning(c *C) {
124
writer := &loggo.TestWriter{}
125
err := loggo.RegisterWriter("test", writer, loggo.WARNING)
129
s.logger.Criticalf("Something critical.")
130
s.logger.Errorf("An error.")
131
s.logger.Warningf("A warning message")
132
s.logger.Infof("Info message")
133
s.logger.Tracef("Trace the function")
136
c.Assert(writer.Log, HasLen, 3)
137
c.Assert(writer.Log[0].Level, Equals, loggo.CRITICAL)
138
c.Assert(writer.Log[0].Message, Equals, "Something critical.")
139
c.Assert(writer.Log[0].Timestamp, Between(start, end))
141
c.Assert(writer.Log[1].Level, Equals, loggo.ERROR)
142
c.Assert(writer.Log[1].Message, Equals, "An error.")
143
c.Assert(writer.Log[1].Timestamp, Between(start, end))
145
c.Assert(writer.Log[2].Level, Equals, loggo.WARNING)
146
c.Assert(writer.Log[2].Message, Equals, "A warning message")
147
c.Assert(writer.Log[2].Timestamp, Between(start, end))
150
func (s *writerSuite) TestWritingLimitTrace(c *C) {
151
writer := &loggo.TestWriter{}
152
err := loggo.RegisterWriter("test", writer, loggo.TRACE)
156
s.logger.Criticalf("Something critical.")
157
s.logger.Errorf("An error.")
158
s.logger.Warningf("A warning message")
159
s.logger.Infof("Info message")
160
s.logger.Tracef("Trace the function")
163
c.Assert(writer.Log, HasLen, 5)
164
c.Assert(writer.Log[0].Level, Equals, loggo.CRITICAL)
165
c.Assert(writer.Log[0].Message, Equals, "Something critical.")
166
c.Assert(writer.Log[0].Timestamp, Between(start, end))
168
c.Assert(writer.Log[1].Level, Equals, loggo.ERROR)
169
c.Assert(writer.Log[1].Message, Equals, "An error.")
170
c.Assert(writer.Log[1].Timestamp, Between(start, end))
172
c.Assert(writer.Log[2].Level, Equals, loggo.WARNING)
173
c.Assert(writer.Log[2].Message, Equals, "A warning message")
174
c.Assert(writer.Log[2].Timestamp, Between(start, end))
176
c.Assert(writer.Log[3].Level, Equals, loggo.INFO)
177
c.Assert(writer.Log[3].Message, Equals, "Info message")
178
c.Assert(writer.Log[3].Timestamp, Between(start, end))
180
c.Assert(writer.Log[4].Level, Equals, loggo.TRACE)
181
c.Assert(writer.Log[4].Message, Equals, "Trace the function")
182
c.Assert(writer.Log[4].Timestamp, Between(start, end))
185
func (s *writerSuite) TestMultipleWriters(c *C) {
186
errorWriter := &loggo.TestWriter{}
187
err := loggo.RegisterWriter("error", errorWriter, loggo.ERROR)
189
warningWriter := &loggo.TestWriter{}
190
err = loggo.RegisterWriter("warning", warningWriter, loggo.WARNING)
192
infoWriter := &loggo.TestWriter{}
193
err = loggo.RegisterWriter("info", infoWriter, loggo.INFO)
195
traceWriter := &loggo.TestWriter{}
196
err = loggo.RegisterWriter("trace", traceWriter, loggo.TRACE)
199
s.logger.Errorf("An error.")
200
s.logger.Warningf("A warning message")
201
s.logger.Infof("Info message")
202
s.logger.Tracef("Trace the function")
204
c.Assert(errorWriter.Log, HasLen, 1)
205
c.Assert(warningWriter.Log, HasLen, 2)
206
c.Assert(infoWriter.Log, HasLen, 3)
207
c.Assert(traceWriter.Log, HasLen, 4)
210
func Between(start, end time.Time) Checker {
211
if end.Before(start) {
212
return &betweenChecker{end, start}
214
return &betweenChecker{start, end}
217
type betweenChecker struct {
221
func (checker *betweenChecker) Info() *CheckerInfo {
224
Params: []string{"obtained"},
229
func (checker *betweenChecker) Check(params []interface{}, names []string) (result bool, error string) {
230
when, ok := params[0].(time.Time)
232
return false, "obtained value type must be time.Time"
234
if when.Before(checker.start) {
235
return false, fmt.Sprintf("obtained value %#v type must before start value of %#v", when, checker.start)
237
if when.After(checker.end) {
238
return false, fmt.Sprintf("obtained value %#v type must after end value of %#v", when, checker.end)