converge/pkg/testsupport/utils.go

76 lines
1.5 KiB
Go

package testsupport
import (
"context"
"git.wamblee.org/converge/pkg/support/pprof"
"github.com/stretchr/testify/suite"
"log"
"net/http"
"os"
_ "runtime/pprof"
"sync"
"time"
)
type TestFunction func() any
func RunAndWait(suite *suite.Suite, functions ...TestFunction) []any {
wg := sync.WaitGroup{}
wg.Add(len(functions))
res := make([]any, len(functions))
for i, function := range functions {
go func() {
defer func() {
wg.Done()
}()
res[i] = function()
}()
}
wg.Wait()
return res
}
func StartPprof(port string) *http.Server {
if os.Getenv("PPROF") == "" {
return nil
}
if port == "" {
port = ":9000"
}
mux := http.NewServeMux()
pprof.RegisterPprof(mux, "/debug/pprof")
srv := http.Server{
Addr: port,
Handler: mux,
}
go func() {
if err := srv.ListenAndServe(); err != http.ErrServerClosed {
log.Fatalf("Could not start pprof listener: %v", err)
}
log.Println("Test pprof server started: " + port)
}()
return &srv
}
func StopPprof(ctx context.Context, server *http.Server) {
if os.Getenv("PPROF") == "" {
return
}
err := server.Shutdown(ctx)
if err != nil {
log.Println("Error shutting down test pprof server")
return
}
log.Println("Test pprof server stopped")
}
func CreateTestContext(ctx context.Context, timeout time.Duration) (context.Context, context.CancelFunc) {
ctx, cancelFunc := context.WithCancel(ctx)
ctx, timeoutCancelFunc := context.WithTimeout(ctx, timeout)
compositeCancelFunc := func() {
timeoutCancelFunc()
cancelFunc()
}
return ctx, compositeCancelFunc
}