diff --git a/nameserver/mdns_server.go b/nameserver/mdns_server.go index 0516036d..2cca64de 100644 --- a/nameserver/mdns_server.go +++ b/nameserver/mdns_server.go @@ -63,6 +63,7 @@ func (s *MDNSServer) Start(ifi *net.Interface) error { q := &r.Question[0] if q.Qtype == qtype { if m := lookup(r, q); m != nil { + Debug.Printf("Found local answer to mDNS query %s", q.Name) if err = s.sendResponse(m); err != nil { Warning.Printf("Error writing to %s", w) } diff --git a/nameserver/mdns_server_test.go b/nameserver/mdns_server_test.go index 9b1bde54..4319b609 100644 --- a/nameserver/mdns_server_test.go +++ b/nameserver/mdns_server_test.go @@ -11,7 +11,9 @@ import ( var ( containerID = "deadbeef" + testName = "test.weave.local." testAddr1 = "10.0.2.1/24" + testInAddr1 = "1.2.0.10.in-addr.arpa." ) func sendQuery(name string, querytype uint16) error { @@ -31,10 +33,13 @@ func sendQuery(name string, querytype uint16) error { } func TestServerSimpleQuery(t *testing.T) { + // The ff can be handy for debugging (obvs) + //wt.InitDefaultLogging(true) + log.Println("TestServerSimpleQuery starting") var zone = new(ZoneDb) ip, _, _ := net.ParseCIDR(testAddr1) - zone.AddRecord(containerID, "test.weave.local.", ip) + zone.AddRecord(containerID, testName, ip) mdnsServer, err := NewMDNSServer(zone) wt.AssertNoErr(t, err) @@ -42,8 +47,26 @@ func TestServerSimpleQuery(t *testing.T) { wt.AssertNoErr(t, err) var receivedAddr net.IP + var receivedName string + var recvChan chan interface{} receivedCount := 0 + reset := func() { + receivedAddr = nil + receivedName = "" + receivedCount = 0 + recvChan = make(chan interface{}) + } + + wait := func() { + select { + case <-recvChan: + return + case <-time.After(100 * time.Millisecond): + return + } + } + // Implement a minimal listener for responses multicast, err := LinkLocalMulticastListener(nil) wt.AssertNoErr(t, err) @@ -56,8 +79,12 @@ func TestServerSimpleQuery(t *testing.T) { case *dns.A: receivedAddr = rr.A receivedCount++ + case *dns.PTR: + receivedName = rr.Ptr + receivedCount++ } } + recvChan <- "ok" } } @@ -67,22 +94,32 @@ func TestServerSimpleQuery(t *testing.T) { time.Sleep(100 * time.Millisecond) // Allow for server to get going - sendQuery("test.weave.local.", dns.TypeA) - - time.Sleep(time.Second) + reset() + sendQuery(testName, dns.TypeA) + wait() if receivedCount != 1 { - t.Fatal("Unexpected result count for test.weave.local", receivedCount) + t.Fatalf("Unexpected result count %d for %s", receivedCount, testName) } if !receivedAddr.Equal(ip) { - t.Fatal("Unexpected result for test.weave.local", receivedAddr) + t.Fatalf("Unexpected result %s for %s", receivedAddr, testName) } - receivedCount = 0 - + reset() sendQuery("testfail.weave.", dns.TypeA) + wait() if receivedCount != 0 { - t.Fatal("Unexpected result count for testfail.weave", receivedCount) + t.Fatalf("Unexpected result count %d for testfail.weave", receivedCount) + } + + reset() + sendQuery(testInAddr1, dns.TypePTR) + wait() + + if receivedCount != 1 { + t.Fatalf("Expected an answer to %s, got %d answers", testInAddr1, receivedCount) + } else if !(testName == receivedName) { + t.Fatalf("Expected answer %s to query for %s, got %s", testName, testInAddr1, receivedName) } }