mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-08-27 13:25:23 +02:00
* Implementation for calculating language statistics Impement saving code language statistics to database Implement rendering langauge stats Add primary laguage to show in repository list Implement repository stats indexer queue Add indexer test Refactor to use queue module * Do not timeout for queues
152 lines
3.2 KiB
Go
152 lines
3.2 KiB
Go
// Copyright 2019 The Gitea Authors. All rights reserved.
|
|
// Use of this source code is governed by a MIT-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package integrations
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"fmt"
|
|
"os"
|
|
"runtime"
|
|
"strings"
|
|
"sync"
|
|
"testing"
|
|
|
|
"code.gitea.io/gitea/modules/log"
|
|
"code.gitea.io/gitea/modules/queue"
|
|
)
|
|
|
|
var prefix string
|
|
|
|
// TestLogger is a logger which will write to the testing log
|
|
type TestLogger struct {
|
|
log.WriterLogger
|
|
}
|
|
|
|
var writerCloser = &testLoggerWriterCloser{}
|
|
|
|
type testLoggerWriterCloser struct {
|
|
sync.RWMutex
|
|
t []*testing.TB
|
|
}
|
|
|
|
func (w *testLoggerWriterCloser) setT(t *testing.TB) {
|
|
w.Lock()
|
|
w.t = append(w.t, t)
|
|
w.Unlock()
|
|
}
|
|
|
|
func (w *testLoggerWriterCloser) Write(p []byte) (int, error) {
|
|
w.RLock()
|
|
var t *testing.TB
|
|
if len(w.t) > 0 {
|
|
t = w.t[len(w.t)-1]
|
|
}
|
|
w.RUnlock()
|
|
if t != nil && *t != nil {
|
|
if len(p) > 0 && p[len(p)-1] == '\n' {
|
|
p = p[:len(p)-1]
|
|
}
|
|
|
|
defer func() {
|
|
err := recover()
|
|
if err == nil {
|
|
return
|
|
}
|
|
var errString string
|
|
errErr, ok := err.(error)
|
|
if ok {
|
|
errString = errErr.Error()
|
|
} else {
|
|
errString, ok = err.(string)
|
|
}
|
|
if !ok {
|
|
panic(err)
|
|
}
|
|
if !strings.HasPrefix(errString, "Log in goroutine after ") {
|
|
panic(err)
|
|
}
|
|
}()
|
|
|
|
(*t).Log(string(p))
|
|
return len(p), nil
|
|
}
|
|
return len(p), nil
|
|
}
|
|
|
|
func (w *testLoggerWriterCloser) Close() error {
|
|
w.Lock()
|
|
if len(w.t) > 0 {
|
|
w.t = w.t[:len(w.t)-1]
|
|
}
|
|
w.Unlock()
|
|
return nil
|
|
}
|
|
|
|
// PrintCurrentTest prints the current test to os.Stdout
|
|
func PrintCurrentTest(t testing.TB, skip ...int) func() {
|
|
actualSkip := 1
|
|
if len(skip) > 0 {
|
|
actualSkip = skip[0]
|
|
}
|
|
_, filename, line, _ := runtime.Caller(actualSkip)
|
|
|
|
if log.CanColorStdout {
|
|
fmt.Fprintf(os.Stdout, "=== %s (%s:%d)\n", fmt.Formatter(log.NewColoredValue(t.Name())), strings.TrimPrefix(filename, prefix), line)
|
|
} else {
|
|
fmt.Fprintf(os.Stdout, "=== %s (%s:%d)\n", t.Name(), strings.TrimPrefix(filename, prefix), line)
|
|
}
|
|
writerCloser.setT(&t)
|
|
return func() {
|
|
if err := queue.GetManager().FlushAll(context.Background(), -1); err != nil {
|
|
t.Errorf("Flushing queues failed with error %v", err)
|
|
}
|
|
_ = writerCloser.Close()
|
|
}
|
|
}
|
|
|
|
// Printf takes a format and args and prints the string to os.Stdout
|
|
func Printf(format string, args ...interface{}) {
|
|
if log.CanColorStdout {
|
|
for i := 0; i < len(args); i++ {
|
|
args[i] = log.NewColoredValue(args[i])
|
|
}
|
|
}
|
|
fmt.Fprintf(os.Stdout, "\t"+format, args...)
|
|
}
|
|
|
|
// NewTestLogger creates a TestLogger as a log.LoggerProvider
|
|
func NewTestLogger() log.LoggerProvider {
|
|
logger := &TestLogger{}
|
|
logger.Colorize = log.CanColorStdout
|
|
logger.Level = log.TRACE
|
|
return logger
|
|
}
|
|
|
|
// Init inits connection writer with json config.
|
|
// json config only need key "level".
|
|
func (log *TestLogger) Init(config string) error {
|
|
err := json.Unmarshal([]byte(config), log)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
log.NewWriterLogger(writerCloser)
|
|
return nil
|
|
}
|
|
|
|
// Flush when log should be flushed
|
|
func (log *TestLogger) Flush() {
|
|
}
|
|
|
|
// GetName returns the default name for this implementation
|
|
func (log *TestLogger) GetName() string {
|
|
return "test"
|
|
}
|
|
|
|
func init() {
|
|
log.Register("test", NewTestLogger)
|
|
_, filename, _, _ := runtime.Caller(0)
|
|
prefix = strings.TrimSuffix(filename, "integrations/testlogger.go")
|
|
}
|