aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--middleware/normalize.go3
-rw-r--r--middleware/normalize_test.go96
2 files changed, 97 insertions, 2 deletions
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)
+ }
+ }
+
+}