You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

file_test.go 7.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package log
  5. import (
  6. "compress/gzip"
  7. "fmt"
  8. "io/ioutil"
  9. "os"
  10. "path/filepath"
  11. "strings"
  12. "testing"
  13. "time"
  14. "github.com/stretchr/testify/assert"
  15. )
  16. func TestFileLoggerFails(t *testing.T) {
  17. tmpDir, err := ioutil.TempDir("", "TestFileLogger")
  18. assert.NoError(t, err)
  19. defer os.RemoveAll(tmpDir)
  20. prefix := "TestPrefix "
  21. level := INFO
  22. flags := LstdFlags | LUTC | Lfuncname
  23. //filename := filepath.Join(tmpDir, "test.log")
  24. fileLogger := NewFileLogger()
  25. //realFileLogger, ok := fileLogger.(*FileLogger)
  26. //assert.Equal(t, true, ok)
  27. // Fail if there is bad json
  28. err = fileLogger.Init("{")
  29. assert.Error(t, err)
  30. // Fail if there is no filename
  31. err = fileLogger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"filename\":\"%s\"}", prefix, level.String(), flags, ""))
  32. assert.Error(t, err)
  33. // Fail if the file isn't a filename
  34. err = fileLogger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"filename\":\"%s\"}", prefix, level.String(), flags, filepath.ToSlash(tmpDir)))
  35. assert.Error(t, err)
  36. }
  37. func TestFileLogger(t *testing.T) {
  38. tmpDir, err := ioutil.TempDir("", "TestFileLogger")
  39. assert.NoError(t, err)
  40. defer os.RemoveAll(tmpDir)
  41. prefix := "TestPrefix "
  42. level := INFO
  43. flags := LstdFlags | LUTC | Lfuncname
  44. filename := filepath.Join(tmpDir, "test.log")
  45. fileLogger := NewFileLogger()
  46. realFileLogger, ok := fileLogger.(*FileLogger)
  47. assert.Equal(t, true, ok)
  48. location, _ := time.LoadLocation("EST")
  49. date := time.Date(2019, time.January, 13, 22, 3, 30, 15, location)
  50. dateString := date.UTC().Format("2006/01/02 15:04:05")
  51. event := Event{
  52. level: INFO,
  53. msg: "TEST MSG",
  54. caller: "CALLER",
  55. filename: "FULL/FILENAME",
  56. line: 1,
  57. time: date,
  58. }
  59. expected := fmt.Sprintf("%s%s %s:%d:%s [%c] %s\n", prefix, dateString, event.filename, event.line, event.caller, strings.ToUpper(event.level.String())[0], event.msg)
  60. fileLogger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"filename\":\"%s\",\"maxsize\":%d,\"compress\":false}", prefix, level.String(), flags, filepath.ToSlash(filename), len(expected)*2))
  61. assert.Equal(t, flags, realFileLogger.Flags)
  62. assert.Equal(t, level, realFileLogger.Level)
  63. assert.Equal(t, level, fileLogger.GetLevel())
  64. fileLogger.LogEvent(&event)
  65. fileLogger.Flush()
  66. logData, err := ioutil.ReadFile(filename)
  67. assert.NoError(t, err)
  68. assert.Equal(t, expected, string(logData))
  69. event.level = DEBUG
  70. fileLogger.LogEvent(&event)
  71. fileLogger.Flush()
  72. logData, err = ioutil.ReadFile(filename)
  73. assert.NoError(t, err)
  74. assert.Equal(t, expected, string(logData))
  75. event.level = TRACE
  76. fileLogger.LogEvent(&event)
  77. fileLogger.Flush()
  78. logData, err = ioutil.ReadFile(filename)
  79. assert.NoError(t, err)
  80. assert.Equal(t, expected, string(logData))
  81. event.level = WARN
  82. expected += fmt.Sprintf("%s%s %s:%d:%s [%c] %s\n", prefix, dateString, event.filename, event.line, event.caller, strings.ToUpper(event.level.String())[0], event.msg)
  83. fileLogger.LogEvent(&event)
  84. fileLogger.Flush()
  85. logData, err = ioutil.ReadFile(filename)
  86. assert.NoError(t, err)
  87. assert.Equal(t, expected, string(logData))
  88. // Should rotate
  89. fileLogger.LogEvent(&event)
  90. fileLogger.Flush()
  91. logData, err = ioutil.ReadFile(filename + fmt.Sprintf(".%s.%03d", time.Now().Format("2006-01-02"), 1))
  92. assert.NoError(t, err)
  93. assert.Equal(t, expected, string(logData))
  94. logData, err = ioutil.ReadFile(filename)
  95. assert.NoError(t, err)
  96. expected = fmt.Sprintf("%s%s %s:%d:%s [%c] %s\n", prefix, dateString, event.filename, event.line, event.caller, strings.ToUpper(event.level.String())[0], event.msg)
  97. assert.Equal(t, expected, string(logData))
  98. for num := 2; num <= 999; num++ {
  99. file, err := os.OpenFile(filename+fmt.Sprintf(".%s.%03d", time.Now().Format("2006-01-02"), num), os.O_RDONLY|os.O_CREATE, 0666)
  100. assert.NoError(t, err)
  101. file.Close()
  102. }
  103. err = realFileLogger.DoRotate()
  104. assert.Error(t, err)
  105. expected += fmt.Sprintf("%s%s %s:%d:%s [%c] %s\n", prefix, dateString, event.filename, event.line, event.caller, strings.ToUpper(event.level.String())[0], event.msg)
  106. fileLogger.LogEvent(&event)
  107. fileLogger.Flush()
  108. logData, err = ioutil.ReadFile(filename)
  109. assert.NoError(t, err)
  110. assert.Equal(t, expected, string(logData))
  111. // Should fail to rotate
  112. expected += fmt.Sprintf("%s%s %s:%d:%s [%c] %s\n", prefix, dateString, event.filename, event.line, event.caller, strings.ToUpper(event.level.String())[0], event.msg)
  113. fileLogger.LogEvent(&event)
  114. fileLogger.Flush()
  115. logData, err = ioutil.ReadFile(filename)
  116. assert.NoError(t, err)
  117. assert.Equal(t, expected, string(logData))
  118. fileLogger.Close()
  119. }
  120. func TestCompressFileLogger(t *testing.T) {
  121. tmpDir, err := ioutil.TempDir("", "TestFileLogger")
  122. assert.NoError(t, err)
  123. defer os.RemoveAll(tmpDir)
  124. prefix := "TestPrefix "
  125. level := INFO
  126. flags := LstdFlags | LUTC | Lfuncname
  127. filename := filepath.Join(tmpDir, "test.log")
  128. fileLogger := NewFileLogger()
  129. realFileLogger, ok := fileLogger.(*FileLogger)
  130. assert.Equal(t, true, ok)
  131. location, _ := time.LoadLocation("EST")
  132. date := time.Date(2019, time.January, 13, 22, 3, 30, 15, location)
  133. dateString := date.UTC().Format("2006/01/02 15:04:05")
  134. event := Event{
  135. level: INFO,
  136. msg: "TEST MSG",
  137. caller: "CALLER",
  138. filename: "FULL/FILENAME",
  139. line: 1,
  140. time: date,
  141. }
  142. expected := fmt.Sprintf("%s%s %s:%d:%s [%c] %s\n", prefix, dateString, event.filename, event.line, event.caller, strings.ToUpper(event.level.String())[0], event.msg)
  143. fileLogger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"filename\":\"%s\",\"maxsize\":%d,\"compress\":true}", prefix, level.String(), flags, filepath.ToSlash(filename), len(expected)*2))
  144. fileLogger.LogEvent(&event)
  145. fileLogger.Flush()
  146. logData, err := ioutil.ReadFile(filename)
  147. assert.NoError(t, err)
  148. assert.Equal(t, expected, string(logData))
  149. event.level = WARN
  150. expected += fmt.Sprintf("%s%s %s:%d:%s [%c] %s\n", prefix, dateString, event.filename, event.line, event.caller, strings.ToUpper(event.level.String())[0], event.msg)
  151. fileLogger.LogEvent(&event)
  152. fileLogger.Flush()
  153. logData, err = ioutil.ReadFile(filename)
  154. assert.NoError(t, err)
  155. assert.Equal(t, expected, string(logData))
  156. // Should rotate
  157. fileLogger.LogEvent(&event)
  158. fileLogger.Flush()
  159. for num := 2; num <= 999; num++ {
  160. file, err := os.OpenFile(filename+fmt.Sprintf(".%s.%03d.gz", time.Now().Format("2006-01-02"), num), os.O_RDONLY|os.O_CREATE, 0666)
  161. assert.NoError(t, err)
  162. file.Close()
  163. }
  164. err = realFileLogger.DoRotate()
  165. assert.Error(t, err)
  166. }
  167. func TestCompressOldFile(t *testing.T) {
  168. tmpDir, err := ioutil.TempDir("", "TestFileLogger")
  169. assert.NoError(t, err)
  170. defer os.RemoveAll(tmpDir)
  171. fname := filepath.Join(tmpDir, "test")
  172. nonGzip := filepath.Join(tmpDir, "test-nonGzip")
  173. f, err := os.OpenFile(fname, os.O_CREATE|os.O_WRONLY, 0660)
  174. assert.NoError(t, err)
  175. ng, err := os.OpenFile(nonGzip, os.O_CREATE|os.O_WRONLY, 0660)
  176. assert.NoError(t, err)
  177. for i := 0; i < 999; i++ {
  178. f.WriteString("This is a test file\n")
  179. ng.WriteString("This is a test file\n")
  180. }
  181. f.Close()
  182. ng.Close()
  183. err = compressOldLogFile(fname, -1)
  184. assert.NoError(t, err)
  185. _, err = os.Lstat(fname + ".gz")
  186. assert.NoError(t, err)
  187. f, err = os.Open(fname + ".gz")
  188. assert.NoError(t, err)
  189. zr, err := gzip.NewReader(f)
  190. assert.NoError(t, err)
  191. data, err := ioutil.ReadAll(zr)
  192. assert.NoError(t, err)
  193. original, err := ioutil.ReadFile(nonGzip)
  194. assert.NoError(t, err)
  195. assert.Equal(t, original, data)
  196. }