Back to home page

Project CMSSW displayed by LXR

 
 

    


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 }