diff --git a/etcd/leasedkv_test.go b/etcd/leasedkv_test.go index 5d8a9444f..0366d7dd2 100644 --- a/etcd/leasedkv_test.go +++ b/etcd/leasedkv_test.go @@ -3,7 +3,8 @@ package etcd import ( "context" - "errors" + "fmt" + "net" "os" "testing" "time" @@ -11,16 +12,48 @@ import ( "github.com/molecula/featurebase/v2/disco" "github.com/molecula/featurebase/v2/logger" "github.com/molecula/featurebase/v2/testhook" + "github.com/pkg/errors" "go.etcd.io/etcd/embed" "go.etcd.io/etcd/etcdserver/api/v3client" + "go.etcd.io/etcd/pkg/types" ) const initVal = "test" const newVal = "newValue" +// listenerWithURL builds a TCP listener and corresponding http://localhost:%d +// URL, and returns those. Identical to the copy in /test, except we can't +// import that because it imports us. +func listenerWithURL() (listener *net.TCPListener, url string, err error) { + l, err := net.Listen("tcp", ":0") + if err != nil { + return listener, url, err + } + listener = l.(*net.TCPListener) + port := listener.Addr().(*net.TCPAddr).Port + url = fmt.Sprintf("http://localhost:%d", port) + return listener, url, err +} + func TestLeasedKv(t *testing.T) { cfg := embed.NewConfig() + clientListener, clientURL, err := listenerWithURL() + if err != nil { + t.Fatal(errors.Wrap(err, "creating client listener")) + } + peerListener, peerURL, err := listenerWithURL() + if err != nil { + t.Fatal(errors.Wrap(err, "creating peer listener")) + } + cfg.LPUrls = types.MustNewURLs([]string{peerURL}) + cfg.LPeerSocket = []*net.TCPListener{peerListener} + cfg.APUrls = types.MustNewURLs([]string{peerURL}) + cfg.LCUrls = types.MustNewURLs([]string{clientURL}) + cfg.LClientSocket = []*net.TCPListener{clientListener} + cfg.ACUrls = types.MustNewURLs([]string{clientURL}) + cfg.InitialCluster = cfg.Name + "=" + peerURL + dir, err := testhook.TempDir(t, "leasedkv-*") if err != nil { t.Fatal(err)