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