Proposed way of creating no-timeout tests and...
... fix for Server.Shutdown() function.
This commit is contained in:
parent
28dc2fa7be
commit
4b21f37064
22
server.go
22
server.go
|
@ -304,17 +304,27 @@ func (srv *Server) ActivateAndServe() error {
|
||||||
// ActivateAndServe will return. All in progress queries are completed before the server
|
// ActivateAndServe will return. All in progress queries are completed before the server
|
||||||
// is taken down. If the Shutdown was not succesful an error is returned.
|
// is taken down. If the Shutdown was not succesful an error is returned.
|
||||||
func (srv *Server) Shutdown() error {
|
func (srv *Server) Shutdown() error {
|
||||||
// TODO(miek): does this work with socket activation? Double check if we set the
|
// Client sends fake request here to not wait for timeout in readUDP/readTCP loop
|
||||||
// address there. And... is it needed?
|
// and trap to stop event ASAP.
|
||||||
c := new(Client)
|
net, addr := srv.Net, srv.Addr
|
||||||
c.Net = srv.Net
|
|
||||||
switch srv.Net {
|
if srv.Listener != nil {
|
||||||
|
a := srv.Listener.Addr()
|
||||||
|
net, addr = a.Network(), a.String()
|
||||||
|
} else if srv.PacketConn != nil {
|
||||||
|
a := srv.PacketConn.LocalAddr()
|
||||||
|
net, addr = a.Network(), a.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
switch net {
|
||||||
case "tcp", "tcp4", "tcp6":
|
case "tcp", "tcp4", "tcp6":
|
||||||
go func() { srv.stopTCP <- true }()
|
go func() { srv.stopTCP <- true }()
|
||||||
case "udp", "udp4", "udp6":
|
case "udp", "udp4", "udp6":
|
||||||
go func() { srv.stopUDP <- true }()
|
go func() { srv.stopUDP <- true }()
|
||||||
}
|
}
|
||||||
c.Exchange(new(Msg), srv.Addr)
|
c := &Client{Net: net}
|
||||||
|
c.Exchange(new(Msg), addr)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -31,21 +31,33 @@ func AnotherHelloServer(w ResponseWriter, req *Msg) {
|
||||||
w.WriteMsg(m)
|
w.WriteMsg(m)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RunLocalUDPServer() (*Server, string, error) {
|
||||||
|
pc, err := net.ListenPacket("udp", "127.0.0.1:0")
|
||||||
|
if err != nil {
|
||||||
|
return nil, "", err
|
||||||
|
}
|
||||||
|
server := &Server{PacketConn: pc}
|
||||||
|
go func() {
|
||||||
|
server.ActivateAndServe()
|
||||||
|
pc.Close()
|
||||||
|
}()
|
||||||
|
return server, pc.LocalAddr().String(), nil
|
||||||
|
}
|
||||||
|
|
||||||
func TestServing(t *testing.T) {
|
func TestServing(t *testing.T) {
|
||||||
HandleFunc("miek.nl.", HelloServer)
|
HandleFunc("miek.nl.", HelloServer)
|
||||||
HandleFunc("example.com.", AnotherHelloServer)
|
HandleFunc("example.com.", AnotherHelloServer)
|
||||||
go func() {
|
|
||||||
err := ListenAndServe(":8053", "udp", nil)
|
s, addrstr, err := RunLocalUDPServer()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Log("ListenAndServe: ", err.Error())
|
t.Fatalf("Unable to run test server on port 8053: %s", err)
|
||||||
t.Fatal()
|
}
|
||||||
}
|
defer s.Shutdown()
|
||||||
}()
|
|
||||||
time.Sleep(4e8)
|
|
||||||
c := new(Client)
|
c := new(Client)
|
||||||
m := new(Msg)
|
m := new(Msg)
|
||||||
m.SetQuestion("miek.nl.", TypeTXT)
|
m.SetQuestion("miek.nl.", TypeTXT)
|
||||||
r, _, err := c.Exchange(m, "127.0.0.1:8053")
|
r, _, err := c.Exchange(m, addrstr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Log("failed to exchange miek.nl", err)
|
t.Log("failed to exchange miek.nl", err)
|
||||||
t.Fatal()
|
t.Fatal()
|
||||||
|
@ -57,7 +69,7 @@ func TestServing(t *testing.T) {
|
||||||
}
|
}
|
||||||
|
|
||||||
m.SetQuestion("example.com.", TypeTXT)
|
m.SetQuestion("example.com.", TypeTXT)
|
||||||
r, _, err = c.Exchange(m, "127.0.0.1:8053")
|
r, _, err = c.Exchange(m, addrstr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Log("failed to exchange example.com", err)
|
t.Log("failed to exchange example.com", err)
|
||||||
t.Fatal()
|
t.Fatal()
|
||||||
|
@ -70,7 +82,7 @@ func TestServing(t *testing.T) {
|
||||||
|
|
||||||
// Test Mixes cased as noticed by Ask.
|
// Test Mixes cased as noticed by Ask.
|
||||||
m.SetQuestion("eXaMplE.cOm.", TypeTXT)
|
m.SetQuestion("eXaMplE.cOm.", TypeTXT)
|
||||||
r, _, err = c.Exchange(m, "127.0.0.1:8053")
|
r, _, err = c.Exchange(m, addrstr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Log("failed to exchange eXaMplE.cOm", err)
|
t.Log("failed to exchange eXaMplE.cOm", err)
|
||||||
t.Fail()
|
t.Fail()
|
||||||
|
|
Loading…
Reference in New Issue