diff options
author | Siyuan Zhou <siyuan.zhou@mongodb.com> | 2017-06-28 17:16:56 -0400 |
---|---|---|
committer | Siyuan Zhou <siyuan.zhou@mongodb.com> | 2017-07-21 15:07:13 -0400 |
commit | db9f34fdec33e2250dad53d7d2d3a829507b3f95 (patch) | |
tree | 8215fb49923c2de07bd255e25e8d0d2d17263888 /src/mongo/unittest | |
parent | 44884d771fe8aac3d894092b38912d72c3c3f438 (diff) | |
download | mongo-db9f34fdec33e2250dad53d7d2d3a829507b3f95.tar.gz |
SERVER-25788 Accept command line arguments in unit tests
This reverts commit eb5283b46b7599e07793c8695c74880a10f3998e.
Diffstat (limited to 'src/mongo/unittest')
-rw-r--r-- | src/mongo/unittest/unittest.cpp | 10 | ||||
-rw-r--r-- | src/mongo/unittest/unittest_main.cpp | 54 |
2 files changed, 60 insertions, 4 deletions
diff --git a/src/mongo/unittest/unittest.cpp b/src/mongo/unittest/unittest.cpp index a39383a79a2..5399bef2069 100644 --- a/src/mongo/unittest/unittest.cpp +++ b/src/mongo/unittest/unittest.cpp @@ -282,14 +282,18 @@ Result* Suite::run(const std::string& filter, int runsPerTest) { bool passes = false; - log() << "\t going to run test: " << tc->getName() << std::endl; - std::stringstream err; err << tc->getName() << "\t"; try { - for (int x = 0; x < runsPerTest; x++) + for (int x = 0; x < runsPerTest; x++) { + std::stringstream runTimes; + if (runsPerTest > 1) { + runTimes << " (" << x + 1 << "/" << runsPerTest << ")"; + } + log() << "\t going to run test: " << tc->getName() << runTimes.str(); tc->run(); + } passes = true; } catch (const TestAssertionFailureException& ae) { err << ae.toString(); diff --git a/src/mongo/unittest/unittest_main.cpp b/src/mongo/unittest/unittest_main.cpp index 132b2cc1842..cd259f4e7f5 100644 --- a/src/mongo/unittest/unittest_main.cpp +++ b/src/mongo/unittest/unittest_main.cpp @@ -27,16 +27,68 @@ * then also delete it in the license file. */ +#include <iostream> #include <string> #include <vector> #include "mongo/base/initializer.h" +#include "mongo/base/status.h" #include "mongo/unittest/unittest.h" +#include "mongo/util/options_parser/environment.h" +#include "mongo/util/options_parser/option_section.h" +#include "mongo/util/options_parser/options_parser.h" #include "mongo/util/signal_handlers_synchronous.h" +using mongo::Status; + int main(int argc, char** argv, char** envp) { ::mongo::clearSignalMask(); ::mongo::setupSynchronousSignalHandlers(); ::mongo::runGlobalInitializersOrDie(argc, argv, envp); - return ::mongo::unittest::Suite::run(std::vector<std::string>(), "", 1); + + namespace moe = ::mongo::optionenvironment; + moe::OptionsParser parser; + moe::Environment environment; + moe::OptionSection options; + std::map<std::string, std::string> env; + + // Register our allowed options with our OptionSection + auto listDesc = "List all test suites in this unit test."; + options.addOptionChaining("list", "list", moe::Switch, listDesc).setDefault(moe::Value(false)); + + auto suiteDesc = "Test suite name. Specify --suite more than once to run multiple suites."; + options.addOptionChaining("suite", "suite", moe::StringVector, suiteDesc); + + auto filterDesc = "Test case name filter. Specify the substring of the test names."; + options.addOptionChaining("filter", "filter", moe::String, filterDesc); + + auto repeatDesc = "Specifies the number of runs for each test."; + options.addOptionChaining("repeat", "repeat", moe::Int, repeatDesc).setDefault(moe::Value(1)); + + std::vector<std::string> argVector(argv, argv + argc); + Status ret = parser.run(options, argVector, env, &environment); + if (!ret.isOK()) { + std::cerr << options.helpString(); + return EXIT_FAILURE; + } + + bool list = false; + moe::StringVector_t suites; + std::string filter; + int repeat = 1; + // "list" and "repeat" will be assigned with default values, if not present. + invariantOK(environment.get("list", &list)); + invariantOK(environment.get("repeat", &repeat)); + // The default values of "suite" and "filter" are empty. + environment.get("suite", &suites).ignore(); + environment.get("filter", &filter).ignore(); + + if (list) { + auto suiteNames = ::mongo::unittest::getAllSuiteNames(); + for (auto name : suiteNames) { + std::cout << name << std::endl; + } + return EXIT_SUCCESS; + } + return ::mongo::unittest::Suite::run(suites, filter, repeat); } |