Add a mutex and used ports list to the random port generator

to avoid port collisions

Signed-off-by: Jorge Alberto Díaz Orozco <diazorozcoj@gmail.com>
This commit is contained in:
Jorge Alberto Díaz Orozco 2024-10-02 13:37:10 +02:00 committed by Jorge Alberto Díaz Orozco
parent e99e7ca9cf
commit 06945b3933
No known key found for this signature in database
GPG key ID: 2FEC0DC5013F5D64

View file

@ -15,21 +15,56 @@ package testutil
import (
"net"
"sync"
"testing"
)
var (
mu sync.Mutex
usedPorts []int
)
// RandomUnprivilegedPort returns valid unprivileged random port number which can be used for testing.
func RandomUnprivilegedPort(t *testing.T) int {
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")
if err != nil {
t.Fatalf("Listening on random port: %v", err)
return 0, err
}
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
}