Skip to content

Improve test logger #24235

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Apr 21, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions models/migrations/base/testlogger.go
Original file line number Diff line number Diff line change
Expand Up @@ -165,11 +165,6 @@ func (log *TestLogger) Init(config string) error {
return nil
}

// Content returns the content accumulated in the content provider
func (log *TestLogger) Content() (string, error) {
return "", fmt.Errorf("not supported")
}

// Flush when log should be flushed
func (log *TestLogger) Flush() {
}
Expand Down
71 changes: 0 additions & 71 deletions modules/log/buffer.go

This file was deleted.

63 changes: 0 additions & 63 deletions modules/log/buffer_test.go

This file was deleted.

5 changes: 0 additions & 5 deletions modules/log/conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -118,11 +118,6 @@ func (log *ConnLogger) Init(jsonconfig string) error {
return nil
}

// Content returns the content accumulated in the content provider
func (log *ConnLogger) Content() (string, error) {
return "", fmt.Errorf("not supported")
}

// Flush does nothing for this implementation
func (log *ConnLogger) Flush() {
}
Expand Down
5 changes: 0 additions & 5 deletions modules/log/console.go
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,6 @@ func (log *ConsoleLogger) Init(config string) error {
return nil
}

// Content returns the content accumulated in the content provider
func (log *ConsoleLogger) Content() (string, error) {
return "", fmt.Errorf("not supported")
}

// Flush when log should be flushed
func (log *ConsoleLogger) Flush() {
}
Expand Down
10 changes: 4 additions & 6 deletions modules/log/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -247,12 +247,6 @@ func (m *MultiChannelledLog) GetEventLogger(name string) EventLogger {
return m.loggers[name]
}

// GetEventProvider returns a sub logger provider content from this MultiChannelledLog
func (m *MultiChannelledLog) GetLoggerProviderContent(name string) (string, error) {
channelledLogger := m.GetEventLogger(name).(*ChannelledLog)
return channelledLogger.loggerProvider.Content()
}

// GetEventLoggerNames returns a list of names
func (m *MultiChannelledLog) GetEventLoggerNames() []string {
m.rwmutex.RLock()
Expand Down Expand Up @@ -460,3 +454,7 @@ func (m *MultiChannelledLog) ResetLevel() Level {
func (m *MultiChannelledLog) GetName() string {
return m.name
}

func (e *Event) GetMsg() string {
return e.msg
}
9 changes: 0 additions & 9 deletions modules/log/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -253,15 +253,6 @@ func (log *FileLogger) deleteOldLog() {
})
}

// Content returns the content accumulated in the content provider
func (log *FileLogger) Content() (string, error) {
b, err := os.ReadFile(log.Filename)
if err != nil {
return "", err
}
return string(b), nil
}

// Flush flush file logger.
// there are no buffering messages in file logger in memory.
// flush file means sync file from disk.
Expand Down
1 change: 0 additions & 1 deletion modules/log/provider.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ package log
// LoggerProvider represents behaviors of a logger provider.
type LoggerProvider interface {
Init(config string) error
Content() (string, error)
EventLogger
}

Expand Down
5 changes: 0 additions & 5 deletions modules/log/smtp.go
Original file line number Diff line number Diff line change
Expand Up @@ -95,11 +95,6 @@ func (log *SMTPLogger) sendMail(p []byte) (int, error) {
)
}

// Content returns the content accumulated in the content provider
func (log *SMTPLogger) Content() (string, error) {
return "", fmt.Errorf("not supported")
}

// Flush when log should be flushed
func (log *SMTPLogger) Flush() {
}
Expand Down
116 changes: 116 additions & 0 deletions modules/test/logchecker.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,116 @@
// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

package test

import (
"strconv"
"strings"
"sync"
"sync/atomic"
"time"

"code.gitea.io/gitea/modules/log"
)

type LogChecker struct {
logger *log.MultiChannelledLogger
loggerName string
eventLoggerName string

filterMessages []string
filtered []bool

stopMark string
stopped bool

mu sync.Mutex
}

