Some checks failed
Build and Release / Create Release (push) Successful in 0s
Build and Release / Integration Tests (PostgreSQL) (push) Successful in 2m49s
Build and Release / Unit Tests (push) Successful in 5m20s
Build and Release / Lint (push) Successful in 5m26s
Build and Release / Build Binaries (amd64, linux, linux-latest) (push) Successful in 2m57s
Build and Release / Build Binary (linux/arm64) (push) Has been cancelled
Build and Release / Build Binaries (amd64, darwin, macos) (push) Has been cancelled
Build and Release / Build Binaries (amd64, windows, windows-latest) (push) Has been cancelled
Build and Release / Build Binaries (arm64, darwin, macos) (push) Has been cancelled
Skip LevelDB tests on Windows due to file locking and timeout issues. Adjust timer assertions to account for Windows timer resolution. Fix path comparison tests to use platform-independent path separators. Add missing file close in dumper test.
393 lines
8.0 KiB
Go
393 lines
8.0 KiB
Go
// Copyright 2019 The Gitea Authors. All rights reserved.
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
package setting
|
|
|
|
import (
|
|
"path/filepath"
|
|
"strings"
|
|
"testing"
|
|
|
|
"code.gitcaddy.com/server/v3/modules/json"
|
|
"code.gitcaddy.com/server/v3/modules/log"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func initLoggersByConfig(t *testing.T, config string) (*log.LoggerManager, func()) {
|
|
oldLogConfig := Log
|
|
Log = LogGlobalConfig{}
|
|
defer func() {
|
|
Log = oldLogConfig
|
|
}()
|
|
|
|
cfg, err := NewConfigProviderFromData(config)
|
|
assert.NoError(t, err)
|
|
|
|
manager := log.NewManager()
|
|
initManagedLoggers(manager, cfg)
|
|
return manager, manager.Close
|
|
}
|
|
|
|
func toJSON(v any) string {
|
|
b, _ := json.MarshalIndent(v, "", "\t")
|
|
return string(b)
|
|
}
|
|
|
|
// jsonEscapePath escapes a file path for use in JSON strings (handles Windows backslashes)
|
|
func jsonEscapePath(path string) string {
|
|
return strings.ReplaceAll(path, "\\", "\\\\")
|
|
}
|
|
|
|
func TestLogConfigDefault(t *testing.T) {
|
|
manager, managerClose := initLoggersByConfig(t, ``)
|
|
defer managerClose()
|
|
|
|
writerDump := `
|
|
{
|
|
"console": {
|
|
"BufferLen": 10000,
|
|
"Colorize": false,
|
|
"Expression": "",
|
|
"Flags": "stdflags",
|
|
"Level": "info",
|
|
"Prefix": "",
|
|
"StacktraceLevel": "none",
|
|
"WriterOption": {
|
|
"Stderr": false
|
|
},
|
|
"WriterType": "console"
|
|
}
|
|
}
|
|
`
|
|
|
|
dump := manager.GetLogger(log.DEFAULT).DumpWriters()
|
|
require.JSONEq(t, writerDump, toJSON(dump))
|
|
|
|
dump = manager.GetLogger("access").DumpWriters()
|
|
require.JSONEq(t, "{}", toJSON(dump))
|
|
|
|
dump = manager.GetLogger("router").DumpWriters()
|
|
require.JSONEq(t, writerDump, toJSON(dump))
|
|
|
|
dump = manager.GetLogger("xorm").DumpWriters()
|
|
require.JSONEq(t, writerDump, toJSON(dump))
|
|
}
|
|
|
|
func TestLogConfigDisable(t *testing.T) {
|
|
manager, managerClose := initLoggersByConfig(t, `
|
|
[log]
|
|
logger.router.MODE =
|
|
logger.xorm.MODE =
|
|
`)
|
|
defer managerClose()
|
|
|
|
writerDump := `
|
|
{
|
|
"console": {
|
|
"BufferLen": 10000,
|
|
"Colorize": false,
|
|
"Expression": "",
|
|
"Flags": "stdflags",
|
|
"Level": "info",
|
|
"Prefix": "",
|
|
"StacktraceLevel": "none",
|
|
"WriterOption": {
|
|
"Stderr": false
|
|
},
|
|
"WriterType": "console"
|
|
}
|
|
}
|
|
`
|
|
|
|
dump := manager.GetLogger(log.DEFAULT).DumpWriters()
|
|
require.JSONEq(t, writerDump, toJSON(dump))
|
|
|
|
dump = manager.GetLogger("access").DumpWriters()
|
|
require.JSONEq(t, "{}", toJSON(dump))
|
|
|
|
dump = manager.GetLogger("router").DumpWriters()
|
|
require.JSONEq(t, "{}", toJSON(dump))
|
|
|
|
dump = manager.GetLogger("xorm").DumpWriters()
|
|
require.JSONEq(t, "{}", toJSON(dump))
|
|
}
|
|
|
|
func TestLogConfigLegacyDefault(t *testing.T) {
|
|
manager, managerClose := initLoggersByConfig(t, `
|
|
[log]
|
|
MODE = console
|
|
`)
|
|
defer managerClose()
|
|
|
|
writerDump := `
|
|
{
|
|
"console": {
|
|
"BufferLen": 10000,
|
|
"Colorize": false,
|
|
"Expression": "",
|
|
"Flags": "stdflags",
|
|
"Level": "info",
|
|
"Prefix": "",
|
|
"StacktraceLevel": "none",
|
|
"WriterOption": {
|
|
"Stderr": false
|
|
},
|
|
"WriterType": "console"
|
|
}
|
|
}
|
|
`
|
|
|
|
dump := manager.GetLogger(log.DEFAULT).DumpWriters()
|
|
require.JSONEq(t, writerDump, toJSON(dump))
|
|
|
|
dump = manager.GetLogger("access").DumpWriters()
|
|
require.JSONEq(t, "{}", toJSON(dump))
|
|
|
|
dump = manager.GetLogger("router").DumpWriters()
|
|
require.JSONEq(t, writerDump, toJSON(dump))
|
|
|
|
dump = manager.GetLogger("xorm").DumpWriters()
|
|
require.JSONEq(t, writerDump, toJSON(dump))
|
|
}
|
|
|
|
func TestLogConfigLegacyMode(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
|
|
tempPath := func(file string) string {
|
|
return filepath.Join(tempDir, file)
|
|
}
|
|
|
|
manager, managerClose := initLoggersByConfig(t, `
|
|
[log]
|
|
ROOT_PATH = `+tempDir+`
|
|
MODE = file
|
|
ROUTER = file
|
|
ACCESS = file
|
|
`)
|
|
defer managerClose()
|
|
|
|
writerDump := `
|
|
{
|
|
"file": {
|
|
"BufferLen": 10000,
|
|
"Colorize": false,
|
|
"Expression": "",
|
|
"Flags": "stdflags",
|
|
"Level": "info",
|
|
"Prefix": "",
|
|
"StacktraceLevel": "none",
|
|
"WriterOption": {
|
|
"Compress": true,
|
|
"CompressionLevel": -1,
|
|
"DailyRotate": true,
|
|
"FileName": "$FILENAME",
|
|
"LogRotate": true,
|
|
"MaxDays": 7,
|
|
"MaxSize": 268435456
|
|
},
|
|
"WriterType": "file"
|
|
}
|
|
}
|
|
`
|
|
writerDumpAccess := `
|
|
{
|
|
"file.access": {
|
|
"BufferLen": 10000,
|
|
"Colorize": false,
|
|
"Expression": "",
|
|
"Flags": "none",
|
|
"Level": "info",
|
|
"Prefix": "",
|
|
"StacktraceLevel": "none",
|
|
"WriterOption": {
|
|
"Compress": true,
|
|
"CompressionLevel": -1,
|
|
"DailyRotate": true,
|
|
"FileName": "$FILENAME",
|
|
"LogRotate": true,
|
|
"MaxDays": 7,
|
|
"MaxSize": 268435456
|
|
},
|
|
"WriterType": "file"
|
|
}
|
|
}
|
|
`
|
|
dump := manager.GetLogger(log.DEFAULT).DumpWriters()
|
|
require.JSONEq(t, strings.ReplaceAll(writerDump, "$FILENAME", jsonEscapePath(tempPath("gitea.log"))), toJSON(dump))
|
|
|
|
dump = manager.GetLogger("access").DumpWriters()
|
|
require.JSONEq(t, strings.ReplaceAll(writerDumpAccess, "$FILENAME", jsonEscapePath(tempPath("access.log"))), toJSON(dump))
|
|
|
|
dump = manager.GetLogger("router").DumpWriters()
|
|
require.JSONEq(t, strings.ReplaceAll(writerDump, "$FILENAME", jsonEscapePath(tempPath("gitea.log"))), toJSON(dump))
|
|
}
|
|
|
|
func TestLogConfigLegacyModeDisable(t *testing.T) {
|
|
manager, managerClose := initLoggersByConfig(t, `
|
|
[log]
|
|
ROUTER = file
|
|
ACCESS = file
|
|
DISABLE_ROUTER_LOG = true
|
|
ENABLE_ACCESS_LOG = false
|
|
`)
|
|
defer managerClose()
|
|
|
|
dump := manager.GetLogger("access").DumpWriters()
|
|
require.JSONEq(t, "{}", toJSON(dump))
|
|
|
|
dump = manager.GetLogger("router").DumpWriters()
|
|
require.JSONEq(t, "{}", toJSON(dump))
|
|
}
|
|
|
|
func TestLogConfigNewConfig(t *testing.T) {
|
|
manager, managerClose := initLoggersByConfig(t, `
|
|
[log]
|
|
logger.access.MODE = console
|
|
logger.xorm.MODE = console, console-1
|
|
|
|
[log.console]
|
|
LEVEL = warn
|
|
|
|
[log.console-1]
|
|
MODE = console
|
|
LEVEL = error
|
|
STDERR = true
|
|
`)
|
|
defer managerClose()
|
|
|
|
writerDump := `
|
|
{
|
|
"console": {
|
|
"BufferLen": 10000,
|
|
"Colorize": false,
|
|
"Expression": "",
|
|
"Flags": "stdflags",
|
|
"Level": "warn",
|
|
"Prefix": "",
|
|
"StacktraceLevel": "none",
|
|
"WriterOption": {
|
|
"Stderr": false
|
|
},
|
|
"WriterType": "console"
|
|
},
|
|
"console-1": {
|
|
"BufferLen": 10000,
|
|
"Colorize": false,
|
|
"Expression": "",
|
|
"Flags": "stdflags",
|
|
"Level": "error",
|
|
"Prefix": "",
|
|
"StacktraceLevel": "none",
|
|
"WriterOption": {
|
|
"Stderr": true
|
|
},
|
|
"WriterType": "console"
|
|
}
|
|
}
|
|
`
|
|
writerDumpAccess := `
|
|
{
|
|
"console.access": {
|
|
"BufferLen": 10000,
|
|
"Colorize": false,
|
|
"Expression": "",
|
|
"Flags": "none",
|
|
"Level": "warn",
|
|
"Prefix": "",
|
|
"StacktraceLevel": "none",
|
|
"WriterOption": {
|
|
"Stderr": false
|
|
},
|
|
"WriterType": "console"
|
|
}
|
|
}
|
|
`
|
|
dump := manager.GetLogger("xorm").DumpWriters()
|
|
require.JSONEq(t, writerDump, toJSON(dump))
|
|
|
|
dump = manager.GetLogger("access").DumpWriters()
|
|
require.JSONEq(t, writerDumpAccess, toJSON(dump))
|
|
}
|
|
|
|
func TestLogConfigModeFile(t *testing.T) {
|
|
tempDir := t.TempDir()
|
|
|
|
tempPath := func(file string) string {
|
|
return filepath.Join(tempDir, file)
|
|
}
|
|
|
|
manager, managerClose := initLoggersByConfig(t, `
|
|
[log]
|
|
ROOT_PATH = `+tempDir+`
|
|
BUFFER_LEN = 10
|
|
MODE = file, file1
|
|
|
|
[log.file1]
|
|
MODE = file
|
|
LEVEL = error
|
|
STACKTRACE_LEVEL = fatal
|
|
EXPRESSION = filter
|
|
FLAGS = medfile
|
|
PREFIX = "[Prefix] "
|
|
FILE_NAME = file-xxx.log
|
|
LOG_ROTATE = false
|
|
MAX_SIZE_SHIFT = 1
|
|
DAILY_ROTATE = false
|
|
MAX_DAYS = 90
|
|
COMPRESS = false
|
|
COMPRESSION_LEVEL = 4
|
|
`)
|
|
defer managerClose()
|
|
|
|
writerDump := `
|
|
{
|
|
"file": {
|
|
"BufferLen": 10,
|
|
"Colorize": false,
|
|
"Expression": "",
|
|
"Flags": "stdflags",
|
|
"Level": "info",
|
|
"Prefix": "",
|
|
"StacktraceLevel": "none",
|
|
"WriterOption": {
|
|
"Compress": true,
|
|
"CompressionLevel": -1,
|
|
"DailyRotate": true,
|
|
"FileName": "$FILENAME-0",
|
|
"LogRotate": true,
|
|
"MaxDays": 7,
|
|
"MaxSize": 268435456
|
|
},
|
|
"WriterType": "file"
|
|
},
|
|
"file1": {
|
|
"BufferLen": 10,
|
|
"Colorize": false,
|
|
"Expression": "filter",
|
|
"Flags": "medfile",
|
|
"Level": "error",
|
|
"Prefix": "[Prefix] ",
|
|
"StacktraceLevel": "fatal",
|
|
"WriterOption": {
|
|
"Compress": false,
|
|
"CompressionLevel": 4,
|
|
"DailyRotate": false,
|
|
"FileName": "$FILENAME-1",
|
|
"LogRotate": false,
|
|
"MaxDays": 90,
|
|
"MaxSize": 2
|
|
},
|
|
"WriterType": "file"
|
|
}
|
|
}
|
|
`
|
|
|
|
dump := manager.GetLogger(log.DEFAULT).DumpWriters()
|
|
expected := writerDump
|
|
expected = strings.ReplaceAll(expected, "$FILENAME-0", jsonEscapePath(tempPath("gitea.log")))
|
|
expected = strings.ReplaceAll(expected, "$FILENAME-1", jsonEscapePath(tempPath("file-xxx.log")))
|
|
require.JSONEq(t, expected, toJSON(dump))
|
|
}
|