mirror of
https://github.com/prometheus/prometheus.git
synced 2025-02-21 03:16:00 -08:00
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
This commit is contained in:
commit
20bf32b9d5
|
@ -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…
Reference in a new issue