LCOV - code coverage report
Current view: top level - src/test - getarg_tests.cpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 144 144 100.0 %
Date: 2020-09-26 01:30:44 Functions: 49 49 100.0 %

          Line data    Source code
       1             : // Copyright (c) 2012-2020 The Bitcoin Core developers
       2             : // Distributed under the MIT software license, see the accompanying
       3             : // file COPYING or http://www.opensource.org/licenses/mit-license.php.
       4             : 
       5             : #include <test/util/setup_common.h>
       6             : #include <util/strencodings.h>
       7             : #include <util/system.h>
       8             : 
       9             : #include <string>
      10             : #include <utility>
      11             : #include <vector>
      12             : 
      13             : #include <boost/algorithm/string.hpp>
      14             : #include <boost/test/unit_test.hpp>
      15             : 
      16             : namespace getarg_tests{
      17          12 :     class LocalTestingSetup : BasicTestingSetup {
      18             :         protected:
      19             :         void SetupArgs(const std::vector<std::pair<std::string, unsigned int>>& args);
      20             :         void ResetArgs(const std::string& strArg);
      21             :         ArgsManager m_args;
      22             :     };
      23             : }
      24             : 
      25          89 : BOOST_FIXTURE_TEST_SUITE(getarg_tests, LocalTestingSetup)
      26             : 
      27          27 : void LocalTestingSetup :: ResetArgs(const std::string& strArg)
      28             : {
      29          27 :     std::vector<std::string> vecArg;
      30          27 :     if (strArg.size())
      31          25 :       boost::split(vecArg, strArg, IsSpace, boost::token_compress_on);
      32             : 
      33             :     // Insert dummy executable name:
      34          27 :     vecArg.insert(vecArg.begin(), "testbitcoin");
      35             : 
      36             :     // Convert to char*:
      37          27 :     std::vector<const char*> vecChar;
      38          92 :     for (const std::string& s : vecArg)
      39          65 :         vecChar.push_back(s.c_str());
      40             : 
      41          27 :     std::string error;
      42          27 :     BOOST_CHECK(m_args.ParseParameters(vecChar.size(), vecChar.data(), error));
      43          27 : }
      44             : 
      45           6 : void LocalTestingSetup :: SetupArgs(const std::vector<std::pair<std::string, unsigned int>>& args)
      46             : {
      47           6 :     m_args.ClearArgs();
      48          19 :     for (const auto& arg : args) {
      49          13 :         m_args.AddArg(arg.first, "", arg.second, OptionsCategory::OPTIONS);
      50             :     }
      51           6 : }
      52             : 
      53          95 : BOOST_AUTO_TEST_CASE(boolarg)
      54             : {
      55           1 :     const auto foo = std::make_pair("-foo", ArgsManager::ALLOW_ANY);
      56           1 :     SetupArgs({foo});
      57           1 :     ResetArgs("-foo");
      58           1 :     BOOST_CHECK(m_args.GetBoolArg("-foo", false));
      59           1 :     BOOST_CHECK(m_args.GetBoolArg("-foo", true));
      60             : 
      61           1 :     BOOST_CHECK(!m_args.GetBoolArg("-fo", false));
      62           1 :     BOOST_CHECK(m_args.GetBoolArg("-fo", true));
      63             : 
      64           1 :     BOOST_CHECK(!m_args.GetBoolArg("-fooo", false));
      65           1 :     BOOST_CHECK(m_args.GetBoolArg("-fooo", true));
      66             : 
      67           1 :     ResetArgs("-foo=0");
      68           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", false));
      69           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", true));
      70             : 
      71           1 :     ResetArgs("-foo=1");
      72           1 :     BOOST_CHECK(m_args.GetBoolArg("-foo", false));
      73           1 :     BOOST_CHECK(m_args.GetBoolArg("-foo", true));
      74             : 
      75             :     // New 0.6 feature: auto-map -nosomething to !-something:
      76           1 :     ResetArgs("-nofoo");
      77           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", false));
      78           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", true));
      79             : 
      80           1 :     ResetArgs("-nofoo=1");
      81           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", false));
      82           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", true));
      83             : 
      84           1 :     ResetArgs("-foo -nofoo");  // -nofoo should win
      85           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", false));
      86           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", true));
      87             : 
      88           1 :     ResetArgs("-foo=1 -nofoo=1");  // -nofoo should win
      89           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", false));
      90           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", true));
      91             : 
      92           1 :     ResetArgs("-foo=0 -nofoo=0");  // -nofoo=0 should win
      93           1 :     BOOST_CHECK(m_args.GetBoolArg("-foo", false));
      94           1 :     BOOST_CHECK(m_args.GetBoolArg("-foo", true));
      95             : 
      96             :     // New 0.6 feature: treat -- same as -:
      97           1 :     ResetArgs("--foo=1");
      98           1 :     BOOST_CHECK(m_args.GetBoolArg("-foo", false));
      99           1 :     BOOST_CHECK(m_args.GetBoolArg("-foo", true));
     100             : 
     101           1 :     ResetArgs("--nofoo=1");
     102           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", false));
     103           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", true));
     104             : 
     105           1 : }
     106             : 
     107          95 : BOOST_AUTO_TEST_CASE(stringarg)
     108             : {
     109           1 :     const auto foo = std::make_pair("-foo", ArgsManager::ALLOW_ANY);
     110           1 :     const auto bar = std::make_pair("-bar", ArgsManager::ALLOW_ANY);
     111           2 :     SetupArgs({foo, bar});
     112           1 :     ResetArgs("");
     113           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-foo", ""), "");
     114           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-foo", "eleven"), "eleven");
     115             : 
     116           1 :     ResetArgs("-foo -bar");
     117           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-foo", ""), "");
     118           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-foo", "eleven"), "");
     119             : 
     120           1 :     ResetArgs("-foo=");
     121           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-foo", ""), "");
     122           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-foo", "eleven"), "");
     123             : 
     124           1 :     ResetArgs("-foo=11");
     125           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-foo", ""), "11");
     126           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-foo", "eleven"), "11");
     127             : 
     128           1 :     ResetArgs("-foo=eleven");
     129           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-foo", ""), "eleven");
     130           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-foo", "eleven"), "eleven");
     131             : 
     132           1 : }
     133             : 
     134          95 : BOOST_AUTO_TEST_CASE(intarg)
     135             : {
     136           1 :     const auto foo = std::make_pair("-foo", ArgsManager::ALLOW_ANY);
     137           1 :     const auto bar = std::make_pair("-bar", ArgsManager::ALLOW_ANY);
     138           2 :     SetupArgs({foo, bar});
     139           1 :     ResetArgs("");
     140           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-foo", 11), 11);
     141           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-foo", 0), 0);
     142             : 
     143           1 :     ResetArgs("-foo -bar");
     144           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-foo", 11), 0);
     145           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-bar", 11), 0);
     146             : 
     147           1 :     ResetArgs("-foo=11 -bar=12");
     148           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-foo", 0), 11);
     149           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-bar", 11), 12);
     150             : 
     151           1 :     ResetArgs("-foo=NaN -bar=NotANumber");
     152           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-foo", 1), 0);
     153           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-bar", 11), 0);
     154           1 : }
     155             : 
     156          95 : BOOST_AUTO_TEST_CASE(doubledash)
     157             : {
     158           1 :     const auto foo = std::make_pair("-foo", ArgsManager::ALLOW_ANY);
     159           1 :     const auto bar = std::make_pair("-bar", ArgsManager::ALLOW_ANY);
     160           2 :     SetupArgs({foo, bar});
     161           1 :     ResetArgs("--foo");
     162           1 :     BOOST_CHECK_EQUAL(m_args.GetBoolArg("-foo", false), true);
     163             : 
     164           1 :     ResetArgs("--foo=verbose --bar=1");
     165           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-foo", ""), "verbose");
     166           1 :     BOOST_CHECK_EQUAL(m_args.GetArg("-bar", 0), 1);
     167           1 : }
     168             : 
     169          95 : BOOST_AUTO_TEST_CASE(boolargno)
     170             : {
     171           1 :     const auto foo = std::make_pair("-foo", ArgsManager::ALLOW_ANY);
     172           1 :     const auto bar = std::make_pair("-bar", ArgsManager::ALLOW_ANY);
     173           2 :     SetupArgs({foo, bar});
     174           1 :     ResetArgs("-nofoo");
     175           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", true));
     176           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", false));
     177             : 
     178           1 :     ResetArgs("-nofoo=1");
     179           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", true));
     180           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", false));
     181             : 
     182           1 :     ResetArgs("-nofoo=0");
     183           1 :     BOOST_CHECK(m_args.GetBoolArg("-foo", true));
     184           1 :     BOOST_CHECK(m_args.GetBoolArg("-foo", false));
     185             : 
     186           1 :     ResetArgs("-foo --nofoo"); // --nofoo should win
     187           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", true));
     188           1 :     BOOST_CHECK(!m_args.GetBoolArg("-foo", false));
     189             : 
     190           1 :     ResetArgs("-nofoo -foo"); // foo always wins:
     191           1 :     BOOST_CHECK(m_args.GetBoolArg("-foo", true));
     192           1 :     BOOST_CHECK(m_args.GetBoolArg("-foo", false));
     193           1 : }
     194             : 
     195          95 : BOOST_AUTO_TEST_CASE(logargs)
     196             : {
     197           1 :     const auto okaylog_bool = std::make_pair("-okaylog-bool", ArgsManager::ALLOW_BOOL);
     198           1 :     const auto okaylog_negbool = std::make_pair("-okaylog-negbool", ArgsManager::ALLOW_BOOL);
     199           1 :     const auto okaylog = std::make_pair("-okaylog", ArgsManager::ALLOW_ANY);
     200           1 :     const auto dontlog = std::make_pair("-dontlog", ArgsManager::ALLOW_ANY | ArgsManager::SENSITIVE);
     201           4 :     SetupArgs({okaylog_bool, okaylog_negbool, okaylog, dontlog});
     202           1 :     ResetArgs("-okaylog-bool -nookaylog-negbool -okaylog=public -dontlog=private");
     203             : 
     204             :     // Everything logged to debug.log will also append to str
     205           1 :     std::string str;
     206           2 :     auto print_connection = LogInstance().PushBackCallback(
     207           5 :         [&str](const std::string& s) {
     208           4 :             str += s;
     209           4 :         });
     210             : 
     211             :     // Log the arguments
     212           1 :     m_args.LogArgs();
     213             : 
     214           1 :     LogInstance().DeleteCallback(print_connection);
     215             :     // Check that what should appear does, and what shouldn't doesn't.
     216           1 :     BOOST_CHECK(str.find("Command-line arg: okaylog-bool=\"\"") != std::string::npos);
     217           1 :     BOOST_CHECK(str.find("Command-line arg: okaylog-negbool=false") != std::string::npos);
     218           1 :     BOOST_CHECK(str.find("Command-line arg: okaylog=\"public\"") != std::string::npos);
     219           1 :     BOOST_CHECK(str.find("dontlog=****") != std::string::npos);
     220           1 :     BOOST_CHECK(str.find("private") == std::string::npos);
     221           1 : }
     222             : 
     223          89 : BOOST_AUTO_TEST_SUITE_END()

Generated by: LCOV version 1.15