mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 05:11:41 +01:00 
			
		
		
		
	enable mirror, usestdlibbars and perfsprint part of: https://github.com/go-gitea/gitea/issues/34083 --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
		
			
				
	
	
		
			106 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			106 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Copyright 2023 The Gitea Authors. All rights reserved.
 | |
| // SPDX-License-Identifier: MIT
 | |
| 
 | |
| package test
 | |
| 
 | |
| import (
 | |
| 	"context"
 | |
| 	"strconv"
 | |
| 	"strings"
 | |
| 	"sync"
 | |
| 	"sync/atomic"
 | |
| 	"time"
 | |
| 
 | |
| 	"code.gitea.io/gitea/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) (logChecker *LogChecker, cancel func()) {
 | |
| 	logger := log.GetManager().GetLogger(namePrefix)
 | |
| 	newCheckerIndex := atomic.AddInt64(&checkerIndex, 1)
 | |
| 	writerName := namePrefix + "-" + strconv.FormatInt(newCheckerIndex, 10)
 | |
| 
 | |
| 	lc := &LogChecker{}
 | |
| 	lc.EventWriterBaseImpl = log.NewEventWriterBase(writerName, "test-log-checker", log.WriterMode{})
 | |
| 	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)
 | |
| 	}
 | |
| }
 |