1# Big definition of tests to run
2
3our %TESTS = (
4	'mkstr' => {
5		# Simple v4
6		'1.2.3.4' => [
7			{ 'res' => '1.2.3.4/32', },
8			{ 'args' => '-m', 'res' => '1.2.3.4/255.255.255.255', },
9			{ 'args' => '-mw', 'res' => '1.2.3.4/0.0.0.0', },
10			{ 'args' => '-6', 'res' => '::ffff:1.2.3.4/128', },
11			{ 'args' => '-6c', 'res' => '::1.2.3.4/128', },
12			{ 'args' => '-a', 'res' => '1.2.3.4', },
13			{ 'args' => '-p', 'res' => '32', },
14			{ 'args' => '-pm', 'res' => '255.255.255.255', },
15			{ 'args' => '-pmw', 'res' => '0.0.0.0', },
16			{ 'args' => '-r', 'res' => '4.3.2.1.in-addr.arpa', },
17		],
18		'0' => [
19			{ 'res' => '0.0.0.0/32', },
20		],
21		# Quick test of single-digit version in dec/oct/hex
22		'12' => [
23			{ 'res' => '0.0.0.12/32', },
24		],
25		'12' => [
26			{ 'res' => '0.0.0.12/32', },
27		],
28		'012' => [
29			{ 'res' => '0.0.0.10/32', },
30		],
31		'0x12' => [
32			{ 'res' => '0.0.0.18/32', },
33		],
34
35
36		# Simple v6
37		'0102:0304:0506:0708:0910:1112:1314:1516' => [
38			{ 'res' => '102:304:506:708:910:1112:1314:1516/128', },
39			{ 'args' => '-m',
40				'res' => '102:304:506:708:910:1112:1314:1516/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', },
41			{ 'args' => '-mw',
42				'res' => '102:304:506:708:910:1112:1314:1516/::', },
43			{ 'args' => '-mwe',
44				'res' => '102:304:506:708:910:1112:1314:1516/0:0:0:0:0:0:0:0', },
45			{ 'args' => '-mwev',
46				'res' => '0102:0304:0506:0708:0910:1112:1314:1516/0000:0000:0000:0000:0000:0000:0000:0000', },
47			{ 'args' => '-a',
48				'res' => '102:304:506:708:910:1112:1314:1516', },
49			{ 'args' => '-p', 'res' => '128', },
50			{ 'args' => '-pm',
51				'res' => 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', },
52			{ 'args' => '-pmw', 'res' => '::', },
53			{ 'args' => '-r',
54				'res' => '6.1.5.1.4.1.3.1.2.1.1.1.0.1.9.0.8.0.7.0.6.0.5.0.4.0.3.0.2.0.1.0.ip6.arpa', },
55		],
56		'::' => [
57			{ 'args' => '-e', 'res' => '0:0:0:0:0:0:0:0/128', },
58			{ 'args' => '-ev',
59			  'res' => '0000:0000:0000:0000:0000:0000:0000:0000/128', },
60		],
61
62		# Various minimized v6 forms
63		'::fe12:ab13/ffff:ff00::' => [
64			{ 'res' => '::fe12:ab13/24', },
65			{ 'args' => '-e', 'res' => '0:0:0:0:0:0:fe12:ab13/24', },
66			{ 'args' => '-em',
67				'res' => '0:0:0:0:0:0:fe12:ab13/ffff:ff00:0:0:0:0:0:0', },
68		],
69		'fe12::ab13' => [
70			{ 'res' => 'fe12::ab13/128', },
71			{ 'args' => '-e', 'res' => 'fe12:0:0:0:0:0:0:ab13/128', },
72		],
73		'fe12::cd98:0:ab13' => [
74			{ 'res' => 'fe12::cd98:0:ab13/128', },
75			{ 'args' => '-e', 'res' => 'fe12:0:0:0:0:cd98:0:ab13/128', },
76		],
77		'fe12::cd98:e:0:0:0:ab13' => [
78			{ 'res' => 'fe12:0:cd98:e::ab13/128', },
79			{ 'args' => '-e', 'res' => 'fe12:0:cd98:e:0:0:0:ab13/128', },
80		],
81		'fe12::cd98:0:0:0:ab13' => [
82			{ 'res' => 'fe12:0:0:cd98::ab13/128', },
83			{ 'args' => '-e', 'res' => 'fe12:0:0:cd98:0:0:0:ab13/128', },
84		],
85
86
87		# Now test netmask/pflen parsing
88		'0/0' => [
89			{ 'res' => '0.0.0.0/0', },
90			{ 'args' => '-m', 'res' => '0.0.0.0/0.0.0.0', },
91		],
92		'0/24' => [
93			{ 'res' => '0.0.0.0/24', },
94			{ 'args' => '-m', 'res' => '0.0.0.0/255.255.255.0', },
95		],
96		'0/19' => [
97			{ 'res' => '0.0.0.0/19', },
98			{ 'args' => '-m', 'res' => '0.0.0.0/255.255.224.0', },
99		],
100		'0/255.192.0.0' => [
101			{ 'res' => '0.0.0.0/10', },
102			{ 'args' => '-m', 'res' => '0.0.0.0/255.192.0.0', },
103		],
104		'0.0.0.0/255.192.0.0' => [
105			{ 'res' => '0.0.0.0/10', },
106			{ 'args' => '-m', 'res' => '0.0.0.0/255.192.0.0', },
107		],
108		'::/::' => [
109			{ 'res' => '::/0', },
110			{ 'args' => '-m', 'res' => '::/::', },
111		],
112
113		# Arbitrary decision: Nothing after / is {32,128}, just as if no
114		# / where given at all.
115		'1.2.3.4/' => [
116			{ 'res' => '1.2.3.4/32', },
117		],
118		'12::34/' => [
119			{ 'res' => '12::34/128', },
120		],
121
122		# Multiple /'s should be removed
123		'1.2.3.4//' => [
124			{ 'res' => '1.2.3.4/32', },
125		],
126		'1.2.3.4/////' => [
127			{ 'res' => '1.2.3.4/32', },
128		],
129		'1.2.3.4//16' => [
130			{ 'res' => '1.2.3.4/16', },
131		],
132		'1.2.3.4///255.255.192.0' => [
133			{ 'res' => '1.2.3.4/18', },
134		],
135		'12::34//' => [
136			{ 'res' => '12::34/128', },
137		],
138		'12::34/////' => [
139			{ 'res' => '12::34/128', },
140		],
141		'12::34//64' => [
142			{ 'res' => '12::34/64', },
143		],
144		'12::34///ffff:ffe0::' => [
145			{ 'res' => '12::34/27', },
146		],
147
148
149		# Play with v4 mapped/compat
150		'192.168.27.49/24' => [
151			{ 'res' => '192.168.27.49/24', },
152			{ 'args' => '-f6', 'res' => '::ffff:c0a8:1b31/120', },
153			{ 'args' => '-mf6',
154				'res' => '::ffff:c0a8:1b31/ffff:ffff:ffff:ffff:ffff:ffff:ffff:ff00', },
155			{ 'args' => '-6', 'res' => '::ffff:192.168.27.49/120', },
156			{ 'args' => '-6c', 'res' => '::192.168.27.49/120', },
157		],
158		'::ffff:192.168.27.49' => [
159			{ 'res' => '::ffff:c0a8:1b31/128', },
160			{ 'args' => '-f4', 'res' => '192.168.27.49/32', },
161		],
162		'::192.168.27.49' => [
163			{ 'res' => '::c0a8:1b31/128', },
164			{ 'args' => '-f4', 'res' => '192.168.27.49/32', },
165		],
166		'fe::4d3:9a99' => [
167			{ 'res' => 'fe::4d3:9a99/128', },
168			{ 'args' => '-f4', 'res' => '4.211.154.153/32', },
169			{ 'args' => '-6f4', 'res' => '::ffff:4.211.154.153/128', },
170			{ 'args' => '-6cf4', 'res' => '::4.211.154.153/128', },
171		],
172		'fe::4.211.154.153' => [
173			{ 'res' => 'fe::4d3:9a99/128', },
174			{ 'args' => '-f4', 'res' => '4.211.154.153/32', },
175		],
176
177
178		# Wacky v4 address format
179		'127.0347.0xfe8/0xff.0340.0' => [
180			{ 'res' => '127.231.15.232/11', },
181			{ 'args' => '-m', 'res' => '127.231.15.232/255.224.0.0', },
182		],
183
184
185		# PTR-record forms
186		'4.3.2.1.in-addr.arpa' => [
187			{ 'res' => '1.2.3.4/32', },
188		],
189		'3.2.1.in-addr.arpa' => [
190			{ 'res' => '1.2.3.0/24', },
191		],
192		'6.1.5.1.4.1.3.1.2.1.1.1.0.1.9.0.8.0.7.0.6.0.5.0.4.0.3.0.2.0.1.0.ip6.arpa' => [
193			{ 'res' => '102:304:506:708:910:1112:1314:1516/128', },
194		],
195		'5.1.4.1.3.1.2.1.1.1.0.1.9.0.8.0.7.0.6.0.5.0.4.0.3.0.2.0.1.0.ip6.arpa' => [
196			{ 'res' => '102:304:506:708:910:1112:1314:1500/120', },
197		],
198		'1.4.1.3.1.2.1.1.1.0.1.9.0.8.0.7.0.6.0.5.0.4.0.3.0.2.0.1.0.ip6.arpa' => [
199			{ 'res' => '102:304:506:708:910:1112:1314:1000/116', },
200		],
201		'6.1.5.1.4.1.3.1.2.1.1.1.0.1.9.0.8.0.7.0.6.0.5.0.4.0.3.0.2.0.1.0.ip6.int' => [
202			{ 'res' => '102:304:506:708:910:1112:1314:1516/128', },
203		],
204
205
206		# Stuff we expect to fail
207		# Too long/too big/etc
208		'27.226.49.7.11' => [
209			{ 'res' => 'FROMFAILED', },
210		],
211		'fe27::eeb97' => [
212			{ 'res' => 'FROMFAILED', },
213		],
214		'17.29.393.195' => [
215			{ 'res' => 'FROMFAILED', },
216		],
217		'17.29.195.393' => [
218			{ 'res' => 'FROMFAILED', },
219		],
220		'444.3.2.1.in-addr.arpa' => [
221			{ 'res' => 'FROMFAILED', },
222		],
223		'4.333.2.1.in-addr.arpa' => [
224			{ 'res' => 'FROMFAILED', },
225		],
226		'5.4.3.2.1.in-addr.arpa' => [
227			{ 'res' => 'FROMFAILED', },
228		],
229		'6.10.5.1.4.1.3.1.2.1.1.1.0.1.9.0.8.0.7.0.6.0.5.0.4.0.3.0.2.0.1.0.ip6.arpa' => [
230			{ 'res' => 'FROMFAILED', },
231		],
232		'16.1.5.1.4.1.3.1.2.1.1.1.0.1.9.0.8.0.7.0.6.0.5.0.4.0.3.0.2.0.1.0.ip6.arpa' => [
233			{ 'res' => 'FROMFAILED', },
234		],
235		'7.6.1.5.1.4.1.3.1.2.1.1.1.0.1.9.0.8.0.7.0.6.0.5.0.4.0.3.0.2.0.1.0.ip6.arpa' => [
236			{ 'res' => 'FROMFAILED', },
237		],
238
239		# Invalid masks
240		'1.2.3.4/255.255.255.17' => [
241			{ 'res' => 'FROMFAILED', },
242		],
243		'1.2.3.4/255.255.255.256' => [
244			{ 'res' => 'FROMFAILED', },
245		],
246		'1.2.3.4/255.255.0.255' => [
247			{ 'res' => 'FROMFAILED', },
248		],
249		'1.2.3.4/255.255.255' => [
250			{ 'res' => 'FROMFAILED', },
251		],
252
253		# Invalid characters
254		'1.2.b.4' => [
255			{ 'res' => 'FROMFAILED', },
256		],
257		'1.2.08.4' => [
258			{ 'res' => 'FROMFAILED', },
259		],
260		'1.2.0xg.4' => [
261			{ 'res' => 'FROMFAILED', },
262		],
263		'1.2:3.4' => [
264			{ 'res' => 'FROMFAILED', },
265		],
266		'1.2*3.4' => [
267			{ 'res' => 'FROMFAILED', },
268		],
269		'fe27::geb9' => [
270			{ 'res' => 'FROMFAILED', },
271		],
272		'ge27::1ab2' => [
273			{ 'res' => 'FROMFAILED', },
274		],
275		'e2g::1ab2' => [
276			{ 'res' => 'FROMFAILED', },
277		],
278		'fe27::geeb9' => [
279			{ 'res' => 'FROMFAILED', },
280		],
281
282		# Downright wrong formats
283		'fe38:::1234' => [
284			{ 'res' => 'FROMFAILED', },
285		],
286		'fe38::::1234' => [
287			{ 'res' => 'FROMFAILED', },
288		],
289		'amooseoncebitmysister' => [
290			{ 'res' => 'FROMFAILED', },
291		],
292		'/' => [
293			{ 'res' => 'FROMFAILED', },
294		],
295		'/27' => [
296			{ 'res' => 'FROMFAILED', },
297		],
298		'/255.255.255.0' => [
299			{ 'res' => 'FROMFAILED', },
300		],
301		'/ffff::' => [
302			{ 'res' => 'FROMFAILED', },
303		],
304		'/120::' => [
305			{ 'res' => 'FROMFAILED', },
306		],
307
308	},
309);
310