LCOV - code coverage report
Current view: top level - tests - utils.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 385 385 100.0 %
Date: 2021-09-08 13:54:31 Functions: 8 8 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :  * License:
       3             :  *    Copyright (c) 2006-2021  Made to Order Software Corp.  All Rights Reserved
       4             :  *
       5             :  *    https://snapwebsites.org/
       6             :  *    contact@m2osw.com
       7             :  *
       8             :  *    This program is free software; you can redistribute it and/or modify
       9             :  *    it under the terms of the GNU General Public License as published by
      10             :  *    the Free Software Foundation; either version 2 of the License, or
      11             :  *    (at your option) any later version.
      12             :  *
      13             :  *    This program is distributed in the hope that it will be useful,
      14             :  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
      15             :  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      16             :  *    GNU General Public License for more details.
      17             :  *
      18             :  *    You should have received a copy of the GNU General Public License along
      19             :  *    with this program; if not, write to the Free Software Foundation, Inc.,
      20             :  *    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
      21             :  *
      22             :  * Authors:
      23             :  *    Alexis Wilke   alexis@m2osw.com
      24             :  */
      25             : 
      26             : // self
      27             : //
      28             : #include    "main.h"
      29             : 
      30             : 
      31             : // advgetopt lib
      32             : //
      33             : #include    <advgetopt/conf_file.h>
      34             : #include    <advgetopt/utils.h>
      35             : 
      36             : 
      37             : // snapdev lib
      38             : //
      39             : #include    <snapdev/safe_setenv.h>
      40             : 
      41             : 
      42             : // C++ lib
      43             : //
      44             : #include    <fstream>
      45             : 
      46             : 
      47             : // last include
      48             : //
      49             : #include    <snapdev/poison.h>
      50             : 
      51             : 
      52             : 
      53          99 : int shuffle_rand(int n)
      54             : {
      55          99 :     return rand() % n;
      56             : }
      57             : 
      58             : 
      59             : 
      60           4 : CATCH_TEST_CASE("utils_unquote", "[utils][valid]")
      61             : {
      62           4 :     CATCH_START_SECTION("Unquote, default pairs")
      63           1 :         CATCH_REQUIRE(advgetopt::unquote("") == "");
      64           1 :         CATCH_REQUIRE(advgetopt::unquote("a") == "a");
      65           1 :         CATCH_REQUIRE(advgetopt::unquote("ab") == "ab");
      66           1 :         CATCH_REQUIRE(advgetopt::unquote("abc") == "abc");
      67             : 
      68           1 :         CATCH_REQUIRE(advgetopt::unquote("''") == "");
      69           1 :         CATCH_REQUIRE(advgetopt::unquote("'a'") == "a");
      70           1 :         CATCH_REQUIRE(advgetopt::unquote("'ab'") == "ab");
      71           1 :         CATCH_REQUIRE(advgetopt::unquote("'abc'") == "abc");
      72           1 :         CATCH_REQUIRE(advgetopt::unquote("'abcd'") == "abcd");
      73             : 
      74           1 :         CATCH_REQUIRE(advgetopt::unquote("\"\"") == "");
      75           1 :         CATCH_REQUIRE(advgetopt::unquote("\"a\"") == "a");
      76           1 :         CATCH_REQUIRE(advgetopt::unquote("\"ab\"") == "ab");
      77           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abc\"") == "abc");
      78           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abcd\"") == "abcd");
      79             : 
      80           1 :         CATCH_REQUIRE(advgetopt::unquote("\"'") == "\"'");
      81           1 :         CATCH_REQUIRE(advgetopt::unquote("\"a'") == "\"a'");
      82           1 :         CATCH_REQUIRE(advgetopt::unquote("\"ab'") == "\"ab'");
      83           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abc'") == "\"abc'");
      84           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abcd'") == "\"abcd'");
      85             : 
      86           1 :         CATCH_REQUIRE(advgetopt::unquote("'\"") == "'\"");
      87           1 :         CATCH_REQUIRE(advgetopt::unquote("'a\"") == "'a\"");
      88           1 :         CATCH_REQUIRE(advgetopt::unquote("'ab\"") == "'ab\"");
      89           1 :         CATCH_REQUIRE(advgetopt::unquote("'abc\"") == "'abc\"");
      90           1 :         CATCH_REQUIRE(advgetopt::unquote("'abcd\"") == "'abcd\"");
      91             : 
      92           1 :         CATCH_REQUIRE(advgetopt::unquote("\"") == "\"");
      93           1 :         CATCH_REQUIRE(advgetopt::unquote("\"a") == "\"a");
      94           1 :         CATCH_REQUIRE(advgetopt::unquote("\"ab") == "\"ab");
      95           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abc") == "\"abc");
      96           1 :         CATCH_REQUIRE(advgetopt::unquote("\"abcd") == "\"abcd");
      97             : 
      98           1 :         CATCH_REQUIRE(advgetopt::unquote("'") == "'");
      99           1 :         CATCH_REQUIRE(advgetopt::unquote("'a") == "'a");
     100           1 :         CATCH_REQUIRE(advgetopt::unquote("'ab") == "'ab");
     101           1 :         CATCH_REQUIRE(advgetopt::unquote("'abc") == "'abc");
     102           1 :         CATCH_REQUIRE(advgetopt::unquote("'abcd") == "'abcd");
     103             : 
     104           1 :         CATCH_REQUIRE(advgetopt::unquote("'") == "'");
     105           1 :         CATCH_REQUIRE(advgetopt::unquote("a'") == "a'");
     106           1 :         CATCH_REQUIRE(advgetopt::unquote("ab'") == "ab'");
     107           1 :         CATCH_REQUIRE(advgetopt::unquote("abc'") == "abc'");
     108           1 :         CATCH_REQUIRE(advgetopt::unquote("abcd'") == "abcd'");
     109             : 
     110           1 :         CATCH_REQUIRE(advgetopt::unquote("\"") == "\"");
     111           1 :         CATCH_REQUIRE(advgetopt::unquote("a\"") == "a\"");
     112           1 :         CATCH_REQUIRE(advgetopt::unquote("ab\"") == "ab\"");
     113           1 :         CATCH_REQUIRE(advgetopt::unquote("abc\"") == "abc\"");
     114           1 :         CATCH_REQUIRE(advgetopt::unquote("abcd\"") == "abcd\"");
     115             :     CATCH_END_SECTION()
     116             : 
     117           4 :     CATCH_START_SECTION("Unquote, brackets")
     118           1 :         CATCH_REQUIRE(advgetopt::unquote("", "[]<>{}") == "");
     119           1 :         CATCH_REQUIRE(advgetopt::unquote("a", "[]<>{}") == "a");
     120           1 :         CATCH_REQUIRE(advgetopt::unquote("ab", "[]<>{}") == "ab");
     121           1 :         CATCH_REQUIRE(advgetopt::unquote("abc", "[]<>{}") == "abc");
     122             : 
     123           1 :         CATCH_REQUIRE(advgetopt::unquote("{}", "[]<>{}") == "");
     124           1 :         CATCH_REQUIRE(advgetopt::unquote("{a}", "[]<>{}") == "a");
     125           1 :         CATCH_REQUIRE(advgetopt::unquote("{ab}", "[]<>{}") == "ab");
     126           1 :         CATCH_REQUIRE(advgetopt::unquote("{abc}", "[]<>{}") == "abc");
     127           1 :         CATCH_REQUIRE(advgetopt::unquote("{abcd}", "[]<>{}") == "abcd");
     128             : 
     129           1 :         CATCH_REQUIRE(advgetopt::unquote("[]", "[]<>{}") == "");
     130           1 :         CATCH_REQUIRE(advgetopt::unquote("[a]", "[]<>{}") == "a");
     131           1 :         CATCH_REQUIRE(advgetopt::unquote("[ab]", "[]<>{}") == "ab");
     132           1 :         CATCH_REQUIRE(advgetopt::unquote("[abc]", "[]<>{}") == "abc");
     133           1 :         CATCH_REQUIRE(advgetopt::unquote("[abcd]", "[]<>{}") == "abcd");
     134             : 
     135           1 :         CATCH_REQUIRE(advgetopt::unquote("<>", "[]<>{}") == "");
     136           1 :         CATCH_REQUIRE(advgetopt::unquote("<a>", "[]<>{}") == "a");
     137           1 :         CATCH_REQUIRE(advgetopt::unquote("<ab>", "[]<>{}") == "ab");
     138           1 :         CATCH_REQUIRE(advgetopt::unquote("<abc>", "[]<>{}") == "abc");
     139           1 :         CATCH_REQUIRE(advgetopt::unquote("<abcd>", "[]<>{}") == "abcd");
     140             : 
     141           1 :         CATCH_REQUIRE(advgetopt::unquote("[}", "[]<>{}") == "[}");
     142           1 :         CATCH_REQUIRE(advgetopt::unquote("[a}", "[]<>{}") == "[a}");
     143           1 :         CATCH_REQUIRE(advgetopt::unquote("[ab}", "[]<>{}") == "[ab}");
     144           1 :         CATCH_REQUIRE(advgetopt::unquote("[abc}", "[]<>{}") == "[abc}");
     145           1 :         CATCH_REQUIRE(advgetopt::unquote("[abcd}", "[]<>{}") == "[abcd}");
     146             : 
     147           1 :         CATCH_REQUIRE(advgetopt::unquote("[>", "[]<>{}") == "[>");
     148           1 :         CATCH_REQUIRE(advgetopt::unquote("[a>", "[]<>{}") == "[a>");
     149           1 :         CATCH_REQUIRE(advgetopt::unquote("[ab>", "[]<>{}") == "[ab>");
     150           1 :         CATCH_REQUIRE(advgetopt::unquote("[abc>", "[]<>{}") == "[abc>");
     151           1 :         CATCH_REQUIRE(advgetopt::unquote("[abcd>", "[]<>{}") == "[abcd>");
     152             : 
     153           1 :         CATCH_REQUIRE(advgetopt::unquote("'\"", "[]<>{}") == "'\"");
     154           1 :         CATCH_REQUIRE(advgetopt::unquote("'a\"", "[]<>{}") == "'a\"");
     155           1 :         CATCH_REQUIRE(advgetopt::unquote("'ab\"", "[]<>{}") == "'ab\"");
     156           1 :         CATCH_REQUIRE(advgetopt::unquote("'abc\"", "[]<>{}") == "'abc\"");
     157           1 :         CATCH_REQUIRE(advgetopt::unquote("'abcd\"", "[]<>{}") == "'abcd\"");
     158             : 
     159           1 :         CATCH_REQUIRE(advgetopt::unquote("[", "[]<>{}") == "[");
     160           1 :         CATCH_REQUIRE(advgetopt::unquote("[a", "[]<>{}") == "[a");
     161           1 :         CATCH_REQUIRE(advgetopt::unquote("[ab", "[]<>{}") == "[ab");
     162           1 :         CATCH_REQUIRE(advgetopt::unquote("[abc", "[]<>{}") == "[abc");
     163           1 :         CATCH_REQUIRE(advgetopt::unquote("[abcd", "[]<>{}") == "[abcd");
     164             : 
     165           1 :         CATCH_REQUIRE(advgetopt::unquote("{", "[]<>{}") == "{");
     166           1 :         CATCH_REQUIRE(advgetopt::unquote("{a", "[]<>{}") == "{a");
     167           1 :         CATCH_REQUIRE(advgetopt::unquote("{ab", "[]<>{}") == "{ab");
     168           1 :         CATCH_REQUIRE(advgetopt::unquote("{abc", "[]<>{}") == "{abc");
     169           1 :         CATCH_REQUIRE(advgetopt::unquote("{abcd", "[]<>{}") == "{abcd");
     170             : 
     171           1 :         CATCH_REQUIRE(advgetopt::unquote("<", "[]<>{}") == "<");
     172           1 :         CATCH_REQUIRE(advgetopt::unquote("<a", "[]<>{}") == "<a");
     173           1 :         CATCH_REQUIRE(advgetopt::unquote("<ab", "[]<>{}") == "<ab");
     174           1 :         CATCH_REQUIRE(advgetopt::unquote("<abc", "[]<>{}") == "<abc");
     175           1 :         CATCH_REQUIRE(advgetopt::unquote("<abcd", "[]<>{}") == "<abcd");
     176             : 
     177           1 :         CATCH_REQUIRE(advgetopt::unquote("}", "[]<>{}") == "}");
     178           1 :         CATCH_REQUIRE(advgetopt::unquote("a}", "[]<>{}") == "a}");
     179           1 :         CATCH_REQUIRE(advgetopt::unquote("ab}", "[]<>{}") == "ab}");
     180           1 :         CATCH_REQUIRE(advgetopt::unquote("abc}", "[]<>{}") == "abc}");
     181           1 :         CATCH_REQUIRE(advgetopt::unquote("abcd}", "[]<>{}") == "abcd}");
     182             : 
     183           1 :         CATCH_REQUIRE(advgetopt::unquote("]", "[]<>{}") == "]");
     184           1 :         CATCH_REQUIRE(advgetopt::unquote("a]", "[]<>{}") == "a]");
     185           1 :         CATCH_REQUIRE(advgetopt::unquote("ab]", "[]<>{}") == "ab]");
     186           1 :         CATCH_REQUIRE(advgetopt::unquote("abc]", "[]<>{}") == "abc]");
     187           1 :         CATCH_REQUIRE(advgetopt::unquote("abcd]", "[]<>{}") == "abcd]");
     188             : 
     189           1 :         CATCH_REQUIRE(advgetopt::unquote(">", "[]<>{}") == ">");
     190           1 :         CATCH_REQUIRE(advgetopt::unquote("a>", "[]<>{}") == "a>");
     191           1 :         CATCH_REQUIRE(advgetopt::unquote("ab>", "[]<>{}") == "ab>");
     192           1 :         CATCH_REQUIRE(advgetopt::unquote("abc>", "[]<>{}") == "abc>");
     193           1 :         CATCH_REQUIRE(advgetopt::unquote("abcd>", "[]<>{}") == "abcd>");
     194             :     CATCH_END_SECTION()
     195           2 : }
     196             : 
     197             : 
     198             : 
     199             : 
     200          13 : CATCH_TEST_CASE("utils_split", "[utils][valid]")
     201             : {
     202          22 :     CATCH_START_SECTION("Split three words")
     203           2 :         advgetopt::string_list_t result;
     204           2 :         advgetopt::split_string("test with spaces"
     205             :                               , result
     206           1 :                               , {" "});
     207           1 :         CATCH_REQUIRE(result.size() == 3);
     208           1 :         CATCH_REQUIRE(result[0] == "test");
     209           1 :         CATCH_REQUIRE(result[1] == "with");
     210           1 :         CATCH_REQUIRE(result[2] == "spaces");
     211             :     CATCH_END_SECTION()
     212             : 
     213          22 :     CATCH_START_SECTION("Split three words, one with single quotes")
     214           2 :         advgetopt::string_list_t result;
     215           2 :         advgetopt::split_string("test 'with quotes and' spaces"
     216             :                               , result
     217           1 :                               , {" "});
     218           1 :         CATCH_REQUIRE(result.size() == 3);
     219           1 :         CATCH_REQUIRE(result[0] == "test");
     220           1 :         CATCH_REQUIRE(result[1] == "with quotes and");
     221           1 :         CATCH_REQUIRE(result[2] == "spaces");
     222             :     CATCH_END_SECTION()
     223             : 
     224          22 :     CATCH_START_SECTION("Split three words, one with double quotes")
     225           2 :         advgetopt::string_list_t result;
     226           2 :         advgetopt::split_string("test \"with quotes and\" spaces"
     227             :                               , result
     228           1 :                               , {" "});
     229           1 :         CATCH_REQUIRE(result.size() == 3);
     230           1 :         CATCH_REQUIRE(result[0] == "test");
     231           1 :         CATCH_REQUIRE(result[1] == "with quotes and");
     232           1 :         CATCH_REQUIRE(result[2] == "spaces");
     233             :     CATCH_END_SECTION()
     234             : 
     235          22 :     CATCH_START_SECTION("Split three words, one with single quotes but no spaces")
     236           2 :         advgetopt::string_list_t result;
     237           2 :         advgetopt::split_string("test'with quotes and'nospaces"
     238             :                               , result
     239           1 :                               , {" "});
     240           1 :         CATCH_REQUIRE(result.size() == 3);
     241           1 :         CATCH_REQUIRE(result[0] == "test");
     242           1 :         CATCH_REQUIRE(result[1] == "with quotes and");
     243           1 :         CATCH_REQUIRE(result[2] == "nospaces");
     244             :     CATCH_END_SECTION()
     245             : 
     246          22 :     CATCH_START_SECTION("Split three words, one with double quotes but no spaces")
     247           2 :         advgetopt::string_list_t result;
     248           2 :         advgetopt::split_string("test\"with quotes and\"nospaces"
     249             :                               , result
     250           1 :                               , {" "});
     251           1 :         CATCH_REQUIRE(result.size() == 3);
     252           1 :         CATCH_REQUIRE(result[0] == "test");
     253           1 :         CATCH_REQUIRE(result[1] == "with quotes and");
     254           1 :         CATCH_REQUIRE(result[2] == "nospaces");
     255             :     CATCH_END_SECTION()
     256             : 
     257          22 :     CATCH_START_SECTION("Split five words, four separators")
     258           2 :         advgetopt::string_list_t result;
     259           5 :         advgetopt::split_string("test,with quite|many;separators"
     260             :                               , result
     261           4 :                               , {" ",",","|",";"});
     262           1 :         CATCH_REQUIRE(result.size() == 5);
     263           1 :         CATCH_REQUIRE(result[0] == "test");
     264           1 :         CATCH_REQUIRE(result[1] == "with");
     265           1 :         CATCH_REQUIRE(result[2] == "quite");
     266           1 :         CATCH_REQUIRE(result[3] == "many");
     267           1 :         CATCH_REQUIRE(result[4] == "separators");
     268             :     CATCH_END_SECTION()
     269             : 
     270          22 :     CATCH_START_SECTION("Split five words, multiple/repeated separators")
     271           2 :         advgetopt::string_list_t result;
     272           5 :         advgetopt::split_string("test, with quite|||many ; separators"
     273             :                               , result
     274           4 :                               , {" ",",","|",";"});
     275           1 :         CATCH_REQUIRE(result.size() == 5);
     276           1 :         CATCH_REQUIRE(result[0] == "test");
     277           1 :         CATCH_REQUIRE(result[1] == "with");
     278           1 :         CATCH_REQUIRE(result[2] == "quite");
     279           1 :         CATCH_REQUIRE(result[3] == "many");
     280           1 :         CATCH_REQUIRE(result[4] == "separators");
     281             :     CATCH_END_SECTION()
     282             : 
     283          22 :     CATCH_START_SECTION("Split five words, and empty entries")
     284           2 :         advgetopt::string_list_t result;
     285           5 :         advgetopt::split_string("|||test, with quite\"\"many ; ''separators''"
     286             :                               , result
     287           4 :                               , {" ",",","|",";"});
     288           1 :         CATCH_REQUIRE(result.size() == 5);
     289           1 :         CATCH_REQUIRE(result[0] == "test");
     290           1 :         CATCH_REQUIRE(result[1] == "with");
     291           1 :         CATCH_REQUIRE(result[2] == "quite");
     292           1 :         CATCH_REQUIRE(result[3] == "many");
     293           1 :         CATCH_REQUIRE(result[4] == "separators");
     294             :     CATCH_END_SECTION()
     295             : 
     296          22 :     CATCH_START_SECTION("Split five words, start/end with separator")
     297           2 :         advgetopt::string_list_t result;
     298           2 :         advgetopt::split_string("|start|and|end|with|separator|"
     299             :                               , result
     300           1 :                               , {"|"});
     301           1 :         CATCH_REQUIRE(result.size() == 5);
     302           1 :         CATCH_REQUIRE(result[0] == "start");
     303           1 :         CATCH_REQUIRE(result[1] == "and");
     304           1 :         CATCH_REQUIRE(result[2] == "end");
     305           1 :         CATCH_REQUIRE(result[3] == "with");
     306           1 :         CATCH_REQUIRE(result[4] == "separator");
     307             :     CATCH_END_SECTION()
     308             : 
     309          22 :     CATCH_START_SECTION("Split five words, unclosed double quote")
     310           2 :         advgetopt::string_list_t result;
     311           2 :         advgetopt::split_string("\"unclosed quote|mark"
     312             :                               , result
     313           1 :                               , {"|"});
     314           1 :         CATCH_REQUIRE(result.size() == 1);
     315           1 :         CATCH_REQUIRE(result[0] == "unclosed quote|mark");
     316             :     CATCH_END_SECTION()
     317             : 
     318          22 :     CATCH_START_SECTION("Split five words, unclosed single quote")
     319           2 :         advgetopt::string_list_t result;
     320           3 :         advgetopt::split_string("here is an \"unclosed quote|mark"
     321             :                               , result
     322           2 :                               , {"|"," "});
     323             :         //CATCH_REQUIRE(result.size() == 4);
     324           1 :         CATCH_REQUIRE(result[0] == "here");
     325           1 :         CATCH_REQUIRE(result[1] == "is");
     326           1 :         CATCH_REQUIRE(result[2] == "an");
     327           1 :         CATCH_REQUIRE(result[3] == "unclosed quote|mark");
     328             :     CATCH_END_SECTION()
     329          11 : }
     330             : 
     331             : 
     332             : 
     333             : 
     334           6 : CATCH_TEST_CASE("utils_insert_group_name", "[utils][valid]")
     335             : {
     336           8 :     CATCH_START_SECTION("Full insert")
     337             :         // CONFIG FILE HAS NO EXTENSION
     338             :         {
     339           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     340             :                               "/this/is/a/path"
     341             :                             , "group-name"
     342           2 :                             , "project-name"));
     343           1 :             CATCH_REQUIRE(fullname.size() == 1);
     344           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-path");
     345             :         }
     346             : 
     347             :         {
     348           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     349             :                               "/this/is/a/path"
     350             :                             , "group-name"
     351           2 :                             , ""));
     352           1 :             CATCH_REQUIRE(fullname.size() == 1);
     353           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-path");
     354             :         }
     355             : 
     356             :         {
     357           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     358             :                               "/this/is/a/path"
     359             :                             , "group-name"
     360           2 :                             , nullptr));
     361           1 :             CATCH_REQUIRE(fullname.size() == 1);
     362           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-path");
     363             :         }
     364             : 
     365             :         {
     366           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     367             :                               "/this/is/a/path"
     368             :                             , ""
     369           2 :                             , "project-name"));
     370           1 :             CATCH_REQUIRE(fullname.size() == 1);
     371           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-path");
     372             :         }
     373             : 
     374             :         {
     375           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     376             :                               "/this/is/a/path"
     377             :                             , nullptr
     378           2 :                             , "project-name"));
     379           1 :             CATCH_REQUIRE(fullname.size() == 1);
     380           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-path");
     381             :         }
     382             : 
     383             :         // CONFIG FILE HAS EXTENSION
     384             :         {
     385           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     386             :                               "/this/is/a/basename.ext"
     387             :                             , "group-name"
     388           2 :                             , "project-name"));
     389           1 :             CATCH_REQUIRE(fullname.size() == 1);
     390           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-basename.ext");
     391             :         }
     392             : 
     393             :         {
     394           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     395             :                               "/this/is/a/basename.ext"
     396             :                             , "group-name"
     397           2 :                             , ""));
     398           1 :             CATCH_REQUIRE(fullname.size() == 1);
     399           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-basename.ext");
     400             :         }
     401             : 
     402             :         {
     403           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     404             :                               "/this/is/a/basename.ext"
     405             :                             , "group-name"
     406           2 :                             , nullptr));
     407           1 :             CATCH_REQUIRE(fullname.size() == 1);
     408           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/group-name.d/50-basename.ext");
     409             :         }
     410             : 
     411             :         {
     412           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     413             :                               "/this/is/a/basename.ext"
     414             :                             , ""
     415           2 :                             , "project-name"));
     416           1 :             CATCH_REQUIRE(fullname.size() == 1);
     417           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-basename.ext");
     418             :         }
     419             : 
     420             :         {
     421           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     422             :                               "/this/is/a/basename.ext"
     423             :                             , nullptr
     424           2 :                             , "project-name"));
     425           1 :             CATCH_REQUIRE(fullname.size() == 1);
     426           1 :             CATCH_REQUIRE(fullname[0] == "/this/is/a/project-name.d/50-basename.ext");
     427             :         }
     428             :     CATCH_END_SECTION()
     429             : 
     430           8 :     CATCH_START_SECTION("Empty cases")
     431             :         {
     432           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     433             :                               "/this/is/a/path"
     434             :                             , nullptr
     435           2 :                             , nullptr));
     436           1 :             CATCH_REQUIRE(fullname.empty());
     437             :         }
     438             : 
     439             :         {
     440           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     441             :                               "/this/is/a/path"
     442             :                             , nullptr
     443           2 :                             , ""));
     444           1 :             CATCH_REQUIRE(fullname.empty());
     445             :         }
     446             : 
     447             :         {
     448           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     449             :                               "/this/is/a/path"
     450             :                             , ""
     451           2 :                             , nullptr));
     452           1 :             CATCH_REQUIRE(fullname.empty());
     453             :         }
     454             : 
     455             :         {
     456           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     457             :                               "/this/is/a/path"
     458             :                             , ""
     459           2 :                             , ""));
     460           1 :             CATCH_REQUIRE(fullname.empty());
     461             :         }
     462             : 
     463             :         {
     464           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     465             :                               ""
     466             :                             , "group-name"
     467           2 :                             , "project-name"));
     468           1 :             CATCH_REQUIRE(fullname.empty());
     469             :         }
     470             : 
     471             :         {
     472           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     473             :                               ""
     474             :                             , ""
     475           2 :                             , "project-name"));
     476           1 :             CATCH_REQUIRE(fullname.empty());
     477             :         }
     478             : 
     479             :         {
     480           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     481             :                               ""
     482             :                             , nullptr
     483           2 :                             , "project-name"));
     484           1 :             CATCH_REQUIRE(fullname.empty());
     485             :         }
     486             : 
     487             :         {
     488           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     489             :                               ""
     490             :                             , nullptr
     491           2 :                             , ""));
     492           1 :             CATCH_REQUIRE(fullname.empty());
     493             :         }
     494             : 
     495             :         {
     496           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     497             :                               ""
     498             :                             , nullptr
     499           2 :                             , nullptr));
     500           1 :             CATCH_REQUIRE(fullname.empty());
     501             :         }
     502             :     CATCH_END_SECTION()
     503             : 
     504           8 :     CATCH_START_SECTION("Basename Only")
     505             :         {
     506           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     507             :                               "basename"
     508             :                             , nullptr
     509           2 :                             , "advgetopt"));
     510           1 :             CATCH_REQUIRE(fullname.size() == 1);
     511           1 :             CATCH_REQUIRE(fullname[0] == "advgetopt.d/50-basename");
     512             :         }
     513             : 
     514             :         {
     515           1 :             advgetopt::string_list_t fullname(advgetopt::insert_group_name(
     516             :                               "basename.ext"
     517             :                             , "advgetopt"
     518           2 :                             , nullptr));
     519           1 :             CATCH_REQUIRE(fullname.size() == 1);
     520           1 :             CATCH_REQUIRE(fullname[0] == "advgetopt.d/50-basename.ext");
     521             :         }
     522             :     CATCH_END_SECTION()
     523             : 
     524           8 :     CATCH_START_SECTION("Actual List of Files on Disk")
     525             :         {
     526           1 :             SNAP_CATCH2_NAMESPACE::init_tmp_dir("advgetopt-multi", "sorted-user-conf", false);
     527             : 
     528             :             // generate an array of numbers from 00 to 99
     529             :             //
     530           2 :             std::vector<int> numbers;
     531         101 :             for(int i = 0; i < 100; ++i)
     532             :             {
     533         100 :                 numbers.push_back(i);
     534             :             }
     535           1 :             std::random_shuffle(numbers.begin(), numbers.end(), shuffle_rand);
     536           1 :             int const max(rand() % 50 + 10);
     537           1 :             numbers.resize(max);
     538           2 :             std::string path(SNAP_CATCH2_NAMESPACE::g_config_project_filename);
     539           1 :             std::string::size_type const pos(path.rfind('/'));
     540           1 :             path = path.substr(0, pos);
     541           2 :             advgetopt::string_list_t filenames;
     542          31 :             for(int i = 0; i < max; ++i)
     543             :             {
     544          60 :                 std::stringstream ss;
     545          30 :                 ss << path;
     546          30 :                 ss << '/';
     547          30 :                 int const n(numbers[i]);
     548          30 :                 if(n < 10)
     549             :                 {
     550           4 :                     ss << '0';
     551             :                 }
     552          30 :                 ss << n;
     553          30 :                 ss << "-sorted-user-conf.config";
     554          30 :                 filenames.push_back(ss.str());
     555          60 :                 std::ofstream conf;
     556          30 :                 conf.open(ss.str(), std::ios_base::out);
     557          30 :                 CATCH_REQUIRE(conf.is_open());
     558          30 :                 conf << "# Config with a number" << std::endl;
     559          30 :                 conf << "var=\"value: " << numbers[i] << "\"" << std::endl;
     560             :             }
     561           1 :             std::sort(filenames.begin(), filenames.end());
     562           2 :             std::string const last_filename(*filenames.rbegin());
     563           1 :             std::string::size_type const slash_pos(last_filename.rfind('/'));
     564           2 :             std::string const expected_var("value: " + last_filename.substr(slash_pos + 1, 2));
     565             : 
     566           1 :             advgetopt::string_list_t fullnames(advgetopt::insert_group_name(
     567             :                               SNAP_CATCH2_NAMESPACE::g_config_filename
     568             :                             , "advgetopt-multi"
     569           2 :                             , "multi-channels"));
     570           1 :             CATCH_REQUIRE(fullnames.size() == filenames.size());
     571          31 :             for(size_t idx(0); idx < filenames.size(); ++idx)
     572             :             {
     573          30 :                 CATCH_REQUIRE(fullnames[idx] == filenames[idx]);
     574             :             }
     575             : 
     576             :             {
     577           2 :                 std::ofstream conf;
     578           1 :                 conf.open(SNAP_CATCH2_NAMESPACE::g_config_filename, std::ios_base::out);
     579           1 :                 CATCH_REQUIRE(conf.is_open());
     580           1 :                 conf << "# Original Config with a number" << std::endl;
     581           1 :                 conf << "var=master value" << std::endl;
     582             : 
     583             :                 // verify the master config file
     584             :                 //
     585           2 :                 advgetopt::conf_file_setup setup(SNAP_CATCH2_NAMESPACE::g_config_filename);
     586           2 :                 advgetopt::conf_file::pointer_t config_file(advgetopt::conf_file::get_conf_file(setup));
     587           1 :                 CATCH_REQUIRE(config_file->get_parameter("var") == "master value");
     588             :             }
     589             : 
     590             :             {
     591             :                 // run a load to verify that we indeed get the last var=...
     592             :                 // value and not some random entry
     593             :                 //
     594           2 :                 std::string temp_dir = SNAP_CATCH2_NAMESPACE::g_tmp_dir + "/.config";
     595           1 :                 char const * const dirs[] = {
     596           1 :                     temp_dir.c_str(),
     597             :                     nullptr
     598           1 :                 };
     599           1 :                 advgetopt::option opts[] = {
     600             :                     advgetopt::define_option(
     601             :                           advgetopt::Name("var")
     602             :                         , advgetopt::Flags(advgetopt::all_flags<advgetopt::GETOPT_FLAG_SHOW_USAGE_ON_ERROR>())
     603             :                         , advgetopt::Help("verify loading configuration files in a serie.")
     604             :                     ),
     605             :                     advgetopt::end_options()
     606             :                 };
     607             : #pragma GCC diagnostic push
     608             : #pragma GCC diagnostic ignored "-Wpedantic"
     609           1 :                 advgetopt::options_environment env = {
     610             :                     .f_project_name = "sorted-configs",
     611             :                     .f_group_name = "advgetopt-multi",
     612             :                     .f_options = opts,
     613             :                     .f_options_files_directory = nullptr,
     614             :                     .f_environment_variable_name = nullptr,
     615             :                     .f_configuration_files = nullptr,
     616             :                     .f_configuration_filename = "sorted-user-conf.config",
     617             :                     .f_configuration_directories = dirs,
     618             :                     .f_environment_flags = advgetopt::GETOPT_ENVIRONMENT_FLAG_PROCESS_SYSTEM_PARAMETERS,
     619             :                     .f_help_header = nullptr,
     620             :                     .f_help_footer = nullptr,
     621             :                     .f_version = nullptr,
     622             :                     .f_license = nullptr,
     623             :                     .f_copyright = nullptr,
     624             :                     .f_build_date = UTC_BUILD_DATE,
     625             :                     .f_build_time = UTC_BUILD_TIME,
     626             :                     .f_groups = nullptr
     627           1 :                 };
     628             : #pragma GCC diagnostic pop
     629           1 :                 char const * const argv[] = {
     630             :                     "test",
     631             :                     nullptr
     632             :                 };
     633           2 :                 advgetopt::getopt opt(env, 1, const_cast<char **>(argv));
     634           1 :                 CATCH_REQUIRE(memcmp(&opt.get_options_environment(), &env, sizeof(env)) == 0);
     635           1 :                 CATCH_REQUIRE(opt.get_string("var") == expected_var);
     636             :             }
     637             :         }
     638             :     CATCH_END_SECTION()
     639           4 : }
     640             : 
     641             : 
     642             : 
     643             : 
     644             : 
     645             : 
     646             : 
     647           5 : CATCH_TEST_CASE("utils_handle_user_directory", "[utils][valid]")
     648             : {
     649           6 :     CATCH_START_SECTION("Valid cases")
     650           2 :         snap::safe_setenv env("HOME", "/home/advgetopt");
     651             : 
     652             :         {
     653           2 :             std::string result(advgetopt::handle_user_directory("~"));
     654           1 :             CATCH_REQUIRE(result == "/home/advgetopt");
     655             :         }
     656             : 
     657             :         {
     658           2 :             std::string result(advgetopt::handle_user_directory("~/"));
     659           1 :             CATCH_REQUIRE(result == "/home/advgetopt/");
     660             :         }
     661             : 
     662             :         {
     663           2 :             std::string result(advgetopt::handle_user_directory("~/.config/advgetopt.conf"));
     664           1 :             CATCH_REQUIRE(result == "/home/advgetopt/.config/advgetopt.conf");
     665             :         }
     666             :     CATCH_END_SECTION()
     667             : 
     668           6 :     CATCH_START_SECTION("$HOME is empty")
     669           2 :         snap::safe_setenv env("HOME", "");
     670             : 
     671             :         {
     672           2 :             std::string result(advgetopt::handle_user_directory("~"));
     673           1 :             CATCH_REQUIRE(result == "~");
     674             :         }
     675             : 
     676             :         {
     677           2 :             std::string result(advgetopt::handle_user_directory("~/.config/advgetopt.conf"));
     678           1 :             CATCH_REQUIRE(result == "~/.config/advgetopt.conf");
     679             :         }
     680             :     CATCH_END_SECTION()
     681             : 
     682           6 :     CATCH_START_SECTION("Paths do not start with ~")
     683           2 :         snap::safe_setenv env("HOME", "/home/advgetopt");
     684             : 
     685             :         {
     686           2 :             std::string result(advgetopt::handle_user_directory("/~"));
     687           1 :             CATCH_REQUIRE(result == "/~");
     688             :         }
     689             : 
     690             :         {
     691           2 :             std::string result(advgetopt::handle_user_directory("/~/.config/advgetopt.conf"));
     692           1 :             CATCH_REQUIRE(result == "/~/.config/advgetopt.conf");
     693             :         }
     694             :     CATCH_END_SECTION()
     695           3 : }
     696             : 
     697             : 
     698             : 
     699             : 
     700             : 
     701           4 : CATCH_TEST_CASE("utils_true_false", "[utils][boolean]")
     702             : {
     703           4 :     CATCH_START_SECTION("True Values")
     704             :     {
     705           1 :         CATCH_REQUIRE(advgetopt::is_true("true"));
     706           1 :         CATCH_REQUIRE(advgetopt::is_true("on"));
     707           1 :         CATCH_REQUIRE(advgetopt::is_true("1"));
     708             : 
     709           1 :         CATCH_REQUIRE_FALSE(advgetopt::is_true("false"));
     710           1 :         CATCH_REQUIRE_FALSE(advgetopt::is_true("off"));
     711           1 :         CATCH_REQUIRE_FALSE(advgetopt::is_true("0"));
     712             : 
     713           1 :         CATCH_REQUIRE_FALSE(advgetopt::is_true("random"));
     714             :     }
     715             :     CATCH_END_SECTION()
     716             : 
     717           4 :     CATCH_START_SECTION("False Values")
     718             :     {
     719           1 :         CATCH_REQUIRE(advgetopt::is_false("false"));
     720           1 :         CATCH_REQUIRE(advgetopt::is_false("off"));
     721           1 :         CATCH_REQUIRE(advgetopt::is_false("0"));
     722             : 
     723           1 :         CATCH_REQUIRE_FALSE(advgetopt::is_false("true"));
     724           1 :         CATCH_REQUIRE_FALSE(advgetopt::is_false("on"));
     725           1 :         CATCH_REQUIRE_FALSE(advgetopt::is_false("1"));
     726             : 
     727           1 :         CATCH_REQUIRE_FALSE(advgetopt::is_false("random"));
     728             :     }
     729             :     CATCH_END_SECTION()
     730           8 : }
     731             : 
     732             : 
     733             : 
     734             : 
     735             : 
     736             : 
     737             : 
     738             : // vim: ts=4 sw=4 et

Generated by: LCOV version 1.13