diff --git a/middleware/normalize.go b/middleware/normalize.go index e5b747620..e28ed96ea 100644 --- a/middleware/normalize.go +++ b/middleware/normalize.go @@ -16,7 +16,7 @@ func (z Zones) Matches(qname string) string { zone := "" for _, zname := range z { if dns.IsSubDomain(zname, qname) { - // TODO(miek): hmm, add test for this case + // We want the *longest* matching zone, otherwise we may end up in a parent if len(zname) > len(zone) { zone = zname } @@ -41,7 +41,6 @@ func (n Name) Matches(child string) bool { if dns.Name(n) == dns.Name(child) { return true } - return dns.IsSubDomain(string(n), child) } diff --git a/middleware/normalize_test.go b/middleware/normalize_test.go new file mode 100644 index 000000000..285e185fd --- /dev/null +++ b/middleware/normalize_test.go @@ -0,0 +1,96 @@ +package middleware + +import "testing" + +func TestZoneMatches(t *testing.T) { + child := "example.org." + zones := Zones([]string{"org.", "."}) + actual := zones.Matches(child) + if actual != "org." { + t.Errorf("Expected %v, got %v", "org.", actual) + } + + child = "bla.example.org." + zones = Zones([]string{"bla.example.org.", "org.", "."}) + actual = zones.Matches(child) + + if actual != "bla.example.org." { + t.Errorf("Expected %v, got %v", "org.", actual) + } +} + +func TestZoneNormalize(t *testing.T) { + zones := Zones([]string{"example.org", "Example.ORG.", "example.org."}) + expected := "example.org." + zones.Normalize() + + for _, actual := range zones { + if actual != expected { + t.Errorf("Expected %v, got %v\n", expected, actual) + } + } +} + +func TestNameMatches(t *testing.T) { + matches := []struct { + child string + parent string + expected bool + }{ + {".", ".", true}, + {"example.org.", ".", true}, + {"example.org.", "example.org.", true}, + {"example.org.", "org.", true}, + {"org.", "example.org.", false}, + } + + for _, m := range matches { + actual := Name(m.parent).Matches(m.child) + if actual != m.expected { + t.Errorf("Expected %v for %s/%s, got %v", m.expected, m.parent, m.child, actual) + } + + } +} + +func TestNameNormalize(t *testing.T) { + names := []string{ + "example.org", "example.org.", + "Example.ORG.", "example.org."} + + for i := 0; i < len(names); i += 2 { + ts := names[i] + expected := names[i+1] + actual := Name(ts).Normalize() + if expected != actual { + t.Errorf("Expected %v, got %v\n", expected, actual) + } + } +} + +func TestHostNormalize(t *testing.T) { + hosts := []string{".:53", ".", "example.org:53", "example.org.", "example.org.:53", "example.org."} + + for i := 0; i < len(hosts); i += 2 { + ts := hosts[i] + expected := hosts[i+1] + actual := Host(ts).Normalize() + if expected != actual { + t.Errorf("Expected %v, got %v\n", expected, actual) + } + } +} + +func TestAddrNormalize(t *testing.T) { + addrs := []string{".:53", ".:53", "example.org", "example.org:53", "example.org.:1053", "example.org.:1053"} + + for i := 0; i < len(addrs); i += 2 { + ts := addrs[i] + expected := addrs[i+1] + actual := Addr(ts).Normalize() + if expected != actual { + t.Errorf("Expected %v, got %v\n", expected, actual) + } + } + +}