mirror of
https://github.com/ipfs/kubo.git
synced 2026-02-22 02:47:48 +08:00
This is the slowest test in the sharness test suite, because it has very long sleeps. It usually takes 2+ minutes to run. This new impl runs all peering tests in about 20 seconds, since it polls for conditions instead of sleeping, and runs the tests in parallel. This also has an additional test case for a peer that was never online and then connects.
92 lines
1.9 KiB
Go
92 lines
1.9 KiB
Go
package testutils
|
|
|
|
import (
|
|
"bufio"
|
|
"fmt"
|
|
"net"
|
|
"net/netip"
|
|
"net/url"
|
|
"strings"
|
|
"sync"
|
|
|
|
"github.com/multiformats/go-multiaddr"
|
|
manet "github.com/multiformats/go-multiaddr/net"
|
|
)
|
|
|
|
// StrCat takes a bunch of strings or string slices
|
|
// and concats them all together into one string slice.
|
|
// If an arg is not one of those types, this panics.
|
|
// If an arg is an empty string, it is dropped.
|
|
func StrCat(args ...interface{}) []string {
|
|
res := make([]string, 0)
|
|
for _, a := range args {
|
|
if s, ok := a.(string); ok {
|
|
if s != "" {
|
|
res = append(res, s)
|
|
}
|
|
continue
|
|
}
|
|
if ss, ok := a.([]string); ok {
|
|
for _, s := range ss {
|
|
if s != "" {
|
|
res = append(res, s)
|
|
}
|
|
}
|
|
continue
|
|
}
|
|
panic(fmt.Sprintf("arg '%v' must be a string or string slice, but is '%T'", a, a))
|
|
}
|
|
return res
|
|
}
|
|
|
|
// PreviewStr returns a preview of s, which is a prefix for logging that avoids dumping a huge string to logs.
|
|
func PreviewStr(s string) string {
|
|
suffix := "..."
|
|
previewLength := 10
|
|
if len(s) < previewLength {
|
|
previewLength = len(s)
|
|
suffix = ""
|
|
}
|
|
return s[0:previewLength] + suffix
|
|
}
|
|
|
|
func SplitLines(s string) []string {
|
|
var lines []string
|
|
scanner := bufio.NewScanner(strings.NewReader(s))
|
|
for scanner.Scan() {
|
|
lines = append(lines, scanner.Text())
|
|
}
|
|
return lines
|
|
}
|
|
|
|
// URLStrToMultiaddr converts a URL string like http://localhost:80 to a multiaddr.
|
|
func URLStrToMultiaddr(u string) multiaddr.Multiaddr {
|
|
parsedURL, err := url.Parse(u)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
addrPort, err := netip.ParseAddrPort(parsedURL.Host)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
tcpAddr := net.TCPAddrFromAddrPort(addrPort)
|
|
ma, err := manet.FromNetAddr(tcpAddr)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
return ma
|
|
}
|
|
|
|
// ForEachPar invokes f in a new goroutine for each element of s and waits for all to complete.
|
|
func ForEachPar[T any](s []T, f func(T)) {
|
|
wg := sync.WaitGroup{}
|
|
wg.Add(len(s))
|
|
for _, x := range s {
|
|
go func(x T) {
|
|
defer wg.Done()
|
|
f(x)
|
|
}(x)
|
|
}
|
|
wg.Wait()
|
|
}
|