logos-messaging-go-bindings/waku/nwaku_test_utils.go

109 lines
2.2 KiB
Go

package waku
import (
"encoding/json"
"fmt"
"io"
"net/http"
"os"
"strconv"
"time"
"github.com/cenkalti/backoff/v3"
"github.com/sirupsen/logrus"
"go.uber.org/zap"
"golang.org/x/exp/rand"
)
type NwakuInfo struct {
ListenAddresses []string `json:"listenAddresses"`
EnrUri string `json:"enrUri"`
}
func logrusToZap(log *logrus.Logger) *zap.Logger {
config := zap.NewDevelopmentConfig()
config.EncoderConfig.TimeKey = "" // Remove timestamp duplication
config.Level = zap.NewAtomicLevelAt(zap.DebugLevel)
zapLogger, _ := config.Build()
return zapLogger
}
func GenerateUniquePort() int {
rng := rand.New(rand.NewSource(uint64(time.Now().UnixNano()))) // Local RNG instance
for {
port := rng.Intn(MaxPort-MinPort+1) + MinPort
portsMutex.Lock()
if !usedPorts[port] {
usedPorts[port] = true
portsMutex.Unlock()
return port
}
portsMutex.Unlock()
}
}
func GetNwakuInfo(host *string, port *int) (NwakuInfo, error) {
nwakuRestPort := 8645
if port != nil {
nwakuRestPort = *port
}
envNwakuRestPort := os.Getenv("NWAKU_REST_PORT")
if envNwakuRestPort != "" {
v, err := strconv.Atoi(envNwakuRestPort)
if err != nil {
return NwakuInfo{}, err
}
nwakuRestPort = v
}
nwakuRestHost := "localhost"
if host != nil {
nwakuRestHost = *host
}
envNwakuRestHost := os.Getenv("NWAKU_REST_HOST")
if envNwakuRestHost != "" {
nwakuRestHost = envNwakuRestHost
}
resp, err := http.Get(fmt.Sprintf("http://%s:%d/debug/v1/info", nwakuRestHost, nwakuRestPort))
if err != nil {
return NwakuInfo{}, err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return NwakuInfo{}, err
}
var data NwakuInfo
err = json.Unmarshal(body, &data)
if err != nil {
return NwakuInfo{}, err
}
return data, nil
}
type BackOffOption func(*backoff.ExponentialBackOff)
func RetryWithBackOff(o func() error, options ...BackOffOption) error {
b := backoff.ExponentialBackOff{
InitialInterval: time.Millisecond * 100,
RandomizationFactor: 0.1,
Multiplier: 1,
MaxInterval: time.Second,
MaxElapsedTime: time.Second * 10,
Clock: backoff.SystemClock,
}
for _, option := range options {
option(&b)
}
b.Reset()
return backoff.Retry(o, &b)
}