Browse Source

Merge pull request #15074 from jadolg/synchronized-RandomUnprivilegedPort

Add a mutex and used ports list to the tests random port generator to avoid port collisions
pull/15027/merge
Julius Volz 2 months ago committed by GitHub
parent
commit
20bf32b9d5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 41
      util/testutil/port.go

41
util/testutil/port.go

@ -15,21 +15,56 @@ package testutil
import ( import (
"net" "net"
"sync"
"testing" "testing"
) )
var (
mu sync.Mutex
usedPorts []int
)
// RandomUnprivilegedPort returns valid unprivileged random port number which can be used for testing. // RandomUnprivilegedPort returns valid unprivileged random port number which can be used for testing.
func RandomUnprivilegedPort(t *testing.T) int { func RandomUnprivilegedPort(t *testing.T) int {
t.Helper() t.Helper()
mu.Lock()
defer mu.Unlock()
port, err := getPort()
if err != nil {
t.Fatal(err)
}
for portWasUsed(port) {
port, err = getPort()
if err != nil {
t.Fatal(err)
}
}
usedPorts = append(usedPorts, port)
return port
}
func portWasUsed(port int) bool {
for _, usedPort := range usedPorts {
if port == usedPort {
return true
}
}
return false
}
func getPort() (int, error) {
listener, err := net.Listen("tcp", ":0") listener, err := net.Listen("tcp", ":0")
if err != nil { if err != nil {
t.Fatalf("Listening on random port: %v", err) return 0, err
} }
if err := listener.Close(); err != nil { if err := listener.Close(); err != nil {
t.Fatalf("Closing listener: %v", err) return 0, err
} }
return listener.Addr().(*net.TCPAddr).Port return listener.Addr().(*net.TCPAddr).Port, nil
} }

Loading…
Cancel
Save