blob: fab7bba9e732499bf7103182d950453d912cf46e [file] [log] [blame]
Jan Schär4a180222024-07-29 16:32:54 +02001package dns
2
3import (
4 "testing"
5)
6
7func TestIsSubDomain(t *testing.T) {
8 cases := []struct {
9 parent, child string
10 expected bool
11 }{
12 {".", ".", true},
13 {".", "test.", true},
14 {"example.com.", "example.com.", true},
15 {"example.com.", "www.example.com.", true},
16 {"example.com.", "xample.com.", false},
17 {"example.com.", "www.axample.com.", false},
18 {"example.com.", "wwwexample.com.", false},
19 {"example.com.", `www\.example.com.`, false},
20 {"example.com.", `www\\.example.com.`, true},
21 }
22 for _, c := range cases {
23 if IsSubDomain(c.parent, c.child) != c.expected {
24 t.Errorf("IsSubDomain(%q, %q): expected %v", c.parent, c.child, c.expected)
25 }
26 }
27}
28
29func TestSplitLastLabel(t *testing.T) {
30 cases := []struct {
31 name, rest, label string
32 }{
33 {"", "", ""},
34 {".", "", ""},
35 {"com.", "", "com"},
36 {"www.example.com", "www.example.", "com"},
37 {"www.example.com.", "www.example.", "com"},
38 {`www.example\.com.`, "www.", `example\.com`},
39 {`www.example\\.com.`, `www.example\\.`, "com"},
40 }
41 for _, c := range cases {
42 rest, label := SplitLastLabel(c.name)
43 if rest != c.rest || label != c.label {
44 t.Errorf("SplitLastLabel(%q) = (%q, %q), expected (%q, %q)", c.name, rest, label, c.rest, c.label)
45 }
46 }
47}
48
49func TestParseReverse(t *testing.T) {
50 cases := []struct {
51 name string
52 ip string
53 bits int
54 extra bool
55 }{
56 {"example.", "invalid IP", 0, false},
57 {"0.10.200.255.in-addr.arpa.", "255.200.10.0", 32, false},
58 {"7.6.45.123.in-addr.arpa.", "123.45.6.7", 32, false},
59 {"6.45.123.in-addr.arpa.", "123.45.6.0", 24, false},
60 {"45.123.in-addr.arpa.", "123.45.0.0", 16, false},
61 {"123.in-addr.arpa.", "123.0.0.0", 8, false},
62 {"in-addr.arpa.", "0.0.0.0", 0, false},
63 {"8.7.6.45.123.in-addr.arpa.", "123.45.6.7", 32, true}, // too many fields
64 {".6.45.123.in-addr.arpa.", "123.45.6.0", 24, true}, // empty field
65 {"7.06.45.123.in-addr.arpa.", "123.45.0.0", 16, true}, // leading 0
66 {"7.256.45.123.in-addr.arpa.", "123.45.0.0", 16, true}, // number too large
67 {"a6.45.123.in-addr.arpa.", "123.45.0.0", 16, true}, // invalid character
68 {`7\.6.45.123.in-addr.arpa.`, "123.45.0.0", 16, true}, // escaped .
69 {"0.6.45.123in-addr.arpa.", "invalid IP", 0, false}, // missing .
70 {
71 "0.1.2.3.4.5.6.7.8.9.a.b.c.d.e.f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.",
72 "::fedc:ba98:7654:3210",
73 128,
74 false,
75 },
76 {
77 "1.2.3.4.5.6.7.8.9.a.b.c.d.e.f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.",
78 "::fedc:ba98:7654:3210",
79 124,
80 false,
81 },
82 {
83 "2.3.4.5.6.7.8.9.a.b.c.d.e.f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.",
84 "::fedc:ba98:7654:3200",
85 120,
86 false,
87 },
88 {
89 "3.4.5.6.7.8.9.a.b.c.d.e.f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.",
90 "::fedc:ba98:7654:3000",
91 116,
92 false,
93 },
94 {
95 "2.ip6.arpa.",
96 "2000::",
97 4,
98 false,
99 },
100 {
101 "ip6.arpa.",
102 "::",
103 0,
104 false,
105 },
106 {
107 "0.0.1.2.3.4.5.6.7.8.9.a.b.c.d.e.f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.", // too long
108 "::fedc:ba98:7654:3210",
109 128,
110 true,
111 },
112 {
113 "01.2.3.4.5.6.7.8.9.a.b.c.d.e.f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.", // missing dot
114 "::fedc:ba98:7654:3200",
115 120,
116 true,
117 },
118 {
119 "001.2.3.4.5.6.7.8.9.a.b.c.d.e.f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.", // missing dot
120 "::fedc:ba98:7654:3200",
121 120,
122 true,
123 },
124 {
125 `0.1\.2.3.4.5.6.7.8.9.a.b.c.d.e.f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.`, // escaped dot
126 "::fedc:ba98:7654:3000",
127 116,
128 true,
129 },
130 {
131 "g.1.2.3.4.5.6.7.8.9.a.b.c.d.e.f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.", // invalid character
132 "::fedc:ba98:7654:3210",
133 124,
134 true,
135 },
136 }
137 for _, c := range cases {
138 ip, bits, extra := ParseReverse(c.name)
139 if ip.String() != c.ip || bits != c.bits || extra != c.extra {
140 t.Errorf("ParseReverse(%q) = (%s, %v, %v), expected (%s, %v, %v)", c.name, ip, bits, extra, c.ip, c.bits, c.extra)
141 }
142 }
143}
144
145func BenchmarkParseReverseIPv4(b *testing.B) {
146 for i := 0; i < b.N; i++ {
147 ParseReverse("7.6.45.123.in-addr.arpa.")
148 }
149}
150
151func BenchmarkParseReverseIPv6(b *testing.B) {
152 for i := 0; i < b.N; i++ {
153 ParseReverse("0.1.2.3.4.5.6.7.8.9.a.b.c.d.e.f.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.")
154 }
155}