diff --git a/src/seeder/options.cpp b/src/seeder/options.cpp --- a/src/seeder/options.cpp +++ b/src/seeder/options.cpp @@ -36,8 +36,28 @@ } nThreads = argsManager->GetArg("-threads", DEFAULT_NUM_THREADS); + if (nThreads <= 0) { + tfm::format( + std::cerr, + "Error: -threads argument expects only positive integers\n"); + return EXIT_FAILURE; + } + nPort = argsManager->GetArg("-port", DEFAULT_PORT); + if (nPort < 0 || nPort > 65535) { + tfm::format(std::cerr, "Error: -port argument expects only positive " + "integers in the range 0 - 65535\n"); + return EXIT_FAILURE; + } + nDnsThreads = argsManager->GetArg("-dnsthreads", DEFAULT_NUM_DNS_THREADS); + if (nDnsThreads <= 0) { + tfm::format( + std::cerr, + "Error: -dnsthreads argument expects only positive integers\n"); + return EXIT_FAILURE; + } + fWipeBan = argsManager->GetBoolArg("-wipeban", DEFAULT_WIPE_BAN); fWipeIgnore = argsManager->GetBoolArg("-wipeignore", DEFAULT_WIPE_IGNORE); mbox = argsManager->GetArg("-mbox", DEFAULT_EMAIL); diff --git a/src/seeder/test/options_tests.cpp b/src/seeder/test/options_tests.cpp --- a/src/seeder/test/options_tests.cpp +++ b/src/seeder/test/options_tests.cpp @@ -7,6 +7,10 @@ #include +static const char *TEST_HOST = "-host=seeder.bitcoinabc.org"; +static const char *TEST_NAMESERVER = "-ns=localhost"; +static const char *TEST_EMAIL = "-mbox=email@bitcoinabc.org"; + class ArgsTestingSetup { public: ArgsManager argsManager; @@ -28,8 +32,7 @@ } BOOST_FIXTURE_TEST_CASE(options_basic_test, ArgsTestingSetup) { - const char *argv[] = {"ignored", "-host=seeder.bitcoinabc.org", - "-ns=localhost", "-mbox=email@bitcoinabc.org", + const char *argv[] = {"ignored", TEST_HOST, TEST_NAMESERVER, TEST_EMAIL, "-port=5555"}; BOOST_CHECK(opts.ParseCommandLine(5, argv) == seeder::CONTINUE_EXECUTION); BOOST_CHECK(opts.host == "seeder.bitcoinabc.org"); @@ -38,4 +41,70 @@ BOOST_CHECK(opts.nPort == 5555); } +BOOST_FIXTURE_TEST_CASE(options_threads_test, ArgsTestingSetup) { + const std::map expectedResults = { + {-9999, EXIT_FAILURE}, + {-1, EXIT_FAILURE}, + {0, EXIT_FAILURE}, + {1, seeder::CONTINUE_EXECUTION}, + {seeder::DEFAULT_NUM_THREADS, seeder::CONTINUE_EXECUTION}, + {9999, seeder::CONTINUE_EXECUTION}}; + + for (const auto entry : expectedResults) { + const std::string testArg = "-threads=" + ToString(entry.first); + const char *argv[] = {"ignored", TEST_HOST, TEST_NAMESERVER, TEST_EMAIL, + testArg.c_str()}; + BOOST_CHECK(opts.ParseCommandLine(5, argv) == entry.second); + if (entry.second == seeder::CONTINUE_EXECUTION) { + BOOST_CHECK(opts.nThreads == entry.first); + } + } +} + +BOOST_FIXTURE_TEST_CASE(options_dns_threads_test, ArgsTestingSetup) { + const std::map expectedResults = { + {-9999, EXIT_FAILURE}, + {-1, EXIT_FAILURE}, + {0, EXIT_FAILURE}, + {1, seeder::CONTINUE_EXECUTION}, + {seeder::DEFAULT_NUM_DNS_THREADS, seeder::CONTINUE_EXECUTION}, + {9999, seeder::CONTINUE_EXECUTION}}; + + for (const auto entry : expectedResults) { + const std::string testArg = "-dnsthreads=" + ToString(entry.first); + const char *argv[] = {"ignored", TEST_HOST, TEST_NAMESERVER, TEST_EMAIL, + testArg.c_str()}; + BOOST_CHECK(opts.ParseCommandLine(5, argv) == entry.second); + if (entry.second == seeder::CONTINUE_EXECUTION) { + BOOST_CHECK(opts.nDnsThreads == entry.first); + } + } +} + +BOOST_FIXTURE_TEST_CASE(options_port_test, ArgsTestingSetup) { + const std::map expectedResults = { + {-9999, EXIT_FAILURE}, + {-1, EXIT_FAILURE}, + // Note: port 0 indicates to the kernel that a random unused port should + // be assigned + {0, seeder::CONTINUE_EXECUTION}, + {1, seeder::CONTINUE_EXECUTION}, + {seeder::DEFAULT_PORT, seeder::CONTINUE_EXECUTION}, + {53, seeder::CONTINUE_EXECUTION}, + {15353, seeder::CONTINUE_EXECUTION}, + {65535, seeder::CONTINUE_EXECUTION}, + {65536, EXIT_FAILURE}, + {999999, EXIT_FAILURE}}; + + for (const auto entry : expectedResults) { + const std::string testArg = "-port=" + ToString(entry.first); + const char *argv[] = {"ignored", TEST_HOST, TEST_NAMESERVER, TEST_EMAIL, + testArg.c_str()}; + BOOST_CHECK(opts.ParseCommandLine(5, argv) == entry.second); + if (entry.second == seeder::CONTINUE_EXECUTION) { + BOOST_CHECK(opts.nPort == entry.first); + } + } +} + BOOST_AUTO_TEST_SUITE_END()