mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-31 10:13:14 -04:00 
			
		
		
		
	* plugin/forward: add HealthChecker interface Make the HealthChecker interface and morph the current DNS health checker into that interface. Remove all whole bunch of method on Forward that didn't make sense. This is done in preparation of adding a DoH client to forward - which requires a completely different healthcheck implementation (and more, but lets start here) Signed-off-by: Miek Gieben <miek@miek.nl> * Use protocol Signed-off-by: Miek Gieben <miek@miek.nl> * Dial doesnt need to be method an Forward either Signed-off-by: Miek Gieben <miek@miek.nl> * Address comments Address various comments on the PR. Signed-off-by: Miek Gieben <miek@miek.nl>
		
			
				
	
	
		
			162 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			162 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package forward
 | |
| 
 | |
| import (
 | |
| 	"testing"
 | |
| 	"time"
 | |
| 
 | |
| 	"github.com/coredns/coredns/plugin/pkg/dnstest"
 | |
| 
 | |
| 	"github.com/miekg/dns"
 | |
| )
 | |
| 
 | |
| func TestCached(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()
 | |
| 
 | |
| 	tr := newTransport(s.Addr)
 | |
| 	tr.Start()
 | |
| 	defer tr.Stop()
 | |
| 
 | |
| 	c1, cache1, _ := tr.Dial("udp")
 | |
| 	c2, cache2, _ := tr.Dial("udp")
 | |
| 
 | |
| 	if cache1 || cache2 {
 | |
| 		t.Errorf("Expected non-cached connection")
 | |
| 	}
 | |
| 
 | |
| 	tr.Yield(c1)
 | |
| 	tr.Yield(c2)
 | |
| 	c3, cached3, _ := tr.Dial("udp")
 | |
| 	if !cached3 {
 | |
| 		t.Error("Expected cached connection (c3)")
 | |
| 	}
 | |
| 	if c2 != c3 {
 | |
| 		t.Error("Expected c2 == c3")
 | |
| 	}
 | |
| 
 | |
| 	tr.Yield(c3)
 | |
| 
 | |
| 	// dial another protocol
 | |
| 	c4, cached4, _ := tr.Dial("tcp")
 | |
| 	if cached4 {
 | |
| 		t.Errorf("Expected non-cached connection (c4)")
 | |
| 	}
 | |
| 	tr.Yield(c4)
 | |
| }
 | |
| 
 | |
| func TestCleanupByTimer(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()
 | |
| 
 | |
| 	tr := newTransport(s.Addr)
 | |
| 	tr.SetExpire(100 * time.Millisecond)
 | |
| 	tr.Start()
 | |
| 	defer tr.Stop()
 | |
| 
 | |
| 	c1, _, _ := tr.Dial("udp")
 | |
| 	c2, _, _ := tr.Dial("udp")
 | |
| 	tr.Yield(c1)
 | |
| 	time.Sleep(10 * time.Millisecond)
 | |
| 	tr.Yield(c2)
 | |
| 
 | |
| 	time.Sleep(120 * time.Millisecond)
 | |
| 	c3, cached, _ := tr.Dial("udp")
 | |
| 	if cached {
 | |
| 		t.Error("Expected non-cached connection (c3)")
 | |
| 	}
 | |
| 	tr.Yield(c3)
 | |
| 
 | |
| 	time.Sleep(120 * time.Millisecond)
 | |
| 	c4, cached, _ := tr.Dial("udp")
 | |
| 	if cached {
 | |
| 		t.Error("Expected non-cached connection (c4)")
 | |
| 	}
 | |
| 	tr.Yield(c4)
 | |
| }
 | |
| 
 | |
| func TestPartialCleanup(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()
 | |
| 
 | |
| 	tr := newTransport(s.Addr)
 | |
| 	tr.SetExpire(100 * time.Millisecond)
 | |
| 	tr.Start()
 | |
| 	defer tr.Stop()
 | |
| 
 | |
| 	c1, _, _ := tr.Dial("udp")
 | |
| 	c2, _, _ := tr.Dial("udp")
 | |
| 	c3, _, _ := tr.Dial("udp")
 | |
| 	c4, _, _ := tr.Dial("udp")
 | |
| 	c5, _, _ := tr.Dial("udp")
 | |
| 
 | |
| 	tr.Yield(c1)
 | |
| 	time.Sleep(10 * time.Millisecond)
 | |
| 	tr.Yield(c2)
 | |
| 	time.Sleep(10 * time.Millisecond)
 | |
| 	tr.Yield(c3)
 | |
| 	time.Sleep(50 * time.Millisecond)
 | |
| 	tr.Yield(c4)
 | |
| 	time.Sleep(10 * time.Millisecond)
 | |
| 	tr.Yield(c5)
 | |
| 	time.Sleep(40 * time.Millisecond)
 | |
| 
 | |
| 	c6, _, _ := tr.Dial("udp")
 | |
| 	if c6 != c5 {
 | |
| 		t.Errorf("Expected c6 == c5")
 | |
| 	}
 | |
| 	c7, _, _ := tr.Dial("udp")
 | |
| 	if c7 != c4 {
 | |
| 		t.Errorf("Expected c7 == c4")
 | |
| 	}
 | |
| 	c8, cached, _ := tr.Dial("udp")
 | |
| 	if cached {
 | |
| 		t.Error("Expected non-cached connection (c8)")
 | |
| 	}
 | |
| 
 | |
| 	tr.Yield(c6)
 | |
| 	tr.Yield(c7)
 | |
| 	tr.Yield(c8)
 | |
| }
 | |
| 
 | |
| func TestCleanupAll(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()
 | |
| 
 | |
| 	tr := newTransport(s.Addr)
 | |
| 
 | |
| 	c1, _ := dns.DialTimeout("udp", tr.addr, defaultDialTimeout)
 | |
| 	c2, _ := dns.DialTimeout("udp", tr.addr, defaultDialTimeout)
 | |
| 	c3, _ := dns.DialTimeout("udp", tr.addr, defaultDialTimeout)
 | |
| 
 | |
| 	tr.conns["udp"] = []*persistConn{
 | |
| 		{c1, time.Now()},
 | |
| 		{c2, time.Now()},
 | |
| 		{c3, time.Now()},
 | |
| 	}
 | |
| 
 | |
| 	if tr.len() != 3 {
 | |
| 		t.Error("Expected 3 connections")
 | |
| 	}
 | |
| 	tr.cleanup(true)
 | |
| 
 | |
| 	if tr.len() > 0 {
 | |
| 		t.Error("Expected no cached connections")
 | |
| 	}
 | |
| }
 |