github.com/rudderlabs/rudder-go-kit@v0.30.0/testhelper/freeport.go (about) 1 package testhelper 2 3 import ( 4 "sync" 5 6 "github.com/phayes/freeport" 7 ) 8 9 var ( 10 usedPorts map[int]struct{} 11 usedPortsMu sync.Mutex 12 ) 13 14 func GetFreePort() (int, error) { 15 usedPortsMu.Lock() 16 defer usedPortsMu.Unlock() 17 for { 18 port, err := freeport.GetFreePort() 19 if err != nil { 20 return 0, err 21 } 22 23 if usedPorts == nil { 24 usedPorts = make(map[int]struct{}) 25 } 26 if _, used := usedPorts[port]; used { 27 continue 28 } 29 usedPorts[port] = struct{}{} 30 return port, nil 31 } 32 }