github.com/angryronald/go-kit@v0.0.0-20240505173814-ff2bd9c79dbf/test/docker/docker.utils.go (about)

     1  package docker
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  	"sync"
     7  	"time"
     8  )
     9  
    10  var lock sync.Mutex
    11  
    12  func nextPort(port *int) int {
    13  	lock.Lock()
    14  	*port = *port + 1
    15  
    16  	defer lock.Unlock()
    17  	return *port
    18  }
    19  
    20  func isOpen(port string) bool {
    21  	timeout := time.Second
    22  	conn, err := net.DialTimeout("tcp", net.JoinHostPort("", port), timeout)
    23  	if err != nil {
    24  		return true
    25  	}
    26  	if conn != nil {
    27  		defer conn.Close()
    28  		return false
    29  	}
    30  	return false
    31  }
    32  
    33  func GetAvailablePort(defaultPort int) string {
    34  	if isOpen(fmt.Sprint(defaultPort)) {
    35  		return fmt.Sprint(defaultPort)
    36  	}
    37  	for {
    38  		p := fmt.Sprintf("%d", nextPort(&defaultPort))
    39  		if isOpen(p) {
    40  			return p
    41  		}
    42  	}
    43  }