44package log
55
66import (
7+ "regexp"
78 "sync"
89 "testing"
910 "time"
@@ -34,11 +35,11 @@ func (d *dummyWriter) Close() error {
3435 return nil
3536}
3637
37- func (d * dummyWriter ) GetLogs () []string {
38+ func (d * dummyWriter ) FetchLogs () []string {
3839 d .mu .Lock ()
3940 defer d .mu .Unlock ()
40- logs := make ([] string , len ( d .logs ))
41- copy ( logs , d .logs )
41+ logs := d .logs
42+ d .logs = nil
4243 return logs
4344}
4445
@@ -76,14 +77,14 @@ func TestLogger(t *testing.T) {
7677
7778 // w2 is slow, so only w1 has logs
7879 time .Sleep (100 * time .Millisecond )
79- assert .Equal (t , []string {"debug-level\n " , "error-level\n " }, w1 .GetLogs ())
80- assert .Equal (t , [] string {}, w2 .GetLogs ())
80+ assert .Equal (t , []string {"debug-level\n " , "error-level\n " }, w1 .FetchLogs ())
81+ assert .Empty (t , w2 .FetchLogs ())
8182
8283 logger .Close ()
8384
8485 // after Close, all logs are flushed
85- assert .Equal (t , [] string { "debug-level \n " , "error-level \n " }, w1 .GetLogs ())
86- assert .Equal (t , []string {"error-level\n " }, w2 .GetLogs ())
86+ assert .Empty (t , w1 .FetchLogs ())
87+ assert .Equal (t , []string {"error-level\n " }, w2 .FetchLogs ())
8788}
8889
8990func TestLoggerPause (t * testing.T ) {
@@ -97,12 +98,12 @@ func TestLoggerPause(t *testing.T) {
9798
9899 logger .Info ("info-level" )
99100 time .Sleep (100 * time .Millisecond )
100- assert .Equal (t , [] string {}, w1 .GetLogs ())
101+ assert .Empty (t , w1 .FetchLogs ())
101102
102103 GetManager ().ResumeAll ()
103104
104105 time .Sleep (100 * time .Millisecond )
105- assert .Equal (t , []string {"info-level\n " }, w1 .GetLogs ())
106+ assert .Equal (t , []string {"info-level\n " }, w1 .FetchLogs ())
106107
107108 logger .Close ()
108109}
@@ -123,21 +124,42 @@ func (t *testLogStringPtrReceiver) LogString() string {
123124 return "log-string-ptr-receiver"
124125}
125126
126- func TestLoggerLogString (t * testing.T ) {
127- logger := NewLoggerWithWriters (t .Context (), "test" )
128-
129- w1 := newDummyWriter ("dummy-1" , DEBUG , 0 )
130- w1 .Mode .Colorize = true
131- logger .AddWriters (w1 )
132-
133- logger .Info ("%s %s %#v %v" , testLogString {}, & testLogString {}, testLogString {Field : "detail" }, NewColoredValue (testLogString {}, FgRed ))
134- logger .Info ("%s %s %#v %v" , testLogStringPtrReceiver {}, & testLogStringPtrReceiver {}, testLogStringPtrReceiver {Field : "detail" }, NewColoredValue (testLogStringPtrReceiver {}, FgRed ))
135- logger .Close ()
127+ func genericFunc [T any ](logger Logger , v T ) {
128+ logger .Info ("from genericFunc: %v" , v )
129+ }
136130
137- assert .Equal (t , []string {
138- "log-string log-string log.testLogString{Field:\" detail\" } \x1b [31mlog-string\x1b [0m\n " ,
139- "log-string-ptr-receiver log-string-ptr-receiver &log.testLogStringPtrReceiver{Field:\" detail\" } \x1b [31mlog-string-ptr-receiver\x1b [0m\n " ,
140- }, w1 .GetLogs ())
131+ func TestLoggerOutput (t * testing.T ) {
132+ t .Run ("LogString" , func (t * testing.T ) {
133+ logger := NewLoggerWithWriters (t .Context (), "test" )
134+ w1 := newDummyWriter ("dummy-1" , DEBUG , 0 )
135+ w1 .Mode .Colorize = true
136+ logger .AddWriters (w1 )
137+ logger .Info ("%s %s %#v %v" , testLogString {}, & testLogString {}, testLogString {Field : "detail" }, NewColoredValue (testLogString {}, FgRed ))
138+ logger .Info ("%s %s %#v %v" , testLogStringPtrReceiver {}, & testLogStringPtrReceiver {}, testLogStringPtrReceiver {Field : "detail" }, NewColoredValue (testLogStringPtrReceiver {}, FgRed ))
139+ logger .Close ()
140+
141+ assert .Equal (t , []string {
142+ "log-string log-string log.testLogString{Field:\" detail\" } \x1b [31mlog-string\x1b [0m\n " ,
143+ "log-string-ptr-receiver log-string-ptr-receiver &log.testLogStringPtrReceiver{Field:\" detail\" } \x1b [31mlog-string-ptr-receiver\x1b [0m\n " ,
144+ }, w1 .FetchLogs ())
145+ })
146+
147+ t .Run ("Caller" , func (t * testing.T ) {
148+ logger := NewLoggerWithWriters (t .Context (), "test" )
149+ w1 := newDummyWriter ("dummy-1" , DEBUG , 0 )
150+ w1 .EventWriterBaseImpl .Mode .Flags .flags = Lmedfile | Lshortfuncname
151+ logger .AddWriters (w1 )
152+ anonymousFunc := func (logger Logger ) {
153+ logger .Info ("from anonymousFunc" )
154+ }
155+ genericFunc (logger , "123" )
156+ anonymousFunc (logger )
157+ logger .Close ()
158+ logs := w1 .FetchLogs ()
159+ assert .Len (t , logs , 2 )
160+ assert .Regexp (t , `modules/log/logger_test.go:\w+:` + regexp .QuoteMeta (`genericFunc() from genericFunc: 123` ), logs [0 ])
161+ assert .Regexp (t , `modules/log/logger_test.go:\w+:` + regexp .QuoteMeta (`TestLoggerOutput.2.1() from anonymousFunc` ), logs [1 ])
162+ })
141163}
142164
143165func TestLoggerExpressionFilter (t * testing.T ) {
@@ -153,5 +175,5 @@ func TestLoggerExpressionFilter(t *testing.T) {
153175 logger .SendLogEvent (& Event {Level : INFO , Filename : "foo.go" , MsgSimpleText : "by filename" })
154176 logger .Close ()
155177
156- assert .Equal (t , []string {"foo\n " , "foo bar\n " , "by filename\n " }, w1 .GetLogs ())
178+ assert .Equal (t , []string {"foo\n " , "foo bar\n " , "by filename\n " }, w1 .FetchLogs ())
157179}
0 commit comments