diff options
Diffstat (limited to 'vendor/gopkg.in/olivere/elastic.v5/client_test.go')
-rw-r--r-- | vendor/gopkg.in/olivere/elastic.v5/client_test.go | 143 |
1 files changed, 142 insertions, 1 deletions
diff --git a/vendor/gopkg.in/olivere/elastic.v5/client_test.go b/vendor/gopkg.in/olivere/elastic.v5/client_test.go index 46aa42619..a6fe011e9 100644 --- a/vendor/gopkg.in/olivere/elastic.v5/client_test.go +++ b/vendor/gopkg.in/olivere/elastic.v5/client_test.go @@ -11,11 +11,15 @@ import ( "errors" "fmt" "log" + "net" "net/http" + "reflect" "regexp" "strings" "testing" "time" + + "github.com/fortytw2/leaktest" ) func findConn(s string, slice ...*conn) (int, bool) { @@ -279,6 +283,74 @@ func TestClientHealthcheckStartupTimeout(t *testing.T) { } } +func TestClientHealthcheckTimeoutLeak(t *testing.T) { + // This test test checks if healthcheck requests are canceled + // after timeout. + // It contains couple of hacks which won't be needed once we + // stop supporting Go1.7. + // On Go1.7 it uses server side effects to monitor if connection + // was closed, + // and on Go 1.8+ we're additionally honestly monitoring routine + // leaks via leaktest. + mux := http.NewServeMux() + + var reqDone bool + mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + cn, ok := w.(http.CloseNotifier) + if !ok { + t.Fatalf("Writer is not CloseNotifier, but %v", reflect.TypeOf(w).Name()) + } + <-cn.CloseNotify() + reqDone = true + }) + + lis, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatalf("Couldn't setup listener: %v", err) + } + addr := lis.Addr().String() + + srv := &http.Server{ + Handler: mux, + } + go srv.Serve(lis) + + cli := &Client{ + c: &http.Client{}, + conns: []*conn{ + &conn{ + url: "http://" + addr + "/", + }, + }, + } + + type closer interface { + Shutdown(context.Context) error + } + + // pre-Go1.8 Server can't Shutdown + cl, isServerCloseable := (interface{}(srv)).(closer) + + // Since Go1.7 can't Shutdown() - there will be leak from server + // Monitor leaks on Go 1.8+ + if isServerCloseable { + defer leaktest.CheckTimeout(t, time.Second*10)() + } + + cli.healthcheck(time.Millisecond*500, true) + + if isServerCloseable { + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + cl.Shutdown(ctx) + } + + <-time.After(time.Second) + if !reqDone { + t.Fatal("Request wasn't canceled or stopped") + } +} + // -- NewSimpleClient -- func TestSimpleClientDefaults(t *testing.T) { @@ -415,7 +487,7 @@ func TestClientSniffNode(t *testing.T) { } ch := make(chan []*conn) - go func() { ch <- client.sniffNode(DefaultURL) }() + go func() { ch <- client.sniffNode(context.Background(), DefaultURL) }() select { case nodes := <-ch: @@ -469,6 +541,75 @@ func TestClientSniffOnDefaultURL(t *testing.T) { } } +func TestClientSniffTimeoutLeak(t *testing.T) { + // This test test checks if sniff requests are canceled + // after timeout. + // It contains couple of hacks which won't be needed once we + // stop supporting Go1.7. + // On Go1.7 it uses server side effects to monitor if connection + // was closed, + // and on Go 1.8+ we're additionally honestly monitoring routine + // leaks via leaktest. + mux := http.NewServeMux() + + var reqDone bool + mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + cn, ok := w.(http.CloseNotifier) + if !ok { + t.Fatalf("Writer is not CloseNotifier, but %v", reflect.TypeOf(w).Name()) + } + <-cn.CloseNotify() + reqDone = true + }) + + lis, err := net.Listen("tcp", "127.0.0.1:0") + if err != nil { + t.Fatalf("Couldn't setup listener: %v", err) + } + addr := lis.Addr().String() + + srv := &http.Server{ + Handler: mux, + } + go srv.Serve(lis) + + cli := &Client{ + c: &http.Client{}, + conns: []*conn{ + &conn{ + url: "http://" + addr + "/", + }, + }, + snifferEnabled: true, + } + + type closer interface { + Shutdown(context.Context) error + } + + // pre-Go1.8 Server can't Shutdown + cl, isServerCloseable := (interface{}(srv)).(closer) + + // Since Go1.7 can't Shutdown() - there will be leak from server + // Monitor leaks on Go 1.8+ + if isServerCloseable { + defer leaktest.CheckTimeout(t, time.Second*10)() + } + + cli.sniff(time.Millisecond * 500) + + if isServerCloseable { + ctx, cancel := context.WithTimeout(context.Background(), time.Second) + defer cancel() + cl.Shutdown(ctx) + } + + <-time.After(time.Second) + if !reqDone { + t.Fatal("Request wasn't canceled or stopped") + } +} + func TestClientExtractHostname(t *testing.T) { tests := []struct { Scheme string |