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