code.gitea.io/gitea@v1.19.3/modules/log/conn_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 "fmt" 8 "io" 9 "net" 10 "strings" 11 "sync" 12 "testing" 13 "time" 14 15 "github.com/stretchr/testify/assert" 16 ) 17 18 func listenReadAndClose(t *testing.T, l net.Listener, expected string) { 19 conn, err := l.Accept() 20 assert.NoError(t, err) 21 defer conn.Close() 22 written, err := io.ReadAll(conn) 23 24 assert.NoError(t, err) 25 assert.Equal(t, expected, string(written)) 26 } 27 28 func TestConnLogger(t *testing.T) { 29 protocol := "tcp" 30 address := ":3099" 31 32 l, err := net.Listen(protocol, address) 33 if err != nil { 34 t.Fatal(err) 35 } 36 defer l.Close() 37 38 prefix := "TestPrefix " 39 level := INFO 40 flags := LstdFlags | LUTC | Lfuncname 41 42 logger := NewConn() 43 connLogger := logger.(*ConnLogger) 44 45 logger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"reconnectOnMsg\":%t,\"reconnect\":%t,\"net\":\"%s\",\"addr\":\"%s\"}", prefix, level.String(), flags, true, true, protocol, address)) 46 47 assert.Equal(t, flags, connLogger.Flags) 48 assert.Equal(t, level, connLogger.Level) 49 assert.Equal(t, level, logger.GetLevel()) 50 51 location, _ := time.LoadLocation("EST") 52 53 date := time.Date(2019, time.January, 13, 22, 3, 30, 15, location) 54 55 dateString := date.UTC().Format("2006/01/02 15:04:05") 56 57 event := Event{ 58 level: INFO, 59 msg: "TEST MSG", 60 caller: "CALLER", 61 filename: "FULL/FILENAME", 62 line: 1, 63 time: date, 64 } 65 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) 66 var wg sync.WaitGroup 67 wg.Add(2) 68 go func() { 69 defer wg.Done() 70 listenReadAndClose(t, l, expected) 71 }() 72 go func() { 73 defer wg.Done() 74 err := logger.LogEvent(&event) 75 assert.NoError(t, err) 76 }() 77 wg.Wait() 78 79 event.level = WARN 80 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) 81 wg.Add(2) 82 go func() { 83 defer wg.Done() 84 listenReadAndClose(t, l, expected) 85 }() 86 go func() { 87 defer wg.Done() 88 err := logger.LogEvent(&event) 89 assert.NoError(t, err) 90 }() 91 wg.Wait() 92 93 logger.Close() 94 } 95 96 func TestConnLoggerBadConfig(t *testing.T) { 97 logger := NewConn() 98 99 err := logger.Init("{") 100 assert.Error(t, err) 101 assert.Contains(t, err.Error(), "Unable to parse JSON") 102 logger.Close() 103 } 104 105 func TestConnLoggerCloseBeforeSend(t *testing.T) { 106 protocol := "tcp" 107 address := ":3099" 108 109 prefix := "TestPrefix " 110 level := INFO 111 flags := LstdFlags | LUTC | Lfuncname 112 113 logger := NewConn() 114 115 logger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"reconnectOnMsg\":%t,\"reconnect\":%t,\"net\":\"%s\",\"addr\":\"%s\"}", prefix, level.String(), flags, false, false, protocol, address)) 116 logger.Close() 117 } 118 119 func TestConnLoggerFailConnect(t *testing.T) { 120 protocol := "tcp" 121 address := ":3099" 122 123 prefix := "TestPrefix " 124 level := INFO 125 flags := LstdFlags | LUTC | Lfuncname 126 127 logger := NewConn() 128 129 logger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"reconnectOnMsg\":%t,\"reconnect\":%t,\"net\":\"%s\",\"addr\":\"%s\"}", prefix, level.String(), flags, false, false, protocol, address)) 130 131 assert.Equal(t, level, logger.GetLevel()) 132 133 location, _ := time.LoadLocation("EST") 134 135 date := time.Date(2019, time.January, 13, 22, 3, 30, 15, location) 136 137 // dateString := date.UTC().Format("2006/01/02 15:04:05") 138 139 event := Event{ 140 level: INFO, 141 msg: "TEST MSG", 142 caller: "CALLER", 143 filename: "FULL/FILENAME", 144 line: 1, 145 time: date, 146 } 147 148 err := logger.LogEvent(&event) 149 assert.Error(t, err) 150 151 logger.Close() 152 } 153 154 func TestConnLoggerClose(t *testing.T) { 155 protocol := "tcp" 156 address := ":3099" 157 158 l, err := net.Listen(protocol, address) 159 if err != nil { 160 t.Fatal(err) 161 } 162 defer l.Close() 163 164 prefix := "TestPrefix " 165 level := INFO 166 flags := LstdFlags | LUTC | Lfuncname 167 168 logger := NewConn() 169 connLogger := logger.(*ConnLogger) 170 171 logger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"reconnectOnMsg\":%t,\"reconnect\":%t,\"net\":\"%s\",\"addr\":\"%s\"}", prefix, level.String(), flags, false, false, protocol, address)) 172 173 assert.Equal(t, flags, connLogger.Flags) 174 assert.Equal(t, level, connLogger.Level) 175 assert.Equal(t, level, logger.GetLevel()) 176 location, _ := time.LoadLocation("EST") 177 178 date := time.Date(2019, time.January, 13, 22, 3, 30, 15, location) 179 180 dateString := date.UTC().Format("2006/01/02 15:04:05") 181 182 event := Event{ 183 level: INFO, 184 msg: "TEST MSG", 185 caller: "CALLER", 186 filename: "FULL/FILENAME", 187 line: 1, 188 time: date, 189 } 190 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) 191 var wg sync.WaitGroup 192 wg.Add(2) 193 go func() { 194 defer wg.Done() 195 err := logger.LogEvent(&event) 196 assert.NoError(t, err) 197 logger.Close() 198 }() 199 go func() { 200 defer wg.Done() 201 listenReadAndClose(t, l, expected) 202 }() 203 wg.Wait() 204 205 logger = NewConn() 206 connLogger = logger.(*ConnLogger) 207 208 logger.Init(fmt.Sprintf("{\"prefix\":\"%s\",\"level\":\"%s\",\"flags\":%d,\"reconnectOnMsg\":%t,\"reconnect\":%t,\"net\":\"%s\",\"addr\":\"%s\"}", prefix, level.String(), flags, false, true, protocol, address)) 209 210 assert.Equal(t, flags, connLogger.Flags) 211 assert.Equal(t, level, connLogger.Level) 212 assert.Equal(t, level, logger.GetLevel()) 213 214 event.level = WARN 215 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) 216 wg.Add(2) 217 go func() { 218 defer wg.Done() 219 listenReadAndClose(t, l, expected) 220 }() 221 go func() { 222 defer wg.Done() 223 err := logger.LogEvent(&event) 224 assert.NoError(t, err) 225 logger.Close() 226 }() 227 wg.Wait() 228 logger.Flush() 229 logger.Close() 230 }