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  }