]>
Commit | Line | Data |
---|---|---|
1c2d079d | 1 | #ifndef BOOST_TEST_DYN_LINK |
8d388c48 | 2 | #define BOOST_TEST_DYN_LINK |
1c2d079d FM |
3 | #endif |
4 | ||
8d388c48 | 5 | #define BOOST_TEST_NO_MAIN |
6 | ||
870a0fe4 AT |
7 | #ifdef HAVE_CONFIG_H |
8 | #include "config.h" | |
9 | #endif | |
8d388c48 | 10 | #include <boost/test/unit_test.hpp> |
11 | #include "rcpgenerator.hh" | |
12 | #include "misc.hh" | |
13 | #include <utility> | |
14 | ||
15 | using std::string; | |
16 | ||
114ef974 | 17 | BOOST_AUTO_TEST_SUITE(test_rcpgenerator_cc) |
8d388c48 | 18 | |
19 | BOOST_AUTO_TEST_CASE(test_xfrIP6) { | |
232f0877 CH |
20 | RecordTextReader rtr("::1"); |
21 | string rawIPv6; | |
22 | rtr.xfrIP6(rawIPv6); | |
23 | string loopback6; | |
24 | loopback6.append(15, 0); | |
25 | loopback6.append(1,1); | |
26 | BOOST_CHECK_EQUAL(makeHexDump(rawIPv6), makeHexDump(loopback6)); | |
d5ef463e | 27 | |
232f0877 CH |
28 | RecordTextReader rtr2("2a01:4f8:d12:1880::5"); |
29 | rtr2.xfrIP6(rawIPv6); | |
30 | string ip6("\x2a\x01\x04\xf8\x0d\x12\x18\x80\x00\x00\x00\x00\x00\x00\x00\x05", 16); | |
31 | BOOST_CHECK_EQUAL(makeHexDump(rawIPv6), makeHexDump(ip6)); | |
ac213ef4 PL |
32 | |
33 | RecordTextReader rtr3("::FFFF:192.0.2.0"); | |
34 | rtr3.xfrIP6(rawIPv6); | |
35 | string ip62("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xc0\x00\x02\x00", 16); | |
36 | BOOST_CHECK_EQUAL(makeHexDump(rawIPv6), makeHexDump(ip62)); | |
8d388c48 | 37 | } |
38 | ||
373914dc PL |
39 | BOOST_AUTO_TEST_CASE(test_xfrSvcParamKeyVals_alpn) { |
40 | string source("alpn=h2"); | |
41 | RecordTextReader rtr(source); | |
42 | set<SvcParam> v; | |
43 | rtr.xfrSvcParamKeyVals(v); | |
dc593046 | 44 | BOOST_CHECK_EQUAL(v.size(), 1U); |
373914dc | 45 | auto alpn = v.begin()->getALPN(); |
dc593046 | 46 | BOOST_CHECK_EQUAL(alpn.size(), 1U); |
373914dc PL |
47 | auto val = alpn.begin(); |
48 | BOOST_CHECK_EQUAL(*val, "h2"); | |
8d388c48 | 49 | |
373914dc PL |
50 | // Check the writer |
51 | string target; | |
52 | RecordTextWriter rtw(target); | |
53 | rtw.xfrSvcParamKeyVals(v); | |
54 | BOOST_CHECK_EQUAL(target, source); | |
55 | ||
56 | v.clear(); | |
57 | source = "alpn=h2,h3"; | |
58 | RecordTextReader rtr2(source); | |
59 | rtr2.xfrSvcParamKeyVals(v); | |
dc593046 | 60 | BOOST_CHECK_EQUAL(v.size(), 1U); |
373914dc | 61 | alpn = v.begin()->getALPN(); |
dc593046 | 62 | BOOST_CHECK_EQUAL(alpn.size(), 2U); |
373914dc PL |
63 | val = alpn.begin(); |
64 | BOOST_CHECK_EQUAL(*val, "h2"); | |
65 | val++; | |
66 | BOOST_CHECK_EQUAL(*val, "h3"); | |
67 | ||
68 | // Check the writer | |
69 | target.clear(); | |
70 | RecordTextWriter rtw2(target); | |
71 | rtw2.xfrSvcParamKeyVals(v); | |
72 | BOOST_CHECK_EQUAL(target, source); | |
76a98652 PL |
73 | |
74 | // Check generic | |
75 | v.clear(); | |
76 | source="key1=\\002h2\\002h3"; | |
77 | RecordTextReader rtr3(source); | |
78 | rtr3.xfrSvcParamKeyVals(v); | |
79 | BOOST_CHECK_EQUAL(v.size(), 1U); | |
80 | alpn = v.begin()->getALPN(); | |
81 | BOOST_CHECK_EQUAL(alpn.size(), 2U); | |
82 | val = alpn.begin(); | |
83 | BOOST_CHECK_EQUAL(*val, "h2"); | |
84 | val++; | |
85 | BOOST_CHECK_EQUAL(*val, "h3"); | |
86 | ||
87 | // Error conditions | |
88 | source="key1=\\002h2\\003h3"; // Wrong length for 2nd argument | |
89 | RecordTextReader rtr4(source); | |
90 | BOOST_CHECK_THROW(rtr4.xfrSvcParamKeyVals(v), RecordTextException); | |
91 | ||
92 | source="key1=\\002h2\\002h3foobar"; // extra data | |
93 | RecordTextReader rtr5(source); | |
94 | BOOST_CHECK_THROW(rtr5.xfrSvcParamKeyVals(v), RecordTextException); | |
373914dc PL |
95 | } |
96 | ||
97 | BOOST_AUTO_TEST_CASE(test_xfrSvcParamKeyVals_mandatory) { | |
98 | string source("mandatory=alpn"); | |
99 | RecordTextReader rtr(source); | |
100 | set<SvcParam> v; | |
101 | rtr.xfrSvcParamKeyVals(v); | |
dc593046 | 102 | BOOST_CHECK_EQUAL(v.size(), 1U); |
373914dc | 103 | auto m = v.begin()->getMandatory(); |
dc593046 | 104 | BOOST_CHECK_EQUAL(m.size(), 1U); |
373914dc PL |
105 | auto val = m.begin(); |
106 | BOOST_CHECK(*val == SvcParam::alpn); | |
107 | ||
108 | // Check the writer | |
109 | string target; | |
110 | RecordTextWriter rtw(target); | |
111 | rtw.xfrSvcParamKeyVals(v); | |
112 | BOOST_CHECK_EQUAL(target, source); | |
113 | ||
114 | v.clear(); | |
115 | source = "mandatory=alpn,ipv4hint"; | |
116 | RecordTextReader rtr2("mandatory=alpn,ipv4hint"); | |
117 | rtr2.xfrSvcParamKeyVals(v); | |
dc593046 | 118 | BOOST_CHECK_EQUAL(v.size(), 1U); |
373914dc | 119 | m = v.begin()->getMandatory(); |
dc593046 | 120 | BOOST_CHECK_EQUAL(m.size(), 2U); |
373914dc PL |
121 | val = m.begin(); |
122 | BOOST_CHECK(*val == SvcParam::alpn); | |
123 | val++; | |
124 | BOOST_CHECK(*val == SvcParam::ipv4hint); | |
125 | ||
126 | // Check the writer | |
127 | target.clear(); | |
128 | RecordTextWriter rtw2(target); | |
129 | rtw2.xfrSvcParamKeyVals(v); | |
130 | BOOST_CHECK_EQUAL(target, source); | |
76a98652 PL |
131 | |
132 | // Generic parsing | |
133 | v.clear(); | |
134 | source = "key0=\\000\\001\\000\\004"; | |
135 | RecordTextReader rtr3(source); | |
136 | rtr3.xfrSvcParamKeyVals(v); | |
137 | BOOST_CHECK_EQUAL(v.size(), 1U); | |
138 | m = v.begin()->getMandatory(); | |
139 | BOOST_CHECK_EQUAL(m.size(), 2U); | |
140 | val = m.begin(); | |
141 | BOOST_CHECK(*val == SvcParam::alpn); | |
142 | val++; | |
143 | BOOST_CHECK(*val == SvcParam::ipv4hint); | |
144 | ||
145 | // Broken | |
146 | v.clear(); | |
147 | source = "key0=\\000\\001\\000"; | |
148 | RecordTextReader rtr4(source); | |
149 | BOOST_CHECK_THROW(rtr4.xfrSvcParamKeyVals(v), RecordTextException); | |
150 | ||
151 | v.clear(); | |
152 | source = "key0="; | |
153 | RecordTextReader rtr5(source); | |
154 | BOOST_CHECK_THROW(rtr5.xfrSvcParamKeyVals(v), RecordTextException); | |
155 | ||
156 | v.clear(); | |
157 | source = "key0"; | |
158 | RecordTextReader rtr6(source); | |
159 | BOOST_CHECK_THROW(rtr6.xfrSvcParamKeyVals(v), RecordTextException); | |
373914dc PL |
160 | } |
161 | ||
162 | BOOST_AUTO_TEST_CASE(test_xfrSvcParamKeyVals_no_default_alpn) { | |
163 | string source("no-default-alpn"); | |
164 | RecordTextReader rtr(source); | |
165 | set<SvcParam> v; | |
166 | rtr.xfrSvcParamKeyVals(v); | |
dc593046 | 167 | BOOST_CHECK_EQUAL(v.size(), 1U); |
373914dc PL |
168 | auto k = v.begin()->getKey(); |
169 | BOOST_CHECK(k == SvcParam::no_default_alpn); | |
170 | ||
171 | // Check the writer | |
172 | string target; | |
173 | RecordTextWriter rtw(target); | |
174 | rtw.xfrSvcParamKeyVals(v); | |
175 | BOOST_CHECK_EQUAL(target, source); | |
176 | ||
177 | RecordTextReader rtr2("no-default-alpn="); | |
178 | v.clear(); | |
179 | BOOST_CHECK_THROW(rtr2.xfrSvcParamKeyVals(v), RecordTextException); | |
76a98652 PL |
180 | |
181 | // Generic | |
182 | v.clear(); | |
183 | source = "key2"; | |
184 | RecordTextReader rtr3(source); | |
185 | rtr3.xfrSvcParamKeyVals(v); | |
186 | BOOST_CHECK_EQUAL(v.size(), 1U); | |
187 | k = v.begin()->getKey(); | |
188 | BOOST_CHECK(k == SvcParam::no_default_alpn); | |
373914dc PL |
189 | } |
190 | ||
191 | BOOST_AUTO_TEST_CASE(test_xfrSvcParamKeyVals_ipv4hint) { | |
192 | string source("ipv4hint=192.0.2.1"); | |
193 | RecordTextReader rtr(source); | |
194 | set<SvcParam> v; | |
195 | rtr.xfrSvcParamKeyVals(v); | |
dc593046 | 196 | BOOST_CHECK_EQUAL(v.size(), 1U); |
373914dc PL |
197 | auto k = v.begin()->getKey(); |
198 | BOOST_CHECK(k == SvcParam::ipv4hint); | |
199 | auto val = v.begin()->getIPHints(); | |
dc593046 | 200 | BOOST_CHECK_EQUAL(val.size(), 1U); |
373914dc PL |
201 | BOOST_CHECK_EQUAL(val.begin()->toString(), "192.0.2.1"); |
202 | ||
203 | // Check the writer | |
204 | string target; | |
205 | RecordTextWriter rtw(target); | |
206 | rtw.xfrSvcParamKeyVals(v); | |
207 | BOOST_CHECK_EQUAL(target, source); | |
208 | ||
209 | v.clear(); | |
210 | source = "ipv4hint=192.0.2.1,192.0.2.2,192.0.2.3"; | |
211 | RecordTextReader rtr2(source); | |
212 | rtr2.xfrSvcParamKeyVals(v); | |
dc593046 | 213 | BOOST_CHECK_EQUAL(v.size(), 1U); |
373914dc PL |
214 | k = v.begin()->getKey(); |
215 | BOOST_CHECK(k == SvcParam::ipv4hint); | |
216 | ||
217 | val = v.begin()->getIPHints(); | |
dc593046 | 218 | BOOST_CHECK_EQUAL(val.size(), 3U); |
373914dc PL |
219 | auto valit = val.begin(); |
220 | BOOST_CHECK_EQUAL(valit->toString(), "192.0.2.1"); | |
221 | valit++; | |
222 | BOOST_CHECK_EQUAL(valit->toString(), "192.0.2.2"); | |
223 | valit++; | |
224 | BOOST_CHECK_EQUAL(valit->toString(), "192.0.2.3"); | |
225 | ||
226 | // Check the writer | |
227 | target.clear(); | |
228 | RecordTextWriter rtw2(target); | |
229 | rtw2.xfrSvcParamKeyVals(v); | |
230 | BOOST_CHECK_EQUAL(target, source); | |
231 | ||
232 | v.clear(); | |
233 | RecordTextReader rtr3("ipv4hint=2001:db8::1"); | |
234 | BOOST_CHECK_THROW(rtr3.xfrSvcParamKeyVals(v), RecordTextException); | |
235 | ||
236 | v.clear(); | |
237 | RecordTextReader rtr4("ipv4hint=192.0.2.1,2001:db8::1"); | |
238 | BOOST_CHECK_THROW(rtr4.xfrSvcParamKeyVals(v), RecordTextException); | |
76a98652 PL |
239 | |
240 | // Check if we can parse the generic format | |
241 | v.clear(); | |
242 | source = "key4=\\192\\000\\002\\015"; | |
243 | RecordTextReader rtr5(source); | |
244 | rtr5.xfrSvcParamKeyVals(v); | |
245 | BOOST_CHECK_EQUAL(v.size(), 1U); | |
246 | BOOST_CHECK_EQUAL(v.begin()->getIPHints().size(), 1U); | |
247 | k = v.begin()->getKey(); | |
248 | BOOST_CHECK(k == SvcParam::ipv4hint); | |
249 | BOOST_CHECK_EQUAL(v.begin()->getIPHints().begin()->toString(), "192.0.2.15"); | |
250 | ||
251 | v.clear(); | |
252 | source = "key4=\\192\\000\\002\\015\\192\\000\\002\\222"; | |
253 | RecordTextReader rtr6(source); | |
254 | rtr6.xfrSvcParamKeyVals(v); | |
255 | BOOST_CHECK_EQUAL(v.size(), 1U); | |
256 | BOOST_CHECK_EQUAL(v.begin()->getIPHints().size(), 2U); | |
257 | k = v.begin()->getKey(); | |
258 | BOOST_CHECK(k == SvcParam::ipv4hint); | |
259 | BOOST_CHECK_EQUAL(v.begin()->getIPHints().begin()->toString(), "192.0.2.15"); | |
260 | BOOST_CHECK_EQUAL(v.begin()->getIPHints().at(1).toString(), "192.0.2.222"); | |
261 | ||
262 | v.clear(); | |
263 | source = "key4=\\192\\000\\222"; // Wrong number of octets | |
264 | RecordTextReader rtr7(source); | |
265 | BOOST_CHECK_THROW(rtr7.xfrSvcParamKeyVals(v), RecordTextException); | |
373914dc PL |
266 | } |
267 | ||
268 | BOOST_AUTO_TEST_CASE(test_xfrSvcParamKeyVals_ipv6hint) { | |
269 | string source("ipv6hint=2001:db8::1"); | |
270 | RecordTextReader rtr(source); | |
271 | set<SvcParam> v; | |
272 | rtr.xfrSvcParamKeyVals(v); | |
dc593046 | 273 | BOOST_CHECK_EQUAL(v.size(), 1U); |
373914dc PL |
274 | auto k = v.begin()->getKey(); |
275 | BOOST_CHECK(k == SvcParam::ipv6hint); | |
276 | auto val = v.begin()->getIPHints(); | |
dc593046 | 277 | BOOST_CHECK_EQUAL(val.size(), 1U); |
373914dc PL |
278 | BOOST_CHECK_EQUAL(val.begin()->toString(), "2001:db8::1"); |
279 | ||
280 | // Check the writer | |
281 | string target; | |
282 | RecordTextWriter rtw(target); | |
283 | rtw.xfrSvcParamKeyVals(v); | |
284 | BOOST_CHECK_EQUAL(target, source); | |
285 | ||
286 | v.clear(); | |
287 | source = "ipv6hint=2001:db8::1,2001:db8::2,2001:db8::3"; | |
288 | RecordTextReader rtr2(source); | |
289 | rtr2.xfrSvcParamKeyVals(v); | |
dc593046 | 290 | BOOST_CHECK_EQUAL(v.size(), 1U); |
373914dc PL |
291 | k = v.begin()->getKey(); |
292 | BOOST_CHECK(k == SvcParam::ipv6hint); | |
293 | ||
294 | val = v.begin()->getIPHints(); | |
dc593046 | 295 | BOOST_CHECK_EQUAL(val.size(), 3U); |
373914dc PL |
296 | auto valit = val.begin(); |
297 | BOOST_CHECK_EQUAL(valit->toString(), "2001:db8::1"); | |
298 | valit++; | |
299 | BOOST_CHECK_EQUAL(valit->toString(), "2001:db8::2"); | |
300 | valit++; | |
301 | BOOST_CHECK_EQUAL(valit->toString(), "2001:db8::3"); | |
302 | ||
303 | // Check the writer | |
304 | target.clear(); | |
305 | RecordTextWriter rtw2(target); | |
306 | rtw2.xfrSvcParamKeyVals(v); | |
307 | BOOST_CHECK_EQUAL(target, source); | |
308 | ||
309 | v.clear(); | |
310 | RecordTextReader rtr3("ipv6hint=192.0.2.1"); | |
311 | BOOST_CHECK_THROW(rtr3.xfrSvcParamKeyVals(v), RecordTextException); | |
312 | ||
313 | v.clear(); | |
314 | RecordTextReader rtr4("ipv6hint=192.0.2.1,2001:db8::1"); | |
315 | BOOST_CHECK_THROW(rtr4.xfrSvcParamKeyVals(v), RecordTextException); | |
76a98652 PL |
316 | |
317 | // Check if we can parse the generic format | |
318 | v.clear(); | |
319 | RecordTextReader rtr5("key6=\\032\\001\\013\\184\\000\\083\\000\\000\\000\\000\\000\\000\\000\\000\\000\\021"); | |
320 | rtr5.xfrSvcParamKeyVals(v); | |
321 | BOOST_CHECK_EQUAL(v.size(), 1U); | |
322 | BOOST_CHECK_EQUAL(v.begin()->getIPHints().size(), 1U); | |
323 | k = v.begin()->getKey(); | |
324 | BOOST_CHECK(k == SvcParam::ipv6hint); | |
325 | BOOST_CHECK_EQUAL(v.begin()->getIPHints().begin()->toString(), "2001:db8:53::15"); | |
326 | ||
327 | v.clear(); | |
328 | source = "key6=\\032\\001\\013\\184\\000\\083\\000\\000\\000\\000\\000\\000\\000\\000\\000\\021\\032\\001\\013\\184\\000\\083\\000\\000\\000\\000\\000\\000\\000\\000\\000\\022"; | |
329 | RecordTextReader rtr6(source); | |
330 | rtr6.xfrSvcParamKeyVals(v); | |
331 | BOOST_CHECK_EQUAL(v.size(), 1U); | |
332 | BOOST_CHECK_EQUAL(v.begin()->getIPHints().size(), 2U); | |
333 | k = v.begin()->getKey(); | |
334 | BOOST_CHECK(k == SvcParam::ipv6hint); | |
335 | BOOST_CHECK_EQUAL(v.begin()->getIPHints().begin()->toString(), "2001:db8:53::15"); | |
336 | BOOST_CHECK_EQUAL(v.begin()->getIPHints().at(1).toString(), "2001:db8:53::16"); | |
337 | ||
338 | v.clear(); | |
339 | source = "key6=\\040\\001\\015\\270\\000\\123\\000\\000\\000\\000\\000\\000\\000\\000\\000"; // wrong number of octets | |
340 | RecordTextReader rtr7(source); | |
341 | BOOST_CHECK_THROW(rtr7.xfrSvcParamKeyVals(v), RecordTextException); | |
373914dc PL |
342 | } |
343 | ||
344 | BOOST_AUTO_TEST_CASE(test_xfrSvcParamKeyVals_port) { | |
345 | string source("port=53"); | |
346 | RecordTextReader rtr(source); | |
347 | set<SvcParam> v; | |
348 | rtr.xfrSvcParamKeyVals(v); | |
dc593046 | 349 | BOOST_CHECK_EQUAL(v.size(), 1U); |
373914dc PL |
350 | auto k = v.begin()->getKey(); |
351 | BOOST_CHECK(k == SvcParam::port); | |
352 | auto val = v.begin()->getPort(); | |
353 | BOOST_CHECK_EQUAL(val, 53); | |
354 | ||
355 | // Check the writer | |
356 | string target; | |
357 | RecordTextWriter rtw(target); | |
358 | rtw.xfrSvcParamKeyVals(v); | |
359 | BOOST_CHECK_EQUAL(target, source); | |
360 | ||
361 | v.clear(); | |
362 | RecordTextReader rtr2("port=100000"); | |
363 | BOOST_CHECK_THROW(rtr2.xfrSvcParamKeyVals(v), RecordTextException); | |
364 | ||
365 | v.clear(); | |
366 | RecordTextReader rtr3("port=foo"); | |
367 | BOOST_CHECK_THROW(rtr3.xfrSvcParamKeyVals(v), RecordTextException); | |
368 | ||
369 | v.clear(); | |
370 | RecordTextReader rtr4("port="); | |
371 | BOOST_CHECK_THROW(rtr4.xfrSvcParamKeyVals(v), RecordTextException); | |
372 | ||
373 | v.clear(); | |
374 | RecordTextReader rtr5("port"); | |
375 | BOOST_CHECK_THROW(rtr5.xfrSvcParamKeyVals(v), RecordTextException); | |
76a98652 PL |
376 | |
377 | // Generic | |
378 | v.clear(); | |
379 | RecordTextReader rtr6("key3"); | |
380 | BOOST_CHECK_THROW(rtr6.xfrSvcParamKeyVals(v), RecordTextException); | |
381 | ||
382 | v.clear(); | |
383 | RecordTextReader rtr7("key3=\\000\\053"); | |
384 | rtr7.xfrSvcParamKeyVals(v); | |
385 | BOOST_CHECK_EQUAL(v.size(), 1U); | |
386 | k = v.begin()->getKey(); | |
387 | BOOST_CHECK(k == SvcParam::port); | |
388 | val = v.begin()->getPort(); | |
389 | BOOST_CHECK_EQUAL(val, 53); | |
373914dc PL |
390 | } |
391 | ||
392 | BOOST_AUTO_TEST_CASE(test_xfrSvcParamKeyVals_generic) { | |
393 | string source("key666=foobar"); | |
394 | RecordTextReader rtr(source); | |
395 | set<SvcParam> v; | |
396 | rtr.xfrSvcParamKeyVals(v); | |
dc593046 | 397 | BOOST_CHECK_EQUAL(v.size(), 1U); |
373914dc PL |
398 | auto k = v.begin()->getKey(); |
399 | BOOST_CHECK(k == 666); | |
400 | auto val = v.begin()->getValue(); | |
401 | BOOST_CHECK_EQUAL(val, "foobar"); | |
402 | ||
403 | // Check the writer | |
404 | string target; | |
405 | RecordTextWriter rtw(target); | |
406 | rtw.xfrSvcParamKeyVals(v); | |
b1a048a9 | 407 | BOOST_CHECK_EQUAL(target, "key666=\"foobar\""); |
373914dc PL |
408 | |
409 | v.clear(); | |
410 | RecordTextReader rtr2("key666="); | |
411 | BOOST_CHECK_THROW(rtr2.xfrSvcParamKeyVals(v), RecordTextException); | |
412 | ||
413 | v.clear(); | |
414 | RecordTextReader rtr3("key666"); | |
415 | BOOST_CHECK_THROW(rtr3.xfrSvcParamKeyVals(v), RecordTextException); | |
416 | ||
417 | v.clear(); | |
418 | source = "key666=\"blablabla\""; | |
419 | RecordTextReader rtr4(source); | |
420 | rtr4.xfrSvcParamKeyVals(v); | |
dc593046 | 421 | BOOST_CHECK_EQUAL(v.size(), 1U); |
373914dc PL |
422 | k = v.begin()->getKey(); |
423 | BOOST_CHECK(k == SvcParam::keyFromString("key666")); | |
424 | val = v.begin()->getValue(); | |
b1a048a9 | 425 | BOOST_CHECK_EQUAL(val, "blablabla"); |
373914dc PL |
426 | |
427 | // Check the writer | |
428 | target.clear(); | |
429 | RecordTextWriter rtw2(target); | |
430 | rtw2.xfrSvcParamKeyVals(v); | |
431 | BOOST_CHECK_EQUAL(target, source); | |
b1a048a9 PL |
432 | |
433 | v.clear(); | |
434 | source = "key666=\"foo\\123 bar\""; | |
435 | RecordTextReader rtr5(source); | |
436 | rtr5.xfrSvcParamKeyVals(v); | |
437 | BOOST_CHECK_EQUAL(v.size(), 1U); | |
438 | k = v.begin()->getKey(); | |
439 | BOOST_CHECK(k == SvcParam::keyFromString("key666")); | |
440 | val = v.begin()->getValue(); | |
441 | BOOST_CHECK_EQUAL(val, "foo{ bar"); | |
442 | ||
443 | // Check the writer | |
444 | target.clear(); | |
445 | RecordTextWriter rtw3(target); | |
446 | rtw3.xfrSvcParamKeyVals(v); | |
447 | BOOST_CHECK_EQUAL("key666=\"foo{ bar\"", target); | |
448 | ||
449 | v.clear(); | |
450 | RecordTextReader rtr6("key665= blabla"); | |
451 | BOOST_CHECK_THROW(rtr6.xfrSvcParamKeyVals(v), RecordTextException); | |
452 | ||
453 | v.clear(); | |
454 | RecordTextReader rtr7("key665=bla bla"); | |
455 | BOOST_CHECK_THROW(rtr7.xfrSvcParamKeyVals(v), RecordTextException); | |
373914dc PL |
456 | } |
457 | ||
458 | BOOST_AUTO_TEST_CASE(test_xfrSvcParamKeyVals_multiple) { | |
4f254e34 | 459 | RecordTextReader rtr("key666=foobar ech=\"dG90YWxseSBib2d1cyBlY2hjb25maWcgdmFsdWU=\" ipv6hint=2001:db8::1 alpn=h2,h3 mandatory=alpn ipv4hint=192.0.2.1,192.0.2.2"); // out of order, resulting set should be in-order |
373914dc PL |
460 | set<SvcParam> v; |
461 | rtr.xfrSvcParamKeyVals(v); | |
dc593046 | 462 | BOOST_CHECK_EQUAL(v.size(), 6U); |
373914dc PL |
463 | auto vit = v.begin(); |
464 | ||
465 | // Check ordering | |
466 | for (size_t i = 0; i < v.size(); i++) { | |
467 | if (i == 0) { | |
468 | BOOST_CHECK(vit->getKey() == SvcParam::mandatory); | |
469 | } | |
470 | if (i == 1) { | |
471 | BOOST_CHECK(vit->getKey() == SvcParam::alpn); | |
472 | } | |
473 | if (i == 2) { | |
474 | BOOST_CHECK(vit->getKey() == SvcParam::ipv4hint); | |
475 | } | |
476 | if (i == 3) { | |
4f254e34 | 477 | BOOST_CHECK(vit->getKey() == SvcParam::ech); |
373914dc PL |
478 | } |
479 | if (i == 4) { | |
480 | BOOST_CHECK(vit->getKey() == SvcParam::ipv6hint); | |
481 | } | |
482 | if (i == 5) { | |
483 | BOOST_CHECK(vit->getKey() == SvcParam::keyFromString("key666")); | |
484 | } | |
485 | vit++; | |
486 | } | |
487 | ||
488 | // Check the writer | |
489 | string target; | |
490 | RecordTextWriter rtw(target); | |
491 | rtw.xfrSvcParamKeyVals(v); | |
4f254e34 | 492 | BOOST_CHECK_EQUAL(target, "mandatory=alpn alpn=h2,h3 ipv4hint=192.0.2.1,192.0.2.2 ech=\"dG90YWxseSBib2d1cyBlY2hjb25maWcgdmFsdWU=\" ipv6hint=2001:db8::1 key666=\"foobar\""); |
373914dc PL |
493 | } |
494 | ||
4f254e34 PL |
495 | BOOST_AUTO_TEST_CASE(test_xfrSvcParamKeyVals_ech) { |
496 | string source("ech=\"dG90YWxseSBib2d1cyBlY2hjb25maWcgdmFsdWU=\""); | |
373914dc PL |
497 | RecordTextReader rtr(source); |
498 | set<SvcParam> v; | |
499 | rtr.xfrSvcParamKeyVals(v); | |
dc593046 | 500 | BOOST_CHECK_EQUAL(v.size(), 1U); |
373914dc | 501 | auto k = v.begin()->getKey(); |
4f254e34 PL |
502 | BOOST_CHECK(k == SvcParam::ech); |
503 | auto val = v.begin()->getECH(); | |
373914dc PL |
504 | BOOST_CHECK_EQUAL(val, "totally bogus echconfig value"); // decoded! |
505 | ||
506 | // Check the writer | |
507 | string target; | |
508 | RecordTextWriter rtw(target); | |
509 | rtw.xfrSvcParamKeyVals(v); | |
510 | BOOST_CHECK_EQUAL(source, target); | |
76a98652 PL |
511 | |
512 | // Generic | |
513 | v.clear(); | |
514 | source = "key5=echconfig"; | |
515 | RecordTextReader rtr2(source); | |
516 | rtr2.xfrSvcParamKeyVals(v); | |
517 | BOOST_CHECK_EQUAL(v.size(), 1U); | |
518 | k = v.begin()->getKey(); | |
519 | BOOST_CHECK(k == SvcParam::ech); | |
520 | val = v.begin()->getECH(); | |
521 | BOOST_CHECK_EQUAL(val, "echconfig"); | |
373914dc PL |
522 | } |
523 | ||
786ed0ff PL |
524 | BOOST_AUTO_TEST_CASE(test_xfrNodeOrLocatorID) { |
525 | string source("0000:0000:0000:0001"); | |
526 | RecordTextReader rtr(source); | |
527 | NodeOrLocatorID v; | |
528 | rtr.xfrNodeOrLocatorID(v); | |
2c510d90 PD |
529 | BOOST_CHECK_EQUAL(v.content[0], 0); |
530 | BOOST_CHECK_EQUAL(v.content[1], 0); | |
531 | BOOST_CHECK_EQUAL(v.content[2], 0); | |
532 | BOOST_CHECK_EQUAL(v.content[3], 0); | |
533 | BOOST_CHECK_EQUAL(v.content[4], 0); | |
534 | BOOST_CHECK_EQUAL(v.content[5], 0); | |
535 | BOOST_CHECK_EQUAL(v.content[6], 0); | |
536 | BOOST_CHECK_EQUAL(v.content[7], 1); | |
786ed0ff PL |
537 | |
538 | string target; | |
539 | RecordTextWriter rtw(target); | |
540 | rtw.xfrNodeOrLocatorID(v); | |
541 | BOOST_CHECK_EQUAL(source, target); | |
542 | } | |
543 | ||
dc593046 | 544 | BOOST_AUTO_TEST_SUITE_END() |