logger_test.go 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package lgr
  2. import (
  3. "bytes"
  4. "errors"
  5. "fmt"
  6. "strings"
  7. "sync"
  8. "testing"
  9. "time"
  10. "github.com/stretchr/testify/assert"
  11. )
  12. func TestLoggerNoDbg(t *testing.T) {
  13. tbl := []struct {
  14. format string
  15. args []interface{}
  16. rout, rerr string
  17. }{
  18. {"", []interface{}{}, "2018/01/07 13:02:34.000 \n", ""},
  19. {"DEBUG something 123 %s", []interface{}{"aaa"}, "", ""},
  20. {"[DEBUG] something 123 %s", []interface{}{"aaa"}, "", ""},
  21. {"INFO something 123 %s", []interface{}{"aaa"}, "2018/01/07 13:02:34.000 INFO something 123 aaa\n", ""},
  22. {"[INFO] something 123 %s", []interface{}{"aaa"}, "2018/01/07 13:02:34.000 INFO something 123 aaa\n", ""},
  23. {"blah something 123 %s", []interface{}{"aaa"}, "2018/01/07 13:02:34.000 blah something 123 aaa\n", ""},
  24. {"WARN something 123 %s", []interface{}{"aaa"}, "2018/01/07 13:02:34.000 WARN something 123 aaa\n", ""},
  25. {"ERROR something 123 %s", []interface{}{"aaa"}, "2018/01/07 13:02:34.000 ERROR something 123 aaa\n",
  26. "2018/01/07 13:02:34.000 ERROR something 123 aaa\n"},
  27. }
  28. rout, rerr := bytes.NewBuffer([]byte{}), bytes.NewBuffer([]byte{})
  29. l := New(Out(rout), Err(rerr))
  30. l.now = func() time.Time { return time.Date(2018, 1, 7, 13, 2, 34, 0, time.Local) }
  31. for i, tt := range tbl {
  32. rout.Reset()
  33. rerr.Reset()
  34. t.Run(fmt.Sprintf("check-%d", i), func(t *testing.T) {
  35. l.Logf(tt.format, tt.args...)
  36. assert.Equal(t, tt.rout, rout.String())
  37. assert.Equal(t, tt.rerr, rerr.String())
  38. })
  39. }
  40. }
  41. func TestLoggerWithDbg(t *testing.T) {
  42. tbl := []struct {
  43. format string
  44. args []interface{}
  45. rout, rerr string
  46. }{
  47. {"", []interface{}{},
  48. "2018/01/07 13:02:34.000 {lgr/logger_test.go:79 lgr.TestLoggerWithDbg.func2} \n", ""},
  49. {"DEBUG something 123 %s", []interface{}{"aaa"},
  50. "2018/01/07 13:02:34.000 DEBUG {lgr/logger_test.go:79 lgr.TestLoggerWithDbg.func2} something 123 aaa\n", ""},
  51. {"[DEBUG] something 123 %s", []interface{}{"aaa"},
  52. "2018/01/07 13:02:34.000 DEBUG {lgr/logger_test.go:79 lgr.TestLoggerWithDbg.func2} something 123 aaa\n", ""},
  53. {"INFO something 123 %s", []interface{}{"aaa"},
  54. "2018/01/07 13:02:34.000 INFO {lgr/logger_test.go:79 lgr.TestLoggerWithDbg.func2} something 123 aaa\n", ""},
  55. {"[INFO] something 123 %s", []interface{}{"aaa"},
  56. "2018/01/07 13:02:34.000 INFO {lgr/logger_test.go:79 lgr.TestLoggerWithDbg.func2} something 123 aaa\n", ""},
  57. {"blah something 123 %s", []interface{}{"aaa"},
  58. "2018/01/07 13:02:34.000 {lgr/logger_test.go:79 lgr.TestLoggerWithDbg.func2} blah something 123 aaa\n", ""},
  59. {"WARN something 123 %s", []interface{}{"aaa"},
  60. "2018/01/07 13:02:34.000 WARN {lgr/logger_test.go:79 lgr.TestLoggerWithDbg.func2} something 123 aaa\n", ""},
  61. {"ERROR something 123 %s", []interface{}{"aaa"},
  62. "2018/01/07 13:02:34.000 ERROR {lgr/logger_test.go:79 lgr.TestLoggerWithDbg.func2} something 123 aaa\n",
  63. "2018/01/07 13:02:34.000 ERROR {lgr/logger_test.go:79 lgr.TestLoggerWithDbg.func2} something 123 aaa\n"},
  64. }
  65. rout, rerr := bytes.NewBuffer([]byte{}), bytes.NewBuffer([]byte{})
  66. l := New(Debug, CallerFile, CallerFunc, Out(rout), Err(rerr))
  67. l.now = func() time.Time { return time.Date(2018, 1, 7, 13, 2, 34, 0, time.Local) }
  68. for i, tt := range tbl {
  69. rout.Reset()
  70. rerr.Reset()
  71. t.Run(fmt.Sprintf("check-%d", i), func(t *testing.T) {
  72. l.Logf(tt.format, tt.args...)
  73. assert.Equal(t, tt.rout, rout.String())
  74. assert.Equal(t, tt.rerr, rerr.String())
  75. })
  76. }
  77. l = New(Debug, Out(rout), Err(rerr)) // no caller
  78. l.now = func() time.Time { return time.Date(2018, 1, 7, 13, 2, 34, 0, time.Local) }
  79. rout.Reset()
  80. rerr.Reset()
  81. l.Logf("[DEBUG] something 123 %s", "err")
  82. assert.Equal(t, "2018/01/07 13:02:34.000 DEBUG something 123 err\n", rout.String())
  83. assert.Equal(t, "", rerr.String())
  84. l = New(Debug, Out(rout), Err(rerr), CallerFile) // caller file only
  85. l.now = func() time.Time { return time.Date(2018, 1, 7, 13, 2, 34, 0, time.Local) }
  86. rout.Reset()
  87. rerr.Reset()
  88. l.Logf("[DEBUG] something 123 %s", "err")
  89. assert.Equal(t, "2018/01/07 13:02:34.000 DEBUG {lgr/logger_test.go:97} something 123 err\n", rout.String())
  90. l = New(Debug, Out(rout), Err(rerr), CallerFunc) // caller func only
  91. l.now = func() time.Time { return time.Date(2018, 1, 7, 13, 2, 34, 0, time.Local) }
  92. rout.Reset()
  93. rerr.Reset()
  94. l.Logf("[DEBUG] something 123 %s", "err")
  95. assert.Equal(t, "2018/01/07 13:02:34.000 DEBUG {lgr.TestLoggerWithDbg} something 123 err\n", rout.String())
  96. }
  97. func TestLoggerWithLevelBraces(t *testing.T) {
  98. rout, rerr := bytes.NewBuffer([]byte{}), bytes.NewBuffer([]byte{})
  99. l := New(Debug, Out(rout), Err(rerr), LevelBraces)
  100. l.now = func() time.Time { return time.Date(2018, 1, 7, 13, 2, 34, 0, time.Local) }
  101. l.Logf("[DEBUG] something 123 %s", "err")
  102. assert.Equal(t, "2018/01/07 13:02:34.000 [DEBUG] something 123 err\n", rout.String())
  103. }
  104. func TestLoggerWithPanic(t *testing.T) {
  105. fatalCalls := 0
  106. rout, rerr := bytes.NewBuffer([]byte{}), bytes.NewBuffer([]byte{})
  107. l := New(Debug, CallerFunc, Out(rout), Err(rerr))
  108. l.now = func() time.Time { return time.Date(2018, 1, 7, 13, 2, 34, 0, time.Local) }
  109. l.fatal = func() { fatalCalls++ }
  110. l.Logf("[PANIC] oh my, panic now! %v", errors.New("bad thing happened"))
  111. assert.Equal(t, 1, fatalCalls)
  112. assert.Equal(t, "2018/01/07 13:02:34.000 PANIC {lgr.TestLoggerWithPanic} oh my, panic now! bad thing happened\n", rout.String())
  113. t.Logf(rerr.String())
  114. assert.True(t, strings.HasPrefix(rerr.String(), "2018/01/07 13:02:34.000 PANIC"))
  115. assert.True(t, strings.Contains(rerr.String(), "github.com/go-pkgz/lgr.getDump"))
  116. assert.True(t, strings.Contains(rerr.String(), "go-pkgz/lgr/logger.go:"))
  117. }
  118. func TestLoggerConcurrent(t *testing.T) {
  119. rout, rerr := bytes.NewBuffer([]byte{}), bytes.NewBuffer([]byte{})
  120. l := New(Debug, Out(rout), Err(rerr))
  121. l.now = func() time.Time { return time.Date(2018, 1, 7, 13, 2, 34, 0, time.Local) }
  122. var wg sync.WaitGroup
  123. wg.Add(1000)
  124. for i := 0; i < 1000; i++ {
  125. go func(i int) {
  126. l.Logf("[DEBUG] test test 123 debug message #%d, %v", i, errors.New("some error"))
  127. wg.Done()
  128. }(i)
  129. }
  130. wg.Wait()
  131. assert.Equal(t, 1001, len(strings.Split(rout.String(), "\n")))
  132. assert.Equal(t, "", rerr.String())
  133. }
  134. func BenchmarkNoDbg(b *testing.B) {
  135. rout, rerr := bytes.NewBuffer([]byte{}), bytes.NewBuffer([]byte{})
  136. l := New(Out(rout), Err(rerr))
  137. l.now = func() time.Time { return time.Date(2018, 1, 7, 13, 2, 34, 0, time.Local) }
  138. e := errors.New("some error")
  139. for n := 0; n < b.N; n++ {
  140. l.Logf("[INFO] test test 123 debug message #%d, %v", n, e)
  141. }
  142. }
  143. func BenchmarkWithDbg(b *testing.B) {
  144. rout, rerr := bytes.NewBuffer([]byte{}), bytes.NewBuffer([]byte{})
  145. l := New(Debug, CallerFile, CallerFunc, Out(rout), Err(rerr))
  146. l.now = func() time.Time { return time.Date(2018, 1, 7, 13, 2, 34, 0, time.Local) }
  147. e := errors.New("some error")
  148. for n := 0; n < b.N; n++ {
  149. l.Logf("[INFO] test test 123 debug message #%d, %v", n, e)
  150. }
  151. }