test.go

 1// Package test provides testing utilities.
 2package test
 3
 4import (
 5	"net"
 6	"sync"
 7)
 8
 9var (
10	used = map[int]struct{}{}
11	lock sync.Mutex
12)
13
14// RandomPort returns a random port number.
15// This is mainly used for testing.
16func RandomPort() int {
17	addr, _ := net.Listen("tcp", ":0") //nolint:gosec,noctx
18	_ = addr.Close()
19	port := addr.Addr().(*net.TCPAddr).Port
20	lock.Lock()
21
22	if _, ok := used[port]; ok {
23		lock.Unlock()
24		return RandomPort()
25	}
26
27	used[port] = struct{}{}
28	lock.Unlock()
29	return port
30}