From ac2c5ab4dbaf8dc3027c02ad46f6b7781db79d64 Mon Sep 17 00:00:00 2001 From: Alberto Bertogli Date: Sat, 30 Nov 2019 11:34:14 +0000 Subject: [PATCH] test: Add testlib.GetFreePort function Some tests require picking ports, and today resort to hard-coding, which is brittle. This patch adds a testlib.GetFreePort function to help pick free ports. It is not totally race-free, but is much better than hard-coding. --- internal/testlib/testlib.go | 12 ++++++++++++ internal/testlib/testlib_test.go | 7 +++++++ 2 files changed, 19 insertions(+) diff --git a/internal/testlib/testlib.go b/internal/testlib/testlib.go index 34299fe..d2bde57 100644 --- a/internal/testlib/testlib.go +++ b/internal/testlib/testlib.go @@ -3,6 +3,7 @@ package testlib import ( "io/ioutil" + "net" "os" "strings" "testing" @@ -52,3 +53,14 @@ func Rewrite(t *testing.T, path, contents string) error { return err } + +// GetFreePort returns a free TCP port. This is hacky and not race-free, but +// it works well enough for testing purposes. +func GetFreePort() string { + l, err := net.Listen("tcp", "localhost:0") + if err != nil { + panic(err) + } + defer l.Close() + return l.Addr().String() +} diff --git a/internal/testlib/testlib_test.go b/internal/testlib/testlib_test.go index 71b84ef..10c90eb 100644 --- a/internal/testlib/testlib_test.go +++ b/internal/testlib/testlib_test.go @@ -76,3 +76,10 @@ func TestRewrite(t *testing.T) { t.Errorf("basic rewrite failed") } } + +func TestGetFreePort(t *testing.T) { + p := GetFreePort() + if p == "" { + t.Errorf("failed to get free port") + } +}