aboutsummaryrefslogtreecommitdiff
path: root/plugin/forward/proxy_test.go
diff options
context:
space:
mode:
authorGravatar Ruslan Drozhdzh <30860269+rdrozhdzh@users.noreply.github.com> 2018-04-20 17:47:46 +0300
committerGravatar GitHub <noreply@github.com> 2018-04-20 17:47:46 +0300
commit135377bf776295d8ef86081c1ef581e7b41d26f0 (patch)
treee09807cdfedfb7b8a6181ad660c42dd6ea0d1f78 /plugin/forward/proxy_test.go
parentad13d88346d3e4686d92df20efb65af8f97dd7e1 (diff)
downloadcoredns-135377bf776295d8ef86081c1ef581e7b41d26f0.tar.gz
coredns-135377bf776295d8ef86081c1ef581e7b41d26f0.tar.zst
coredns-135377bf776295d8ef86081c1ef581e7b41d26f0.zip
plugin/forward: gracefull stop (#1701)
* plugin/forward: gracefull stop - stop connection manager only when no queries in progress * minor improvement * prevent healthcheck on stopped proxy * revert closing channels * use standard context
Diffstat (limited to 'plugin/forward/proxy_test.go')
-rw-r--r--plugin/forward/proxy_test.go65
1 files changed, 65 insertions, 0 deletions
diff --git a/plugin/forward/proxy_test.go b/plugin/forward/proxy_test.go
new file mode 100644
index 000000000..8c53f3150
--- /dev/null
+++ b/plugin/forward/proxy_test.go
@@ -0,0 +1,65 @@
+package forward
+
+import (
+ "context"
+ "sync"
+ "testing"
+
+ "github.com/coredns/coredns/plugin/pkg/dnstest"
+ "github.com/coredns/coredns/plugin/test"
+ "github.com/coredns/coredns/request"
+
+ "github.com/miekg/dns"
+)
+
+func TestProxyClose(t *testing.T) {
+ s := dnstest.NewServer(func(w dns.ResponseWriter, r *dns.Msg) {
+ ret := new(dns.Msg)
+ ret.SetReply(r)
+ w.WriteMsg(ret)
+ })
+ defer s.Close()
+
+ req := new(dns.Msg)
+ req.SetQuestion("example.org.", dns.TypeA)
+ state := request.Request{W: &test.ResponseWriter{}, Req: req}
+ ctx := context.TODO()
+
+ repeatCnt := 1000
+ for repeatCnt > 0 {
+ repeatCnt--
+ p := NewProxy(s.Addr, nil /* no TLS */)
+ p.start(hcDuration)
+
+ var wg sync.WaitGroup
+ wg.Add(5)
+ go func() {
+ p.connect(ctx, state, false, false)
+ wg.Done()
+ }()
+ go func() {
+ p.connect(ctx, state, true, false)
+ wg.Done()
+ }()
+ go func() {
+ p.close()
+ wg.Done()
+ }()
+ go func() {
+ p.connect(ctx, state, false, false)
+ wg.Done()
+ }()
+ go func() {
+ p.connect(ctx, state, true, false)
+ wg.Done()
+ }()
+ wg.Wait()
+
+ if p.inProgress != 0 {
+ t.Errorf("unexpected query in progress")
+ }
+ if p.state != stopped {
+ t.Errorf("unexpected proxy state, expected %d, got %d", stopped, p.state)
+ }
+ }
+}