Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-07-12 02:41:42

0001 /*
0002  *  tsetprocessor_t.cc
0003  *  EDMProto
0004  *
0005  *  Created by Chris Jones on 5/1/18.
0006  *
0007  */
0008 
0009 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0010 #include "FWCore/TestProcessor/interface/TestProcessor.h"
0011 
0012 #include "DataFormats/TestObjects/interface/ToyProducts.h"
0013 #include "DataFormats/TestObjects/interface/ThingCollection.h"
0014 
0015 #include "FWCore/Integration/interface/ESTestData.h"
0016 #include "FWCore/Integration/interface/ESTestRecords.h"
0017 
0018 #include <cppunit/extensions/HelperMacros.h>
0019 
0020 #include <memory>
0021 
0022 #include <iostream>
0023 #include <sstream>
0024 #include <stdexcept>
0025 #include <string>
0026 #include <vector>
0027 #include <algorithm>
0028 #include <set>
0029 
0030 class testTestProcessor : public CppUnit::TestFixture {
0031   CPPUNIT_TEST_SUITE(testTestProcessor);
0032   CPPUNIT_TEST(simpleProcessTest);
0033   CPPUNIT_TEST(addProductTest);
0034   CPPUNIT_TEST(missingProductTest);
0035   CPPUNIT_TEST(filterTest);
0036   CPPUNIT_TEST(outputModuleTest);
0037   CPPUNIT_TEST(extraProcessTest);
0038   CPPUNIT_TEST(eventSetupTest);
0039   CPPUNIT_TEST(eventSetupPutTest);
0040   CPPUNIT_TEST(lumiTest);
0041   CPPUNIT_TEST(taskTest);
0042   CPPUNIT_TEST(emptyProcessBlockTest);
0043   CPPUNIT_TEST(emptyRunTest);
0044   CPPUNIT_TEST(emptyLumiTest);
0045   CPPUNIT_TEST(processBlockProductTest);
0046   CPPUNIT_TEST(processBlockEndProductTest);
0047   CPPUNIT_TEST(runProductTest);
0048   CPPUNIT_TEST(lumiProductTest);
0049 
0050   CPPUNIT_TEST_SUITE_END();
0051 
0052 public:
0053   void setUp() {}
0054   void tearDown() {}
0055   void simpleProcessTest();
0056   void addProductTest();
0057   void missingProductTest();
0058   void filterTest();
0059   void outputModuleTest();
0060   void extraProcessTest();
0061   void eventSetupTest();
0062   void eventSetupPutTest();
0063   void lumiTest();
0064   void taskTest();
0065   void emptyProcessBlockTest();
0066   void emptyRunTest();
0067   void emptyLumiTest();
0068   void processBlockProductTest();
0069   void processBlockEndProductTest();
0070   void runProductTest();
0071   void lumiProductTest();
0072 
0073 private:
0074 };
0075 
0076 ///registration of the test so that the runner can find it
0077 CPPUNIT_TEST_SUITE_REGISTRATION(testTestProcessor);
0078 
0079 void testTestProcessor::simpleProcessTest() {
0080   char const* kTest =
0081       "from FWCore.TestProcessor.TestProcess import *\n"
0082       "process = TestProcess()\n"
0083       "process.foo = cms.EDProducer('IntProducer', ivalue=cms.int32(1))\n"
0084       "process.moduleToTest(process.foo)\n";
0085   edm::test::TestProcessor::Config config(kTest);
0086   edm::test::TestProcessor tester(config);
0087   CPPUNIT_ASSERT(tester.labelOfTestModule() == "foo");
0088 
0089   auto event = tester.test();
0090 
0091   CPPUNIT_ASSERT(event.get<edmtest::IntProduct>()->value == 1);
0092 
0093   CPPUNIT_ASSERT(not event.get<edmtest::IntProduct>("doesNotExist"));
0094   CPPUNIT_ASSERT_THROW(*event.get<edmtest::IntProduct>("doesNotExist"), cms::Exception);
0095 }
0096 
0097 void testTestProcessor::addProductTest() {
0098   char const* kTest =
0099       "from FWCore.TestProcessor.TestProcess import *\n"
0100       "process = TestProcess()\n"
0101       "process.add = cms.EDProducer('AddIntsProducer', labels=cms.VInputTag('in'))\n"
0102       "process.moduleToTest(process.add)\n";
0103   edm::test::TestProcessor::Config config(kTest);
0104   auto token = config.produces<edmtest::IntProduct>("in");
0105 
0106   edm::test::TestProcessor tester(config);
0107 
0108   {
0109     auto event = tester.test(std::make_pair(token, std::make_unique<edmtest::IntProduct>(1)));
0110 
0111     CPPUNIT_ASSERT(event.get<edmtest::IntProduct>()->value == 1);
0112   }
0113 
0114   {
0115     auto event = tester.test(std::make_pair(token, std::make_unique<edmtest::IntProduct>(2)));
0116 
0117     CPPUNIT_ASSERT(event.get<edmtest::IntProduct>()->value == 2);
0118   }
0119 
0120   //Check that event gets reset so the data product is not available
0121   CPPUNIT_ASSERT_THROW(tester.test(), cms::Exception);
0122 }
0123 
0124 void testTestProcessor::missingProductTest() {
0125   char const* kTest =
0126       "from FWCore.TestProcessor.TestProcess import *\n"
0127       "process = TestProcess()\n"
0128       "process.add = cms.EDProducer('AddIntsProducer', labels=cms.VInputTag('in'))\n"
0129       "process.moduleToTest(process.add)\n";
0130   edm::test::TestProcessor::Config config(kTest);
0131 
0132   edm::test::TestProcessor tester(config);
0133 
0134   CPPUNIT_ASSERT_THROW(tester.test(), cms::Exception);
0135 }
0136 
0137 void testTestProcessor::filterTest() {
0138   char const* kTest =
0139       "from FWCore.TestProcessor.TestProcess import *\n"
0140       "process = TestProcess()\n"
0141       "process.foo = cms.EDFilter('TestFilterModule', acceptValue=cms.untracked.int32(2),\n"
0142       "   onlyOne = cms.untracked.bool(True))\n"
0143       "process.moduleToTest(process.foo)\n";
0144   edm::test::TestProcessor::Config config(kTest);
0145   edm::test::TestProcessor tester(config);
0146   CPPUNIT_ASSERT(tester.labelOfTestModule() == "foo");
0147 
0148   CPPUNIT_ASSERT(not tester.test().modulePassed());
0149   CPPUNIT_ASSERT(tester.test().modulePassed());
0150   CPPUNIT_ASSERT(not tester.test().modulePassed());
0151   CPPUNIT_ASSERT(tester.test().modulePassed());
0152 }
0153 
0154 void testTestProcessor::outputModuleTest() {
0155   char const* kTest =
0156       "from FWCore.TestProcessor.TestProcess import *\n"
0157       "process = TestProcess()\n"
0158       "process.MessageLogger.cerr.INFO.limit=10000\n"
0159       "process.foo = cms.OutputModule('GetProductCheckerOutputModule', verbose=cms.untracked.bool(True),"
0160       " outputCommands = cms.untracked.vstring('drop *','keep edmtestIntProduct_in__TEST'),\n"
0161       " crosscheck = cms.untracked.vstring('edmtestIntProduct_in__TEST'))\n"
0162       "process.moduleToTest(process.foo)\n";
0163   edm::test::TestProcessor::Config config(kTest);
0164   auto token = config.produces<edmtest::IntProduct>("in");
0165   edm::test::TestProcessor tester(config);
0166   tester.test(std::make_pair(token, std::make_unique<edmtest::IntProduct>(1)));
0167 }
0168 void testTestProcessor::extraProcessTest() {
0169   char const* kTest =
0170       "from FWCore.TestProcessor.TestProcess import *\n"
0171       "process = TestProcess()\n"
0172       "process.add = cms.EDProducer('AddIntsProducer', labels=cms.VInputTag('in'))\n"
0173       "process.moduleToTest(process.add)\n";
0174   edm::test::TestProcessor::Config config(kTest);
0175   auto processToken = config.addExtraProcess("HLT");
0176   auto token = config.produces<edmtest::IntProduct>("in", "", processToken);
0177 
0178   edm::test::TestProcessor tester(config);
0179 
0180   {
0181     auto event = tester.test(std::make_pair(token, std::make_unique<edmtest::IntProduct>(1)));
0182 
0183     CPPUNIT_ASSERT(event.get<edmtest::IntProduct>()->value == 1);
0184   }
0185 }
0186 
0187 void testTestProcessor::eventSetupTest() {
0188   char const* kTest =
0189       "from FWCore.TestProcessor.TestProcess import *\n"
0190       "process = TestProcess()\n"
0191       "process.emptyESSourceA1 = cms.ESSource('EmptyESSource',"
0192       "recordName = cms.string('ESTestRecordA'),"
0193       "firstValid = cms.vuint32(1,2),"
0194       "iovIsRunNotTime = cms.bool(True)"
0195       ")\n"
0196 
0197       "process.add_(cms.ESProducer('ESTestProducerA') )\n"
0198       "process.add = cms.EDAnalyzer('ESTestAnalyzerA', runsToGetDataFor = cms.vint32(1,2), "
0199       "expectedValues=cms.untracked.vint32(1,2))\n"
0200       "process.moduleToTest(process.add)\n";
0201   edm::test::TestProcessor::Config config(kTest);
0202 
0203   edm::test::TestProcessor tester(config);
0204 
0205   (void)tester.test();
0206 
0207   tester.setRunNumber(2);
0208   (void)tester.test();
0209 }
0210 
0211 void testTestProcessor::eventSetupPutTest() {
0212   char const* kTest =
0213       "from FWCore.TestProcessor.TestProcess import *\n"
0214       "process = TestProcess()\n"
0215       "process.add = cms.EDAnalyzer('ESTestAnalyzerA', runsToGetDataFor = cms.vint32(1,2,3), "
0216       "expectedValues=cms.untracked.vint32(1,2,2))\n"
0217       "process.moduleToTest(process.add)\n";
0218   edm::test::TestProcessor::Config config(kTest);
0219   auto estoken = config.esProduces<ESTestRecordA, edmtest::ESTestDataA>();
0220 
0221   edm::test::TestProcessor tester(config);
0222 
0223   (void)tester.test(std::make_pair(estoken, std::make_unique<edmtest::ESTestDataA>(1)));
0224 
0225   tester.setRunNumber(2);
0226   (void)tester.test(std::make_pair(estoken, std::make_unique<edmtest::ESTestDataA>(2)));
0227 
0228   tester.setRunNumber(3);
0229   CPPUNIT_ASSERT_THROW(tester.test(), cms::Exception);
0230 }
0231 
0232 void testTestProcessor::lumiTest() {
0233   auto const kTest = R"_(from FWCore.TestProcessor.TestProcess import *
0234 process = TestProcess()
0235 process.toTest = cms.EDProducer('ThingProducer')
0236 process.moduleToTest(process.toTest)
0237 )_";
0238   edm::test::TestProcessor::Config config(kTest);
0239 
0240   edm::test::TestProcessor tester(config);
0241   (void)tester.test();
0242   tester.setLuminosityBlockNumber(2);
0243   (void)tester.test();
0244 }
0245 
0246 void testTestProcessor::taskTest() {
0247   char const* kTest =
0248       "from FWCore.TestProcessor.TestProcess import *\n"
0249       "process = TestProcess()\n"
0250       "process.mid = cms.EDProducer('AddIntsProducer', labels=cms.VInputTag('in'))\n"
0251       "process.add = cms.EDProducer('AddIntsProducer', labels=cms.VInputTag('mid','in'))\n"
0252       "process.moduleToTest(process.add,cms.Task(process.mid))\n";
0253   edm::test::TestProcessor::Config config(kTest);
0254   auto token = config.produces<edmtest::IntProduct>("in");
0255 
0256   edm::test::TestProcessor tester(config);
0257 
0258   {
0259     auto event = tester.test(std::make_pair(token, std::make_unique<edmtest::IntProduct>(1)));
0260 
0261     CPPUNIT_ASSERT(event.get<edmtest::IntProduct>()->value == 2);
0262   }
0263 }
0264 
0265 void testTestProcessor::emptyProcessBlockTest() {
0266   auto const kTest = R"_(from FWCore.TestProcessor.TestProcess import *
0267 process = TestProcess()
0268 process.toTest = cms.EDAnalyzer('RunLumiEventChecker',
0269         eventSequence = cms.untracked.VEventID()
0270                                 )
0271 process.moduleToTest(process.toTest)
0272 )_";
0273   edm::test::TestProcessor::Config config(kTest);
0274   edm::test::TestProcessor tester(config);
0275 
0276   tester.testWithNoRuns();
0277 }
0278 void testTestProcessor::emptyRunTest() {
0279   auto const kTest = R"_(from FWCore.TestProcessor.TestProcess import *
0280 process = TestProcess()
0281 process.toTest = cms.EDAnalyzer('RunLumiEventChecker',
0282         eventSequence = cms.untracked.VEventID(cms.EventID(1,0,0), cms.EventID(1,0,0))
0283                                 )
0284 process.moduleToTest(process.toTest)
0285 )_";
0286   edm::test::TestProcessor::Config config(kTest);
0287 
0288   edm::test::TestProcessor tester(config);
0289 
0290   tester.testRunWithNoLuminosityBlocks();
0291 }
0292 void testTestProcessor::emptyLumiTest() {
0293   auto const kTest = R"_(from FWCore.TestProcessor.TestProcess import *
0294 process = TestProcess()
0295 process.toTest = cms.EDAnalyzer('RunLumiEventChecker',
0296                                   eventSequence = cms.untracked.VEventID(cms.EventID(1,0,0), cms.EventID(1,1,0),
0297                                                                          cms.EventID(1,1,0), cms.EventID(1,0,0))
0298                                   )
0299 process.moduleToTest(process.toTest)
0300 )_";
0301   edm::test::TestProcessor::Config config(kTest);
0302 
0303   edm::test::TestProcessor tester(config);
0304 
0305   tester.testLuminosityBlockWithNoEvents();
0306 }
0307 
0308 void testTestProcessor::processBlockProductTest() {
0309   auto const kTest = R"_(from FWCore.TestProcessor.TestProcess import *
0310 process = TestProcess()
0311 process.intProducerBeginProcessBlock = cms.EDProducer("IntProducerBeginProcessBlock", ivalue = cms.int32(10000))
0312 process.moduleToTest(process.intProducerBeginProcessBlock)
0313 )_";
0314   edm::test::TestProcessor::Config config(kTest);
0315 
0316   edm::test::TestProcessor tester(config);
0317   {
0318     auto processBlock = tester.testBeginProcessBlock();
0319     CPPUNIT_ASSERT(processBlock.get<edmtest::IntProduct>()->value == 10000);
0320   }
0321   {
0322     auto processBlock = tester.testEndProcessBlock();
0323     CPPUNIT_ASSERT(processBlock.get<edmtest::IntProduct>()->value == 10000);
0324   }
0325 }
0326 
0327 void testTestProcessor::processBlockEndProductTest() {
0328   auto const kTest = R"_(from FWCore.TestProcessor.TestProcess import *
0329 process = TestProcess()
0330 process.intProducerEndProcessBlock = cms.EDProducer("IntProducerEndProcessBlock", ivalue = cms.int32(10001))
0331 process.moduleToTest(process.intProducerEndProcessBlock)
0332 )_";
0333   edm::test::TestProcessor::Config config(kTest);
0334 
0335   edm::test::TestProcessor tester(config);
0336   {
0337     auto processBlock = tester.testBeginProcessBlock();
0338     CPPUNIT_ASSERT_THROW(*processBlock.get<edmtest::IntProduct>(), cms::Exception);
0339   }
0340   {
0341     auto processBlock = tester.testEndProcessBlock();
0342     CPPUNIT_ASSERT(processBlock.get<edmtest::IntProduct>()->value == 10001);
0343   }
0344 }
0345 
0346 void testTestProcessor::runProductTest() {
0347   auto const kTest = R"_(from FWCore.TestProcessor.TestProcess import *
0348 process = TestProcess()
0349 process.toTest = cms.EDProducer('ThingProducer')
0350 process.moduleToTest(process.toTest)
0351 )_";
0352   edm::test::TestProcessor::Config config(kTest);
0353 
0354   edm::test::TestProcessor tester(config);
0355   {
0356     auto run = tester.testBeginRun(1);
0357     CPPUNIT_ASSERT(run.get<edmtest::ThingCollection>("beginRun")->size() == 20);
0358   }
0359 
0360   {
0361     auto run = tester.testEndRun();
0362     CPPUNIT_ASSERT(run.get<edmtest::ThingCollection>("beginRun")->size() == 20);
0363     CPPUNIT_ASSERT(run.get<edmtest::ThingCollection>("endRun")->size() == 20);
0364   }
0365 
0366   {
0367     auto run = tester.testBeginRun(2);
0368     CPPUNIT_ASSERT(run.get<edmtest::ThingCollection>("beginRun")->size() == 20);
0369   }
0370 }
0371 
0372 void testTestProcessor::lumiProductTest() {
0373   auto const kTest = R"_(from FWCore.TestProcessor.TestProcess import *
0374 process = TestProcess()
0375 process.toTest = cms.EDProducer('ThingProducer')
0376 process.moduleToTest(process.toTest)
0377 )_";
0378   edm::test::TestProcessor::Config config(kTest);
0379 
0380   edm::test::TestProcessor tester(config);
0381   {
0382     auto lumi = tester.testBeginLuminosityBlock(1);
0383     CPPUNIT_ASSERT(lumi.get<edmtest::ThingCollection>("beginLumi")->size() == 20);
0384   }
0385 
0386   {
0387     auto lumi = tester.testEndLuminosityBlock();
0388     CPPUNIT_ASSERT(lumi.get<edmtest::ThingCollection>("beginLumi")->size() == 20);
0389     CPPUNIT_ASSERT(lumi.get<edmtest::ThingCollection>("endLumi")->size() == 20);
0390   }
0391 
0392   {
0393     auto lumi = tester.testBeginLuminosityBlock(2);
0394     CPPUNIT_ASSERT(lumi.get<edmtest::ThingCollection>("beginLumi")->size() == 20);
0395   }
0396 }
0397 
0398 #include <Utilities/Testing/interface/CppUnit_testdriver.icpp>