1
// Copyright 2023 The Gitea Authors. All rights reserved.
2
// SPDX-License-Identifier: MIT
12
"github.com/stretchr/testify/assert"
15
type dummyWriter struct {
24
func (d *dummyWriter) Write(p []byte) (n int, err error) {
30
d.logs = append(d.logs, string(p))
34
func (d *dummyWriter) Close() error {
38
func (d *dummyWriter) GetLogs() []string {
41
logs := make([]string, len(d.logs))
46
func newDummyWriter(name string, level Level, delay time.Duration) *dummyWriter {
48
EventWriterBaseImpl: NewEventWriterBase(name, "dummy", WriterMode{Level: level, Flags: FlagsFromBits(0)}),
51
w.Base().OutputWriteCloser = w
55
func TestLogger(t *testing.T) {
56
logger := NewLoggerWithWriters(context.Background(), "test")
58
dump := logger.DumpWriters()
59
assert.EqualValues(t, 0, len(dump))
60
assert.EqualValues(t, NONE, logger.GetLevel())
61
assert.False(t, logger.IsEnabled())
63
w1 := newDummyWriter("dummy-1", DEBUG, 0)
65
assert.EqualValues(t, DEBUG, logger.GetLevel())
67
w2 := newDummyWriter("dummy-2", WARN, 200*time.Millisecond)
69
assert.EqualValues(t, DEBUG, logger.GetLevel())
71
dump = logger.DumpWriters()
72
assert.EqualValues(t, 2, len(dump))
74
logger.Trace("trace-level") // this level is not logged
75
logger.Debug("debug-level")
76
logger.Error("error-level")
78
// w2 is slow, so only w1 has logs
79
time.Sleep(100 * time.Millisecond)
80
assert.Equal(t, []string{"debug-level\n", "error-level\n"}, w1.GetLogs())
81
assert.Equal(t, []string{}, w2.GetLogs())
85
// after Close, all logs are flushed
86
assert.Equal(t, []string{"debug-level\n", "error-level\n"}, w1.GetLogs())
87
assert.Equal(t, []string{"error-level\n"}, w2.GetLogs())
90
func TestLoggerPause(t *testing.T) {
91
logger := NewLoggerWithWriters(context.Background(), "test")
93
w1 := newDummyWriter("dummy-1", DEBUG, 0)
96
GetManager().PauseAll()
97
time.Sleep(50 * time.Millisecond)
99
logger.Info("info-level")
100
time.Sleep(100 * time.Millisecond)
101
assert.Equal(t, []string{}, w1.GetLogs())
103
GetManager().ResumeAll()
105
time.Sleep(100 * time.Millisecond)
106
assert.Equal(t, []string{"info-level\n"}, w1.GetLogs())
111
type testLogString struct {
115
func (t testLogString) LogString() string {
119
func TestLoggerLogString(t *testing.T) {
120
logger := NewLoggerWithWriters(context.Background(), "test")
122
w1 := newDummyWriter("dummy-1", DEBUG, 0)
123
w1.Mode.Colorize = true
124
logger.AddWriters(w1)
126
logger.Info("%s %s %#v %v", testLogString{}, &testLogString{}, testLogString{Field: "detail"}, NewColoredValue(testLogString{}, FgRed))
129
assert.Equal(t, []string{"log-string log-string log.testLogString{Field:\"detail\"} \x1b[31mlog-string\x1b[0m\n"}, w1.GetLogs())
132
func TestLoggerExpressionFilter(t *testing.T) {
133
logger := NewLoggerWithWriters(context.Background(), "test")
135
w1 := newDummyWriter("dummy-1", DEBUG, 0)
136
w1.Mode.Expression = "foo.*"
137
logger.AddWriters(w1)
141
logger.Info("foo bar")
142
logger.SendLogEvent(&Event{Level: INFO, Filename: "foo.go", MsgSimpleText: "by filename"})
145
assert.Equal(t, []string{"foo\n", "foo bar\n", "by filename\n"}, w1.GetLogs())