mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-10-31 14:31:02 +00:00 
			
		
		
		
	- Massive replacement of changing `code.gitea.io/gitea` to `forgejo.org`. - Resolves forgejo/discussions#258 Reviewed-on: https://codeberg.org/forgejo/forgejo/pulls/7337 Reviewed-by: Earl Warren <earl-warren@noreply.codeberg.org> Reviewed-by: Michael Kriese <michael.kriese@gmx.de> Reviewed-by: Beowulf <beowulf@beocode.eu> Reviewed-by: Panagiotis "Ivory" Vasilopoulos <git@n0toose.net> Co-authored-by: Gusted <postmaster@gusted.xyz> Co-committed-by: Gusted <postmaster@gusted.xyz>
		
			
				
	
	
		
			107 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			107 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2023 The Gitea Authors. All rights reserved.
 | |
| // SPDX-License-Identifier: MIT
 | |
| 
 | |
| package test
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"fmt"
 | |
| 	"strings"
 | |
| 	"sync"
 | |
| 	"sync/atomic"
 | |
| 	"time"
 | |
| 
 | |
| 	"forgejo.org/modules/log"
 | |
| )
 | |
| 
 | |
| type LogChecker struct {
 | |
| 	*log.EventWriterBaseImpl
 | |
| 
 | |
| 	filterMessages []string
 | |
| 	filtered       []bool
 | |
| 
 | |
| 	stopMark string
 | |
| 	stopped  bool
 | |
| 
 | |
| 	mu sync.Mutex
 | |
| }
 | |
| 
 | |
| func (lc *LogChecker) Run(ctx context.Context) {
 | |
| 	for {
 | |
| 		select {
 | |
| 		case <-ctx.Done():
 | |
| 			return
 | |
| 		case event, ok := <-lc.Queue:
 | |
| 			if !ok {
 | |
| 				return
 | |
| 			}
 | |
| 			lc.checkLogEvent(event)
 | |
| 		}
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func (lc *LogChecker) checkLogEvent(event *log.EventFormatted) {
 | |
| 	lc.mu.Lock()
 | |
| 	defer lc.mu.Unlock()
 | |
| 	for i, msg := range lc.filterMessages {
 | |
| 		if strings.Contains(event.Origin.MsgSimpleText, msg) {
 | |
| 			lc.filtered[i] = true
 | |
| 		}
 | |
| 	}
 | |
| 	if strings.Contains(event.Origin.MsgSimpleText, lc.stopMark) {
 | |
| 		lc.stopped = true
 | |
| 	}
 | |
| }
 | |
| 
 | |
| var checkerIndex int64
 | |
| 
 | |
| func NewLogChecker(namePrefix string, level log.Level) (logChecker *LogChecker, cancel func()) {
 | |
| 	logger := log.GetManager().GetLogger(namePrefix)
 | |
| 	newCheckerIndex := atomic.AddInt64(&checkerIndex, 1)
 | |
| 	writerName := namePrefix + "-" + fmt.Sprint(newCheckerIndex)
 | |
| 
 | |
| 	lc := &LogChecker{}
 | |
| 	lc.EventWriterBaseImpl = log.NewEventWriterBase(writerName, "test-log-checker", log.WriterMode{
 | |
| 		Level: level,
 | |
| 	})
 | |
| 	logger.AddWriters(lc)
 | |
| 	return lc, func() { _ = logger.RemoveWriter(writerName) }
 | |
| }
 | |
| 
 | |
| // 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)
 | |
| 	}
 | |
| }
 |