writer_test.go 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. package logx
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "errors"
  6. "log"
  7. "testing"
  8. "github.com/stretchr/testify/assert"
  9. )
  10. func TestNewWriter(t *testing.T) {
  11. const literal = "foo bar"
  12. var buf bytes.Buffer
  13. w := NewWriter(&buf)
  14. w.Info(literal)
  15. assert.Contains(t, buf.String(), literal)
  16. buf.Reset()
  17. w.Debug(literal)
  18. assert.Contains(t, buf.String(), literal)
  19. }
  20. func TestConsoleWriter(t *testing.T) {
  21. var buf bytes.Buffer
  22. w := newConsoleWriter()
  23. lw := newLogWriter(log.New(&buf, "", 0))
  24. w.(*concreteWriter).errorLog = lw
  25. w.Alert("foo bar 1")
  26. var val mockedEntry
  27. if err := json.Unmarshal(buf.Bytes(), &val); err != nil {
  28. t.Fatal(err)
  29. }
  30. assert.Equal(t, levelAlert, val.Level)
  31. assert.Equal(t, "foo bar 1", val.Content)
  32. buf.Reset()
  33. w.(*concreteWriter).errorLog = lw
  34. w.Error("foo bar 2")
  35. if err := json.Unmarshal(buf.Bytes(), &val); err != nil {
  36. t.Fatal(err)
  37. }
  38. assert.Equal(t, levelError, val.Level)
  39. assert.Equal(t, "foo bar 2", val.Content)
  40. buf.Reset()
  41. w.(*concreteWriter).infoLog = lw
  42. w.Info("foo bar 3")
  43. if err := json.Unmarshal(buf.Bytes(), &val); err != nil {
  44. t.Fatal(err)
  45. }
  46. assert.Equal(t, levelInfo, val.Level)
  47. assert.Equal(t, "foo bar 3", val.Content)
  48. buf.Reset()
  49. w.(*concreteWriter).severeLog = lw
  50. w.Severe("foo bar 4")
  51. if err := json.Unmarshal(buf.Bytes(), &val); err != nil {
  52. t.Fatal(err)
  53. }
  54. assert.Equal(t, levelFatal, val.Level)
  55. assert.Equal(t, "foo bar 4", val.Content)
  56. buf.Reset()
  57. w.(*concreteWriter).slowLog = lw
  58. w.Slow("foo bar 5")
  59. if err := json.Unmarshal(buf.Bytes(), &val); err != nil {
  60. t.Fatal(err)
  61. }
  62. assert.Equal(t, levelSlow, val.Level)
  63. assert.Equal(t, "foo bar 5", val.Content)
  64. buf.Reset()
  65. w.(*concreteWriter).statLog = lw
  66. w.Stat("foo bar 6")
  67. if err := json.Unmarshal(buf.Bytes(), &val); err != nil {
  68. t.Fatal(err)
  69. }
  70. assert.Equal(t, levelStat, val.Level)
  71. assert.Equal(t, "foo bar 6", val.Content)
  72. w.(*concreteWriter).infoLog = hardToCloseWriter{}
  73. assert.NotNil(t, w.Close())
  74. w.(*concreteWriter).infoLog = easyToCloseWriter{}
  75. w.(*concreteWriter).errorLog = hardToCloseWriter{}
  76. assert.NotNil(t, w.Close())
  77. w.(*concreteWriter).errorLog = easyToCloseWriter{}
  78. w.(*concreteWriter).severeLog = hardToCloseWriter{}
  79. assert.NotNil(t, w.Close())
  80. w.(*concreteWriter).severeLog = easyToCloseWriter{}
  81. w.(*concreteWriter).slowLog = hardToCloseWriter{}
  82. assert.NotNil(t, w.Close())
  83. w.(*concreteWriter).slowLog = easyToCloseWriter{}
  84. w.(*concreteWriter).statLog = hardToCloseWriter{}
  85. assert.NotNil(t, w.Close())
  86. w.(*concreteWriter).statLog = easyToCloseWriter{}
  87. }
  88. func TestNopWriter(t *testing.T) {
  89. assert.NotPanics(t, func() {
  90. var w nopWriter
  91. w.Alert("foo")
  92. w.Debug("foo")
  93. w.Error("foo")
  94. w.Info("foo")
  95. w.Severe("foo")
  96. w.Stack("foo")
  97. w.Stat("foo")
  98. w.Slow("foo")
  99. w.Close()
  100. })
  101. }
  102. func TestWriteJson(t *testing.T) {
  103. var buf bytes.Buffer
  104. log.SetOutput(&buf)
  105. writeJson(nil, "foo")
  106. assert.Contains(t, buf.String(), "foo")
  107. buf.Reset()
  108. writeJson(nil, make(chan int))
  109. assert.Contains(t, buf.String(), "unsupported type")
  110. }
  111. func TestWritePlainAny(t *testing.T) {
  112. var buf bytes.Buffer
  113. log.SetOutput(&buf)
  114. writePlainAny(nil, levelInfo, "foo")
  115. assert.Contains(t, buf.String(), "foo")
  116. buf.Reset()
  117. writePlainAny(nil, levelDebug, make(chan int))
  118. assert.Contains(t, buf.String(), "unsupported type")
  119. writePlainAny(nil, levelDebug, 100)
  120. assert.Contains(t, buf.String(), "100")
  121. buf.Reset()
  122. writePlainAny(nil, levelError, make(chan int))
  123. assert.Contains(t, buf.String(), "unsupported type")
  124. writePlainAny(nil, levelSlow, 100)
  125. assert.Contains(t, buf.String(), "100")
  126. buf.Reset()
  127. writePlainAny(hardToWriteWriter{}, levelStat, 100)
  128. assert.Contains(t, buf.String(), "write error")
  129. buf.Reset()
  130. writePlainAny(hardToWriteWriter{}, levelSevere, "foo")
  131. assert.Contains(t, buf.String(), "write error")
  132. buf.Reset()
  133. writePlainAny(hardToWriteWriter{}, levelAlert, "foo")
  134. assert.Contains(t, buf.String(), "write error")
  135. buf.Reset()
  136. writePlainAny(hardToWriteWriter{}, levelFatal, "foo")
  137. assert.Contains(t, buf.String(), "write error")
  138. }
  139. type mockedEntry struct {
  140. Level string `json:"level"`
  141. Content string `json:"content"`
  142. }
  143. type easyToCloseWriter struct{}
  144. func (h easyToCloseWriter) Write(_ []byte) (_ int, _ error) {
  145. return
  146. }
  147. func (h easyToCloseWriter) Close() error {
  148. return nil
  149. }
  150. type hardToCloseWriter struct{}
  151. func (h hardToCloseWriter) Write(_ []byte) (_ int, _ error) {
  152. return
  153. }
  154. func (h hardToCloseWriter) Close() error {
  155. return errors.New("close error")
  156. }
  157. type hardToWriteWriter struct{}
  158. func (h hardToWriteWriter) Write(_ []byte) (_ int, _ error) {
  159. return 0, errors.New("write error")
  160. }