From 2dc11ce1e3aa3eb5d79c0ee7e8a071e1da22d3ac Mon Sep 17 00:00:00 2001 From: lordwelch Date: Mon, 6 Jul 2020 16:26:52 -0700 Subject: [PATCH] Add additional test cases and fix some failing tests --- integration/netconfig/netconfig_test.go | 4 +- internal/dns/dns.go | 14 ++++ internal/dns/dns_test.go | 90 +++++++++++++++++++++++++ 3 files changed, 106 insertions(+), 2 deletions(-) diff --git a/integration/netconfig/netconfig_test.go b/integration/netconfig/netconfig_test.go index 6ebec98..51ad729 100644 --- a/integration/netconfig/netconfig_test.go +++ b/integration/netconfig/netconfig_test.go @@ -270,7 +270,7 @@ func TestNetconfig(t *testing.T) { } netconfig.DefaultCounterObj = &nftables.CounterObj{Packets: 23, Bytes: 42} - if err := netconfig.Apply(tmp, filepath.Join(tmp, "root")); err != nil { + if err := netconfig.Apply(tmp, filepath.Join(tmp, "root"), true); err != nil { t.Fatalf("netconfig.Apply: %v", err) } @@ -278,7 +278,7 @@ func TestNetconfig(t *testing.T) { // already-configured interfaces, addresses, routes, … (and ensure // nftables rules are replaced, not appendend to). netconfig.DefaultCounterObj = &nftables.CounterObj{Packets: 0, Bytes: 0} - if err := netconfig.Apply(tmp, filepath.Join(tmp, "root")); err != nil { + if err := netconfig.Apply(tmp, filepath.Join(tmp, "root"), true); err != nil { t.Fatalf("netconfig.Apply: %v", err) } diff --git a/internal/dns/dns.go b/internal/dns/dns.go index 8da9d9c..81e585a 100644 --- a/internal/dns/dns.go +++ b/internal/dns/dns.go @@ -143,6 +143,11 @@ func NewServer(addr, domain string) *Server { } func (s *Server) initHostsLocked() { + for k := range s.subnames { + if k != s.domain { + s.Mux.HandleRemove(string(k)) + } + } s.hostsByName = make(map[lcHostname]string) s.hostsByIP = make(map[string]string) s.subnames[s.domain] = make(map[lcHostname]IP) @@ -341,6 +346,15 @@ func (s *Server) SetDNSEntries(dnsEntries []IP) { entry.Host = lcHostname(strings.TrimSuffix(dn, "lan")) + s.domain } s.setSubname(entry) + hdnSlice := strings.SplitN(string(entry.Host), ".", 2) + domain := lcHostname("") + if len(hdnSlice) == 2 { + domain = lcHostname(hdnSlice[1]) + } + if domain == "" || domain == s.domain { + continue + } + s.Mux.HandleFunc(string(domain), s.subnameHandler(domain)) } } diff --git a/internal/dns/dns_test.go b/internal/dns/dns_test.go index b23cb64..cd25ce8 100644 --- a/internal/dns/dns_test.go +++ b/internal/dns/dns_test.go @@ -642,3 +642,93 @@ func TestSubname(t *testing.T) { } }) } + +func TestDNSEntries(t *testing.T) { + r := &recorder{} + s := NewServer("127.0.0.2:0", "lan") + s.SetLeases([]dhcp4d.Lease{ + { + Hostname: "testtarget", + Addr: net.IP{192, 168, 42, 23}, + }, + { + Hostname: "testtarget-ipv6", + Addr: net.ParseIP("fe80:3::"), + }, + }) + s.SetDNSEntries([]IP{ + IP{ + Host: "testtarget", + IPv4: net.IP{7, 7, 7, 7}, + IPv6: net.ParseIP("fe80:1::"), + }, + IP{ + Host: "testtarget.example.org", + IPv4: net.IP{8, 8, 8, 8}, + IPv6: net.ParseIP("fe80:2::"), + }, + { + Host: "testtarget-ipv6", + IPv4: net.IP{9, 9, 9, 9}, + IPv6: net.ParseIP("fe80:9::"), + }, + }) + + t.Run("testtarget.", func(t *testing.T) { + if err := resolveTestTarget(s, "testtarget.", net.IP{192, 168, 42, 23}); err != nil { + t.Fatal(err) + } + }) + + t.Run("testtarget.lan.", func(t *testing.T) { + if err := resolveTestTarget(s, "testtarget.lan.", net.IP{192, 168, 42, 23}); err != nil { + t.Fatal(err) + } + }) + + t.Run("testtarget-ipv6.lan. (IPv6)", func(t *testing.T) { + if err := resolveTestTarget(s, "testtarget-ipv6.lan.", net.ParseIP("fe80:3::")); err != nil { + t.Fatal(err) + } + }) + + t.Run("testtarget-ipv6.lan. (no override???)", func(t *testing.T) { + if err := resolveTestTarget(s, "testtarget-ipv6.lan.", net.IP{9, 9, 9, 9}); err != nil { + t.Fatal(err) + } + }) + + t.Run("testtarget.lan. (IPv6) (no override???)", func(t *testing.T) { + if err := resolveTestTarget(s, "testtarget.lan.", net.ParseIP("fe80:1::")); err != nil { + t.Fatal(err) + } + }) + + t.Run("testtarget.example.org.", func(t *testing.T) { + if err := resolveTestTarget(s, "testtarget.example.org.", net.IP{8, 8, 8, 8}); err != nil { + t.Fatal(err) + } + }) + + t.Run("testtarget.example.org. (IPv6)", func(t *testing.T) { + if err := resolveTestTarget(s, "testtarget.example.org.", net.ParseIP("fe80:2::")); err != nil { + t.Fatal(err) + } + }) + s.SetLeases([]dhcp4d.Lease{ + { + Hostname: "testtarget", + Addr: net.IP{192, 168, 42, 23}, + }, + }) + + t.Run("testtarget.example.org. (deleted)", func(t *testing.T) { + m := new(dns.Msg) + m.SetQuestion("testtarget.example.org.", dns.TypeA) + s.Mux.ServeDNS(r, m) + if got, want := r.response.Rcode, dns.RcodeNameError; got != want { + t.Fatalf("unexpected rcode: got %v, want %v", got, want) + } + }) + +}