summaryrefslogtreecommitdiff
path: root/src/mongo/unittest
diff options
context:
space:
mode:
authorSiyuan Zhou <siyuan.zhou@mongodb.com>2017-06-28 17:16:56 -0400
committerSiyuan Zhou <siyuan.zhou@mongodb.com>2017-07-21 15:07:13 -0400
commitdb9f34fdec33e2250dad53d7d2d3a829507b3f95 (patch)
tree8215fb49923c2de07bd255e25e8d0d2d17263888 /src/mongo/unittest
parent44884d771fe8aac3d894092b38912d72c3c3f438 (diff)
downloadmongo-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.cpp10
-rw-r--r--src/mongo/unittest/unittest_main.cpp54
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);
}