func (lc *LogChecker) LogEvent(event *log.Event) error {
lc.mu.Lock()
defer lc.mu.Unlock()
for i, msg := range lc.filterMessages {
if strings.Contains(event.GetMsg(), msg) {
lc.filtered[i] = true
}
}
if strings.Contains(event.GetMsg(), lc.stopMark) {
lc.stopped = true
}
return nil
}

func (lc *LogChecker) Close() {}

func (lc *LogChecker) Flush() {}

func (lc *LogChecker) GetLevel() log.Level {
return log.TRACE
}

func (lc *LogChecker) GetStacktraceLevel() log.Level {
return log.NONE
}

func (lc *LogChecker) GetName() string {
return lc.eventLoggerName
}

func (lc *LogChecker) ReleaseReopen() error {
return nil
}

var checkerIndex int64

func NewLogChecker(loggerName string) (logChecker *LogChecker, cancel func()) {
logger := log.GetLogger(loggerName)
newCheckerIndex := atomic.AddInt64(&checkerIndex, 1)
lc := &LogChecker{
logger: logger,
loggerName: loggerName,
eventLoggerName: "TestLogChecker-" + strconv.FormatInt(newCheckerIndex, 10),
}
if err := logger.AddLogger(lc); err != nil {
panic(err) // it's impossible
}
return lc, func() { _, _ = logger.DelLogger(lc.GetName()) }
}

// Filter will make the `Check` function to check if these logs are outputted.
func (lc *LogChecker) Filter(msgs ...string) *LogChecker {
lc.mu.Lock()
defer lc.mu.Unlock()
lc.filterMessages = make([]string, len(msgs))
copy(lc.filterMessages, msgs)
lc.filtered = make([]bool, len(lc.filterMessages))
return lc
}

func (lc *LogChecker) StopMark(msg string) *LogChecker {
lc.mu.Lock()
defer lc.mu.Unlock()
lc.stopMark = msg
lc.stopped = false
return lc
}

// Check returns the filtered slice and whether the stop mark is reached.
func (lc *LogChecker) Check(d time.Duration) (filtered []bool, stopped bool) {
stop := time.Now().Add(d)

for {
lc.mu.Lock()
stopped = lc.stopped
lc.mu.Unlock()

if time.Now().After(stop) || stopped {
lc.mu.Lock()
f := make([]bool, len(lc.filtered))
copy(f, lc.filtered)
lc.mu.Unlock()
return f, stopped
}
time.Sleep(10 * time.Millisecond)
}
}
47 changes: 47 additions & 0 deletions modules/test/logchecker_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
// Copyright 2023 The Gitea Authors. All rights reserved.
// SPDX-License-Identifier: MIT

package test

import (
"testing"
"time"

"code.gitea.io/gitea/modules/log"

"github.com/stretchr/testify/assert"
)

func TestLogChecker(t *testing.T) {
_ = log.NewLogger(1000, "console", "console", `{"level":"info","stacktracelevel":"NONE","stderr":true}`)

lc, cleanup := NewLogChecker(log.DEFAULT)
defer cleanup()

lc.Filter("First", "Third").StopMark("End")
log.Info("test")

filtered, stopped := lc.Check(100 * time.Millisecond)
assert.EqualValues(t, []bool{false, false}, filtered)
assert.EqualValues(t, false, stopped)

log.Info("First")
filtered, stopped = lc.Check(100 * time.Millisecond)
assert.EqualValues(t, []bool{true, false}, filtered)
assert.EqualValues(t, false, stopped)

log.Info("Second")
filtered, stopped = lc.Check(100 * time.Millisecond)
assert.EqualValues(t, []bool{true, false}, filtered)
assert.EqualValues(t, false, stopped)

log.Info("Third")
filtered, stopped = lc.Check(100 * time.Millisecond)
assert.EqualValues(t, []bool{true, true}, filtered)
assert.EqualValues(t, false, stopped)

log.Info("End")
filtered, stopped = lc.Check(100 * time.Millisecond)
assert.EqualValues(t, []bool{true, true}, filtered)
assert.EqualValues(t, true, stopped)
}
Loading