diff --git a/clientv3/client_test.go b/clientv3/client_test.go index 1133375eb..2b2b6d593 100644 --- a/clientv3/client_test.go +++ b/clientv3/client_test.go @@ -16,6 +16,7 @@ package clientv3 import ( "fmt" + "net" "testing" "time" @@ -25,6 +26,47 @@ import ( "google.golang.org/grpc" ) +func TestDialCancel(t *testing.T) { + defer testutil.AfterTest(t) + + // accept first connection so client is created with dial timeout + ln, err := net.Listen("unix", "dialcancel:12345") + if err != nil { + t.Fatal(err) + } + defer ln.Close() + + ep := "unix://dialcancel:12345" + cfg := Config{ + Endpoints: []string{ep}, + DialTimeout: 30 * time.Second} + c, err := New(cfg) + if err != nil { + t.Fatal(err) + } + + // connect to ipv4 blackhole so dial blocks + c.SetEndpoints("http://254.0.0.1:12345") + + // issue Get to force redial attempts + go c.Get(context.TODO(), "abc") + + // wait a little bit so client close is after dial starts + time.Sleep(100 * time.Millisecond) + + donec := make(chan struct{}) + go func() { + defer close(donec) + c.Close() + }() + + select { + case <-time.After(5 * time.Second): + t.Fatalf("failed to close") + case <-donec: + } +} + func TestDialTimeout(t *testing.T) { defer testutil.AfterTest(t)