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}