diff --git a/sdk/testutil/free_port.go b/sdk/testutil/free_port.go new file mode 100644 index 000000000..c4d999c7c --- /dev/null +++ b/sdk/testutil/free_port.go @@ -0,0 +1,21 @@ +package testutil + +import ( + "net" + "testing" + + "github.com/stretchr/testify/require" +) + +// TestFreePort just returns an available free localhost port +func TestFreePort(t *testing.T) int { + t.Helper() + require := require.New(t) + addr, err := net.ResolveTCPAddr("tcp", "localhost:0") + require.NoError(err) + + l, err := net.ListenTCP("tcp", addr) + require.NoError(err) + defer l.Close() + return l.Addr().(*net.TCPAddr).Port +} diff --git a/sdk/testutil/free_port_test.go b/sdk/testutil/free_port_test.go new file mode 100644 index 000000000..fd625b9b8 --- /dev/null +++ b/sdk/testutil/free_port_test.go @@ -0,0 +1,25 @@ +package testutil + +import ( + "fmt" + "net" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func Test_TestFreePort(t *testing.T) { + t.Parallel() + t.Run("simple-validation", func(t *testing.T) { + assert, require := assert.New(t), require.New(t) + p := TestFreePort(t) + assert.NotEmpty(p) + + addr, err := net.ResolveTCPAddr("tcp", fmt.Sprintf("localhost:%d", p)) + require.NoError(err) + l, err := net.ListenTCP("tcp", addr) + require.NoError(err) + defer l.Close() + }) +}