Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2025-01-25 08:29:59

0001 
0002 #include "FWCore/Framework/interface/FileBlock.h"
0003 #include "FWCore/Framework/interface/one/OutputModule.h"
0004 #include "FWCore/Framework/interface/MakerMacros.h"
0005 #include "FWCore/Framework/interface/ProcessBlockForOutput.h"
0006 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0007 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0008 #include "FWCore/ParameterSet/interface/ParameterSetDescription.h"
0009 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0010 #include "FWCore/Framework/interface/RunForOutput.h"
0011 #include "FWCore/Utilities/interface/Exception.h"
0012 
0013 #include "TTree.h"
0014 
0015 #include <memory>
0016 #include <string>
0017 #include <vector>
0018 
0019 constexpr unsigned int kDoNotTest = 0xffffffff;
0020 
0021 namespace edm {
0022 
0023   class TestOneOutput : public one::OutputModule<WatchInputFiles, RunCache<int>, LuminosityBlockCache<int>> {
0024   public:
0025     explicit TestOneOutput(ParameterSet const& pset);
0026     ~TestOneOutput() override;
0027     static void fillDescriptions(ConfigurationDescriptions& descriptions);
0028 
0029   private:
0030     void write(EventForOutput const& e) override;
0031     void writeLuminosityBlock(LuminosityBlockForOutput const&) override;
0032     void writeRun(RunForOutput const&) override;
0033     void writeProcessBlock(ProcessBlockForOutput const&) override;
0034 
0035     void respondToOpenInputFile(FileBlock const&) override;
0036     void respondToCloseInputFile(FileBlock const&) override;
0037     void testFileBlock(FileBlock const&);
0038 
0039     std::shared_ptr<int> globalBeginRun(RunForOutput const&) const override;
0040     void globalEndRun(RunForOutput const&) override;
0041 
0042     std::shared_ptr<int> globalBeginLuminosityBlock(LuminosityBlockForOutput const&) const override;
0043     void globalEndLuminosityBlock(LuminosityBlockForOutput const&) override;
0044     void endJob() override;
0045 
0046     bool verbose_;
0047     std::vector<std::string> expectedProcessesWithProcessBlockProducts_;
0048     std::vector<std::string> expectedTopProcessesWithProcessBlockProducts_;
0049     std::vector<std::string> expectedAddedProcesses_;
0050     std::vector<std::string> expectedTopAddedProcesses_;
0051     std::vector<unsigned int> expectedTopCacheIndices0_;
0052     std::vector<unsigned int> expectedTopCacheIndices1_;
0053     std::vector<unsigned int> expectedTopCacheIndices2_;
0054     std::vector<std::string> expectedProcessNamesAtWrite_;
0055     int expectedWriteProcessBlockTransitions_;
0056     unsigned int countWriteProcessBlockTransitions_ = 0;
0057     unsigned int countInputFiles_ = 0;
0058     bool requireNullTTreesInFileBlock_;
0059     bool testTTreesInFileBlock_;
0060     std::vector<unsigned int> expectedCacheIndexSize_;
0061     unsigned int expectedProcessesInFirstFile_;
0062     std::vector<unsigned int> expectedCacheIndexVectorsPerFile_;
0063     std::vector<unsigned int> expectedNEntries0_;
0064     std::vector<unsigned int> expectedNEntries1_;
0065     std::vector<unsigned int> expectedNEntries2_;
0066     std::vector<unsigned int> expectedCacheEntriesPerFile0_;
0067     std::vector<unsigned int> expectedCacheEntriesPerFile1_;
0068     std::vector<unsigned int> expectedCacheEntriesPerFile2_;
0069     std::vector<unsigned int> expectedOuterOffset_;
0070     std::vector<unsigned int> expectedTranslateFromStoredIndex_;
0071     unsigned int expectedNAddedProcesses_;
0072     bool expectedProductsFromInputKept_;
0073   };
0074 
0075   TestOneOutput::TestOneOutput(ParameterSet const& pset)
0076       : one::OutputModuleBase(pset),
0077         one::OutputModule<WatchInputFiles, RunCache<int>, LuminosityBlockCache<int>>(pset),
0078         verbose_(pset.getUntrackedParameter<bool>("verbose")),
0079         expectedProcessesWithProcessBlockProducts_(
0080             pset.getUntrackedParameter<std::vector<std::string>>("expectedProcessesWithProcessBlockProducts")),
0081         expectedTopProcessesWithProcessBlockProducts_(
0082             pset.getUntrackedParameter<std::vector<std::string>>("expectedTopProcessesWithProcessBlockProducts")),
0083         expectedAddedProcesses_(pset.getUntrackedParameter<std::vector<std::string>>("expectedAddedProcesses")),
0084         expectedTopAddedProcesses_(pset.getUntrackedParameter<std::vector<std::string>>("expectedTopAddedProcesses")),
0085         expectedTopCacheIndices0_(pset.getUntrackedParameter<std::vector<unsigned int>>("expectedTopCacheIndices0")),
0086         expectedTopCacheIndices1_(pset.getUntrackedParameter<std::vector<unsigned int>>("expectedTopCacheIndices1")),
0087         expectedTopCacheIndices2_(pset.getUntrackedParameter<std::vector<unsigned int>>("expectedTopCacheIndices2")),
0088         expectedProcessNamesAtWrite_(
0089             pset.getUntrackedParameter<std::vector<std::string>>("expectedProcessNamesAtWrite")),
0090         expectedWriteProcessBlockTransitions_(pset.getUntrackedParameter<int>("expectedWriteProcessBlockTransitions")),
0091         requireNullTTreesInFileBlock_(pset.getUntrackedParameter<bool>("requireNullTTreesInFileBlock")),
0092         testTTreesInFileBlock_(pset.getUntrackedParameter<bool>("testTTreesInFileBlock")),
0093         expectedCacheIndexSize_(pset.getUntrackedParameter<std::vector<unsigned int>>("expectedCacheIndexSize")),
0094         expectedProcessesInFirstFile_(pset.getUntrackedParameter<unsigned int>("expectedProcessesInFirstFile")),
0095         expectedCacheIndexVectorsPerFile_(
0096             pset.getUntrackedParameter<std::vector<unsigned int>>("expectedCacheIndexVectorsPerFile")),
0097         expectedNEntries0_(pset.getUntrackedParameter<std::vector<unsigned int>>("expectedNEntries0")),
0098         expectedNEntries1_(pset.getUntrackedParameter<std::vector<unsigned int>>("expectedNEntries1")),
0099         expectedNEntries2_(pset.getUntrackedParameter<std::vector<unsigned int>>("expectedNEntries2")),
0100         expectedCacheEntriesPerFile0_(
0101             pset.getUntrackedParameter<std::vector<unsigned int>>("expectedCacheEntriesPerFile0")),
0102         expectedCacheEntriesPerFile1_(
0103             pset.getUntrackedParameter<std::vector<unsigned int>>("expectedCacheEntriesPerFile1")),
0104         expectedCacheEntriesPerFile2_(
0105             pset.getUntrackedParameter<std::vector<unsigned int>>("expectedCacheEntriesPerFile2")),
0106         expectedOuterOffset_(pset.getUntrackedParameter<std::vector<unsigned int>>("expectedOuterOffset")),
0107         expectedTranslateFromStoredIndex_(
0108             pset.getUntrackedParameter<std::vector<unsigned int>>("expectedTranslateFromStoredIndex")),
0109         expectedNAddedProcesses_(pset.getUntrackedParameter<unsigned int>("expectedNAddedProcesses")),
0110         expectedProductsFromInputKept_(pset.getUntrackedParameter<bool>("expectedProductsFromInputKept")) {}
0111 
0112   TestOneOutput::~TestOneOutput() {}
0113 
0114   void TestOneOutput::write(EventForOutput const& e) {
0115     if (verbose_) {
0116       LogAbsolute("TestOneOutput") << "one write event";
0117     }
0118   }
0119 
0120   void TestOneOutput::writeLuminosityBlock(LuminosityBlockForOutput const&) {
0121     if (verbose_) {
0122       LogAbsolute("TestOneOutput") << "one writeLuminosityBlock";
0123     }
0124   }
0125 
0126   void TestOneOutput::writeRun(RunForOutput const&) {
0127     if (verbose_) {
0128       LogAbsolute("TestOneOutput") << "one writeRun";
0129     }
0130   }
0131 
0132   void TestOneOutput::writeProcessBlock(ProcessBlockForOutput const& pb) {
0133     if (verbose_) {
0134       LogAbsolute("TestOneOutput") << "one writeProcessBlock";
0135     }
0136     if (countWriteProcessBlockTransitions_ < expectedProcessNamesAtWrite_.size()) {
0137       if (expectedProcessNamesAtWrite_[countWriteProcessBlockTransitions_] != pb.processName()) {
0138         throw cms::Exception("TestFailure") << "TestOneOutput::writeProcessBlock unexpected process name";
0139       }
0140     }
0141     if (!expectedProcessesWithProcessBlockProducts_.empty()) {
0142       if (verbose_) {
0143         for (auto const& process : outputProcessBlockHelper().processesWithProcessBlockProducts()) {
0144           LogAbsolute("TestOneOutput") << "    " << process;
0145         }
0146       }
0147       if (expectedProcessesWithProcessBlockProducts_ !=
0148           outputProcessBlockHelper().processesWithProcessBlockProducts()) {
0149         throw cms::Exception("TestFailure") << "TestOneOutput::writeProcessBlock unexpected process name list";
0150       }
0151     }
0152     if (!(!expectedAddedProcesses_.empty() && expectedAddedProcesses_[0] == "DONOTTEST")) {
0153       if (expectedAddedProcesses_ != outputProcessBlockHelper().processBlockHelper()->addedProcesses()) {
0154         throw cms::Exception("TestFailure") << "TestOneOutput::writeProcessBlock unexpected addedProcesses list";
0155       }
0156     }
0157     if (!(!expectedTopAddedProcesses_.empty() && expectedTopAddedProcesses_[0] == "DONOTTEST")) {
0158       if (expectedTopAddedProcesses_ !=
0159           outputProcessBlockHelper().processBlockHelper()->topProcessBlockHelper()->addedProcesses()) {
0160         throw cms::Exception("TestFailure") << "TestOneOutput::writeProcessBlock unexpected top addedProcesses list";
0161       }
0162     }
0163     if (!expectedTopProcessesWithProcessBlockProducts_.empty()) {
0164       // Same test as the previous except check the list of names in
0165       // the top level process name list from the EventProcessor
0166       if (expectedTopProcessesWithProcessBlockProducts_ != outputProcessBlockHelper()
0167                                                                .processBlockHelper()
0168                                                                ->topProcessBlockHelper()
0169                                                                ->topProcessesWithProcessBlockProducts()) {
0170         throw cms::Exception("TestFailure") << "TestOneOutput::writeProcessBlock unexpected top process name list";
0171       }
0172       // Almost the same as the previous test, should get the same result
0173       if (expectedTopProcessesWithProcessBlockProducts_ !=
0174           outputProcessBlockHelper().processBlockHelper()->topProcessesWithProcessBlockProducts()) {
0175         throw cms::Exception("TestFailure") << "TestOneOutput::writeProcessBlock unexpected top process name list 2";
0176       }
0177 
0178       std::vector<unsigned int> const* expectedTopCacheIndices = nullptr;
0179       if (countInputFiles_ == 1 && !expectedTopCacheIndices0_.empty()) {
0180         expectedTopCacheIndices = &expectedTopCacheIndices0_;
0181       } else if (countInputFiles_ == 2 && !expectedTopCacheIndices1_.empty()) {
0182         expectedTopCacheIndices = &expectedTopCacheIndices1_;
0183       } else if (countInputFiles_ == 3 && !expectedTopCacheIndices2_.empty()) {
0184         expectedTopCacheIndices = &expectedTopCacheIndices2_;
0185       }
0186       if (expectedTopCacheIndices != nullptr) {
0187         unsigned int expectedInputProcesses =
0188             expectedTopProcessesWithProcessBlockProducts_.size() -
0189             outputProcessBlockHelper().processBlockHelper()->topProcessBlockHelper()->addedProcesses().size();
0190 
0191         std::vector<std::vector<unsigned int>> const& topProcessBlockCacheIndices =
0192             outputProcessBlockHelper().processBlockHelper()->processBlockCacheIndices();
0193         if (expectedTopCacheIndices->size() != expectedInputProcesses * topProcessBlockCacheIndices.size()) {
0194           throw cms::Exception("TestFailure")
0195               << "TestOneOutput::writeProcessBlock unexpected sizes related to top cache indices on input file "
0196               << (countInputFiles_ - 1);
0197         }
0198         unsigned int iStored = 0;
0199         for (unsigned int i = 0; i < topProcessBlockCacheIndices.size(); ++i) {
0200           if (topProcessBlockCacheIndices[i].size() != expectedInputProcesses) {
0201             throw cms::Exception("TestFailure")
0202                 << "TestOneOutput::writeProcessBlock unexpected size of inner cache indices vector on input file "
0203                 << (countInputFiles_ - 1);
0204           }
0205           for (unsigned int j = 0; j < topProcessBlockCacheIndices[i].size(); ++j) {
0206             if (topProcessBlockCacheIndices[i][j] != (*expectedTopCacheIndices)[iStored]) {
0207               throw cms::Exception("TestFailure")
0208                   << "TestOneOutput::writeProcessBlock unexpected cache index value on input file "
0209                   << (countInputFiles_ - 1);
0210             }
0211             ++iStored;
0212           }
0213         }
0214       }
0215     }
0216     if (expectedProcessesInFirstFile_ != 0) {
0217       if (expectedProcessesInFirstFile_ != outputProcessBlockHelper().processBlockHelper()->nProcessesInFirstFile()) {
0218         throw cms::Exception("TestFailure")
0219             << "TestOneOutput::writeProcessBlock unexpected value for nProcessesInFirstFile";
0220       }
0221     }
0222     for (unsigned int i = 0; i < expectedCacheIndexVectorsPerFile_.size(); ++i) {
0223       if (i < countInputFiles_) {
0224         if (expectedCacheIndexVectorsPerFile_[i] !=
0225             outputProcessBlockHelper().processBlockHelper()->cacheIndexVectorsPerFile()[i]) {
0226           throw cms::Exception("TestFailure")
0227               << "TestOneOutput::writeProcessBlock unexpected value for cacheIndexVectorsPerFile, element " << i;
0228         }
0229       }
0230     }
0231     if (countInputFiles_ >= 1 && !expectedNEntries0_.empty()) {
0232       if (expectedNEntries0_ != outputProcessBlockHelper().processBlockHelper()->nEntries()[0]) {
0233         throw cms::Exception("TestFailure") << "TestOneOutput::writeProcessBlock unexpected value for nEntries 0";
0234       }
0235     }
0236     if (countInputFiles_ >= 2 && !expectedNEntries1_.empty()) {
0237       if (expectedNEntries1_ != outputProcessBlockHelper().processBlockHelper()->nEntries()[1]) {
0238         throw cms::Exception("TestFailure") << "TestOneOutput::writeProcessBlock unexpected value for nEntries 1";
0239       }
0240     }
0241     if (countInputFiles_ >= 3 && !expectedNEntries2_.empty()) {
0242       if (expectedNEntries2_ != outputProcessBlockHelper().processBlockHelper()->nEntries()[2]) {
0243         throw cms::Exception("TestFailure") << "TestOneOutput::writeProcessBlock unexpected value for nEntries 2";
0244       }
0245     }
0246 
0247     if (countInputFiles_ == 1 && !expectedCacheEntriesPerFile0_.empty()) {
0248       if (expectedCacheEntriesPerFile0_ != outputProcessBlockHelper().processBlockHelper()->cacheEntriesPerFile()) {
0249         throw cms::Exception("TestFailure")
0250             << "TestOneOutput::writeProcessBlock unexpected value for cacheEntriesPerFile 0";
0251       }
0252     } else if (countInputFiles_ == 2 && !expectedCacheEntriesPerFile1_.empty()) {
0253       if (expectedCacheEntriesPerFile1_ != outputProcessBlockHelper().processBlockHelper()->cacheEntriesPerFile()) {
0254         throw cms::Exception("TestFailure")
0255             << "TestOneOutput::writeProcessBlock unexpected value for cacheEntriesPerFile 1";
0256       }
0257     } else if (countInputFiles_ == 3 && !expectedCacheEntriesPerFile2_.empty()) {
0258       if (expectedCacheEntriesPerFile2_ != outputProcessBlockHelper().processBlockHelper()->cacheEntriesPerFile()) {
0259         throw cms::Exception("TestFailure")
0260             << "TestOneOutput::writeProcessBlock unexpected value for cacheEntriesPerFile 2";
0261       }
0262     }
0263 
0264     if (!expectedOuterOffset_.empty() && (countInputFiles_ - 1) < expectedOuterOffset_.size()) {
0265       if (expectedOuterOffset_[countInputFiles_ - 1] !=
0266           outputProcessBlockHelper().processBlockHelper()->outerOffset()) {
0267         throw cms::Exception("TestFailure")
0268             << "TestOneOutput::writeProcessBlock unexpected value for outerOffset, file " << (countInputFiles_ - 1);
0269       }
0270     }
0271     if (countWriteProcessBlockTransitions_ < expectedCacheIndexSize_.size()) {
0272       if (expectedCacheIndexSize_[countWriteProcessBlockTransitions_] !=
0273           outputProcessBlockHelper().processBlockHelper()->processBlockCacheIndices().size()) {
0274         throw cms::Exception("TestFailure")
0275             << "TestOneOutput::writeProcessBlock unexpected cache index size "
0276             << outputProcessBlockHelper().processBlockHelper()->processBlockCacheIndices().size();
0277       }
0278     }
0279     if (!expectedTranslateFromStoredIndex_.empty()) {
0280       if (expectedTranslateFromStoredIndex_ != outputProcessBlockHelper().translateFromStoredIndex()) {
0281         throw cms::Exception("TestFailure")
0282             << "TestOneOutput::writeProcessBlock unexpected value for translateFromStoredIndex";
0283       }
0284     }
0285     if (expectedNAddedProcesses_ != kDoNotTest) {
0286       if (expectedNAddedProcesses_ != outputProcessBlockHelper().nAddedProcesses()) {
0287         throw cms::Exception("TestFailure") << "TestOneOutput::writeProcessBlock unexpected value for nAddedProcesses";
0288       }
0289     }
0290     if (expectedProductsFromInputKept_ != outputProcessBlockHelper().productsFromInputKept()) {
0291       throw cms::Exception("TestFailure")
0292           << "TestOneOutput::writeProcessBlock unexpected value for productsFromInputKept";
0293     }
0294     ++countWriteProcessBlockTransitions_;
0295   }
0296 
0297   void TestOneOutput::respondToOpenInputFile(FileBlock const& fb) {
0298     if (verbose_) {
0299       LogAbsolute("TestOneOutput") << "one respondToOpenInputFile";
0300     }
0301     testFileBlock(fb);
0302     ++countInputFiles_;
0303   }
0304 
0305   void TestOneOutput::respondToCloseInputFile(FileBlock const& fb) {
0306     if (verbose_) {
0307       LogAbsolute("TestOneOutput") << "one respondToCloseInputFile";
0308     }
0309     testFileBlock(fb);
0310   }
0311 
0312   void TestOneOutput::testFileBlock(FileBlock const& fb) {
0313     if (requireNullTTreesInFileBlock_) {
0314       if (fb.tree() != nullptr || fb.lumiTree() != nullptr || fb.runTree() != nullptr ||
0315           !fb.processBlockTrees().empty() || !fb.processesWithProcessBlockTrees().empty() ||
0316           fb.processBlockTree(std::string("DoesNotExist")) != nullptr) {
0317         throw cms::Exception("TestFailure")
0318             << "TestOneOutput::respondToOpenInputFile expected null TTree pointers in FileBlock";
0319       }
0320     } else if (testTTreesInFileBlock_) {
0321       if (fb.tree() == nullptr || std::string("Events") != fb.tree()->GetName() ||
0322           std::string("LuminosityBlocks") != fb.lumiTree()->GetName() ||
0323           std::string("Runs") != fb.runTree()->GetName() || fb.processesWithProcessBlockTrees().size() != 2 ||
0324           fb.processesWithProcessBlockTrees()[0] != "PROD1" || fb.processesWithProcessBlockTrees()[1] != "MERGE" ||
0325           fb.processBlockTrees().size() != 2 ||
0326           std::string("ProcessBlocksPROD1") != fb.processBlockTrees()[0]->GetName() ||
0327           std::string("ProcessBlocksMERGE") != fb.processBlockTrees()[1]->GetName() ||
0328           std::string("ProcessBlocksPROD1") != fb.processBlockTree("PROD1")->GetName() ||
0329           std::string("ProcessBlocksMERGE") != fb.processBlockTree("MERGE")->GetName() ||
0330           fb.processBlockTree("DOESNOTEXIST") != nullptr) {
0331         throw cms::Exception("TestFailure") << "TestOneOutput::testFileBlock failed. Testing tree pointers";
0332       }
0333     }
0334   }
0335 
0336   std::shared_ptr<int> TestOneOutput::globalBeginRun(RunForOutput const& iRun) const {
0337     if (verbose_) {
0338       LogAbsolute("TestOneOutput") << "one globalBeginRun";
0339       for (auto const& it : iRun.productRegistry().productList()) {
0340         LogAbsolute("TestOneOutput") << it.second;
0341       }
0342     }
0343     return std::make_shared<int>(0);
0344   }
0345 
0346   void TestOneOutput::globalEndRun(RunForOutput const&) {
0347     if (verbose_) {
0348       LogAbsolute("TestOneOutput") << "one globalEndRun";
0349     }
0350   }
0351 
0352   std::shared_ptr<int> TestOneOutput::globalBeginLuminosityBlock(LuminosityBlockForOutput const&) const {
0353     if (verbose_) {
0354       LogAbsolute("TestOneOutput") << "one globalBeginLuminosityBlock";
0355     }
0356     return std::make_shared<int>(0);
0357   }
0358 
0359   void TestOneOutput::globalEndLuminosityBlock(LuminosityBlockForOutput const&) {
0360     if (verbose_) {
0361       LogAbsolute("TestOneOutput") << "one globalEndLuminosityBlock";
0362     }
0363   }
0364 
0365   void TestOneOutput::endJob() {
0366     if (expectedWriteProcessBlockTransitions_ >= 0) {
0367       if (static_cast<unsigned int>(expectedWriteProcessBlockTransitions_) != countWriteProcessBlockTransitions_) {
0368         throw cms::Exception("TestFailure")
0369             << "TestOneOutput::writeProcessBlock unexpected number of writeProcessBlock transitions";
0370       }
0371     }
0372   }
0373 
0374   void TestOneOutput::fillDescriptions(ConfigurationDescriptions& descriptions) {
0375     ParameterSetDescription desc;
0376     OutputModule::fillDescription(desc);
0377     desc.addUntracked<bool>("verbose", true);
0378     desc.addUntracked<std::vector<std::string>>("expectedProcessesWithProcessBlockProducts",
0379                                                 std::vector<std::string>());
0380     desc.addUntracked<std::vector<std::string>>("expectedTopProcessesWithProcessBlockProducts",
0381                                                 std::vector<std::string>());
0382     desc.addUntracked<std::vector<std::string>>("expectedAddedProcesses",
0383                                                 std::vector<std::string>(1, std::string("DONOTTEST")));
0384     desc.addUntracked<std::vector<std::string>>("expectedTopAddedProcesses",
0385                                                 std::vector<std::string>(1, std::string("DONOTTEST")));
0386     desc.addUntracked<std::vector<unsigned int>>("expectedTopCacheIndices0", std::vector<unsigned int>());
0387     desc.addUntracked<std::vector<unsigned int>>("expectedTopCacheIndices1", std::vector<unsigned int>());
0388     desc.addUntracked<std::vector<unsigned int>>("expectedTopCacheIndices2", std::vector<unsigned int>());
0389     desc.addUntracked<std::vector<std::string>>("expectedProcessNamesAtWrite", std::vector<std::string>());
0390     desc.addUntracked<int>("expectedWriteProcessBlockTransitions", -1);
0391     desc.addUntracked<bool>("requireNullTTreesInFileBlock", false);
0392     desc.addUntracked<bool>("testTTreesInFileBlock", false);
0393     desc.addUntracked<std::vector<unsigned int>>("expectedCacheIndexSize", std::vector<unsigned int>());
0394     desc.addUntracked<unsigned int>("expectedProcessesInFirstFile", 0);
0395     desc.addUntracked<std::vector<unsigned int>>("expectedCacheIndexVectorsPerFile", std::vector<unsigned int>());
0396     desc.addUntracked<std::vector<unsigned int>>("expectedNEntries0", std::vector<unsigned int>());
0397     desc.addUntracked<std::vector<unsigned int>>("expectedNEntries1", std::vector<unsigned int>());
0398     desc.addUntracked<std::vector<unsigned int>>("expectedNEntries2", std::vector<unsigned int>());
0399     desc.addUntracked<std::vector<unsigned int>>("expectedCacheEntriesPerFile0", std::vector<unsigned int>());
0400     desc.addUntracked<std::vector<unsigned int>>("expectedCacheEntriesPerFile1", std::vector<unsigned int>());
0401     desc.addUntracked<std::vector<unsigned int>>("expectedCacheEntriesPerFile2", std::vector<unsigned int>());
0402     desc.addUntracked<std::vector<unsigned int>>("expectedOuterOffset", std::vector<unsigned int>());
0403     desc.addUntracked<std::vector<unsigned int>>("expectedTranslateFromStoredIndex", std::vector<unsigned int>());
0404     desc.addUntracked<unsigned int>("expectedNAddedProcesses", kDoNotTest);
0405     desc.addUntracked<bool>("expectedProductsFromInputKept", true);
0406 
0407     descriptions.addDefault(desc);
0408   }
0409 }  // namespace edm
0410 
0411 using edm::TestOneOutput;
0412 DEFINE_FWK_MODULE(TestOneOutput);