mirror of
				https://github.com/coredns/coredns.git
				synced 2025-11-04 03:03:14 -05:00 
			
		
		
		
	
		
			
	
	
		
			92 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			92 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| 
								 | 
							
								package test
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import (
							 | 
						||
| 
								 | 
							
									"net"
							 | 
						||
| 
								 | 
							
									"sync"
							 | 
						||
| 
								 | 
							
									"testing"
							 | 
						||
| 
								 | 
							
									"time"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									_ "github.com/miekg/coredns/core"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									"github.com/mholt/caddy"
							 | 
						||
| 
								 | 
							
									"github.com/miekg/dns"
							 | 
						||
| 
								 | 
							
								)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func TCPServer(t *testing.T, laddr string) (*dns.Server, string, error) {
							 | 
						||
| 
								 | 
							
									l, err := net.Listen("tcp", laddr)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, "", err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									server := &dns.Server{Listener: l, ReadTimeout: time.Hour, WriteTimeout: time.Hour}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									waitLock := sync.Mutex{}
							 | 
						||
| 
								 | 
							
									waitLock.Lock()
							 | 
						||
| 
								 | 
							
									server.NotifyStartedFunc = func() { t.Logf("started TCP server on %s", l.Addr()); waitLock.Unlock() }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									go func() {
							 | 
						||
| 
								 | 
							
										server.ActivateAndServe()
							 | 
						||
| 
								 | 
							
										l.Close()
							 | 
						||
| 
								 | 
							
									}()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									waitLock.Lock()
							 | 
						||
| 
								 | 
							
									return server, l.Addr().String(), nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func UDPServer(t *testing.T, laddr string) (*dns.Server, string, error) {
							 | 
						||
| 
								 | 
							
									pc, err := net.ListenPacket("udp", laddr)
							 | 
						||
| 
								 | 
							
									if err != nil {
							 | 
						||
| 
								 | 
							
										return nil, "", err
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									server := &dns.Server{PacketConn: pc, ReadTimeout: time.Hour, WriteTimeout: time.Hour}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									waitLock := sync.Mutex{}
							 | 
						||
| 
								 | 
							
									waitLock.Lock()
							 | 
						||
| 
								 | 
							
									server.NotifyStartedFunc = func() { t.Logf("started UDP server on %s", pc.LocalAddr()); waitLock.Unlock() }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									go func() {
							 | 
						||
| 
								 | 
							
										server.ActivateAndServe()
							 | 
						||
| 
								 | 
							
										pc.Close()
							 | 
						||
| 
								 | 
							
									}()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									waitLock.Lock()
							 | 
						||
| 
								 | 
							
									return server, pc.LocalAddr().String(), nil
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// CoreDNSServer returns a test server. It just takes a normal Corefile as input.
							 | 
						||
| 
								 | 
							
								func CoreDNSServer(corefile string) (*caddy.Instance, error) { return caddy.Start(NewInput(corefile)) }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// CoreDNSSserverStop stops a server.
							 | 
						||
| 
								 | 
							
								func CoreDNSServerStop(i *caddy.Instance) { i.Stop() }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// CoreDNSServeRPorts returns the ports the instance is listening on. The integer k indicates
							 | 
						||
| 
								 | 
							
								// which ServerListener you want.
							 | 
						||
| 
								 | 
							
								func CoreDNSServerPorts(i *caddy.Instance, k int) (udp, tcp string) {
							 | 
						||
| 
								 | 
							
									srvs := i.Servers()
							 | 
						||
| 
								 | 
							
									if len(srvs) < k+1 {
							 | 
						||
| 
								 | 
							
										return "", ""
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									u := srvs[k].LocalAddr()
							 | 
						||
| 
								 | 
							
									t := srvs[k].Addr()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if u != nil {
							 | 
						||
| 
								 | 
							
										udp = u.String()
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if t != nil {
							 | 
						||
| 
								 | 
							
										tcp = t.String()
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								type Input struct {
							 | 
						||
| 
								 | 
							
									corefile []byte
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func NewInput(corefile string) *Input {
							 | 
						||
| 
								 | 
							
									return &Input{corefile: []byte(corefile)}
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								func (i *Input) Body() []byte       { return i.corefile }
							 | 
						||
| 
								 | 
							
								func (i *Input) Path() string       { return "Corefile" }
							 | 
						||
| 
								 | 
							
								func (i *Input) ServerType() string { return "dns" }
							 |