Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-07-28 22:48:27

0001 // -*- C++ -*-
0002 //
0003 // Package:     FWCore/Integration
0004 // Class  :     ExceptionThrowingProducer
0005 //
0006 // Implementation:
0007 //     Intentionally throws exceptions in various Framework transitions.
0008 //     You can configure which transition. Includes some tests of
0009 //     the Framework behavior after an exception occurs.
0010 //
0011 // Original Author:  W. David Dagenhart
0012 //         Created:  26 September 2022
0013 
0014 #include "DataFormats/Provenance/interface/EventID.h"
0015 #include "DataFormats/Provenance/interface/RunLumiEventNumber.h"
0016 #include "FWCore/Framework/interface/Event.h"
0017 #include "FWCore/Framework/interface/Frameworkfwd.h"
0018 #include "FWCore/Framework/interface/global/EDProducer.h"
0019 #include "FWCore/Framework/interface/MakerMacros.h"
0020 #include "FWCore/Integration/plugins/TestServiceOne.h"
0021 #include "FWCore/Integration/plugins/TestServiceTwo.h"
0022 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0023 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0024 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0025 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0026 #include "FWCore/ServiceRegistry/interface/Service.h"
0027 #include "FWCore/Utilities/interface/Exception.h"
0028 #include "FWCore/Utilities/interface/StreamID.h"
0029 
0030 #include <atomic>
0031 #include <limits>
0032 #include <memory>
0033 
0034 constexpr unsigned int kTestStreams = 4;
0035 constexpr unsigned int kUnset = std::numeric_limits<unsigned int>::max();
0036 constexpr unsigned int kNumberOfTestModules = 2;
0037 // 3 modules configured plus TriggerResultsInserter plus PathStatusInserter plus EndPathStatusInserter
0038 constexpr unsigned int kNumberOfModulesWithJobTransitions = 6;
0039 constexpr unsigned int kNumberOfModulesWithStreamTransitions = 3;
0040 constexpr unsigned int kNumberOfModulesWithProcessBlockTransitions = 2;
0041 constexpr unsigned int kStreamToThrowOn = 2;
0042 
0043 namespace edmtest {
0044 
0045   namespace {
0046     struct Cache {};
0047   }  // namespace
0048 
0049   class ExceptionThrowingProducer : public edm::global::EDProducer<edm::StreamCache<Cache>,
0050                                                                    edm::RunCache<Cache>,
0051                                                                    edm::LuminosityBlockCache<Cache>,
0052                                                                    edm::WatchProcessBlock> {
0053   public:
0054     explicit ExceptionThrowingProducer(edm::ParameterSet const&);
0055 
0056     ~ExceptionThrowingProducer() noexcept(false) override;
0057     ExceptionThrowingProducer(const ExceptionThrowingProducer&) = delete;
0058     ExceptionThrowingProducer& operator=(const ExceptionThrowingProducer&) = delete;
0059     ExceptionThrowingProducer(ExceptionThrowingProducer&&) = delete;
0060     ExceptionThrowingProducer& operator=(ExceptionThrowingProducer&&) = delete;
0061 
0062     void produce(edm::StreamID, edm::Event&, edm::EventSetup const&) const override;
0063 
0064     std::shared_ptr<Cache> globalBeginRun(edm::Run const&, edm::EventSetup const&) const override;
0065     void globalEndRun(edm::Run const&, edm::EventSetup const&) const override;
0066     std::shared_ptr<Cache> globalBeginLuminosityBlock(edm::LuminosityBlock const&,
0067                                                       edm::EventSetup const&) const override;
0068     void globalEndLuminosityBlock(edm::LuminosityBlock const&, edm::EventSetup const&) const override;
0069 
0070     std::unique_ptr<Cache> beginStream(edm::StreamID) const override;
0071     void streamBeginRun(edm::StreamID, edm::Run const&, edm::EventSetup const&) const override;
0072     void streamBeginLuminosityBlock(edm::StreamID, edm::LuminosityBlock const&, edm::EventSetup const&) const override;
0073     void streamEndLuminosityBlock(edm::StreamID, edm::LuminosityBlock const&, edm::EventSetup const&) const override;
0074     void streamEndRun(edm::StreamID, edm::Run const&, edm::EventSetup const&) const override;
0075     void endStream(edm::StreamID) const override;
0076 
0077     void beginProcessBlock(edm::ProcessBlock const& processBlock) override;
0078     void endProcessBlock(edm::ProcessBlock const& processBlock) override;
0079 
0080     void beginJob() override;
0081     void endJob() override;
0082 
0083     static void fillDescriptions(edm::ConfigurationDescriptions&);
0084 
0085   private:
0086     const bool verbose_;
0087 
0088     const edm::EventID eventIDThrowOnEvent_;
0089     const edm::EventID eventIDThrowOnGlobalBeginRun_;
0090     const edm::EventID eventIDThrowOnGlobalBeginLumi_;
0091     const edm::EventID eventIDThrowOnGlobalEndRun_;
0092     const edm::EventID eventIDThrowOnGlobalEndLumi_;
0093     const edm::EventID eventIDThrowOnStreamBeginRun_;
0094     const edm::EventID eventIDThrowOnStreamBeginLumi_;
0095     const edm::EventID eventIDThrowOnStreamEndRun_;
0096     const edm::EventID eventIDThrowOnStreamEndLumi_;
0097     const bool throwInBeginJob_;
0098     const bool throwInBeginStream_;
0099     const bool throwInBeginProcessBlock_;
0100     const bool throwInEndProcessBlock_;
0101     const bool throwInEndStream_;
0102     const bool throwInEndJob_;
0103 
0104     unsigned int nBeginJob_ = 0;
0105     mutable std::atomic<unsigned int> nBeginStream_{0};
0106     unsigned int nBeginProcessBlock_ = 0;
0107     unsigned int nEndProcessBlock_ = 0;
0108     mutable std::atomic<unsigned int> nEndStream_{0};
0109     unsigned int nEndJob_ = 0;
0110 
0111     mutable std::vector<unsigned int> nStreamBeginLumi_;
0112     mutable std::vector<unsigned int> nStreamEndLumi_;
0113     mutable std::atomic<unsigned int> nGlobalBeginLumi_{0};
0114     mutable std::atomic<unsigned int> nGlobalEndLumi_{0};
0115 
0116     mutable std::vector<unsigned int> nStreamBeginRun_;
0117     mutable std::vector<unsigned int> nStreamEndRun_;
0118     mutable std::atomic<unsigned int> nGlobalBeginRun_{0};
0119     mutable std::atomic<unsigned int> nGlobalEndRun_{0};
0120 
0121     const unsigned int expectedNBeginJob_;
0122     const unsigned int expectedNBeginStream_;
0123     const unsigned int expectedNBeginProcessBlock_;
0124     const unsigned int expectedNEndProcessBlock_;
0125     const unsigned int expectedNEndStream_;
0126     const unsigned int expectedNEndJob_;
0127     const bool expectNoRunsProcessed_;
0128 
0129     const unsigned int expectedOffsetNoEndJob_;
0130     const unsigned int expectedOffsetNoEndStream_;
0131     const unsigned int expectedOffsetNoEndProcessBlock_;
0132 
0133     const unsigned int expectedStreamBeginLumi_;
0134     const unsigned int expectedOffsetNoStreamEndLumi_;
0135     mutable unsigned int streamWithBeginLumiException_ = kUnset;
0136     const unsigned int expectedGlobalBeginLumi_;
0137     const unsigned int expectedOffsetNoGlobalEndLumi_;
0138     const unsigned int expectedOffsetNoWriteLumi_;
0139 
0140     const unsigned int expectedStreamBeginRun_;
0141     const unsigned int expectedOffsetNoStreamEndRun_;
0142     mutable unsigned int streamWithBeginRunException_ = kUnset;
0143     const unsigned int expectedGlobalBeginRun_;
0144     const unsigned int expectedOffsetNoGlobalEndRun_;
0145     const unsigned int expectedOffsetNoWriteRun_;
0146 
0147     mutable std::atomic<bool> streamBeginLumiExceptionOccurred_ = false;
0148     mutable std::atomic<bool> streamEndLumiExceptionOccurred_ = false;
0149     mutable std::atomic<bool> globalBeginLumiExceptionOccurred_ = false;
0150 
0151     mutable std::atomic<bool> streamBeginRunExceptionOccurred_ = false;
0152     mutable std::atomic<bool> streamEndRunExceptionOccurred_ = false;
0153     mutable std::atomic<bool> globalBeginRunExceptionOccurred_ = false;
0154   };
0155 
0156   ExceptionThrowingProducer::ExceptionThrowingProducer(edm::ParameterSet const& pset)
0157       : verbose_(pset.getUntrackedParameter<bool>("verbose")),
0158         eventIDThrowOnEvent_(pset.getUntrackedParameter<edm::EventID>("eventIDThrowOnEvent")),
0159         eventIDThrowOnGlobalBeginRun_(pset.getUntrackedParameter<edm::EventID>("eventIDThrowOnGlobalBeginRun")),
0160         eventIDThrowOnGlobalBeginLumi_(pset.getUntrackedParameter<edm::EventID>("eventIDThrowOnGlobalBeginLumi")),
0161         eventIDThrowOnGlobalEndRun_(pset.getUntrackedParameter<edm::EventID>("eventIDThrowOnGlobalEndRun")),
0162         eventIDThrowOnGlobalEndLumi_(pset.getUntrackedParameter<edm::EventID>("eventIDThrowOnGlobalEndLumi")),
0163         eventIDThrowOnStreamBeginRun_(pset.getUntrackedParameter<edm::EventID>("eventIDThrowOnStreamBeginRun")),
0164         eventIDThrowOnStreamBeginLumi_(pset.getUntrackedParameter<edm::EventID>("eventIDThrowOnStreamBeginLumi")),
0165         eventIDThrowOnStreamEndRun_(pset.getUntrackedParameter<edm::EventID>("eventIDThrowOnStreamEndRun")),
0166         eventIDThrowOnStreamEndLumi_(pset.getUntrackedParameter<edm::EventID>("eventIDThrowOnStreamEndLumi")),
0167         throwInBeginJob_(pset.getUntrackedParameter<bool>("throwInBeginJob")),
0168         throwInBeginStream_(pset.getUntrackedParameter<bool>("throwInBeginStream")),
0169         throwInBeginProcessBlock_(pset.getUntrackedParameter<bool>("throwInBeginProcessBlock")),
0170         throwInEndProcessBlock_(pset.getUntrackedParameter<bool>("throwInEndProcessBlock")),
0171         throwInEndStream_(pset.getUntrackedParameter<bool>("throwInEndStream")),
0172         throwInEndJob_(pset.getUntrackedParameter<bool>("throwInEndJob")),
0173         nStreamBeginLumi_(kTestStreams, 0),
0174         nStreamEndLumi_(kTestStreams, 0),
0175         nStreamBeginRun_(kTestStreams, 0),
0176         nStreamEndRun_(kTestStreams, 0),
0177         expectedNBeginJob_(pset.getUntrackedParameter<unsigned int>("expectedNBeginJob")),
0178         expectedNBeginStream_(pset.getUntrackedParameter<unsigned int>("expectedNBeginStream")),
0179         expectedNBeginProcessBlock_(pset.getUntrackedParameter<unsigned int>("expectedNBeginProcessBlock")),
0180         expectedNEndProcessBlock_(pset.getUntrackedParameter<unsigned int>("expectedNEndProcessBlock")),
0181         expectedNEndStream_(pset.getUntrackedParameter<unsigned int>("expectedNEndStream")),
0182         expectedNEndJob_(pset.getUntrackedParameter<unsigned int>("expectedNEndJob")),
0183         expectNoRunsProcessed_(pset.getUntrackedParameter<bool>("expectNoRunsProcessed")),
0184         expectedOffsetNoEndJob_(pset.getUntrackedParameter<unsigned int>("expectedOffsetNoEndJob")),
0185         expectedOffsetNoEndStream_(pset.getUntrackedParameter<unsigned int>("expectedOffsetNoEndStream")),
0186         expectedOffsetNoEndProcessBlock_(pset.getUntrackedParameter<unsigned int>("expectedOffsetNoEndProcessBlock")),
0187         expectedStreamBeginLumi_(pset.getUntrackedParameter<unsigned int>("expectedStreamBeginLumi")),
0188         expectedOffsetNoStreamEndLumi_(pset.getUntrackedParameter<unsigned int>("expectedOffsetNoStreamEndLumi")),
0189         expectedGlobalBeginLumi_(pset.getUntrackedParameter<unsigned int>("expectedGlobalBeginLumi")),
0190         expectedOffsetNoGlobalEndLumi_(pset.getUntrackedParameter<unsigned int>("expectedOffsetNoGlobalEndLumi")),
0191         expectedOffsetNoWriteLumi_(pset.getUntrackedParameter<unsigned int>("expectedOffsetNoWriteLumi")),
0192         expectedStreamBeginRun_(pset.getUntrackedParameter<unsigned int>("expectedStreamBeginRun")),
0193         expectedOffsetNoStreamEndRun_(pset.getUntrackedParameter<unsigned int>("expectedOffsetNoStreamEndRun")),
0194         expectedGlobalBeginRun_(pset.getUntrackedParameter<unsigned int>("expectedGlobalBeginRun")),
0195         expectedOffsetNoGlobalEndRun_(pset.getUntrackedParameter<unsigned int>("expectedOffsetNoGlobalEndRun")),
0196         expectedOffsetNoWriteRun_(pset.getUntrackedParameter<unsigned int>("expectedOffsetNoWriteRun")) {}
0197 
0198   ExceptionThrowingProducer::~ExceptionThrowingProducer() noexcept(false) {
0199     if (nBeginJob_ != expectedNBeginJob_) {
0200       edm::LogAbsolute("ExceptionThrowingProducer")
0201           << "ExceptionThrowingProducer::beginJob did not run expected number of times.";
0202       edm::LogAbsolute("ExceptionThrowingProducer") << "At least one test in ExceptionThrowingProducer FAILED";
0203     } else if (nEndJob_ != expectedNEndJob_) {
0204       edm::LogAbsolute("ExceptionThrowingProducer")
0205           << "ExceptionThrowingProducer::endJob did not run expected number of times.";
0206       edm::LogAbsolute("ExceptionThrowingProducer") << "At least one test in ExceptionThrowingProducer FAILED";
0207     } else if (nEndJob_ == 0u && nBeginProcessBlock_ == 0 && nEndProcessBlock_ == 0 && nBeginStream_.load() == 0 &&
0208                nEndStream_.load() == 0 && nGlobalBeginRun_.load() == 0 && nGlobalEndRun_.load() == 0) {
0209       edm::LogAbsolute("ExceptionThrowingProducer") << "All tests in ExceptionThrowingProducer PASSED";
0210     }
0211 
0212     edm::Service<edmtest::TestServiceOne> serviceOne;
0213 
0214     if (verbose_) {
0215       edm::LogAbsolute("ExceptionThrowingProducer") << "serviceOne->nPostEndJob = " << serviceOne->nPostEndJob();
0216       edm::LogAbsolute("ExceptionThrowingProducer")
0217           << "serviceOne->nPreModuleEndJob = " << serviceOne->nPreModuleEndJob();
0218       edm::LogAbsolute("ExceptionThrowingProducer")
0219           << "serviceOne->nPostModuleEndJob = " << serviceOne->nPostModuleEndJob();
0220     }
0221 
0222     if (serviceOne->nPostEndJob() != nBeginJob_ ||
0223         serviceOne->nPreModuleEndJob() != nBeginJob_ * kNumberOfModulesWithJobTransitions - expectedOffsetNoEndJob_ ||
0224         serviceOne->nPostModuleEndJob() != nBeginJob_ * kNumberOfModulesWithJobTransitions - expectedOffsetNoEndJob_) {
0225       edm::LogAbsolute("ExceptionThrowingProducer")
0226           << "FAILED: Unexpected number of service end job related signals in TestServiceOne, checking while in "
0227              "ExceptionThrowingProducer destructor";
0228       edm::LogAbsolute("ExceptionThrowingProducer") << "At least one test in ExceptionThrowingProducer FAILED";
0229     }
0230   }
0231 
0232   void ExceptionThrowingProducer::produce(edm::StreamID, edm::Event& event, edm::EventSetup const&) const {
0233     if (event.id() == eventIDThrowOnEvent_) {
0234       throw cms::Exception("IntentionalTestException")
0235           << "ExceptionThrowingProducer::produce, module configured to throw on: " << eventIDThrowOnEvent_;
0236     }
0237   }
0238 
0239   std::shared_ptr<Cache> ExceptionThrowingProducer::globalBeginRun(edm::Run const& run, edm::EventSetup const&) const {
0240     ++nGlobalBeginRun_;
0241     if (edm::EventID(run.id().run(), edm::invalidLuminosityBlockNumber, edm::invalidEventNumber) ==
0242         eventIDThrowOnGlobalBeginRun_) {
0243       globalBeginRunExceptionOccurred_.store(true);
0244       throw cms::Exception("IntentionalTestException")
0245           << "ExceptionThrowingProducer::globalBeginRun, module configured to throw on: "
0246           << eventIDThrowOnGlobalBeginRun_;
0247     }
0248     return std::make_shared<Cache>();
0249   }
0250 
0251   void ExceptionThrowingProducer::globalEndRun(edm::Run const& run, edm::EventSetup const&) const {
0252     ++nGlobalEndRun_;
0253     if (edm::EventID(run.id().run(), edm::invalidLuminosityBlockNumber, edm::invalidEventNumber) ==
0254         eventIDThrowOnGlobalEndRun_) {
0255       throw cms::Exception("IntentionalTestException")
0256           << "ExceptionThrowingProducer::globalEndRun, module configured to throw on: " << eventIDThrowOnGlobalEndRun_;
0257     }
0258   }
0259 
0260   std::shared_ptr<Cache> ExceptionThrowingProducer::globalBeginLuminosityBlock(edm::LuminosityBlock const& lumi,
0261                                                                                edm::EventSetup const&) const {
0262     ++nGlobalBeginLumi_;
0263     if (edm::EventID(lumi.id().run(), lumi.id().luminosityBlock(), edm::invalidEventNumber) ==
0264         eventIDThrowOnGlobalBeginLumi_) {
0265       globalBeginLumiExceptionOccurred_.store(true);
0266       throw cms::Exception("IntentionalTestException")
0267           << "ExceptionThrowingProducer::globalBeginLuminosityBlock, module configured to throw on: "
0268           << eventIDThrowOnGlobalBeginLumi_;
0269     }
0270     return std::make_shared<Cache>();
0271   }
0272 
0273   void ExceptionThrowingProducer::globalEndLuminosityBlock(edm::LuminosityBlock const& lumi,
0274                                                            edm::EventSetup const&) const {
0275     ++nGlobalEndLumi_;
0276     if (edm::EventID(lumi.id().run(), lumi.id().luminosityBlock(), edm::invalidEventNumber) ==
0277         eventIDThrowOnGlobalEndLumi_) {
0278       throw cms::Exception("IntentionalTestException")
0279           << "ExceptionThrowingProducer::globalEndLuminosityBlock, module configured to throw on: "
0280           << eventIDThrowOnGlobalEndLumi_;
0281     }
0282   }
0283 
0284   std::unique_ptr<Cache> ExceptionThrowingProducer::beginStream(edm::StreamID streamID) const {
0285     ++nBeginStream_;
0286     if (throwInBeginStream_ && streamID.value() == kStreamToThrowOn) {
0287       throw cms::Exception("IntentionalTestException")
0288           << "ExceptionThrowingProducer::beginStream, module configured to throw during beginStream for stream: "
0289           << kStreamToThrowOn;
0290     }
0291     return std::make_unique<Cache>();
0292   }
0293 
0294   void ExceptionThrowingProducer::streamBeginRun(edm::StreamID iStream,
0295                                                  edm::Run const& run,
0296                                                  edm::EventSetup const&) const {
0297     if (iStream < kTestStreams) {
0298       ++nStreamBeginRun_[iStream];
0299     }
0300 
0301     bool expected = false;
0302     if (edm::EventID(run.id().run(), edm::invalidLuminosityBlockNumber, edm::invalidEventNumber) ==
0303             eventIDThrowOnStreamBeginRun_ &&
0304         streamBeginRunExceptionOccurred_.compare_exchange_strong(expected, true)) {
0305       // Remember which stream threw
0306       streamWithBeginRunException_ = iStream.value();
0307       throw cms::Exception("IntentionalTestException")
0308           << "ExceptionThrowingProducer::streamBeginRun, module configured to throw on: "
0309           << eventIDThrowOnStreamBeginRun_;
0310     }
0311   }
0312 
0313   void ExceptionThrowingProducer::streamBeginLuminosityBlock(edm::StreamID iStream,
0314                                                              edm::LuminosityBlock const& lumi,
0315                                                              edm::EventSetup const&) const {
0316     if (iStream < kTestStreams) {
0317       ++nStreamBeginLumi_[iStream];
0318     }
0319 
0320     // Throw if this lumi's ID matches the configured ID (this code is written so
0321     // that only the first stream to match it will throw).
0322     bool expected = false;
0323     if (edm::EventID(lumi.run(), lumi.id().luminosityBlock(), edm::invalidEventNumber) ==
0324             eventIDThrowOnStreamBeginLumi_ &&
0325         streamBeginLumiExceptionOccurred_.compare_exchange_strong(expected, true)) {
0326       // Remember which stream threw
0327       streamWithBeginLumiException_ = iStream.value();
0328 
0329       throw cms::Exception("IntentionalTestException")
0330           << "ExceptionThrowingProducer::streamBeginLuminosityBlock, module configured to throw on: "
0331           << eventIDThrowOnStreamBeginLumi_;
0332     }
0333   }
0334 
0335   void ExceptionThrowingProducer::streamEndLuminosityBlock(edm::StreamID iStream,
0336                                                            edm::LuminosityBlock const& lumi,
0337                                                            edm::EventSetup const&) const {
0338     if (iStream < kTestStreams) {
0339       ++nStreamEndLumi_[iStream];
0340     }
0341 
0342     bool expected = false;
0343     if (edm::EventID(lumi.run(), lumi.id().luminosityBlock(), edm::invalidEventNumber) ==
0344             eventIDThrowOnStreamEndLumi_ &&
0345         streamEndLumiExceptionOccurred_.compare_exchange_strong(expected, true)) {
0346       throw cms::Exception("IntentionalTestException")
0347           << "ExceptionThrowingProducer::streamEndLuminosityBlock, module configured to throw on: "
0348           << eventIDThrowOnStreamEndLumi_;
0349     }
0350   }
0351 
0352   void ExceptionThrowingProducer::streamEndRun(edm::StreamID iStream,
0353                                                edm::Run const& run,
0354                                                edm::EventSetup const&) const {
0355     if (iStream < kTestStreams) {
0356       ++nStreamEndRun_[iStream];
0357     }
0358 
0359     bool expected = false;
0360     if (edm::EventID(run.id().run(), edm::invalidLuminosityBlockNumber, edm::invalidEventNumber) ==
0361             eventIDThrowOnStreamEndRun_ &&
0362         streamEndRunExceptionOccurred_.compare_exchange_strong(expected, true)) {
0363       throw cms::Exception("IntentionalTestException")
0364           << "ExceptionThrowingProducer::streamEndRun, module configured to throw on: " << eventIDThrowOnStreamEndRun_;
0365     }
0366   }
0367 
0368   void ExceptionThrowingProducer::endStream(edm::StreamID streamID) const {
0369     ++nEndStream_;
0370     if (throwInEndStream_ && streamID.value() == kStreamToThrowOn) {
0371       throw cms::Exception("IntentionalTestException")
0372           << "ExceptionThrowingProducer::endStream, module configured to throw during endStream for stream: "
0373           << kStreamToThrowOn;
0374     }
0375   }
0376 
0377   void ExceptionThrowingProducer::beginProcessBlock(edm::ProcessBlock const& processBlock) {
0378     ++nBeginProcessBlock_;
0379     if (throwInBeginProcessBlock_) {
0380       throw cms::Exception("IntentionalTestException")
0381           << "ExceptionThrowingProducer::beginProcessBlock, module configured to throw during beginProcessBlock";
0382     }
0383   }
0384 
0385   void ExceptionThrowingProducer::endProcessBlock(edm::ProcessBlock const& processBlock) {
0386     ++nEndProcessBlock_;
0387     if (throwInEndProcessBlock_) {
0388       throw cms::Exception("IntentionalTestException")
0389           << "ExceptionThrowingProducer::endProcessBlock, module configured to throw during endProcessBlock";
0390     }
0391   }
0392 
0393   void ExceptionThrowingProducer::beginJob() {
0394     ++nBeginJob_;
0395     if (throwInBeginJob_) {
0396       throw cms::Exception("IntentionalTestException")
0397           << "ExceptionThrowingProducer::beginJob, module configured to throw during beginJob";
0398     }
0399   }
0400 
0401   void ExceptionThrowingProducer::endJob() {
0402     ++nEndJob_;
0403 
0404     bool testsPass = true;
0405 
0406     if (nBeginStream_.load() != expectedNBeginStream_) {
0407       edm::LogAbsolute("ExceptionThrowingProducer")
0408           << "FAILED: Unexpected number of beginStream transitions, saw: " << nBeginStream_.load()
0409           << " expected: " << expectedNBeginStream_;
0410       testsPass = false;
0411     }
0412 
0413     if (nBeginProcessBlock_ != expectedNBeginProcessBlock_) {
0414       edm::LogAbsolute("ExceptionThrowingProducer")
0415           << "FAILED: Unexpected number of beginProcessBlock transitions, saw: " << nBeginProcessBlock_
0416           << " expected: " << expectedNBeginProcessBlock_;
0417       testsPass = false;
0418     }
0419 
0420     if (nEndProcessBlock_ != expectedNEndProcessBlock_) {
0421       edm::LogAbsolute("ExceptionThrowingProducer")
0422           << "FAILED: Unexpected number of endProcessBlock transitions, saw: " << nEndProcessBlock_
0423           << " expected: " << expectedNEndProcessBlock_;
0424       testsPass = false;
0425     }
0426 
0427     if (nEndStream_.load() != expectedNEndStream_) {
0428       edm::LogAbsolute("ExceptionThrowingProducer")
0429           << "FAILED: Unexpected number of endStream transitions, saw: " << nEndStream_.load()
0430           << " expected: " << expectedNEndStream_;
0431       testsPass = false;
0432     }
0433 
0434     if (expectNoRunsProcessed_ && nGlobalBeginRun_.load() != 0) {
0435       edm::LogAbsolute("ExceptionThrowingProducer")
0436           << "FAILED: Unexpected number of globalBeginRun transitions, saw: " << nGlobalBeginRun_.load()
0437           << " expected: " << 0;
0438       testsPass = false;
0439     }
0440 
0441     unsigned int totalStreamBeginLumi = 0;
0442     unsigned int i = 0;
0443     for (auto const& nStreamBeginLumi : nStreamBeginLumi_) {
0444       totalStreamBeginLumi += nStreamBeginLumi;
0445 
0446       // Don't know exact number to expect because streams might skip a lumi so
0447       // only throw if it is greater than the maximum possible and we only know
0448       // that for sure if the exception was thrown in stream begin lumi.
0449       if (nStreamBeginLumi > expectedStreamBeginLumi_ && streamWithBeginLumiException_ != kUnset) {
0450         edm::LogAbsolute("ExceptionThrowingProducer")
0451             << "FAILED: More than maximum possible number of streamBeginLumi transitions, stream " << i << " saw "
0452             << nStreamBeginLumi << " max possible " << expectedStreamBeginLumi_;
0453         testsPass = false;
0454       }
0455       unsigned int expectedStreamEndLumi =
0456           (streamWithBeginLumiException_ == i) ? nStreamBeginLumi - 1 : nStreamBeginLumi;
0457       if (nStreamEndLumi_[i] != expectedStreamEndLumi) {
0458         edm::LogAbsolute("ExceptionThrowingProducer")
0459             << "FAILED: Unexpected number of streamEndLumi transitions, stream " << i << " saw " << nStreamEndLumi_[i]
0460             << " expected " << expectedStreamEndLumi;
0461         testsPass = false;
0462       }
0463 
0464       ++i;
0465     }
0466 
0467     unsigned int totalStreamBeginRun = 0;
0468     i = 0;
0469     for (auto const& nStreamBeginRun : nStreamBeginRun_) {
0470       totalStreamBeginRun += nStreamBeginRun;
0471 
0472       // Don't know exact number to expect because streams might skip a run (not yet
0473       // but probably in the future) so only throw if it is greater than the maximum
0474       // possible and we only know that for sure if the exception was thrown in stream begin run.
0475       if (nStreamBeginRun > expectedStreamBeginRun_ && streamWithBeginRunException_ != kUnset) {
0476         edm::LogAbsolute("ExceptionThrowingProducer")
0477             << "FAILED: More than maximum possible number of streamBeginRun transitions, stream " << i << " saw "
0478             << nStreamBeginRun << " max possible " << expectedStreamBeginRun_;
0479         testsPass = false;
0480       }
0481       unsigned int expectedStreamEndRun = (streamWithBeginRunException_ == i) ? nStreamBeginRun - 1 : nStreamBeginRun;
0482       if (nStreamEndRun_[i] != expectedStreamEndRun) {
0483         edm::LogAbsolute("ExceptionThrowingProducer")
0484             << "FAILED: Unexpected number of streamEndRun transitions, stream " << i << " saw " << nStreamEndRun_[i]
0485             << " expected " << expectedStreamEndRun;
0486         testsPass = false;
0487       }
0488 
0489       ++i;
0490     }
0491 
0492     // There has to be at least as many global begin lumi transitions
0493     // as expected. Because of concurrency, the Framework might already have
0494     // started other lumis ahead of the one where an exception occurs.
0495     if (expectedGlobalBeginLumi_ > 0 && nGlobalBeginLumi_.load() < expectedGlobalBeginLumi_) {
0496       edm::LogAbsolute("ExceptionThrowingProducer")
0497           << "FAILED: Less than the expected number of globalBeginLumi transitions, expected at least "
0498           << expectedGlobalBeginLumi_ << " saw " << nGlobalBeginLumi_.load();
0499       testsPass = false;
0500     }
0501 
0502     // There has to be at least as many global begin run transitions
0503     // as expected. Because of concurrency, the Framework might already have
0504     // started other runs ahead of the one where an exception occurs.
0505     if (expectedGlobalBeginRun_ > 0 && nGlobalBeginRun_.load() < expectedGlobalBeginRun_) {
0506       edm::LogAbsolute("ExceptionThrowingProducer")
0507           << "FAILED: Less than the expected number of globalBeginRun transitions, expected at least "
0508           << expectedGlobalBeginRun_ << " saw " << nGlobalBeginRun_.load();
0509       testsPass = false;
0510     }
0511 
0512     unsigned int expectedGlobalEndLumi =
0513         globalBeginLumiExceptionOccurred_.load() ? nGlobalBeginLumi_.load() - 1 : nGlobalBeginLumi_.load();
0514     if (nGlobalEndLumi_.load() != expectedGlobalEndLumi) {
0515       edm::LogAbsolute("ExceptionThrowingProducer")
0516           << "FAILED: number of global end lumi transitions not equal to expected value, expected "
0517           << expectedGlobalEndLumi << " saw " << nGlobalEndLumi_.load();
0518       testsPass = false;
0519     }
0520 
0521     unsigned int expectedGlobalEndRun =
0522         globalBeginRunExceptionOccurred_.load() ? nGlobalBeginRun_.load() - 1 : nGlobalBeginRun_.load();
0523     if (nGlobalEndRun_.load() != expectedGlobalEndRun) {
0524       edm::LogAbsolute("ExceptionThrowingProducer")
0525           << "FAILED: number of global end run transitions not equal to expected value, expected "
0526           << expectedGlobalEndRun << " saw " << nGlobalEndRun_.load();
0527       testsPass = false;
0528     }
0529 
0530     edm::Service<edmtest::TestServiceOne> serviceOne;
0531     if (serviceOne->nPreBeginJob() != nBeginJob_ || serviceOne->nPostBeginJob() != nBeginJob_ ||
0532         serviceOne->nPreEndJob() != nBeginJob_ ||
0533         serviceOne->nPreModuleBeginJob() != nBeginJob_ * kNumberOfModulesWithJobTransitions ||
0534         serviceOne->nPostModuleBeginJob() != nBeginJob_ * kNumberOfModulesWithJobTransitions) {
0535       edm::LogAbsolute("ExceptionThrowingProducer")
0536           << "FAILED: Unexpected number of service transitions in TestServiceOne, beginJob and endJob";
0537       testsPass = false;
0538     }
0539 
0540     if (serviceOne->nPreBeginStream() != nBeginStream_ || serviceOne->nPostBeginStream() != nBeginStream_ ||
0541         serviceOne->nPreEndStream() != nBeginStream_ || serviceOne->nPostEndStream() != nBeginStream_ ||
0542         serviceOne->nPreModuleBeginStream() != nBeginStream_ * kNumberOfModulesWithStreamTransitions ||
0543         serviceOne->nPostModuleBeginStream() != nBeginStream_ * kNumberOfModulesWithStreamTransitions ||
0544         serviceOne->nPreModuleEndStream() !=
0545             nBeginStream_ * kNumberOfModulesWithStreamTransitions - expectedOffsetNoEndStream_ ||
0546         serviceOne->nPostModuleEndStream() !=
0547             nBeginStream_ * kNumberOfModulesWithStreamTransitions - expectedOffsetNoEndStream_) {
0548       edm::LogAbsolute("ExceptionThrowingProducer")
0549           << "FAILED: Unexpected number of service transitions in TestServiceOne, beginStream and endStream";
0550       testsPass = false;
0551     }
0552 
0553     if (serviceOne->nPreBeginProcessBlock() != nBeginProcessBlock_ ||
0554         serviceOne->nPostBeginProcessBlock() != nBeginProcessBlock_ ||
0555         serviceOne->nPreEndProcessBlock() != nBeginProcessBlock_ ||
0556         serviceOne->nPostEndProcessBlock() != nBeginProcessBlock_ ||
0557         serviceOne->nPreModuleBeginProcessBlock() !=
0558             nBeginProcessBlock_ * kNumberOfModulesWithProcessBlockTransitions ||
0559         serviceOne->nPostModuleBeginProcessBlock() !=
0560             nBeginProcessBlock_ * kNumberOfModulesWithProcessBlockTransitions ||
0561         serviceOne->nPreModuleEndProcessBlock() !=
0562             nBeginProcessBlock_ * kNumberOfModulesWithProcessBlockTransitions - expectedOffsetNoEndProcessBlock_ ||
0563         serviceOne->nPostModuleEndProcessBlock() !=
0564             nBeginProcessBlock_ * kNumberOfModulesWithProcessBlockTransitions - expectedOffsetNoEndProcessBlock_) {
0565       edm::LogAbsolute("ExceptionThrowingProducer") << "FAILED: Unexpected number of service transitions in "
0566                                                        "TestServiceOne, beginProcessBlock and endProcessBlock";
0567       testsPass = false;
0568     }
0569 
0570     if (serviceOne->nPreStreamBeginLumi() != totalStreamBeginLumi ||
0571         serviceOne->nPostStreamBeginLumi() != totalStreamBeginLumi ||
0572         serviceOne->nPreStreamEndLumi() != totalStreamBeginLumi ||
0573         serviceOne->nPostStreamEndLumi() != totalStreamBeginLumi ||
0574         serviceOne->nPreModuleStreamBeginLumi() != totalStreamBeginLumi * kNumberOfTestModules ||
0575         serviceOne->nPostModuleStreamBeginLumi() != totalStreamBeginLumi * kNumberOfTestModules ||
0576         serviceOne->nPreModuleStreamEndLumi() !=
0577             totalStreamBeginLumi * kNumberOfTestModules - expectedOffsetNoStreamEndLumi_ ||
0578         serviceOne->nPostModuleStreamEndLumi() !=
0579             totalStreamBeginLumi * kNumberOfTestModules - expectedOffsetNoStreamEndLumi_) {
0580       edm::LogAbsolute("ExceptionThrowingProducer")
0581           << "FAILED: Unexpected number of service transitions in TestServiceOne, stream lumi";
0582       testsPass = false;
0583     }
0584 
0585     edm::Service<edmtest::TestServiceTwo> serviceTwo;
0586     if (serviceTwo->nPreStreamBeginLumi() != totalStreamBeginLumi ||
0587         serviceTwo->nPostStreamBeginLumi() != totalStreamBeginLumi ||
0588         serviceTwo->nPreStreamEndLumi() != totalStreamBeginLumi ||
0589         serviceTwo->nPostStreamEndLumi() != totalStreamBeginLumi ||
0590         serviceTwo->nPreModuleStreamBeginLumi() != totalStreamBeginLumi * kNumberOfTestModules ||
0591         serviceTwo->nPostModuleStreamBeginLumi() != totalStreamBeginLumi * kNumberOfTestModules ||
0592         serviceTwo->nPreModuleStreamEndLumi() !=
0593             totalStreamBeginLumi * kNumberOfTestModules - expectedOffsetNoStreamEndLumi_ ||
0594         serviceTwo->nPostModuleStreamEndLumi() !=
0595             totalStreamBeginLumi * kNumberOfTestModules - expectedOffsetNoStreamEndLumi_) {
0596       edm::LogAbsolute("ExceptionThrowingProducer")
0597           << "FAILED: Unexpected number of service transitions in TestServiceTwo, stream lumi";
0598       testsPass = false;
0599     }
0600 
0601     unsigned int nGlobalBeginLumi = nGlobalBeginLumi_.load();
0602 
0603     if (serviceOne->nPreGlobalBeginLumi() != nGlobalBeginLumi ||
0604         serviceOne->nPostGlobalBeginLumi() != nGlobalBeginLumi || serviceOne->nPreGlobalEndLumi() != nGlobalBeginLumi ||
0605         serviceOne->nPostGlobalEndLumi() != nGlobalBeginLumi ||
0606         serviceOne->nPreModuleGlobalBeginLumi() != nGlobalBeginLumi * kNumberOfTestModules ||
0607         serviceOne->nPostModuleGlobalBeginLumi() != nGlobalBeginLumi * kNumberOfTestModules ||
0608         serviceOne->nPreModuleGlobalEndLumi() !=
0609             nGlobalBeginLumi * kNumberOfTestModules - expectedOffsetNoGlobalEndLumi_ ||
0610         serviceOne->nPostModuleGlobalEndLumi() !=
0611             nGlobalBeginLumi * kNumberOfTestModules - expectedOffsetNoGlobalEndLumi_ ||
0612         serviceOne->nPreGlobalWriteLumi() != nGlobalBeginLumi - expectedOffsetNoWriteLumi_ ||
0613         serviceOne->nPostGlobalWriteLumi() != nGlobalBeginLumi - expectedOffsetNoWriteLumi_) {
0614       edm::LogAbsolute("ExceptionThrowingProducer")
0615           << "FAILED: Unexpected number of service transitions in TestServiceOne, global lumi";
0616       testsPass = false;
0617     }
0618 
0619     if (serviceTwo->nPreGlobalBeginLumi() != nGlobalBeginLumi ||
0620         serviceTwo->nPostGlobalBeginLumi() != nGlobalBeginLumi || serviceTwo->nPreGlobalEndLumi() != nGlobalBeginLumi ||
0621         serviceTwo->nPostGlobalEndLumi() != nGlobalBeginLumi ||
0622         serviceTwo->nPreModuleGlobalBeginLumi() != nGlobalBeginLumi * kNumberOfTestModules ||
0623         serviceTwo->nPostModuleGlobalBeginLumi() != nGlobalBeginLumi * kNumberOfTestModules ||
0624         serviceTwo->nPreModuleGlobalEndLumi() !=
0625             nGlobalBeginLumi * kNumberOfTestModules - expectedOffsetNoGlobalEndLumi_ ||
0626         serviceTwo->nPostModuleGlobalEndLumi() !=
0627             nGlobalBeginLumi * kNumberOfTestModules - expectedOffsetNoGlobalEndLumi_ ||
0628         serviceTwo->nPreGlobalWriteLumi() != nGlobalBeginLumi - expectedOffsetNoWriteLumi_ ||
0629         serviceTwo->nPostGlobalWriteLumi() != nGlobalBeginLumi - expectedOffsetNoWriteLumi_) {
0630       edm::LogAbsolute("ExceptionThrowingProducer")
0631           << "FAILED: Unexpected number of service transitions in TestServiceTwo, global lumi";
0632       testsPass = false;
0633     }
0634 
0635     if (serviceOne->nPreStreamBeginRun() != totalStreamBeginRun ||
0636         serviceOne->nPostStreamBeginRun() != totalStreamBeginRun ||
0637         serviceOne->nPreStreamEndRun() != totalStreamBeginRun ||
0638         serviceOne->nPostStreamEndRun() != totalStreamBeginRun ||
0639         serviceOne->nPreModuleStreamBeginRun() != totalStreamBeginRun * kNumberOfTestModules ||
0640         serviceOne->nPostModuleStreamBeginRun() != totalStreamBeginRun * kNumberOfTestModules ||
0641         serviceOne->nPreModuleStreamEndRun() !=
0642             totalStreamBeginRun * kNumberOfTestModules - expectedOffsetNoStreamEndRun_ ||
0643         serviceOne->nPostModuleStreamEndRun() !=
0644             totalStreamBeginRun * kNumberOfTestModules - expectedOffsetNoStreamEndRun_) {
0645       edm::LogAbsolute("ExceptionThrowingProducer")
0646           << "FAILED: Unexpected number of service transitions in TestServiceOne, stream run";
0647       testsPass = false;
0648     }
0649 
0650     if (serviceTwo->nPreStreamBeginRun() != totalStreamBeginRun ||
0651         serviceTwo->nPostStreamBeginRun() != totalStreamBeginRun ||
0652         serviceTwo->nPreStreamEndRun() != totalStreamBeginRun ||
0653         serviceTwo->nPostStreamEndRun() != totalStreamBeginRun ||
0654         serviceTwo->nPreModuleStreamBeginRun() != totalStreamBeginRun * kNumberOfTestModules ||
0655         serviceTwo->nPostModuleStreamBeginRun() != totalStreamBeginRun * kNumberOfTestModules ||
0656         serviceTwo->nPreModuleStreamEndRun() !=
0657             totalStreamBeginRun * kNumberOfTestModules - expectedOffsetNoStreamEndRun_ ||
0658         serviceTwo->nPostModuleStreamEndRun() !=
0659             totalStreamBeginRun * kNumberOfTestModules - expectedOffsetNoStreamEndRun_) {
0660       edm::LogAbsolute("ExceptionThrowingProducer")
0661           << "FAILED: Unexpected number of service transitions in TestServiceTwo, stream run";
0662       testsPass = false;
0663     }
0664 
0665     unsigned int nGlobalBeginRun = nGlobalBeginRun_.load();
0666 
0667     if (serviceOne->nPreGlobalBeginRun() != nGlobalBeginRun || serviceOne->nPostGlobalBeginRun() != nGlobalBeginRun ||
0668         serviceOne->nPreGlobalEndRun() != nGlobalBeginRun || serviceOne->nPostGlobalEndRun() != nGlobalBeginRun ||
0669         serviceOne->nPreModuleGlobalBeginRun() != nGlobalBeginRun * kNumberOfTestModules ||
0670         serviceOne->nPostModuleGlobalBeginRun() != nGlobalBeginRun * kNumberOfTestModules ||
0671         serviceOne->nPreModuleGlobalEndRun() !=
0672             nGlobalBeginRun * kNumberOfTestModules - expectedOffsetNoGlobalEndRun_ ||
0673         serviceOne->nPostModuleGlobalEndRun() !=
0674             nGlobalBeginRun * kNumberOfTestModules - expectedOffsetNoGlobalEndRun_ ||
0675         serviceOne->nPreGlobalWriteRun() != nGlobalBeginRun - expectedOffsetNoWriteRun_ ||
0676         serviceOne->nPostGlobalWriteRun() != nGlobalBeginRun - expectedOffsetNoWriteRun_) {
0677       edm::LogAbsolute("ExceptionThrowingProducer")
0678           << "FAILED: Unexpected number of service transitions in TestServiceOne, global run";
0679       testsPass = false;
0680     }
0681 
0682     if (serviceTwo->nPreGlobalBeginRun() != nGlobalBeginRun || serviceTwo->nPostGlobalBeginRun() != nGlobalBeginRun ||
0683         serviceTwo->nPreGlobalEndRun() != nGlobalBeginRun || serviceTwo->nPostGlobalEndRun() != nGlobalBeginRun ||
0684         serviceTwo->nPreModuleGlobalBeginRun() != nGlobalBeginRun * kNumberOfTestModules ||
0685         serviceTwo->nPostModuleGlobalBeginRun() != nGlobalBeginRun * kNumberOfTestModules ||
0686         serviceTwo->nPreModuleGlobalEndRun() !=
0687             nGlobalBeginRun * kNumberOfTestModules - expectedOffsetNoGlobalEndRun_ ||
0688         serviceTwo->nPostModuleGlobalEndRun() !=
0689             nGlobalBeginRun * kNumberOfTestModules - expectedOffsetNoGlobalEndRun_ ||
0690         serviceTwo->nPreGlobalWriteRun() != nGlobalBeginRun - expectedOffsetNoWriteRun_ ||
0691         serviceTwo->nPostGlobalWriteRun() != nGlobalBeginRun - expectedOffsetNoWriteRun_) {
0692       edm::LogAbsolute("ExceptionThrowingProducer")
0693           << "FAILED: Unexpected number of service transitions in TestServiceTwo, global run";
0694       testsPass = false;
0695     }
0696 
0697     if (verbose_) {
0698       edm::LogAbsolute("ExceptionThrowingProducer") << "nBeginJob_ = " << nBeginJob_;
0699       edm::LogAbsolute("ExceptionThrowingProducer") << "nBeginStream_ = " << nBeginStream_.load();
0700       edm::LogAbsolute("ExceptionThrowingProducer") << "nBeginProcessBlock_ = " << nBeginProcessBlock_;
0701       edm::LogAbsolute("ExceptionThrowingProducer") << "nEndProcessBlock_ = " << nEndProcessBlock_;
0702       edm::LogAbsolute("ExceptionThrowingProducer") << "nEndStream_ = " << nEndStream_.load();
0703       edm::LogAbsolute("ExceptionThrowingProducer") << "nEndJob_ = " << nEndJob_ << "\n";
0704 
0705       edm::LogAbsolute("ExceptionThrowingProducer") << "nGlobalBeginLumi_ = " << nGlobalBeginLumi_;
0706       edm::LogAbsolute("ExceptionThrowingProducer") << "nGlobalEndLumi_ = " << nGlobalEndLumi_;
0707       edm::LogAbsolute("ExceptionThrowingProducer") << "nGlobalBeginRun_ = " << nGlobalBeginRun_;
0708       edm::LogAbsolute("ExceptionThrowingProducer") << "nGlobalEndRun_ = " << nGlobalEndRun_ << "\n";
0709 
0710       edm::LogAbsolute("ExceptionThrowingProducer") << "serviceOne->nPreBeginJob = " << serviceOne->nPreBeginJob();
0711       edm::LogAbsolute("ExceptionThrowingProducer") << "serviceOne->nPostBeginJob = " << serviceOne->nPostBeginJob();
0712       edm::LogAbsolute("ExceptionThrowingProducer") << "serviceOne->nPreEndJob = " << serviceOne->nPreEndJob();
0713 
0714       edm::LogAbsolute("ExceptionThrowingProducer")
0715           << "serviceOne->nPreModuleBeginJob = " << serviceOne->nPreModuleBeginJob();
0716       edm::LogAbsolute("ExceptionThrowingProducer")
0717           << "serviceOne->nPostModuleBeginJob = " << serviceOne->nPostModuleBeginJob() << "\n";
0718 
0719       edm::LogAbsolute("ExceptionThrowingProducer")
0720           << "serviceOne->nPreBeginStream = " << serviceOne->nPreBeginStream();
0721       edm::LogAbsolute("ExceptionThrowingProducer")
0722           << "serviceOne->nPostBeginStream = " << serviceOne->nPostBeginStream();
0723       edm::LogAbsolute("ExceptionThrowingProducer") << "serviceOne->nPreEndStream = " << serviceOne->nPreEndStream();
0724       edm::LogAbsolute("ExceptionThrowingProducer") << "serviceOne->nPostEndStream = " << serviceOne->nPostEndStream();
0725 
0726       edm::LogAbsolute("ExceptionThrowingProducer")
0727           << "serviceOne->nPreModuleBeginStream = " << serviceOne->nPreModuleBeginStream();
0728       edm::LogAbsolute("ExceptionThrowingProducer")
0729           << "serviceOne->nPostModuleBeginStream = " << serviceOne->nPostModuleBeginStream();
0730       edm::LogAbsolute("ExceptionThrowingProducer")
0731           << "serviceOne->nPreModuleEndStream = " << serviceOne->nPreModuleEndStream();
0732       edm::LogAbsolute("ExceptionThrowingProducer")
0733           << "serviceOne->nPostModuleEndStream = " << serviceOne->nPostModuleEndStream() << "\n";
0734 
0735       edm::LogAbsolute("ExceptionThrowingProducer")
0736           << "serviceOne->nPreBeginProcessBlock = " << serviceOne->nPreBeginProcessBlock();
0737       edm::LogAbsolute("ExceptionThrowingProducer")
0738           << "serviceOne->nPostBeginProcessBlock = " << serviceOne->nPostBeginProcessBlock();
0739       edm::LogAbsolute("ExceptionThrowingProducer")
0740           << "serviceOne->nPreEndProcessBlock = " << serviceOne->nPreEndProcessBlock();
0741       edm::LogAbsolute("ExceptionThrowingProducer")
0742           << "serviceOne->nPostEndProcessBlock = " << serviceOne->nPostEndProcessBlock();
0743 
0744       edm::LogAbsolute("ExceptionThrowingProducer")
0745           << "serviceOne->nPreModuleBeginProcessBlock = " << serviceOne->nPreModuleBeginProcessBlock();
0746       edm::LogAbsolute("ExceptionThrowingProducer")
0747           << "serviceOne->nPostModuleBeginProcessBlock = " << serviceOne->nPostModuleBeginProcessBlock();
0748       edm::LogAbsolute("ExceptionThrowingProducer")
0749           << "serviceOne->nPreModuleEndProcessBlock = " << serviceOne->nPreModuleEndProcessBlock();
0750       edm::LogAbsolute("ExceptionThrowingProducer")
0751           << "serviceOne->nPostModuleEndProcessBlock = " << serviceOne->nPostModuleEndProcessBlock() << "\n";
0752 
0753       edm::LogAbsolute("ExceptionThrowingProducer")
0754           << "serviceOne->nPreStreamBeginLumi = " << serviceOne->nPreStreamBeginLumi();
0755       edm::LogAbsolute("ExceptionThrowingProducer")
0756           << "serviceOne->nPostStreamBeginLumi = " << serviceOne->nPostStreamBeginLumi();
0757       edm::LogAbsolute("ExceptionThrowingProducer")
0758           << "serviceOne->nPreStreamEndLumi = " << serviceOne->nPreStreamEndLumi();
0759       edm::LogAbsolute("ExceptionThrowingProducer")
0760           << "serviceOne->nPostStreamEndLumi = " << serviceOne->nPostStreamEndLumi();
0761       edm::LogAbsolute("ExceptionThrowingProducer")
0762           << "serviceOne->nPreModuleStreamBeginLumi = " << serviceOne->nPreModuleStreamBeginLumi();
0763       edm::LogAbsolute("ExceptionThrowingProducer")
0764           << "serviceOne->nPostModuleStreamBeginLumi = " << serviceOne->nPostModuleStreamBeginLumi();
0765       edm::LogAbsolute("ExceptionThrowingProducer")
0766           << "serviceOne->nPreModuleStreamEndLumi = " << serviceOne->nPreModuleStreamEndLumi();
0767       edm::LogAbsolute("ExceptionThrowingProducer")
0768           << "serviceOne->nPostModuleStreamEndLumi = " << serviceOne->nPostModuleStreamEndLumi() << "\n";
0769 
0770       edm::LogAbsolute("ExceptionThrowingProducer")
0771           << "serviceOne->nPreGlobalBeginLumi = " << serviceOne->nPreGlobalBeginLumi();
0772       edm::LogAbsolute("ExceptionThrowingProducer")
0773           << "serviceOne->nPostGlobalBeginLumi = " << serviceOne->nPostGlobalBeginLumi();
0774       edm::LogAbsolute("ExceptionThrowingProducer")
0775           << "serviceOne->nPreGlobalEndLumi = " << serviceOne->nPreGlobalEndLumi();
0776       edm::LogAbsolute("ExceptionThrowingProducer")
0777           << "serviceOne->nPostGlobalEndLumi = " << serviceOne->nPostGlobalEndLumi();
0778       edm::LogAbsolute("ExceptionThrowingProducer")
0779           << "serviceOne->nPreModuleGlobalBeginLumi = " << serviceOne->nPreModuleGlobalBeginLumi();
0780       edm::LogAbsolute("ExceptionThrowingProducer")
0781           << "serviceOne->nPostModuleGlobalBeginLumi = " << serviceOne->nPostModuleGlobalBeginLumi();
0782       edm::LogAbsolute("ExceptionThrowingProducer")
0783           << "serviceOne->nPreModuleGlobalEndLumi = " << serviceOne->nPreModuleGlobalEndLumi();
0784       edm::LogAbsolute("ExceptionThrowingProducer")
0785           << "serviceOne->nPostModuleGlobalEndLumi = " << serviceOne->nPostModuleGlobalEndLumi();
0786       edm::LogAbsolute("ExceptionThrowingProducer")
0787           << "serviceOne->nPreGlobalWriteLumi = " << serviceOne->nPreGlobalWriteLumi();
0788       edm::LogAbsolute("ExceptionThrowingProducer")
0789           << "serviceOne->nPostGlobalWriteLumi = " << serviceOne->nPostGlobalWriteLumi() << "\n";
0790 
0791       edm::LogAbsolute("ExceptionThrowingProducer")
0792           << "serviceOne->nPreStreamBeginRun = " << serviceOne->nPreStreamBeginRun();
0793       edm::LogAbsolute("ExceptionThrowingProducer")
0794           << "serviceOne->nPostStreamBeginRun = " << serviceOne->nPostStreamBeginRun();
0795       edm::LogAbsolute("ExceptionThrowingProducer")
0796           << "serviceOne->nPreStreamEndRun = " << serviceOne->nPreStreamEndRun();
0797       edm::LogAbsolute("ExceptionThrowingProducer")
0798           << "serviceOne->nPostStreamEndRun = " << serviceOne->nPostStreamEndRun();
0799       edm::LogAbsolute("ExceptionThrowingProducer")
0800           << "serviceOne->nPreModuleStreamBeginRun = " << serviceOne->nPreModuleStreamBeginRun();
0801       edm::LogAbsolute("ExceptionThrowingProducer")
0802           << "serviceOne->nPostModuleStreamBeginRun = " << serviceOne->nPostModuleStreamBeginRun();
0803       edm::LogAbsolute("ExceptionThrowingProducer")
0804           << "serviceOne->nPreModuleStreamEndRun = " << serviceOne->nPreModuleStreamEndRun();
0805       edm::LogAbsolute("ExceptionThrowingProducer")
0806           << "serviceOne->nPostModuleStreamEndRun = " << serviceOne->nPostModuleStreamEndRun() << "\n";
0807 
0808       edm::LogAbsolute("ExceptionThrowingProducer")
0809           << "serviceOne->nPreGlobalBeginRun = " << serviceOne->nPreGlobalBeginRun();
0810       edm::LogAbsolute("ExceptionThrowingProducer")
0811           << "serviceOne->nPostGlobalBeginRun = " << serviceOne->nPostGlobalBeginRun();
0812       edm::LogAbsolute("ExceptionThrowingProducer")
0813           << "serviceOne->nPreGlobalEndRun = " << serviceOne->nPreGlobalEndRun();
0814       edm::LogAbsolute("ExceptionThrowingProducer")
0815           << "serviceOne->nPostGlobalEndRun = " << serviceOne->nPostGlobalEndRun();
0816       edm::LogAbsolute("ExceptionThrowingProducer")
0817           << "serviceOne->nPreModuleGlobalBeginRun = " << serviceOne->nPreModuleGlobalBeginRun();
0818       edm::LogAbsolute("ExceptionThrowingProducer")
0819           << "serviceOne->nPostModuleGlobalBeginRun = " << serviceOne->nPostModuleGlobalBeginRun();
0820       edm::LogAbsolute("ExceptionThrowingProducer")
0821           << "serviceOne->nPreModuleGlobalEndRun = " << serviceOne->nPreModuleGlobalEndRun();
0822       edm::LogAbsolute("ExceptionThrowingProducer")
0823           << "serviceOne->nPostModuleGlobalEndRun = " << serviceOne->nPostModuleGlobalEndRun();
0824       edm::LogAbsolute("ExceptionThrowingProducer")
0825           << "serviceOne->nPreGlobalWriteRun = " << serviceOne->nPreGlobalWriteRun();
0826       edm::LogAbsolute("ExceptionThrowingProducer")
0827           << "serviceOne->nPostGlobalWriteRun = " << serviceOne->nPostGlobalWriteRun() << "\n";
0828     }
0829 
0830     if (testsPass) {
0831       edm::LogAbsolute("ExceptionThrowingProducer") << "All tests in ExceptionThrowingProducer PASSED";
0832     } else {
0833       edm::LogAbsolute("ExceptionThrowingProducer") << "At least one test in ExceptionThrowingProducer FAILED";
0834     }
0835 
0836     if (throwInEndJob_) {
0837       throw cms::Exception("IntentionalTestException")
0838           << "ExceptionThrowingProducer::endJob, module configured to throw during endJob";
0839     }
0840   }
0841 
0842   void ExceptionThrowingProducer::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0843     edm::ParameterSetDescription desc;
0844     edm::EventID invalidEventID;
0845     desc.addUntracked<bool>("verbose", false);
0846     desc.addUntracked<edm::EventID>("eventIDThrowOnEvent", invalidEventID);
0847     desc.addUntracked<edm::EventID>("eventIDThrowOnGlobalBeginRun", invalidEventID);
0848     desc.addUntracked<edm::EventID>("eventIDThrowOnGlobalBeginLumi", invalidEventID);
0849     desc.addUntracked<edm::EventID>("eventIDThrowOnGlobalEndRun", invalidEventID);
0850     desc.addUntracked<edm::EventID>("eventIDThrowOnGlobalEndLumi", invalidEventID);
0851     desc.addUntracked<edm::EventID>("eventIDThrowOnStreamBeginRun", invalidEventID);
0852     desc.addUntracked<edm::EventID>("eventIDThrowOnStreamBeginLumi", invalidEventID);
0853     desc.addUntracked<edm::EventID>("eventIDThrowOnStreamEndRun", invalidEventID);
0854     desc.addUntracked<edm::EventID>("eventIDThrowOnStreamEndLumi", invalidEventID);
0855 
0856     desc.addUntracked<bool>("throwInBeginJob", false);
0857     desc.addUntracked<bool>("throwInBeginStream", false);
0858     desc.addUntracked<bool>("throwInBeginProcessBlock", false);
0859     desc.addUntracked<bool>("throwInEndProcessBlock", false);
0860     desc.addUntracked<bool>("throwInEndStream", false);
0861     desc.addUntracked<bool>("throwInEndJob", false);
0862 
0863     desc.addUntracked<unsigned int>("expectedNBeginJob", 1);
0864     desc.addUntracked<unsigned int>("expectedNBeginStream", 4);
0865     desc.addUntracked<unsigned int>("expectedNBeginProcessBlock", 1);
0866     desc.addUntracked<unsigned int>("expectedNEndProcessBlock", 1);
0867     desc.addUntracked<unsigned int>("expectedNEndStream", 4);
0868     desc.addUntracked<unsigned int>("expectedNEndJob", 1);
0869     desc.addUntracked<bool>("expectNoRunsProcessed", false);
0870     desc.addUntracked<unsigned int>("expectedOffsetNoEndJob", 0);
0871     desc.addUntracked<unsigned int>("expectedOffsetNoEndStream", 0);
0872     desc.addUntracked<unsigned int>("expectedOffsetNoEndProcessBlock", 0);
0873     desc.addUntracked<unsigned int>("expectedStreamBeginLumi", kUnset);
0874     desc.addUntracked<unsigned int>("expectedOffsetNoStreamEndLumi", 0);
0875     desc.addUntracked<unsigned int>("expectedGlobalBeginLumi", 0);
0876     desc.addUntracked<unsigned int>("expectedOffsetNoGlobalEndLumi", 0);
0877     desc.addUntracked<unsigned int>("expectedOffsetNoWriteLumi", 0);
0878 
0879     desc.addUntracked<unsigned int>("expectedStreamBeginRun", kUnset);
0880     desc.addUntracked<unsigned int>("expectedOffsetNoStreamEndRun", 0);
0881     desc.addUntracked<unsigned int>("expectedGlobalBeginRun", 0);
0882     desc.addUntracked<unsigned int>("expectedOffsetNoGlobalEndRun", 0);
0883     desc.addUntracked<unsigned int>("expectedOffsetNoWriteRun", 0);
0884 
0885     descriptions.addDefault(desc);
0886   }
0887 
0888 }  // namespace edmtest
0889 using edmtest::ExceptionThrowingProducer;
0890 DEFINE_FWK_MODULE(ExceptionThrowingProducer);