Line data Source code
1 : // Copyright (c) 2011-2025 Made to Order Software Corp. All Rights Reserved
2 : //
3 : // https://snapwebsites.org/project/libaddr
4 : // contact@m2osw.com
5 : //
6 : // Permission is hereby granted, free of charge, to any
7 : // person obtaining a copy of this software and
8 : // associated documentation files (the "Software"), to
9 : // deal in the Software without restriction, including
10 : // without limitation the rights to use, copy, modify,
11 : // merge, publish, distribute, sublicense, and/or sell
12 : // copies of the Software, and to permit persons to whom
13 : // the Software is furnished to do so, subject to the
14 : // following conditions:
15 : //
16 : // The above copyright notice and this permission notice
17 : // shall be included in all copies or substantial
18 : // portions of the Software.
19 : //
20 : // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
21 : // ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
22 : // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
23 : // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO
24 : // EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 : // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
26 : // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
27 : // ARISING FROM, OUT OF OR IN CONNECTION WITH THE
28 : // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
29 : // SOFTWARE.
30 :
31 :
32 : /** \file
33 : * \brief Test the Address Validator.
34 : *
35 : * The advgetopt library comes with a way to validate command line options.
36 : * The validator_address class extends that feature by offering programmers
37 : * a way to validate input data as an IP address.
38 : */
39 :
40 : // addr
41 : //
42 : #include <libaddr/validator_address.h>
43 :
44 :
45 : // self
46 : //
47 : #include "catch_main.h"
48 :
49 :
50 : // last include
51 : //
52 : #include <snapdev/poison.h>
53 :
54 :
55 :
56 :
57 22 : CATCH_TEST_CASE("validator", "[validator]")
58 : {
59 22 : CATCH_START_SECTION("validator: default validation")
60 : {
61 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", advgetopt::string_list_t()));
62 :
63 1 : CATCH_REQUIRE(address_validator != nullptr);
64 1 : CATCH_REQUIRE(address_validator->name() == "address");
65 :
66 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1"));
67 3 : CATCH_REQUIRE(address_validator->validate("10.0.0.10:5434"));
68 3 : CATCH_REQUIRE_FALSE(address_validator->validate("10.0.0.10:5434/24"));
69 3 : CATCH_REQUIRE(address_validator->validate("::"));
70 3 : CATCH_REQUIRE(address_validator->validate("[::]:307"));
71 3 : CATCH_REQUIRE(address_validator->validate("f801::5"));
72 1 : }
73 22 : CATCH_END_SECTION()
74 :
75 22 : CATCH_START_SECTION("validator: allow all")
76 : {
77 1 : advgetopt::string_list_t const flags{
78 : "address=commas spaces newlines range lookup",
79 : "port=yes",
80 : "mask=address",
81 : "comment",
82 : "defaults=192.168.2.1:4040/24",
83 9 : };
84 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
85 :
86 1 : CATCH_REQUIRE(address_validator != nullptr);
87 1 : CATCH_REQUIRE(address_validator->name() == "address");
88 :
89 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1"));
90 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1\n; and comments are allowed after"));
91 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1-192.168.2.254"));
92 3 : CATCH_REQUIRE(address_validator->validate("10.0.0.10:5434"));
93 3 : CATCH_REQUIRE(address_validator->validate("10.0.0.10:5434/24"));
94 3 : CATCH_REQUIRE(address_validator->validate(":5/255.255.255.0"));
95 3 : CATCH_REQUIRE(address_validator->validate("# comment with a hash and allowed before\n:5/255.255.255.0"));
96 3 : CATCH_REQUIRE(address_validator->validate("::"));
97 3 : CATCH_REQUIRE(address_validator->validate("::1 # this is the IPv6 loopback"));
98 3 : CATCH_REQUIRE(address_validator->validate("f801::5/48"));
99 3 : CATCH_REQUIRE(address_validator->validate("f801::5/48 ; a comment at the end of the line works too"));
100 3 : CATCH_REQUIRE(address_validator->validate("")); // default address & port
101 1 : }
102 22 : CATCH_END_SECTION()
103 :
104 22 : CATCH_START_SECTION("validator: allow all (default is IPv6 here)")
105 : {
106 1 : advgetopt::string_list_t const flags{
107 : "address=commas spaces newlines range lookup",
108 : "port=yes",
109 : "mask=address",
110 : "comment",
111 : "defaults=[ff01::345a:123b]:8080/32",
112 9 : };
113 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
114 :
115 1 : CATCH_REQUIRE(address_validator != nullptr);
116 1 : CATCH_REQUIRE(address_validator->name() == "address");
117 :
118 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1"));
119 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1\n; and comments are allowed after"));
120 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1-192.168.2.254"));
121 3 : CATCH_REQUIRE(address_validator->validate("10.0.0.10:5434"));
122 3 : CATCH_REQUIRE(address_validator->validate("10.0.0.10:5434/24"));
123 3 : CATCH_REQUIRE(address_validator->validate(":5/255.255.255.0"));
124 3 : CATCH_REQUIRE(address_validator->validate("# comment with a hash and allowed before\n:5/255.255.255.0"));
125 3 : CATCH_REQUIRE(address_validator->validate("::"));
126 3 : CATCH_REQUIRE(address_validator->validate("::1 # this is the IPv6 loopback"));
127 3 : CATCH_REQUIRE(address_validator->validate("f801::5/48"));
128 3 : CATCH_REQUIRE(address_validator->validate("f801::5/48 ; a comment at the end of the line works too"));
129 3 : CATCH_REQUIRE(address_validator->validate("")); // default address & port
130 1 : }
131 22 : CATCH_END_SECTION()
132 :
133 22 : CATCH_START_SECTION("validator: prevent defaults")
134 : {
135 1 : advgetopt::string_list_t const flags{
136 : "address=required",
137 : "port=required",
138 : "defaults=yes",
139 7 : };
140 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
141 :
142 1 : CATCH_REQUIRE(address_validator != nullptr);
143 1 : CATCH_REQUIRE(address_validator->name() == "address");
144 :
145 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1:4040"));
146 3 : CATCH_REQUIRE_FALSE(address_validator->validate("192.168.1.1"));
147 3 : CATCH_REQUIRE_FALSE(address_validator->validate(":4040"));
148 3 : CATCH_REQUIRE_FALSE(address_validator->validate(""));
149 1 : }
150 22 : CATCH_END_SECTION()
151 :
152 22 : CATCH_START_SECTION("validator: default improperly uses a range")
153 : {
154 : // in Ubuntu 24.04, the errno changed
155 : //SNAP_CATCH2_NAMESPACE::push_expected_log("error: the default address \"192.168.19.1-192.168.19.254\" could not be parsed properly. Error: Invalid address in \"192.168.19.1-192.168.19.254\" error -2 -- Name or service not known (errno: 22 -- Invalid argument).\n");
156 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: the default address \"192.168.19.1-192.168.19.254\" could not be parsed properly. Error: Invalid address in \"192.168.19.1-192.168.19.254\" error -2 -- Name or service not known (errno: 6 -- No such device or address).\n");
157 1 : advgetopt::string_list_t const flags{
158 : "defaults=192.168.19.1-192.168.19.254",
159 5 : };
160 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
161 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
162 :
163 1 : CATCH_REQUIRE(address_validator != nullptr);
164 1 : CATCH_REQUIRE(address_validator->name() == "address");
165 :
166 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1:4040"));
167 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1"));
168 3 : CATCH_REQUIRE(address_validator->validate(":4040"));
169 3 : CATCH_REQUIRE(address_validator->validate(""));
170 1 : }
171 22 : CATCH_END_SECTION()
172 :
173 22 : CATCH_START_SECTION("validator: allow hash comments only")
174 : {
175 1 : advgetopt::string_list_t const flags{
176 : "address=no",
177 : "port=yes",
178 : "comment=hash",
179 7 : };
180 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
181 :
182 1 : CATCH_REQUIRE(address_validator != nullptr);
183 1 : CATCH_REQUIRE(address_validator->name() == "address");
184 :
185 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1 # this should work, right?"));
186 3 : CATCH_REQUIRE(address_validator->validate(" 192.168.3.3:401 # this should work, right?"));
187 3 : CATCH_REQUIRE_FALSE(address_validator->validate("172.17.0.10 ; however, this one fails"));
188 3 : CATCH_REQUIRE_FALSE(address_validator->validate(" 10.0.0.10:5434 ; however, this one fails"));
189 1 : }
190 22 : CATCH_END_SECTION()
191 :
192 22 : CATCH_START_SECTION("validator: invalid mask (too many values)")
193 : {
194 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: the \"mask\" option expects one of \"yes\", \"no\", or \"address\".");
195 1 : advgetopt::string_list_t const flags{
196 : "mask=one value or error",
197 5 : };
198 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
199 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
200 :
201 1 : CATCH_REQUIRE(address_validator != nullptr);
202 1 : CATCH_REQUIRE(address_validator->name() == "address");
203 :
204 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1"));
205 1 : }
206 22 : CATCH_END_SECTION()
207 :
208 22 : CATCH_START_SECTION("validator: invalid mask (undefined value)")
209 : {
210 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: value \"undefined\" is unexpected for the \"mask\" option which expects one of \"yes\", \"no\", or \"address\".");
211 1 : advgetopt::string_list_t const flags{
212 : "mask=undefined",
213 5 : };
214 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
215 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
216 :
217 1 : CATCH_REQUIRE(address_validator != nullptr);
218 1 : CATCH_REQUIRE(address_validator->name() == "address");
219 :
220 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1"));
221 1 : }
222 22 : CATCH_END_SECTION()
223 :
224 22 : CATCH_START_SECTION("validator: port expects one value")
225 : {
226 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: the port=... option expects one of \"yes\", \"no\", or \"required\".");
227 1 : advgetopt::string_list_t const flags{
228 : "port=1 2 3",
229 5 : };
230 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
231 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
232 :
233 1 : CATCH_REQUIRE(address_validator != nullptr);
234 1 : CATCH_REQUIRE(address_validator->name() == "address");
235 :
236 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1"));
237 1 : }
238 22 : CATCH_END_SECTION()
239 :
240 22 : CATCH_START_SECTION("validator: port undefined value")
241 : {
242 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: unexpected value \"undefined\" for the port=... option which expects one of \"yes\", \"no\", or \"required\".");
243 1 : advgetopt::string_list_t const flags{
244 : "port=undefined",
245 5 : };
246 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
247 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
248 :
249 1 : CATCH_REQUIRE(address_validator != nullptr);
250 1 : CATCH_REQUIRE(address_validator->name() == "address");
251 :
252 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1"));
253 1 : }
254 22 : CATCH_END_SECTION()
255 :
256 22 : CATCH_START_SECTION("validator: allow semi-colon comments only")
257 : {
258 1 : advgetopt::string_list_t const flags{
259 : "address=no",
260 : "port=yes",
261 : "comment=semicolon",
262 7 : };
263 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
264 :
265 1 : CATCH_REQUIRE(address_validator != nullptr);
266 1 : CATCH_REQUIRE(address_validator->name() == "address");
267 :
268 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1 ; this should work, right?"));
269 3 : CATCH_REQUIRE(address_validator->validate(" 192.168.3.3:401 ; this should work, right?"));
270 3 : CATCH_REQUIRE_FALSE(address_validator->validate("172.17.0.10 # however, this one fails"));
271 3 : CATCH_REQUIRE_FALSE(address_validator->validate(" 10.0.0.10:5434 # however, this one fails"));
272 1 : }
273 22 : CATCH_END_SECTION()
274 :
275 22 : CATCH_START_SECTION("validator: explicit no comments")
276 : {
277 1 : advgetopt::string_list_t const flags{
278 : "address=no",
279 : "port=yes",
280 : "comment=no",
281 7 : };
282 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
283 :
284 1 : CATCH_REQUIRE(address_validator != nullptr);
285 1 : CATCH_REQUIRE(address_validator->name() == "address");
286 :
287 3 : CATCH_REQUIRE_FALSE(address_validator->validate("192.168.1.1 ; this should fail"));
288 3 : CATCH_REQUIRE_FALSE(address_validator->validate(" 192.168.3.3:401 ; this should fail"));
289 3 : CATCH_REQUIRE_FALSE(address_validator->validate("172.17.0.10 # this should fail"));
290 3 : CATCH_REQUIRE_FALSE(address_validator->validate(" 10.0.0.10:5434 # this should fail"));
291 1 : }
292 22 : CATCH_END_SECTION()
293 :
294 22 : CATCH_START_SECTION("validator: explicit comments (i.e. =yes)")
295 : {
296 1 : advgetopt::string_list_t const flags{
297 : "address=no",
298 : "port=yes",
299 : "comment=yes",
300 7 : };
301 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
302 :
303 1 : CATCH_REQUIRE(address_validator != nullptr);
304 1 : CATCH_REQUIRE(address_validator->name() == "address");
305 :
306 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1 ; this works"));
307 3 : CATCH_REQUIRE(address_validator->validate(" 192.168.3.3:401 ; this works"));
308 3 : CATCH_REQUIRE(address_validator->validate("172.17.0.10 # this works"));
309 3 : CATCH_REQUIRE(address_validator->validate(" 10.0.0.10:5434 # this works"));
310 1 : }
311 22 : CATCH_END_SECTION()
312 :
313 22 : CATCH_START_SECTION("validator: explicit all comments supported (i.e. =all)")
314 : {
315 1 : advgetopt::string_list_t const flags{
316 : "address=no",
317 : "port=yes",
318 : "comment=all",
319 7 : };
320 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
321 :
322 1 : CATCH_REQUIRE(address_validator != nullptr);
323 1 : CATCH_REQUIRE(address_validator->name() == "address");
324 :
325 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1 ; this works"));
326 3 : CATCH_REQUIRE(address_validator->validate(" 192.168.3.3:401 ; this works"));
327 3 : CATCH_REQUIRE(address_validator->validate("172.17.0.10 # this works"));
328 3 : CATCH_REQUIRE(address_validator->validate(" 10.0.0.10:5434 # this works"));
329 1 : }
330 22 : CATCH_END_SECTION()
331 :
332 22 : CATCH_START_SECTION("validator: invalid comment=... value")
333 : {
334 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: value \"unsupported\" is unexpected for the \"comment\" option which expects one of \"yes\", \"all\", \"hash\", \"semicolon\" or \"no\".");
335 1 : advgetopt::string_list_t const flags{
336 : "address=no",
337 : "port=yes",
338 : "comment=unsupported",
339 7 : };
340 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
341 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
342 :
343 1 : CATCH_REQUIRE(address_validator != nullptr);
344 1 : CATCH_REQUIRE(address_validator->name() == "address");
345 :
346 3 : CATCH_REQUIRE(address_validator->validate(" 192.168.1.1 "));
347 3 : CATCH_REQUIRE_FALSE(address_validator->validate(" 192.168.3.3:401 ; this fails"));
348 3 : CATCH_REQUIRE(address_validator->validate("172.17.0.10"));
349 3 : CATCH_REQUIRE_FALSE(address_validator->validate(" 10.0.0.10:5434 # this fails"));
350 1 : }
351 22 : CATCH_END_SECTION()
352 :
353 22 : CATCH_START_SECTION("validator: invalid comment=... with multiple values")
354 : {
355 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: the \"comment\" option expects one of \"yes\", \"all\", \"hash\", \"semicolon\" or \"no\".");
356 1 : advgetopt::string_list_t const flags{
357 : "address=no",
358 : "port=yes",
359 : "comment=hash semicolon",
360 7 : };
361 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
362 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
363 :
364 1 : CATCH_REQUIRE(address_validator != nullptr);
365 1 : CATCH_REQUIRE(address_validator->name() == "address");
366 :
367 3 : CATCH_REQUIRE(address_validator->validate(" 192.168.1.1 "));
368 3 : CATCH_REQUIRE_FALSE(address_validator->validate(" 192.168.3.3:401 ; this fails"));
369 3 : CATCH_REQUIRE(address_validator->validate("172.17.0.10"));
370 3 : CATCH_REQUIRE_FALSE(address_validator->validate(" 10.0.0.10:5434 # this fails"));
371 1 : }
372 22 : CATCH_END_SECTION()
373 :
374 22 : CATCH_START_SECTION("validator: allow \"nothing\"")
375 : {
376 1 : advgetopt::string_list_t const flags{
377 : "address=no",
378 : "port=yes",
379 6 : };
380 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
381 :
382 1 : CATCH_REQUIRE(address_validator != nullptr);
383 1 : CATCH_REQUIRE(address_validator->name() == "address");
384 :
385 3 : CATCH_REQUIRE(address_validator->validate("192.168.1.1"));
386 3 : CATCH_REQUIRE(address_validator->validate("10.0.0.10:5434"));
387 3 : CATCH_REQUIRE(address_validator->validate("::"));
388 3 : CATCH_REQUIRE(address_validator->validate("f801::5"));
389 1 : }
390 22 : CATCH_END_SECTION()
391 :
392 22 : CATCH_START_SECTION("validator: unknown option")
393 : {
394 3 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: \"coment=\" is not a known option for the address validator.");
395 1 : advgetopt::string_list_t const flags{
396 : "", // ignored
397 : "coment=", // "comment" mispelled
398 : "", // ignored
399 7 : };
400 3 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
401 1 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
402 :
403 1 : CATCH_REQUIRE(address_validator != nullptr);
404 1 : CATCH_REQUIRE(address_validator->name() == "address");
405 :
406 3 : CATCH_REQUIRE(address_validator->validate("5.6.7.8"));
407 1 : }
408 22 : CATCH_END_SECTION()
409 :
410 22 : CATCH_START_SECTION("validator: address=no prevents any other option")
411 : {
412 1 : std::vector<std::string> options = {
413 : "commas",
414 : "lookup",
415 : "newlines",
416 : "range",
417 : "required",
418 : "spaces",
419 : "yes",
420 3 : };
421 8 : for(auto const & opt : options)
422 : {
423 21 : std::string address("address=");
424 7 : if((rand() & 1) == 0)
425 : {
426 4 : address += "no " + opt;
427 : }
428 : else
429 : {
430 3 : address += opt + " no";
431 : }
432 7 : advgetopt::string_list_t const flags{
433 : address,
434 : "port=yes",
435 42 : };
436 21 : SNAP_CATCH2_NAMESPACE::push_expected_log("error: the \"no\" option in the address=... option must be used by itself.");
437 21 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
438 7 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
439 :
440 7 : CATCH_REQUIRE(address_validator != nullptr);
441 7 : CATCH_REQUIRE(address_validator->name() == "address");
442 :
443 21 : CATCH_REQUIRE(address_validator->validate("192.168.1.1"));
444 21 : CATCH_REQUIRE(address_validator->validate("10.0.0.10:5434"));
445 21 : CATCH_REQUIRE(address_validator->validate("::"));
446 21 : CATCH_REQUIRE(address_validator->validate("f801::5"));
447 7 : }
448 1 : }
449 22 : CATCH_END_SECTION()
450 :
451 22 : CATCH_START_SECTION("validator: address=<invalid flag name>")
452 : {
453 : // first character of each supported/valid flag to hit that break;
454 : // statement in the address sub-switch()
455 : //
456 1 : std::vector<std::string> options = {
457 : "console",
458 : "loop",
459 : "now",
460 : "real",
461 : "slice",
462 : "yield",
463 : "zero", // plus one that has no case ...
464 3 : };
465 8 : for(auto const & opt : options)
466 : {
467 7 : advgetopt::string_list_t const flags{
468 14 : "address=" + opt + " required",
469 : "port=yes",
470 42 : };
471 14 : SNAP_CATCH2_NAMESPACE::push_expected_log(
472 : "error: the \""
473 14 : + opt
474 28 : + "\" parameter is not understood by the \"address\" options.");
475 21 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
476 7 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
477 :
478 7 : CATCH_REQUIRE(address_validator != nullptr);
479 7 : CATCH_REQUIRE(address_validator->name() == "address");
480 :
481 21 : CATCH_REQUIRE(address_validator->validate("192.168.1.1"));
482 21 : CATCH_REQUIRE(address_validator->validate("10.0.0.10:5434"));
483 21 : CATCH_REQUIRE(address_validator->validate("::"));
484 21 : CATCH_REQUIRE(address_validator->validate("f801::5"));
485 7 : }
486 1 : }
487 22 : CATCH_END_SECTION()
488 :
489 22 : CATCH_START_SECTION("validator: address=<required vs yes>")
490 : {
491 : // first character of each supported/valid flag to hit that break;
492 : // statement in the address sub-switch()
493 : //
494 1 : std::vector<std::string> options = {
495 : "address=required yes",
496 : "address=yes required",
497 3 : };
498 3 : for(auto const & opt : options)
499 : {
500 2 : advgetopt::string_list_t const flags{
501 : opt,
502 : "port=yes",
503 12 : };
504 6 : SNAP_CATCH2_NAMESPACE::push_expected_log(
505 : "error: the \"yes\" and \"required\" options are mutually exclusive, use one or the other (or none, which defaults to \"yes\").");
506 6 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
507 2 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
508 :
509 2 : CATCH_REQUIRE(address_validator != nullptr);
510 2 : CATCH_REQUIRE(address_validator->name() == "address");
511 :
512 6 : CATCH_REQUIRE(address_validator->validate("192.168.1.1"));
513 6 : CATCH_REQUIRE(address_validator->validate("10.0.0.10:5434"));
514 6 : CATCH_REQUIRE(address_validator->validate("::"));
515 6 : CATCH_REQUIRE(address_validator->validate("f801::5"));
516 2 : }
517 1 : }
518 22 : CATCH_END_SECTION()
519 :
520 22 : CATCH_START_SECTION("validator: <invalid parameter name>=<whatever>")
521 : {
522 : // first character of each supported/valid flag to hit that break;
523 : // statement in the address sub-switch()
524 : //
525 1 : std::vector<std::string> parameters = {
526 : "audio",
527 : "call",
528 : "drawing",
529 : "mug",
530 : "paint",
531 : "zero", // plus one that has no case ...
532 3 : };
533 7 : for(auto const & p : parameters)
534 : {
535 6 : advgetopt::string_list_t const flags{
536 : p + "=yes",
537 24 : };
538 12 : SNAP_CATCH2_NAMESPACE::push_expected_log(
539 : "error: \""
540 12 : + p
541 24 : + "=yes\" is not a known option for the address validator.");
542 18 : advgetopt::validator::pointer_t address_validator(advgetopt::validator::create("address", flags));
543 6 : SNAP_CATCH2_NAMESPACE::expected_logs_stack_is_empty();
544 :
545 6 : CATCH_REQUIRE(address_validator != nullptr);
546 6 : CATCH_REQUIRE(address_validator->name() == "address");
547 :
548 18 : CATCH_REQUIRE(address_validator->validate("192.168.1.1"));
549 18 : CATCH_REQUIRE(address_validator->validate("10.0.0.10:5434"));
550 18 : CATCH_REQUIRE(address_validator->validate("::"));
551 18 : CATCH_REQUIRE(address_validator->validate("f801::5"));
552 6 : }
553 1 : }
554 22 : CATCH_END_SECTION()
555 134 : }
556 :
557 :
558 :
559 : // vim: ts=4 sw=4 et
|