File indexing completed on 2025-01-14 02:38:43
0001
0002
0003
0004
0005
0006
0007
0008 #include <iostream>
0009 #include <atomic>
0010 #include <vector>
0011 #include <map>
0012 #include <functional>
0013 #include "oneapi/tbb/global_control.h"
0014 #include "FWCore/Framework/interface/limited/EDFilter.h"
0015 #include "FWCore/Framework/interface/maker/WorkerT.h"
0016 #include "FWCore/Framework/interface/maker/ModuleHolder.h"
0017 #include "FWCore/Framework/interface/PreallocationConfiguration.h"
0018 #include "FWCore/Framework/interface/TransitionInfoTypes.h"
0019 #include "FWCore/Framework/interface/OccurrenceTraits.h"
0020 #include "FWCore/Framework/interface/ProductResolversFactory.h"
0021 #include "DataFormats/Provenance/interface/ProductRegistry.h"
0022 #include "DataFormats/Provenance/interface/BranchIDListHelper.h"
0023 #include "DataFormats/Provenance/interface/ThinnedAssociationsHelper.h"
0024 #include "FWCore/Framework/interface/HistoryAppender.h"
0025 #include "FWCore/ServiceRegistry/interface/ParentContext.h"
0026 #include "FWCore/ServiceRegistry/interface/StreamContext.h"
0027 #include "FWCore/ServiceRegistry/interface/ActivityRegistry.h"
0028 #include "FWCore/Concurrency/interface/FinalWaitingTask.h"
0029 #include "FWCore/Utilities/interface/GlobalIdentifier.h"
0030
0031 #include "FWCore/Utilities/interface/Exception.h"
0032
0033 #include "cppunit/extensions/HelperMacros.h"
0034
0035 namespace {
0036 edm::ParameterSet makePSet() {
0037 edm::ParameterSet pset;
0038 const unsigned int kLimit = 1;
0039 pset.addUntrackedParameter("concurrencyLimit", kLimit);
0040 return pset;
0041 }
0042
0043 const edm::ParameterSet s_pset = makePSet();
0044 }
0045
0046 namespace {
0047 struct ShadowStreamID {
0048 constexpr ShadowStreamID() : value(0) {}
0049 unsigned int value;
0050 };
0051
0052 union IDUnion {
0053 IDUnion() : m_shadow() {}
0054 ShadowStreamID m_shadow;
0055 edm::StreamID m_id;
0056 };
0057 }
0058 static edm::StreamID makeID() {
0059 IDUnion u;
0060 assert(u.m_id.value() == 0);
0061 return u.m_id;
0062 }
0063 static const edm::StreamID s_streamID0 = makeID();
0064
0065 class testLimitedFilter : public CppUnit::TestFixture {
0066 CPPUNIT_TEST_SUITE(testLimitedFilter);
0067
0068 CPPUNIT_TEST(basicTest);
0069 CPPUNIT_TEST(streamTest);
0070 CPPUNIT_TEST(runTest);
0071 CPPUNIT_TEST(runSummaryTest);
0072 CPPUNIT_TEST(lumiTest);
0073 CPPUNIT_TEST(lumiSummaryTest);
0074 CPPUNIT_TEST(beginRunProdTest);
0075 CPPUNIT_TEST(beginLumiProdTest);
0076 CPPUNIT_TEST(endRunProdTest);
0077 CPPUNIT_TEST(endLumiProdTest);
0078 CPPUNIT_TEST(endRunSummaryProdTest);
0079 CPPUNIT_TEST(endLumiSummaryProdTest);
0080
0081 CPPUNIT_TEST_SUITE_END();
0082
0083 public:
0084 testLimitedFilter();
0085
0086 void setUp() {}
0087 void tearDown() {}
0088
0089 void basicTest();
0090 void streamTest();
0091 void runTest();
0092 void runSummaryTest();
0093 void lumiTest();
0094 void lumiSummaryTest();
0095 void beginRunProdTest();
0096 void beginLumiProdTest();
0097 void endRunProdTest();
0098 void endLumiProdTest();
0099 void endRunSummaryProdTest();
0100 void endLumiSummaryProdTest();
0101
0102 enum class Trans {
0103 kBeginJob,
0104 kBeginStream,
0105 kGlobalBeginRun,
0106 kGlobalBeginRunProduce,
0107 kStreamBeginRun,
0108 kGlobalBeginLuminosityBlock,
0109 kStreamBeginLuminosityBlock,
0110 kEvent,
0111 kStreamEndLuminosityBlock,
0112 kGlobalEndLuminosityBlock,
0113 kStreamEndRun,
0114 kGlobalEndRun,
0115 kEndStream,
0116 kEndJob
0117 };
0118 typedef std::vector<Trans> Expectations;
0119
0120 private:
0121 std::map<Trans, std::function<void(edm::Worker*)>> m_transToFunc;
0122
0123 edm::ProcessConfiguration m_procConfig;
0124 std::shared_ptr<edm::ProductRegistry> m_prodReg;
0125 std::shared_ptr<edm::BranchIDListHelper> m_idHelper;
0126 std::shared_ptr<edm::ThinnedAssociationsHelper> m_associationsHelper;
0127 std::unique_ptr<edm::EventPrincipal> m_ep;
0128 edm::HistoryAppender historyAppender_;
0129 std::shared_ptr<edm::LuminosityBlockPrincipal> m_lbp;
0130 std::shared_ptr<edm::RunPrincipal> m_rp;
0131 std::shared_ptr<edm::ActivityRegistry>
0132 m_actReg;
0133 edm::EventSetupImpl* m_es = nullptr;
0134 edm::ModuleDescription m_desc = {"Dummy", "dummy"};
0135
0136 template <typename T>
0137 void testTransitions(std::shared_ptr<T> iMod, Expectations const& iExpect);
0138
0139 template <typename Traits, typename Info>
0140 void doWork(edm::Worker* iBase, Info const& info, edm::ParentContext const& iContext) {
0141 oneapi::tbb::task_group group;
0142 edm::FinalWaitingTask task{group};
0143 edm::ServiceToken token;
0144 iBase->doWorkAsync<Traits>(edm::WaitingTaskHolder(group, &task), info, token, s_streamID0, iContext, nullptr);
0145 task.wait();
0146 }
0147
0148 class BasicProd : public edm::limited::EDFilter<> {
0149 public:
0150 BasicProd() : edm::limited::EDFilterBase(s_pset), edm::limited::EDFilter<>(s_pset) {}
0151 mutable unsigned int m_count = 0;
0152
0153 bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override {
0154 ++m_count;
0155 return true;
0156 }
0157 };
0158 class StreamProd : public edm::limited::EDFilter<edm::StreamCache<int>> {
0159 public:
0160 StreamProd() : edm::limited::EDFilterBase(s_pset), edm::limited::EDFilter<edm::StreamCache<int>>(s_pset) {}
0161 mutable unsigned int m_count = 0;
0162 bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override {
0163 ++m_count;
0164 return true;
0165 }
0166
0167 std::unique_ptr<int> beginStream(edm::StreamID) const override {
0168 ++m_count;
0169 return std::unique_ptr<int>{};
0170 }
0171
0172 virtual void streamBeginRun(edm::StreamID, edm::Run const&, edm::EventSetup const&) const override { ++m_count; }
0173 virtual void streamBeginLuminosityBlock(edm::StreamID,
0174 edm::LuminosityBlock const&,
0175 edm::EventSetup const&) const override {
0176 ++m_count;
0177 }
0178 virtual void streamEndLuminosityBlock(edm::StreamID,
0179 edm::LuminosityBlock const&,
0180 edm::EventSetup const&) const override {
0181 ++m_count;
0182 }
0183 virtual void streamEndRun(edm::StreamID, edm::Run const&, edm::EventSetup const&) const override { ++m_count; }
0184 void endStream(edm::StreamID) const override { ++m_count; }
0185 };
0186
0187 class RunProd : public edm::limited::EDFilter<edm::RunCache<int>> {
0188 public:
0189 RunProd() : edm::limited::EDFilterBase(s_pset), edm::limited::EDFilter<edm::RunCache<int>>(s_pset) {}
0190 mutable unsigned int m_count = 0;
0191 bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override {
0192 ++m_count;
0193 return true;
0194 }
0195
0196 std::shared_ptr<int> globalBeginRun(edm::Run const&, edm::EventSetup const&) const override {
0197 ++m_count;
0198 return std::shared_ptr<int>{};
0199 }
0200
0201 void globalEndRun(edm::Run const&, edm::EventSetup const&) const override { ++m_count; }
0202 };
0203
0204 class LumiProd : public edm::limited::EDFilter<edm::LuminosityBlockCache<int>> {
0205 public:
0206 LumiProd() : edm::limited::EDFilterBase(s_pset), edm::limited::EDFilter<edm::LuminosityBlockCache<int>>(s_pset) {}
0207 mutable unsigned int m_count = 0;
0208 bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override {
0209 ++m_count;
0210 return true;
0211 }
0212
0213 std::shared_ptr<int> globalBeginLuminosityBlock(edm::LuminosityBlock const&,
0214 edm::EventSetup const&) const override {
0215 ++m_count;
0216 return std::shared_ptr<int>{};
0217 }
0218
0219 void globalEndLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&) const override { ++m_count; }
0220 };
0221
0222 class RunSummaryProd : public edm::limited::EDFilter<edm::RunSummaryCache<int>> {
0223 public:
0224 RunSummaryProd() : edm::limited::EDFilterBase(s_pset), edm::limited::EDFilter<edm::RunSummaryCache<int>>(s_pset) {}
0225 mutable unsigned int m_count = 0;
0226 bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override {
0227 ++m_count;
0228 return true;
0229 }
0230
0231 std::shared_ptr<int> globalBeginRunSummary(edm::Run const&, edm::EventSetup const&) const override {
0232 ++m_count;
0233 return std::shared_ptr<int>{};
0234 }
0235
0236 void streamEndRunSummary(edm::StreamID, edm::Run const&, edm::EventSetup const&, int*) const override { ++m_count; }
0237
0238 void globalEndRunSummary(edm::Run const&, edm::EventSetup const&, int*) const override { ++m_count; }
0239 };
0240
0241 class LumiSummaryProd : public edm::limited::EDFilter<edm::LuminosityBlockSummaryCache<int>> {
0242 public:
0243 LumiSummaryProd()
0244 : edm::limited::EDFilterBase(s_pset), edm::limited::EDFilter<edm::LuminosityBlockSummaryCache<int>>(s_pset) {}
0245 mutable unsigned int m_count = 0;
0246 bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override {
0247 ++m_count;
0248 return true;
0249 }
0250
0251 std::shared_ptr<int> globalBeginLuminosityBlockSummary(edm::LuminosityBlock const&,
0252 edm::EventSetup const&) const override {
0253 ++m_count;
0254 return std::shared_ptr<int>{};
0255 }
0256
0257 void streamEndLuminosityBlockSummary(edm::StreamID,
0258 edm::LuminosityBlock const&,
0259 edm::EventSetup const&,
0260 int*) const override {
0261 ++m_count;
0262 }
0263
0264 void globalEndLuminosityBlockSummary(edm::LuminosityBlock const&, edm::EventSetup const&, int*) const override {
0265 ++m_count;
0266 }
0267 };
0268
0269 class BeginRunProd : public edm::limited::EDFilter<edm::BeginRunProducer> {
0270 public:
0271 BeginRunProd() : edm::limited::EDFilterBase(s_pset), edm::limited::EDFilter<edm::BeginRunProducer>(s_pset) {}
0272 mutable unsigned int m_count = 0;
0273 bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override {
0274 ++m_count;
0275 return true;
0276 }
0277
0278 void globalBeginRunProduce(edm::Run&, edm::EventSetup const&) const override { ++m_count; }
0279 };
0280
0281 class BeginLumiProd : public edm::limited::EDFilter<edm::BeginLuminosityBlockProducer> {
0282 public:
0283 BeginLumiProd()
0284 : edm::limited::EDFilterBase(s_pset), edm::limited::EDFilter<edm::BeginLuminosityBlockProducer>(s_pset) {}
0285 mutable unsigned int m_count = 0;
0286 bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override {
0287 ++m_count;
0288 return true;
0289 }
0290
0291 void globalBeginLuminosityBlockProduce(edm::LuminosityBlock&, edm::EventSetup const&) const override { ++m_count; }
0292 };
0293
0294 class EndRunProd : public edm::limited::EDFilter<edm::EndRunProducer> {
0295 public:
0296 EndRunProd() : edm::limited::EDFilterBase(s_pset), edm::limited::EDFilter<edm::EndRunProducer>(s_pset) {}
0297 mutable unsigned int m_count = 0;
0298 bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override {
0299 ++m_count;
0300 return true;
0301 }
0302
0303 void globalEndRunProduce(edm::Run&, edm::EventSetup const&) const override { ++m_count; }
0304 };
0305
0306 class EndLumiProd : public edm::limited::EDFilter<edm::EndLuminosityBlockProducer> {
0307 public:
0308 EndLumiProd()
0309 : edm::limited::EDFilterBase(s_pset), edm::limited::EDFilter<edm::EndLuminosityBlockProducer>(s_pset) {}
0310 mutable unsigned int m_count = 0;
0311 bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override {
0312 ++m_count;
0313 return true;
0314 }
0315
0316 void globalEndLuminosityBlockProduce(edm::LuminosityBlock&, edm::EventSetup const&) const override { ++m_count; }
0317 };
0318
0319 class EndRunSummaryProd : public edm::limited::EDFilter<edm::EndRunProducer, edm::RunSummaryCache<int>> {
0320 public:
0321 EndRunSummaryProd()
0322 : edm::limited::EDFilterBase(s_pset),
0323 edm::limited::EDFilter<edm::EndRunProducer, edm::RunSummaryCache<int>>(s_pset) {}
0324 mutable unsigned int m_count = 0;
0325 mutable bool m_globalEndRunSummaryCalled = false;
0326 bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override {
0327 ++m_count;
0328 return true;
0329 }
0330
0331 std::shared_ptr<int> globalBeginRunSummary(edm::Run const&, edm::EventSetup const&) const override {
0332 ++m_count;
0333 return std::shared_ptr<int>{};
0334 }
0335
0336 void streamEndRunSummary(edm::StreamID, edm::Run const&, edm::EventSetup const&, int*) const override { ++m_count; }
0337
0338 void globalEndRunSummary(edm::Run const&, edm::EventSetup const&, int*) const override {
0339 ++m_count;
0340 CPPUNIT_ASSERT(m_globalEndRunSummaryCalled == false);
0341 m_globalEndRunSummaryCalled = true;
0342 }
0343
0344 void globalEndRunProduce(edm::Run&, edm::EventSetup const&, int const*) const override {
0345 ++m_count;
0346 CPPUNIT_ASSERT(m_globalEndRunSummaryCalled == true);
0347 m_globalEndRunSummaryCalled = false;
0348 }
0349 };
0350
0351 class EndLumiSummaryProd
0352 : public edm::limited::EDFilter<edm::EndLuminosityBlockProducer, edm::LuminosityBlockSummaryCache<int>> {
0353 public:
0354 EndLumiSummaryProd()
0355 : edm::limited::EDFilterBase(s_pset),
0356 edm::limited::EDFilter<edm::EndLuminosityBlockProducer, edm::LuminosityBlockSummaryCache<int>>(s_pset) {}
0357 mutable unsigned int m_count = 0;
0358 mutable bool m_globalEndLuminosityBlockSummaryCalled = false;
0359 bool filter(edm::StreamID, edm::Event&, edm::EventSetup const&) const override {
0360 ++m_count;
0361 return true;
0362 }
0363
0364 std::shared_ptr<int> globalBeginLuminosityBlockSummary(edm::LuminosityBlock const&,
0365 edm::EventSetup const&) const override {
0366 ++m_count;
0367 return std::shared_ptr<int>{};
0368 }
0369
0370 void streamEndLuminosityBlockSummary(edm::StreamID,
0371 edm::LuminosityBlock const&,
0372 edm::EventSetup const&,
0373 int*) const override {
0374 ++m_count;
0375 }
0376
0377 void globalEndLuminosityBlockSummary(edm::LuminosityBlock const&, edm::EventSetup const&, int*) const override {
0378 ++m_count;
0379 CPPUNIT_ASSERT(m_globalEndLuminosityBlockSummaryCalled == false);
0380 m_globalEndLuminosityBlockSummaryCalled = true;
0381 }
0382
0383 void globalEndLuminosityBlockProduce(edm::LuminosityBlock&, edm::EventSetup const&, int const*) const override {
0384 ++m_count;
0385 CPPUNIT_ASSERT(m_globalEndLuminosityBlockSummaryCalled == true);
0386 m_globalEndLuminosityBlockSummaryCalled = false;
0387 }
0388 };
0389
0390 class TransformProd : public edm::limited::EDFilter<edm::Transformer> {
0391 public:
0392 TransformProd(edm::ParameterSet const&)
0393 : edm::limited::EDFilterBase(s_pset), edm::limited::EDFilter<edm::Transformer>(s_pset) {
0394 token_ = produces<float>();
0395 registerTransform(token_, [](edm::StreamID, float iV) { return int(iV); });
0396 }
0397
0398 bool filter(edm::StreamID, edm::Event& iEvent, edm::EventSetup const&) const {
0399
0400 return true;
0401 }
0402
0403 private:
0404 edm::EDPutTokenT<float> token_;
0405 };
0406 };
0407
0408
0409 CPPUNIT_TEST_SUITE_REGISTRATION(testLimitedFilter);
0410
0411 testLimitedFilter::testLimitedFilter()
0412 : m_prodReg(new edm::ProductRegistry{}),
0413 m_idHelper(new edm::BranchIDListHelper{}),
0414 m_associationsHelper(new edm::ThinnedAssociationsHelper{}),
0415 m_ep() {
0416
0417 m_prodReg->setFrozen();
0418 m_idHelper->updateFromRegistry(*m_prodReg);
0419 edm::EventID eventID = edm::EventID::firstValidEvent();
0420
0421 std::string uuid = edm::createGlobalIdentifier();
0422 edm::Timestamp now(1234567UL);
0423 m_rp.reset(
0424 new edm::RunPrincipal(m_prodReg, edm::productResolversFactory::makePrimary, m_procConfig, &historyAppender_, 0));
0425 m_rp->setAux(edm::RunAuxiliary(eventID.run(), now, now));
0426 edm::LuminosityBlockAuxiliary lumiAux(m_rp->run(), 1, now, now);
0427 m_lbp.reset(new edm::LuminosityBlockPrincipal(
0428 m_prodReg, edm::productResolversFactory::makePrimary, m_procConfig, &historyAppender_, 0));
0429 m_lbp->setAux(lumiAux);
0430 m_lbp->setRunPrincipal(m_rp);
0431 edm::EventAuxiliary eventAux(eventID, uuid, now, true);
0432
0433 m_ep.reset(new edm::EventPrincipal(
0434 m_prodReg, edm::productResolversFactory::makePrimary, m_idHelper, m_associationsHelper, m_procConfig, nullptr));
0435 m_ep->fillEventPrincipal(eventAux, nullptr);
0436 m_ep->setLuminosityBlockPrincipal(m_lbp.get());
0437 m_actReg.reset(new edm::ActivityRegistry);
0438
0439
0440 m_transToFunc[Trans::kBeginStream] = [](edm::Worker* iBase) {
0441 edm::StreamContext streamContext(s_streamID0, nullptr);
0442 iBase->beginStream(s_streamID0, streamContext);
0443 };
0444
0445 m_transToFunc[Trans::kGlobalBeginRun] = [this](edm::Worker* iBase) {
0446 typedef edm::OccurrenceTraits<edm::RunPrincipal, edm::BranchActionGlobalBegin> Traits;
0447 edm::GlobalContext gc(edm::GlobalContext::Transition::kBeginRun, nullptr);
0448 edm::ParentContext nullParentContext(&gc);
0449 iBase->setActivityRegistry(m_actReg);
0450 edm::RunTransitionInfo info(*m_rp, *m_es);
0451 doWork<Traits>(iBase, info, nullParentContext);
0452 };
0453 m_transToFunc[Trans::kStreamBeginRun] = [this](edm::Worker* iBase) {
0454 typedef edm::OccurrenceTraits<edm::RunPrincipal, edm::BranchActionStreamBegin> Traits;
0455 edm::StreamContext streamContext(s_streamID0, nullptr);
0456 edm::ParentContext nullParentContext(&streamContext);
0457 iBase->setActivityRegistry(m_actReg);
0458 edm::RunTransitionInfo info(*m_rp, *m_es);
0459 doWork<Traits>(iBase, info, nullParentContext);
0460 };
0461
0462 m_transToFunc[Trans::kGlobalBeginLuminosityBlock] = [this](edm::Worker* iBase) {
0463 typedef edm::OccurrenceTraits<edm::LuminosityBlockPrincipal, edm::BranchActionGlobalBegin> Traits;
0464 edm::GlobalContext gc(edm::GlobalContext::Transition::kBeginLuminosityBlock, nullptr);
0465 edm::ParentContext nullParentContext(&gc);
0466 iBase->setActivityRegistry(m_actReg);
0467 edm::LumiTransitionInfo info(*m_lbp, *m_es);
0468 doWork<Traits>(iBase, info, nullParentContext);
0469 };
0470 m_transToFunc[Trans::kStreamBeginLuminosityBlock] = [this](edm::Worker* iBase) {
0471 typedef edm::OccurrenceTraits<edm::LuminosityBlockPrincipal, edm::BranchActionStreamBegin> Traits;
0472 edm::StreamContext streamContext(s_streamID0, nullptr);
0473 edm::ParentContext nullParentContext(&streamContext);
0474 iBase->setActivityRegistry(m_actReg);
0475 edm::LumiTransitionInfo info(*m_lbp, *m_es);
0476 doWork<Traits>(iBase, info, nullParentContext);
0477 };
0478
0479 m_transToFunc[Trans::kEvent] = [this](edm::Worker* iBase) {
0480 typedef edm::OccurrenceTraits<edm::EventPrincipal, edm::BranchActionStreamBegin> Traits;
0481 edm::StreamContext streamContext(s_streamID0, nullptr);
0482 edm::ParentContext nullParentContext(&streamContext);
0483 iBase->setActivityRegistry(m_actReg);
0484 edm::EventTransitionInfo info(*m_ep, *m_es);
0485 doWork<Traits>(iBase, info, nullParentContext);
0486 };
0487
0488 m_transToFunc[Trans::kStreamEndLuminosityBlock] = [this](edm::Worker* iBase) {
0489 typedef edm::OccurrenceTraits<edm::LuminosityBlockPrincipal, edm::BranchActionStreamEnd> Traits;
0490 edm::StreamContext streamContext(s_streamID0, nullptr);
0491 edm::ParentContext nullParentContext(&streamContext);
0492 iBase->setActivityRegistry(m_actReg);
0493 edm::LumiTransitionInfo info(*m_lbp, *m_es);
0494 doWork<Traits>(iBase, info, nullParentContext);
0495 };
0496 m_transToFunc[Trans::kGlobalEndLuminosityBlock] = [this](edm::Worker* iBase) {
0497 typedef edm::OccurrenceTraits<edm::LuminosityBlockPrincipal, edm::BranchActionGlobalEnd> Traits;
0498 edm::GlobalContext gc(edm::GlobalContext::Transition::kEndLuminosityBlock, nullptr);
0499 edm::ParentContext nullParentContext(&gc);
0500 iBase->setActivityRegistry(m_actReg);
0501 edm::LumiTransitionInfo info(*m_lbp, *m_es);
0502 doWork<Traits>(iBase, info, nullParentContext);
0503 };
0504
0505 m_transToFunc[Trans::kStreamEndRun] = [this](edm::Worker* iBase) {
0506 typedef edm::OccurrenceTraits<edm::RunPrincipal, edm::BranchActionStreamEnd> Traits;
0507 edm::StreamContext streamContext(s_streamID0, nullptr);
0508 edm::ParentContext nullParentContext(&streamContext);
0509 iBase->setActivityRegistry(m_actReg);
0510 edm::RunTransitionInfo info(*m_rp, *m_es);
0511 doWork<Traits>(iBase, info, nullParentContext);
0512 };
0513 m_transToFunc[Trans::kGlobalEndRun] = [this](edm::Worker* iBase) {
0514 typedef edm::OccurrenceTraits<edm::RunPrincipal, edm::BranchActionGlobalEnd> Traits;
0515 edm::GlobalContext gc(edm::GlobalContext::Transition::kEndRun, nullptr);
0516 edm::ParentContext nullParentContext(&gc);
0517 iBase->setActivityRegistry(m_actReg);
0518 edm::RunTransitionInfo info(*m_rp, *m_es);
0519 doWork<Traits>(iBase, info, nullParentContext);
0520 };
0521
0522 m_transToFunc[Trans::kEndStream] = [](edm::Worker* iBase) {
0523 edm::StreamContext streamContext(s_streamID0, nullptr);
0524 iBase->endStream(s_streamID0, streamContext);
0525 };
0526 }
0527
0528 namespace {
0529 template <typename T>
0530 void testTransition(std::shared_ptr<T> iMod,
0531 edm::Worker* iWorker,
0532 testLimitedFilter::Trans iTrans,
0533 testLimitedFilter::Expectations const& iExpect,
0534 std::function<void(edm::Worker*)> iFunc) {
0535 assert(0 == iMod->m_count);
0536 iFunc(iWorker);
0537 auto count = std::count(iExpect.begin(), iExpect.end(), iTrans);
0538 if (count != iMod->m_count) {
0539 std::cout << "For trans " << static_cast<std::underlying_type<testLimitedFilter::Trans>::type>(iTrans)
0540 << " expected " << count << " and got " << iMod->m_count << std::endl;
0541 }
0542 CPPUNIT_ASSERT(iMod->m_count == count);
0543 iMod->m_count = 0;
0544 iWorker->reset();
0545 }
0546 }
0547
0548 template <typename T>
0549 void testLimitedFilter::testTransitions(std::shared_ptr<T> iMod, Expectations const& iExpect) {
0550 oneapi::tbb::global_control control(oneapi::tbb::global_control::max_allowed_parallelism, 1);
0551
0552 edm::maker::ModuleHolderT<edm::limited::EDFilterBase> h(iMod, nullptr);
0553 h.preallocate(edm::PreallocationConfiguration{});
0554 edm::WorkerT<edm::limited::EDFilterBase> wOther{iMod, m_desc, nullptr};
0555 edm::WorkerT<edm::limited::EDFilterBase> wGlobalLumi{iMod, m_desc, nullptr};
0556 edm::WorkerT<edm::limited::EDFilterBase> wStreamLumi{iMod, m_desc, nullptr};
0557 edm::WorkerT<edm::limited::EDFilterBase> wGlobalRun{iMod, m_desc, nullptr};
0558 edm::WorkerT<edm::limited::EDFilterBase> wStreamRun{iMod, m_desc, nullptr};
0559 for (auto& keyVal : m_transToFunc) {
0560 edm::Worker* worker = &wOther;
0561 if (keyVal.first == Trans::kStreamBeginLuminosityBlock || keyVal.first == Trans::kStreamEndLuminosityBlock) {
0562 worker = &wStreamLumi;
0563 } else if (keyVal.first == Trans::kGlobalBeginLuminosityBlock || keyVal.first == Trans::kGlobalEndLuminosityBlock) {
0564 worker = &wGlobalLumi;
0565 } else if (keyVal.first == Trans::kStreamBeginRun || keyVal.first == Trans::kStreamEndRun) {
0566 worker = &wStreamRun;
0567 } else if (keyVal.first == Trans::kGlobalBeginRun || keyVal.first == Trans::kGlobalEndRun) {
0568 worker = &wGlobalRun;
0569 }
0570 testTransition(iMod, worker, keyVal.first, iExpect, keyVal.second);
0571 }
0572 }
0573
0574 void testLimitedFilter::basicTest() {
0575 auto testProd = std::make_shared<BasicProd>();
0576
0577 CPPUNIT_ASSERT(0 == testProd->m_count);
0578 testTransitions(testProd, {Trans::kEvent});
0579 }
0580
0581 void testLimitedFilter::streamTest() {
0582 auto testProd = std::make_shared<StreamProd>();
0583
0584 CPPUNIT_ASSERT(0 == testProd->m_count);
0585 testTransitions(testProd,
0586 {Trans::kBeginStream,
0587 Trans::kStreamBeginRun,
0588 Trans::kStreamBeginLuminosityBlock,
0589 Trans::kEvent,
0590 Trans::kStreamEndLuminosityBlock,
0591 Trans::kStreamEndRun,
0592 Trans::kEndStream});
0593 }
0594
0595 void testLimitedFilter::runTest() {
0596 auto testProd = std::make_shared<RunProd>();
0597
0598 CPPUNIT_ASSERT(0 == testProd->m_count);
0599 testTransitions(testProd, {Trans::kGlobalBeginRun, Trans::kEvent, Trans::kGlobalEndRun});
0600 }
0601
0602 void testLimitedFilter::runSummaryTest() {
0603 auto testProd = std::make_shared<RunSummaryProd>();
0604
0605 CPPUNIT_ASSERT(0 == testProd->m_count);
0606 testTransitions(testProd, {Trans::kGlobalBeginRun, Trans::kEvent, Trans::kStreamEndRun, Trans::kGlobalEndRun});
0607 }
0608
0609 void testLimitedFilter::lumiTest() {
0610 auto testProd = std::make_shared<LumiProd>();
0611
0612 CPPUNIT_ASSERT(0 == testProd->m_count);
0613 testTransitions(testProd, {Trans::kGlobalBeginLuminosityBlock, Trans::kEvent, Trans::kGlobalEndLuminosityBlock});
0614 }
0615
0616 void testLimitedFilter::lumiSummaryTest() {
0617 auto testProd = std::make_shared<LumiSummaryProd>();
0618
0619 CPPUNIT_ASSERT(0 == testProd->m_count);
0620 testTransitions(testProd,
0621 {Trans::kGlobalBeginLuminosityBlock,
0622 Trans::kEvent,
0623 Trans::kStreamEndLuminosityBlock,
0624 Trans::kGlobalEndLuminosityBlock});
0625 }
0626
0627 void testLimitedFilter::beginRunProdTest() {
0628 auto testProd = std::make_shared<BeginRunProd>();
0629
0630 CPPUNIT_ASSERT(0 == testProd->m_count);
0631 testTransitions(testProd, {Trans::kGlobalBeginRun, Trans::kEvent});
0632 }
0633
0634 void testLimitedFilter::beginLumiProdTest() {
0635 auto testProd = std::make_shared<BeginLumiProd>();
0636
0637 CPPUNIT_ASSERT(0 == testProd->m_count);
0638 testTransitions(testProd, {Trans::kGlobalBeginLuminosityBlock, Trans::kEvent});
0639 }
0640
0641 void testLimitedFilter::endRunProdTest() {
0642 auto testProd = std::make_shared<EndRunProd>();
0643
0644 CPPUNIT_ASSERT(0 == testProd->m_count);
0645 testTransitions(testProd, {Trans::kGlobalEndRun, Trans::kEvent});
0646 }
0647
0648 void testLimitedFilter::endLumiProdTest() {
0649 auto testProd = std::make_shared<EndLumiProd>();
0650
0651 CPPUNIT_ASSERT(0 == testProd->m_count);
0652 testTransitions(testProd, {Trans::kGlobalEndLuminosityBlock, Trans::kEvent});
0653 }
0654
0655 void testLimitedFilter::endRunSummaryProdTest() {
0656 auto testProd = std::make_shared<EndRunSummaryProd>();
0657
0658 CPPUNIT_ASSERT(0 == testProd->m_count);
0659 testTransitions(
0660 testProd,
0661 {Trans::kGlobalEndRun, Trans::kEvent, Trans::kGlobalBeginRun, Trans::kStreamEndRun, Trans::kGlobalEndRun});
0662 }
0663
0664 void testLimitedFilter::endLumiSummaryProdTest() {
0665 auto testProd = std::make_shared<EndLumiSummaryProd>();
0666
0667 CPPUNIT_ASSERT(0 == testProd->m_count);
0668 testTransitions(testProd,
0669 {Trans::kGlobalEndLuminosityBlock,
0670 Trans::kEvent,
0671 Trans::kGlobalBeginLuminosityBlock,
0672 Trans::kStreamEndLuminosityBlock,
0673 Trans::kGlobalEndLuminosityBlock});
0674 }