LCOV - code coverage report
Current view: top level - tests - catch_validator.cpp (source / functions) Coverage Total Hit
Test: coverage.info Lines: 100.0 % 316 316
Test Date: 2025-04-18 08:03:11 Functions: 100.0 % 1 1
Legend: Lines: hit not hit

            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
        

Generated by: LCOV version 2.0-1

Snap C++ | List of projects | List of versions