summaryrefslogtreecommitdiffstats
path: root/vendor/gopkg.in/olivere/elastic.v5/client_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gopkg.in/olivere/elastic.v5/client_test.go')
-rw-r--r--vendor/gopkg.in/olivere/elastic.v5/client_test.go143
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