From 9ec95e4fa87ab26e3f752f133c9724950eb3bac0 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 7 Oct 2014 16:29:58 +0100 Subject: [PATCH] Unit test --- server/mdns_client_test.go | 109 +++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 server/mdns_client_test.go diff --git a/server/mdns_client_test.go b/server/mdns_client_test.go new file mode 100644 index 00000000..7201152b --- /dev/null +++ b/server/mdns_client_test.go @@ -0,0 +1,109 @@ +package weavedns + +import ( + "github.com/miekg/dns" + "log" + "net" + "testing" + "time" +) + +var ( + test_addr = net.ParseIP("9.8.7.6") + sendconn *net.UDPConn + sendAddr = &net.UDPAddr{ + IP: net.ParseIP(ipv4mdns), + Port: 0, + } +) + +func minimalServer(w dns.ResponseWriter, req *dns.Msg) { + //log.Println("minimalServer received:", req) + if len(req.Answer) > 0 { + return // Only interested in questions. + } + + m := new(dns.Msg) + m.SetReply(req) + + hdr := dns.RR_Header{Name: m.Question[0].Name, Rrtype: dns.TypeA, + Class: dns.ClassINET, Ttl: 3600} + a := &dns.A{hdr, test_addr} + m.Answer = append(m.Answer, a) + + buf, err := m.Pack() + if err != nil { + log.Fatal(err) + } + if buf == nil { + log.Fatal("Nil buffer") + } + //log.Println("minimalServer sending:", buf) + _, err = sendconn.WriteTo(buf, ipv4Addr) + if err != nil { + log.Fatal(err) + } +} + +func RunLocalMulticastServer() error { + mux := dns.NewServeMux() + mux.HandleFunc("weave", minimalServer) + multicast, err := net.ListenMulticastUDP("udp", nil, ipv4Addr) + if err != nil { + return err + } + go dns.ActivateAndServe(nil, multicast, mux) + return nil +} + +func TestSimpleQuery(t *testing.T) { + log.Println("TestSimpleQuery starting") + mdnsClient, err := NewMDNSClient() + if err != nil { + t.Fatal(err) + } + mdnsClient.Start() + mux := dns.NewServeMux() + + handleMDNS := func(w dns.ResponseWriter, r *dns.Msg) { + //log.Println("test received:", r) + // Only handle responses here + if len(r.Answer) > 0 { + mdnsClient.ResponseCallback(r) + } + } + + mux.HandleFunc("weave", handleMDNS) + multicast, err := net.ListenMulticastUDP("udp", nil, ipv4Addr) + if err != nil { + t.Fatal(err) + } + go dns.ActivateAndServe(nil, multicast, mux) + sendconn, err = net.ListenUDP("udp", sendAddr) + if err != nil { + t.Fatal(err) + } + + err = RunLocalMulticastServer() + if err != nil { + t.Fatalf("Unable to run test server: %s", err) + } + + var received_addr net.IP + + channel := make(chan *ResponseA, 4) + go func() { + for resp := range channel { + log.Printf("Got address response %s addr %s", resp.Name, resp.Addr) + received_addr = resp.Addr + } + }() + mdnsClient.SendQuery("test.weave.", dns.TypeA, channel) + + time.Sleep(1 * time.Second) + + if !received_addr.Equal(test_addr) { + t.Log("Unexpected result for test.weave", received_addr) + t.Fail() + } +}