File indexing completed on 2024-04-06 12:12:29
0001 #include "catch.hpp"
0002
0003 #include "FWCore/Framework/interface/CmsRunParser.h"
0004 #include "FWCore/Utilities/interface/EDMException.h"
0005
0006 #include <string>
0007
0008 TEST_CASE("test cmsRun command line parsing", "[commandline]") {
0009 edm::CmsRunParser parser("cmsRun");
0010
0011 SECTION("No arguments") {
0012 constexpr int kSize = 1;
0013 const char* args[kSize] = {"cmsRun"};
0014 const auto& output = parser.parse(kSize, args);
0015
0016 REQUIRE(edm::CmsRunParser::hasVM(output));
0017 auto vm = edm::CmsRunParser::getVM(output);
0018
0019 REQUIRE(not vm.count(edm::CmsRunParser::kHelpOpt));
0020 REQUIRE(not vm.count(edm::CmsRunParser::kParameterSetOpt));
0021 REQUIRE(not vm.count(edm::CmsRunParser::kStrictOpt));
0022 REQUIRE(not vm.count(edm::CmsRunParser::kJobreportOpt));
0023 REQUIRE(not vm.count(edm::CmsRunParser::kEnableJobreportOpt));
0024 REQUIRE(not vm.count(edm::CmsRunParser::kNumberOfThreadsOpt));
0025 REQUIRE(not vm.count(edm::CmsRunParser::kSizeOfStackForThreadOpt));
0026 REQUIRE(not vm.count(edm::CmsRunParser::kJobModeOpt));
0027 REQUIRE(not vm.count(edm::CmsRunParser::kPythonOpt));
0028 REQUIRE(not vm.count(edm::CmsRunParser::kCmdOpt));
0029 }
0030
0031 SECTION("help") {
0032 constexpr int kSize = 2;
0033 const char* args[kSize] = {"cmsRun", "-h"};
0034 const auto& output = parser.parse(kSize, args);
0035
0036 REQUIRE(not edm::CmsRunParser::hasVM(output));
0037 REQUIRE(edm::CmsRunParser::getExit(output) == 0);
0038 }
0039
0040 SECTION("wrong (short)") {
0041 constexpr int kSize = 2;
0042 const char* args[kSize] = {"cmsRun", "-w"};
0043 const auto& output = parser.parse(kSize, args);
0044
0045 REQUIRE(not edm::CmsRunParser::hasVM(output));
0046 REQUIRE(edm::CmsRunParser::getExit(output) == edm::errors::CommandLineProcessing);
0047 }
0048
0049 SECTION("wrong (long)") {
0050 constexpr int kSize = 2;
0051 const char* args[kSize] = {"cmsRun", "--wrong"};
0052 const auto& output = parser.parse(kSize, args);
0053
0054 REQUIRE(not edm::CmsRunParser::hasVM(output));
0055 REQUIRE(edm::CmsRunParser::getExit(output) == edm::errors::CommandLineProcessing);
0056 }
0057
0058 SECTION("Config file") {
0059 const std::string arg = "config.py";
0060
0061 SECTION("Config file only") {
0062 constexpr int kSize = 2;
0063 const char* args[kSize] = {"cmsRun", arg.c_str()};
0064 const auto& output = parser.parse(kSize, args);
0065
0066 REQUIRE(edm::CmsRunParser::hasVM(output));
0067 auto vm = edm::CmsRunParser::getVM(output);
0068
0069 REQUIRE(vm.count(edm::CmsRunParser::kParameterSetOpt));
0070 REQUIRE(vm[edm::CmsRunParser::kParameterSetOpt].as<std::string>() == arg);
0071 REQUIRE(not vm.count(edm::CmsRunParser::kHelpOpt));
0072 REQUIRE(not vm.count(edm::CmsRunParser::kStrictOpt));
0073 REQUIRE(not vm.count(edm::CmsRunParser::kJobreportOpt));
0074 REQUIRE(not vm.count(edm::CmsRunParser::kEnableJobreportOpt));
0075 REQUIRE(not vm.count(edm::CmsRunParser::kNumberOfThreadsOpt));
0076 REQUIRE(not vm.count(edm::CmsRunParser::kSizeOfStackForThreadOpt));
0077 REQUIRE(not vm.count(edm::CmsRunParser::kJobModeOpt));
0078 REQUIRE(not vm.count(edm::CmsRunParser::kPythonOpt));
0079 REQUIRE(not vm.count(edm::CmsRunParser::kCmdOpt));
0080 }
0081
0082 SECTION("With --") {
0083 constexpr int kSize = 3;
0084 const char* args[kSize] = {"cmsRun", "--", arg.c_str()};
0085 const auto& output = parser.parse(kSize, args);
0086
0087 REQUIRE(edm::CmsRunParser::hasVM(output));
0088 auto vm = edm::CmsRunParser::getVM(output);
0089
0090 REQUIRE(vm.count(edm::CmsRunParser::kParameterSetOpt));
0091 REQUIRE(vm[edm::CmsRunParser::kParameterSetOpt].as<std::string>() == arg);
0092 REQUIRE(not vm.count(edm::CmsRunParser::kHelpOpt));
0093 REQUIRE(not vm.count(edm::CmsRunParser::kStrictOpt));
0094 REQUIRE(not vm.count(edm::CmsRunParser::kJobreportOpt));
0095 REQUIRE(not vm.count(edm::CmsRunParser::kEnableJobreportOpt));
0096 REQUIRE(not vm.count(edm::CmsRunParser::kNumberOfThreadsOpt));
0097 REQUIRE(not vm.count(edm::CmsRunParser::kSizeOfStackForThreadOpt));
0098 REQUIRE(not vm.count(edm::CmsRunParser::kJobModeOpt));
0099 REQUIRE(not vm.count(edm::CmsRunParser::kPythonOpt));
0100 REQUIRE(not vm.count(edm::CmsRunParser::kCmdOpt));
0101 }
0102
0103 SECTION("cmsRun argument") {
0104 constexpr int kSize = 4;
0105 const std::string jobreport = "report.xml";
0106 const char* args[kSize] = {"cmsRun", "-j", jobreport.c_str(), arg.c_str()};
0107 const auto& output = parser.parse(kSize, args);
0108
0109 REQUIRE(edm::CmsRunParser::hasVM(output));
0110 auto vm = edm::CmsRunParser::getVM(output);
0111
0112 REQUIRE(vm.count(edm::CmsRunParser::kParameterSetOpt));
0113 REQUIRE(vm[edm::CmsRunParser::kParameterSetOpt].as<std::string>() == arg);
0114 REQUIRE(not vm.count(edm::CmsRunParser::kHelpOpt));
0115 REQUIRE(not vm.count(edm::CmsRunParser::kStrictOpt));
0116 REQUIRE(vm.count(edm::CmsRunParser::kJobreportOpt));
0117 REQUIRE(vm[edm::CmsRunParser::kJobreportOpt].as<std::string>() == jobreport);
0118 REQUIRE(not vm.count(edm::CmsRunParser::kEnableJobreportOpt));
0119 REQUIRE(not vm.count(edm::CmsRunParser::kNumberOfThreadsOpt));
0120 REQUIRE(not vm.count(edm::CmsRunParser::kSizeOfStackForThreadOpt));
0121 REQUIRE(not vm.count(edm::CmsRunParser::kJobModeOpt));
0122 REQUIRE(not vm.count(edm::CmsRunParser::kPythonOpt));
0123 REQUIRE(not vm.count(edm::CmsRunParser::kCmdOpt));
0124 }
0125
0126 SECTION("Wrong cmsRun argument (short)") {
0127 constexpr int kSize = 3;
0128 const char* args[kSize] = {"cmsRun", "-w", arg.c_str()};
0129 const auto& output = parser.parse(kSize, args);
0130
0131 REQUIRE(not edm::CmsRunParser::hasVM(output));
0132 REQUIRE(edm::CmsRunParser::getExit(output) == edm::errors::CommandLineProcessing);
0133 }
0134
0135 SECTION("Wrong cmsRun argument (long)") {
0136 constexpr int kSize = 3;
0137 const char* args[kSize] = {"cmsRun", "--wrong", arg.c_str()};
0138 const auto& output = parser.parse(kSize, args);
0139
0140 REQUIRE(not edm::CmsRunParser::hasVM(output));
0141 REQUIRE(edm::CmsRunParser::getExit(output) == edm::errors::CommandLineProcessing);
0142 }
0143
0144 SECTION("python argument") {
0145 constexpr int kSize = 3;
0146 const std::string parg = "--test";
0147 const char* args[kSize] = {"cmsRun", arg.c_str(), parg.c_str()};
0148 const auto& output = parser.parse(kSize, args);
0149
0150 REQUIRE(edm::CmsRunParser::hasVM(output));
0151 auto vm = edm::CmsRunParser::getVM(output);
0152
0153 REQUIRE(vm.count(edm::CmsRunParser::kParameterSetOpt));
0154 REQUIRE(vm[edm::CmsRunParser::kParameterSetOpt].as<std::string>() == arg);
0155 REQUIRE(not vm.count(edm::CmsRunParser::kHelpOpt));
0156 REQUIRE(not vm.count(edm::CmsRunParser::kStrictOpt));
0157 REQUIRE(not vm.count(edm::CmsRunParser::kJobreportOpt));
0158 REQUIRE(not vm.count(edm::CmsRunParser::kEnableJobreportOpt));
0159 REQUIRE(not vm.count(edm::CmsRunParser::kNumberOfThreadsOpt));
0160 REQUIRE(not vm.count(edm::CmsRunParser::kSizeOfStackForThreadOpt));
0161 REQUIRE(not vm.count(edm::CmsRunParser::kJobModeOpt));
0162 REQUIRE(vm.count(edm::CmsRunParser::kPythonOpt));
0163 auto pythonOptValues = vm[edm::CmsRunParser::kPythonOpt].as<std::vector<std::string>>();
0164 REQUIRE(pythonOptValues.size() == 1);
0165 REQUIRE(pythonOptValues[0] == parg);
0166 REQUIRE(not vm.count(edm::CmsRunParser::kCmdOpt));
0167 }
0168
0169 SECTION("cmsRun and python argument") {
0170 constexpr int kSize = 5;
0171 const std::string jobreport = "report.xml";
0172 const std::string parg = "--test";
0173 const char* args[kSize] = {"cmsRun", "-j", jobreport.c_str(), arg.c_str(), parg.c_str()};
0174 const auto& output = parser.parse(kSize, args);
0175
0176 REQUIRE(edm::CmsRunParser::hasVM(output));
0177 auto vm = edm::CmsRunParser::getVM(output);
0178
0179 REQUIRE(vm.count(edm::CmsRunParser::kParameterSetOpt));
0180 REQUIRE(vm[edm::CmsRunParser::kParameterSetOpt].as<std::string>() == arg);
0181 REQUIRE(not vm.count(edm::CmsRunParser::kHelpOpt));
0182 REQUIRE(not vm.count(edm::CmsRunParser::kStrictOpt));
0183 REQUIRE(vm.count(edm::CmsRunParser::kJobreportOpt));
0184 REQUIRE(vm[edm::CmsRunParser::kJobreportOpt].as<std::string>() == jobreport);
0185 REQUIRE(not vm.count(edm::CmsRunParser::kEnableJobreportOpt));
0186 REQUIRE(not vm.count(edm::CmsRunParser::kNumberOfThreadsOpt));
0187 REQUIRE(not vm.count(edm::CmsRunParser::kSizeOfStackForThreadOpt));
0188 REQUIRE(not vm.count(edm::CmsRunParser::kJobModeOpt));
0189 auto pythonOptValues = vm[edm::CmsRunParser::kPythonOpt].as<std::vector<std::string>>();
0190 REQUIRE(pythonOptValues.size() == 1);
0191 REQUIRE(pythonOptValues[0] == parg);
0192 REQUIRE(not vm.count(edm::CmsRunParser::kCmdOpt));
0193 }
0194
0195 SECTION("Same cmsRun and python argument") {
0196 constexpr int kSize = 4;
0197 const std::string parg = "--strict";
0198 const char* args[kSize] = {"cmsRun", parg.c_str(), arg.c_str(), parg.c_str()};
0199 const auto& output = parser.parse(kSize, args);
0200
0201 REQUIRE(edm::CmsRunParser::hasVM(output));
0202 auto vm = edm::CmsRunParser::getVM(output);
0203
0204 REQUIRE(vm.count(edm::CmsRunParser::kParameterSetOpt));
0205 REQUIRE(vm[edm::CmsRunParser::kParameterSetOpt].as<std::string>() == arg);
0206 REQUIRE(not vm.count(edm::CmsRunParser::kHelpOpt));
0207 REQUIRE(vm.count(edm::CmsRunParser::kStrictOpt));
0208 REQUIRE(not vm.count(edm::CmsRunParser::kJobreportOpt));
0209 REQUIRE(not vm.count(edm::CmsRunParser::kEnableJobreportOpt));
0210 REQUIRE(not vm.count(edm::CmsRunParser::kNumberOfThreadsOpt));
0211 REQUIRE(not vm.count(edm::CmsRunParser::kSizeOfStackForThreadOpt));
0212 REQUIRE(not vm.count(edm::CmsRunParser::kJobModeOpt));
0213 auto pythonOptValues = vm[edm::CmsRunParser::kPythonOpt].as<std::vector<std::string>>();
0214 REQUIRE(pythonOptValues.size() == 1);
0215 REQUIRE(pythonOptValues[0] == parg);
0216 REQUIRE(not vm.count(edm::CmsRunParser::kCmdOpt));
0217 }
0218 }
0219
0220 SECTION("Config file with -") {
0221 const std::string arg = "-config.py";
0222
0223 SECTION("Config file only") {
0224 constexpr int kSize = 3;
0225 const char* args[kSize] = {"cmsRun", "--", arg.c_str()};
0226 const auto& output = parser.parse(kSize, args);
0227
0228 REQUIRE(edm::CmsRunParser::hasVM(output));
0229 auto vm = edm::CmsRunParser::getVM(output);
0230
0231 REQUIRE(vm.count(edm::CmsRunParser::kParameterSetOpt));
0232 REQUIRE(vm[edm::CmsRunParser::kParameterSetOpt].as<std::string>() == arg);
0233 REQUIRE(not vm.count(edm::CmsRunParser::kHelpOpt));
0234 REQUIRE(not vm.count(edm::CmsRunParser::kStrictOpt));
0235 REQUIRE(not vm.count(edm::CmsRunParser::kJobreportOpt));
0236 REQUIRE(not vm.count(edm::CmsRunParser::kEnableJobreportOpt));
0237 REQUIRE(not vm.count(edm::CmsRunParser::kNumberOfThreadsOpt));
0238 REQUIRE(not vm.count(edm::CmsRunParser::kSizeOfStackForThreadOpt));
0239 REQUIRE(not vm.count(edm::CmsRunParser::kJobModeOpt));
0240 REQUIRE(not vm.count(edm::CmsRunParser::kPythonOpt));
0241 REQUIRE(not vm.count(edm::CmsRunParser::kCmdOpt));
0242 }
0243
0244 SECTION("cmsRun argument") {
0245 constexpr int kSize = 5;
0246 const std::string jobreport = "report.xml";
0247 const char* args[kSize] = {"cmsRun", "-j", jobreport.c_str(), "--", arg.c_str()};
0248 const auto& output = parser.parse(kSize, args);
0249
0250 REQUIRE(edm::CmsRunParser::hasVM(output));
0251 auto vm = edm::CmsRunParser::getVM(output);
0252
0253 REQUIRE(vm.count(edm::CmsRunParser::kParameterSetOpt));
0254 REQUIRE(vm[edm::CmsRunParser::kParameterSetOpt].as<std::string>() == arg);
0255 REQUIRE(not vm.count(edm::CmsRunParser::kHelpOpt));
0256 REQUIRE(not vm.count(edm::CmsRunParser::kStrictOpt));
0257 REQUIRE(vm.count(edm::CmsRunParser::kJobreportOpt));
0258 REQUIRE(vm[edm::CmsRunParser::kJobreportOpt].as<std::string>() == jobreport);
0259 REQUIRE(not vm.count(edm::CmsRunParser::kEnableJobreportOpt));
0260 REQUIRE(not vm.count(edm::CmsRunParser::kNumberOfThreadsOpt));
0261 REQUIRE(not vm.count(edm::CmsRunParser::kSizeOfStackForThreadOpt));
0262 REQUIRE(not vm.count(edm::CmsRunParser::kJobModeOpt));
0263 REQUIRE(not vm.count(edm::CmsRunParser::kPythonOpt));
0264 REQUIRE(not vm.count(edm::CmsRunParser::kCmdOpt));
0265 }
0266
0267 SECTION("Wrong cmsRun argument (short)") {
0268 constexpr int kSize = 4;
0269 const char* args[kSize] = {"cmsRun", "-w", "--", arg.c_str()};
0270 const auto& output = parser.parse(kSize, args);
0271
0272 REQUIRE(not edm::CmsRunParser::hasVM(output));
0273 REQUIRE(edm::CmsRunParser::getExit(output) == edm::errors::CommandLineProcessing);
0274 }
0275
0276 SECTION("Wrong cmsRun argument (long)") {
0277 constexpr int kSize = 4;
0278 const char* args[kSize] = {"cmsRun", "--wrong", "--", arg.c_str()};
0279 const auto& output = parser.parse(kSize, args);
0280
0281 REQUIRE(not edm::CmsRunParser::hasVM(output));
0282 REQUIRE(edm::CmsRunParser::getExit(output) == edm::errors::CommandLineProcessing);
0283 }
0284
0285 SECTION("python argument") {
0286 constexpr int kSize = 4;
0287 const std::string parg = "--test";
0288 const char* args[kSize] = {"cmsRun", "--", arg.c_str(), parg.c_str()};
0289 const auto& output = parser.parse(kSize, args);
0290
0291 REQUIRE(edm::CmsRunParser::hasVM(output));
0292 auto vm = edm::CmsRunParser::getVM(output);
0293
0294 REQUIRE(vm.count(edm::CmsRunParser::kParameterSetOpt));
0295 REQUIRE(vm[edm::CmsRunParser::kParameterSetOpt].as<std::string>() == arg);
0296 REQUIRE(not vm.count(edm::CmsRunParser::kHelpOpt));
0297 REQUIRE(not vm.count(edm::CmsRunParser::kStrictOpt));
0298 REQUIRE(not vm.count(edm::CmsRunParser::kJobreportOpt));
0299 REQUIRE(not vm.count(edm::CmsRunParser::kEnableJobreportOpt));
0300 REQUIRE(not vm.count(edm::CmsRunParser::kNumberOfThreadsOpt));
0301 REQUIRE(not vm.count(edm::CmsRunParser::kSizeOfStackForThreadOpt));
0302 REQUIRE(not vm.count(edm::CmsRunParser::kJobModeOpt));
0303 REQUIRE(vm.count(edm::CmsRunParser::kPythonOpt));
0304 auto pythonOptValues = vm[edm::CmsRunParser::kPythonOpt].as<std::vector<std::string>>();
0305 REQUIRE(pythonOptValues.size() == 1);
0306 REQUIRE(pythonOptValues[0] == parg);
0307 REQUIRE(not vm.count(edm::CmsRunParser::kCmdOpt));
0308 }
0309
0310 SECTION("cmsRun and python arguments") {
0311 constexpr int kSize = 6;
0312 const std::string jobreport = "report.xml";
0313 const std::string parg = "--test";
0314 const char* args[kSize] = {"cmsRun", "-j", jobreport.c_str(), "--", arg.c_str(), parg.c_str()};
0315 const auto& output = parser.parse(kSize, args);
0316
0317 REQUIRE(edm::CmsRunParser::hasVM(output));
0318 auto vm = edm::CmsRunParser::getVM(output);
0319
0320 REQUIRE(vm.count(edm::CmsRunParser::kParameterSetOpt));
0321 REQUIRE(vm[edm::CmsRunParser::kParameterSetOpt].as<std::string>() == arg);
0322 REQUIRE(not vm.count(edm::CmsRunParser::kHelpOpt));
0323 REQUIRE(not vm.count(edm::CmsRunParser::kStrictOpt));
0324 REQUIRE(vm.count(edm::CmsRunParser::kJobreportOpt));
0325 REQUIRE(vm[edm::CmsRunParser::kJobreportOpt].as<std::string>() == jobreport);
0326 REQUIRE(not vm.count(edm::CmsRunParser::kEnableJobreportOpt));
0327 REQUIRE(not vm.count(edm::CmsRunParser::kNumberOfThreadsOpt));
0328 REQUIRE(not vm.count(edm::CmsRunParser::kSizeOfStackForThreadOpt));
0329 REQUIRE(not vm.count(edm::CmsRunParser::kJobModeOpt));
0330 auto pythonOptValues = vm[edm::CmsRunParser::kPythonOpt].as<std::vector<std::string>>();
0331 REQUIRE(pythonOptValues.size() == 1);
0332 REQUIRE(pythonOptValues[0] == parg);
0333 REQUIRE(not vm.count(edm::CmsRunParser::kCmdOpt));
0334 }
0335
0336 SECTION("same cmsRun and python arguments") {
0337 constexpr int kSize = 5;
0338 const std::string parg = "--strict";
0339 const char* args[kSize] = {"cmsRun", parg.c_str(), "--", arg.c_str(), parg.c_str()};
0340 const auto& output = parser.parse(kSize, args);
0341
0342 REQUIRE(edm::CmsRunParser::hasVM(output));
0343 auto vm = edm::CmsRunParser::getVM(output);
0344
0345 REQUIRE(vm.count(edm::CmsRunParser::kParameterSetOpt));
0346 REQUIRE(vm[edm::CmsRunParser::kParameterSetOpt].as<std::string>() == arg);
0347 REQUIRE(not vm.count(edm::CmsRunParser::kHelpOpt));
0348 REQUIRE(vm.count(edm::CmsRunParser::kStrictOpt));
0349 REQUIRE(not vm.count(edm::CmsRunParser::kJobreportOpt));
0350 REQUIRE(not vm.count(edm::CmsRunParser::kEnableJobreportOpt));
0351 REQUIRE(not vm.count(edm::CmsRunParser::kNumberOfThreadsOpt));
0352 REQUIRE(not vm.count(edm::CmsRunParser::kSizeOfStackForThreadOpt));
0353 REQUIRE(not vm.count(edm::CmsRunParser::kJobModeOpt));
0354 auto pythonOptValues = vm[edm::CmsRunParser::kPythonOpt].as<std::vector<std::string>>();
0355 REQUIRE(pythonOptValues.size() == 1);
0356 REQUIRE(pythonOptValues[0] == parg);
0357 REQUIRE(not vm.count(edm::CmsRunParser::kCmdOpt));
0358 }
0359 }
0360
0361 SECTION("Command line input only") {
0362 constexpr int kSize = 3;
0363 const std::string arg(
0364 "import FWCore.ParameterSet.Config as cms; process = cms.Process('Test'); "
0365 "process.source=cms.Source('EmptySource'); process.maxEvents.input=10; print('Test3')");
0366 const char* args[kSize] = {"cmsRun", "-c", arg.c_str()};
0367 const auto& output = parser.parse(kSize, args);
0368
0369 REQUIRE(edm::CmsRunParser::hasVM(output));
0370 auto vm = edm::CmsRunParser::getVM(output);
0371
0372 REQUIRE(not vm.count(edm::CmsRunParser::kParameterSetOpt));
0373 REQUIRE(not vm.count(edm::CmsRunParser::kHelpOpt));
0374 REQUIRE(not vm.count(edm::CmsRunParser::kStrictOpt));
0375 REQUIRE(not vm.count(edm::CmsRunParser::kJobreportOpt));
0376 REQUIRE(not vm.count(edm::CmsRunParser::kEnableJobreportOpt));
0377 REQUIRE(not vm.count(edm::CmsRunParser::kNumberOfThreadsOpt));
0378 REQUIRE(not vm.count(edm::CmsRunParser::kSizeOfStackForThreadOpt));
0379 REQUIRE(not vm.count(edm::CmsRunParser::kJobModeOpt));
0380 REQUIRE(not vm.count(edm::CmsRunParser::kPythonOpt));
0381 REQUIRE(vm.count(edm::CmsRunParser::kCmdOpt));
0382 REQUIRE(vm[edm::CmsRunParser::kCmdOpt].as<std::string>() == arg);
0383 }
0384 }