File indexing completed on 2025-04-30 22:24:10
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include "FWCore/Framework/test/DummyRecord.h"
0011 #include "FWCore/Framework/test/Dummy2Record.h"
0012 #include "FWCore/Framework/test/DepRecord.h"
0013 #include "FWCore/Framework/test/DepOn2Record.h"
0014 #include "FWCore/Framework/test/DummyFinder.h"
0015 #include "FWCore/Framework/test/DummyData.h"
0016 #include "FWCore/Framework/test/DummyESProductResolverProvider.h"
0017 #include "FWCore/Framework/interface/DependentRecordIntervalFinder.h"
0018 #include "FWCore/Framework/interface/EventSetupImpl.h"
0019 #include "FWCore/Framework/interface/EventSetupProvider.h"
0020 #include "FWCore/Framework/interface/EventSetup.h"
0021 #include "FWCore/Framework/interface/ESProductResolverProvider.h"
0022 #include "FWCore/Framework/interface/ESProductResolverTemplate.h"
0023 #include "FWCore/Framework/interface/ESRecordsToProductResolverIndices.h"
0024 #include "FWCore/Framework/interface/EDConsumerBase.h"
0025 #include "FWCore/Framework/interface/EventSetupRecordIntervalFinder.h"
0026 #include "FWCore/Framework/interface/EventSetupRecordProvider.h"
0027 #include "FWCore/Framework/src/SynchronousEventSetupsController.h"
0028 #include "FWCore/Framework/interface/NoRecordException.h"
0029 #include "FWCore/Framework/test/print_eventsetup_record_dependencies.h"
0030 #include "FWCore/Framework/interface/ESModuleProducesInfo.h"
0031 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0032 #include "FWCore/ServiceRegistry/interface/ActivityRegistry.h"
0033 #include "FWCore/ServiceRegistry/interface/ESParentContext.h"
0034 #include "FWCore/Utilities/interface/propagate_const.h"
0035 #include "FWCore/Concurrency/interface/ThreadsController.h"
0036 #include "FWCore/Concurrency/interface/FinalWaitingTask.h"
0037
0038 #include "cppunit/extensions/HelperMacros.h"
0039
0040 #include <memory>
0041 #include <string>
0042 #include <vector>
0043 #include <cstring>
0044
0045 using namespace edm::eventsetup;
0046
0047 namespace {
0048 edm::ParameterSet createDummyPset() {
0049 edm::ParameterSet pset;
0050 std::vector<std::string> emptyVStrings;
0051 pset.addParameter<std::vector<std::string>>("@all_esprefers", emptyVStrings);
0052 pset.addParameter<std::vector<std::string>>("@all_essources", emptyVStrings);
0053 pset.addParameter<std::vector<std::string>>("@all_esmodules", emptyVStrings);
0054 return pset;
0055 }
0056 }
0057
0058 class testdependentrecord : public CppUnit::TestFixture {
0059 CPPUNIT_TEST_SUITE(testdependentrecord);
0060
0061 CPPUNIT_TEST(dependentConstructorTest);
0062 CPPUNIT_TEST(dependentFinder1Test);
0063 CPPUNIT_TEST(dependentFinder2Test);
0064 CPPUNIT_TEST(testIncomparibleIOVAlgorithm);
0065 CPPUNIT_TEST(testInvalidIOVAlgorithm);
0066 CPPUNIT_TEST(testInvalidIOVFirstTime);
0067 CPPUNIT_TEST(testInvalidIOVFirstEventID);
0068 CPPUNIT_TEST(timeAndRunTest);
0069 CPPUNIT_TEST(dependentSetproviderTest);
0070 CPPUNIT_TEST(getTest);
0071 CPPUNIT_TEST(getDataWithESGetTokenTest);
0072 CPPUNIT_TEST(getHandleWithESGetTokenTest);
0073 CPPUNIT_TEST(getTransientHandleWithESGetTokenTest);
0074 CPPUNIT_TEST(oneOfTwoRecordTest);
0075 CPPUNIT_TEST(resetTest);
0076 CPPUNIT_TEST(alternateFinderTest);
0077 CPPUNIT_TEST(invalidRecordTest);
0078 CPPUNIT_TEST(extendIOVTest);
0079
0080 CPPUNIT_TEST_SUITE_END();
0081
0082 public:
0083 void setUp() { m_scheduler = std::make_unique<edm::ThreadsController>(1); }
0084 void tearDown() {}
0085
0086 void dependentConstructorTest();
0087 void dependentFinder1Test();
0088 void dependentFinder2Test();
0089 void testIncomparibleIOVAlgorithm();
0090 void testInvalidIOVAlgorithm();
0091 void testInvalidIOVFirstTime();
0092 void testInvalidIOVFirstEventID();
0093 void timeAndRunTest();
0094 void dependentSetproviderTest();
0095 void getTest();
0096 void getDataWithESGetTokenTest();
0097 void getHandleWithESGetTokenTest();
0098 void getTransientHandleWithESGetTokenTest();
0099 void oneOfTwoRecordTest();
0100 void resetTest();
0101 void alternateFinderTest();
0102 void invalidRecordTest();
0103 void extendIOVTest();
0104
0105 private:
0106 edm::propagate_const<std::unique_ptr<edm::ThreadsController>> m_scheduler;
0107
0108 };
0109
0110
0111 CPPUNIT_TEST_SUITE_REGISTRATION(testdependentrecord);
0112
0113
0114
0115
0116
0117
0118
0119
0120 namespace {
0121
0122 edm::ActivityRegistry activityRegistry;
0123
0124 class DummyESProductResolverProvider : public edm::eventsetup::ESProductResolverProvider {
0125 public:
0126 DummyESProductResolverProvider() { usingRecord<DummyRecord>(); }
0127
0128 protected:
0129 KeyedResolversVector registerResolvers(const EventSetupRecordKey&, unsigned int ) override {
0130 return KeyedResolversVector();
0131 }
0132 std::vector<edm::eventsetup::ESModuleProducesInfo> producesInfo() const override {
0133 return std::vector<edm::eventsetup::ESModuleProducesInfo>();
0134 }
0135 };
0136
0137 class DepRecordResolverProvider : public edm::eventsetup::ESProductResolverProvider {
0138 public:
0139 DepRecordResolverProvider() { usingRecord<DepRecord>(); }
0140
0141 protected:
0142 KeyedResolversVector registerResolvers(const EventSetupRecordKey&, unsigned int ) override {
0143 return KeyedResolversVector();
0144 }
0145 std::vector<edm::eventsetup::ESModuleProducesInfo> producesInfo() const override {
0146 return std::vector<edm::eventsetup::ESModuleProducesInfo>();
0147 }
0148 };
0149
0150 class WorkingDepRecordResolver
0151 : public edm::eventsetup::ESProductResolverTemplate<DepRecord, edm::eventsetup::test::DummyData> {
0152 public:
0153 WorkingDepRecordResolver(const edm::eventsetup::test::DummyData* iDummy) : data_(iDummy) {}
0154
0155 protected:
0156 const value_type* make(const record_type&, const DataKey&) final { return data_; }
0157 void const* getAfterPrefetchImpl() const final { return data_; }
0158
0159 private:
0160 const edm::eventsetup::test::DummyData* data_;
0161 };
0162
0163 class DepRecordResolverProviderWithData : public edm::eventsetup::ESProductResolverProvider {
0164 public:
0165 DepRecordResolverProviderWithData(const edm::eventsetup::test::DummyData& iData = edm::eventsetup::test::DummyData())
0166 : dummy_(iData) {
0167 usingRecord<DepRecord>();
0168 }
0169
0170 protected:
0171 KeyedResolversVector registerResolvers(const EventSetupRecordKey&, unsigned int ) override {
0172 KeyedResolversVector keyedResolversVector;
0173 std::shared_ptr<WorkingDepRecordResolver> pResolver = std::make_shared<WorkingDepRecordResolver>(&dummy_);
0174 edm::eventsetup::DataKey dataKey(edm::eventsetup::DataKey::makeTypeTag<edm::eventsetup::test::DummyData>(), "");
0175 keyedResolversVector.emplace_back(dataKey, pResolver);
0176 return keyedResolversVector;
0177 }
0178 std::vector<edm::eventsetup::ESModuleProducesInfo> producesInfo() const override {
0179 return std::vector<edm::eventsetup::ESModuleProducesInfo>(
0180 1,
0181 edm::eventsetup::ESModuleProducesInfo(
0182 edm::eventsetup::EventSetupRecordKey::makeKey<DepRecord>(),
0183 edm::eventsetup::DataKey(edm::eventsetup::DataKey::makeTypeTag<edm::eventsetup::test::DummyData>(), ""),
0184 0));
0185 }
0186
0187 private:
0188 edm::eventsetup::test::DummyData dummy_;
0189 };
0190
0191 class DepOn2RecordResolverProvider : public edm::eventsetup::ESProductResolverProvider {
0192 public:
0193 DepOn2RecordResolverProvider() { usingRecord<DepOn2Record>(); }
0194
0195 protected:
0196 KeyedResolversVector registerResolvers(const EventSetupRecordKey&, unsigned int ) override {
0197 return KeyedResolversVector();
0198 }
0199 std::vector<edm::eventsetup::ESModuleProducesInfo> producesInfo() const override {
0200 return std::vector<edm::eventsetup::ESModuleProducesInfo>();
0201 }
0202 };
0203
0204 class DepRecordFinder : public edm::EventSetupRecordIntervalFinder {
0205 public:
0206 DepRecordFinder() : edm::EventSetupRecordIntervalFinder(), interval_() { this->findingRecord<DepRecord>(); }
0207
0208 void setInterval(const edm::ValidityInterval& iInterval) { interval_ = iInterval; }
0209
0210 protected:
0211 void setIntervalFor(const edm::eventsetup::EventSetupRecordKey&,
0212 const edm::IOVSyncValue& iTime,
0213 edm::ValidityInterval& iInterval) override {
0214 if (interval_.validFor(iTime)) {
0215 iInterval = interval_;
0216 } else {
0217 if (interval_.last() == edm::IOVSyncValue::invalidIOVSyncValue() &&
0218 interval_.first() != edm::IOVSyncValue::invalidIOVSyncValue() && interval_.first() <= iTime) {
0219 iInterval = interval_;
0220 } else {
0221 iInterval = edm::ValidityInterval();
0222 }
0223 }
0224 }
0225
0226 private:
0227 edm::ValidityInterval interval_;
0228 };
0229
0230 class Dummy2RecordFinder : public edm::EventSetupRecordIntervalFinder {
0231 public:
0232 Dummy2RecordFinder() : edm::EventSetupRecordIntervalFinder(), interval_() { this->findingRecord<Dummy2Record>(); }
0233
0234 void setInterval(const edm::ValidityInterval& iInterval) { interval_ = iInterval; }
0235
0236 protected:
0237 void setIntervalFor(const edm::eventsetup::EventSetupRecordKey&,
0238 const edm::IOVSyncValue& iTime,
0239 edm::ValidityInterval& iInterval) override {
0240 if (interval_.validFor(iTime)) {
0241 iInterval = interval_;
0242 } else {
0243 if (interval_.last() == edm::IOVSyncValue::invalidIOVSyncValue() &&
0244 interval_.first() != edm::IOVSyncValue::invalidIOVSyncValue() && interval_.first() <= iTime) {
0245 iInterval = interval_;
0246 } else {
0247 iInterval = edm::ValidityInterval();
0248 }
0249 }
0250 }
0251
0252 private:
0253 edm::ValidityInterval interval_;
0254 };
0255 }
0256
0257 using namespace edm::eventsetup;
0258 void testdependentrecord::dependentConstructorTest() {
0259 EventSetupRecordProvider depProvider(DepRecord::keyForClass(), &activityRegistry);
0260
0261 CPPUNIT_ASSERT(1 == depProvider.dependentRecords().size());
0262 CPPUNIT_ASSERT(*(depProvider.dependentRecords().begin()) == DummyRecord::keyForClass());
0263
0264 edm::print_eventsetup_record_dependencies<DepRecord>(std::cout);
0265 }
0266
0267 void testdependentrecord::dependentFinder1Test() {
0268 auto dummyProvider = std::make_shared<EventSetupRecordProvider>(DummyRecord::keyForClass(), &activityRegistry);
0269 const edm::EventID eID_1(1, 1, 1);
0270 const edm::IOVSyncValue sync_1(eID_1);
0271 const edm::EventID eID_3(1, 1, 3);
0272 const edm::ValidityInterval definedInterval(sync_1, edm::IOVSyncValue(eID_3));
0273 std::shared_ptr<DummyFinder> dummyFinder = std::make_shared<DummyFinder>();
0274 dummyFinder->setInterval(definedInterval);
0275 dummyProvider->addFinder(dummyFinder);
0276
0277 const EventSetupRecordKey depRecordKey = DepRecord::keyForClass();
0278 DependentRecordIntervalFinder finder(depRecordKey);
0279 finder.addProviderWeAreDependentOn(dummyProvider);
0280
0281 CPPUNIT_ASSERT(definedInterval == finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 2))));
0282
0283 dummyFinder->setInterval(edm::ValidityInterval::invalidInterval());
0284 dummyProvider->initializeForNewSyncValue();
0285 CPPUNIT_ASSERT(edm::ValidityInterval::invalidInterval() ==
0286 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 4))));
0287
0288 const edm::EventID eID_5(1, 1, 5);
0289 const edm::IOVSyncValue sync_5(eID_5);
0290 const edm::ValidityInterval unknownedEndInterval(sync_5, edm::IOVSyncValue::invalidIOVSyncValue());
0291 dummyFinder->setInterval(unknownedEndInterval);
0292
0293 dummyProvider->initializeForNewSyncValue();
0294 CPPUNIT_ASSERT(unknownedEndInterval ==
0295 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 5))));
0296 }
0297
0298 void testdependentrecord::dependentFinder2Test() {
0299 auto dummyProvider1 = std::make_shared<EventSetupRecordProvider>(DummyRecord::keyForClass(), &activityRegistry);
0300
0301 const edm::EventID eID_1(1, 1, 1);
0302 const edm::IOVSyncValue sync_1(eID_1);
0303 const edm::ValidityInterval definedInterval1(sync_1, edm::IOVSyncValue(edm::EventID(1, 1, 5)));
0304 dummyProvider1->setValidityInterval_forTesting(definedInterval1);
0305
0306 auto dummyProvider2 = std::make_shared<EventSetupRecordProvider>(DummyRecord::keyForClass(), &activityRegistry);
0307
0308 const edm::EventID eID_2(1, 1, 2);
0309 const edm::IOVSyncValue sync_2(eID_2);
0310 const edm::ValidityInterval definedInterval2(sync_2, edm::IOVSyncValue(edm::EventID(1, 1, 6)));
0311 dummyProvider2->setValidityInterval_forTesting(definedInterval2);
0312
0313 const edm::ValidityInterval overlapInterval(std::max(definedInterval1.first(), definedInterval2.first()),
0314 std::min(definedInterval1.last(), definedInterval2.last()));
0315
0316 const EventSetupRecordKey depRecordKey = DepRecord::keyForClass();
0317
0318 DependentRecordIntervalFinder finder(depRecordKey);
0319 finder.addProviderWeAreDependentOn(dummyProvider1);
0320 finder.addProviderWeAreDependentOn(dummyProvider2);
0321
0322 CPPUNIT_ASSERT(overlapInterval == finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 4))));
0323 }
0324
0325 void testdependentrecord::testIncomparibleIOVAlgorithm() {
0326 const EventSetupRecordKey depRecordKey = DepRecord::keyForClass();
0327 DependentRecordIntervalFinder finder(depRecordKey);
0328
0329
0330 auto dummyProviderEventID = std::make_shared<EventSetupRecordProvider>(DummyRecord::keyForClass(), &activityRegistry);
0331 auto dummyProviderTime = std::make_shared<EventSetupRecordProvider>(DummyRecord::keyForClass(), &activityRegistry);
0332
0333 finder.addProviderWeAreDependentOn(dummyProviderEventID);
0334 finder.addProviderWeAreDependentOn(dummyProviderTime);
0335
0336 {
0337 const edm::ValidityInterval iovEventID(edm::IOVSyncValue(edm::EventID(1, 1, 1)),
0338 edm::IOVSyncValue(edm::EventID(1, 1, 5)));
0339 dummyProviderEventID->setValidityInterval_forTesting(iovEventID);
0340
0341 const edm::ValidityInterval iovTime(edm::IOVSyncValue(edm::Timestamp(1)), edm::IOVSyncValue(edm::Timestamp(6)));
0342 dummyProviderTime->setValidityInterval_forTesting(iovTime);
0343
0344 const edm::ValidityInterval expectedIOV(iovTime.first(), edm::IOVSyncValue::invalidIOVSyncValue());
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354 CPPUNIT_ASSERT(expectedIOV ==
0355 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 4), edm::Timestamp(3))));
0356
0357
0358
0359
0360
0361 dummyProviderEventID->initializeForNewSyncValue();
0362 dummyProviderTime->initializeForNewSyncValue();
0363 CPPUNIT_ASSERT(expectedIOV ==
0364 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 4), edm::Timestamp(4))));
0365
0366
0367 dummyProviderEventID->initializeForNewSyncValue();
0368 dummyProviderTime->initializeForNewSyncValue();
0369 CPPUNIT_ASSERT(expectedIOV ==
0370 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 2), edm::Timestamp(3))));
0371
0372
0373 dummyProviderEventID->initializeForNewSyncValue();
0374 dummyProviderTime->initializeForNewSyncValue();
0375 CPPUNIT_ASSERT(expectedIOV ==
0376 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 1), edm::Timestamp(2))));
0377 }
0378 {
0379
0380
0381
0382 const edm::ValidityInterval iovEventID(edm::IOVSyncValue(edm::EventID(1, 1, 6)),
0383 edm::IOVSyncValue(edm::EventID(1, 1, 10)));
0384 dummyProviderEventID->setValidityInterval_forTesting(iovEventID);
0385
0386 const edm::ValidityInterval expectedIOV(iovEventID.first(), edm::IOVSyncValue::invalidIOVSyncValue());
0387
0388
0389
0390 dummyProviderTime->initializeForNewSyncValue();
0391 CPPUNIT_ASSERT(expectedIOV ==
0392 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 6), edm::Timestamp(5))));
0393 }
0394 {
0395
0396 const edm::ValidityInterval iovTime(edm::IOVSyncValue(edm::Timestamp(7)), edm::IOVSyncValue(edm::Timestamp(10)));
0397 dummyProviderTime->setValidityInterval_forTesting(iovTime);
0398
0399 const edm::ValidityInterval expectedIOV(iovTime.first(), edm::IOVSyncValue::invalidIOVSyncValue());
0400
0401 dummyProviderEventID->initializeForNewSyncValue();
0402 CPPUNIT_ASSERT(expectedIOV ==
0403 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 7), edm::Timestamp(7))));
0404 }
0405
0406 {
0407 const edm::ValidityInterval iovEventID(edm::IOVSyncValue(edm::EventID(1, 2, 11)),
0408 edm::IOVSyncValue(edm::EventID(1, 3, 20)));
0409 dummyProviderEventID->setValidityInterval_forTesting(iovEventID);
0410
0411 const edm::ValidityInterval iovTime(edm::IOVSyncValue(edm::Timestamp(1ULL << 32)),
0412 edm::IOVSyncValue(edm::Timestamp(5ULL << 32)));
0413 dummyProviderTime->setValidityInterval_forTesting(iovTime);
0414
0415 const edm::ValidityInterval expectedIOV(iovEventID.first(), edm::IOVSyncValue::invalidIOVSyncValue());
0416 CPPUNIT_ASSERT(
0417 expectedIOV ==
0418 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 2, 12), edm::Timestamp(3ULL << 32))));
0419 }
0420
0421 {
0422 const edm::ValidityInterval iovEventID(edm::IOVSyncValue(edm::EventID(1, 3, 21)),
0423 edm::IOVSyncValue(edm::EventID(1, 10, 40)));
0424 dummyProviderEventID->setValidityInterval_forTesting(iovEventID);
0425
0426 const edm::ValidityInterval iovTime(edm::IOVSyncValue(edm::Timestamp(7ULL << 32)),
0427 edm::IOVSyncValue(edm::Timestamp(10ULL << 32)));
0428 dummyProviderTime->setValidityInterval_forTesting(iovTime);
0429
0430 const edm::ValidityInterval expectedIOV(iovTime.first(), edm::IOVSyncValue::invalidIOVSyncValue());
0431 CPPUNIT_ASSERT(
0432 expectedIOV ==
0433 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 4, 30), edm::Timestamp(8ULL << 32))));
0434 }
0435
0436 {
0437 const edm::ValidityInterval iovEventID(edm::IOVSyncValue(edm::EventID(1, 11, 41)),
0438 edm::IOVSyncValue(edm::EventID(1, 20, 60)));
0439 dummyProviderEventID->setValidityInterval_forTesting(iovEventID);
0440
0441 const edm::ValidityInterval iovTime(edm::IOVSyncValue(edm::Timestamp(11ULL << 32)),
0442 edm::IOVSyncValue(edm::Timestamp(100ULL << 32)));
0443 dummyProviderTime->setValidityInterval_forTesting(iovTime);
0444
0445 const edm::ValidityInterval expectedIOV(iovEventID.first(), edm::IOVSyncValue::invalidIOVSyncValue());
0446 CPPUNIT_ASSERT(
0447 expectedIOV ==
0448 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 12, 50), edm::Timestamp(70ULL << 32))));
0449 }
0450
0451
0452 {
0453 const edm::ValidityInterval iovEventID(edm::IOVSyncValue(edm::EventID(2, 1, 0)),
0454 edm::IOVSyncValue(edm::EventID(6, 0, 0)));
0455 dummyProviderEventID->setValidityInterval_forTesting(iovEventID);
0456
0457 const edm::ValidityInterval iovTime(edm::IOVSyncValue(edm::Timestamp(200ULL << 32)),
0458 edm::IOVSyncValue(edm::Timestamp(500ULL << 32)));
0459 dummyProviderTime->setValidityInterval_forTesting(iovTime);
0460
0461 const edm::ValidityInterval expectedIOV(iovTime.first(), edm::IOVSyncValue::invalidIOVSyncValue());
0462 CPPUNIT_ASSERT(
0463 expectedIOV ==
0464 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(4, 12, 50), edm::Timestamp(400ULL << 32))));
0465 }
0466 {
0467 const edm::ValidityInterval iovEventID(edm::IOVSyncValue(edm::EventID(1, 1, 6)),
0468 edm::IOVSyncValue(edm::EventID(1, 1, 10)));
0469 dummyProviderEventID->setValidityInterval_forTesting(iovEventID);
0470
0471 const edm::ValidityInterval iovTime(edm::IOVSyncValue(edm::Timestamp(7)), edm::IOVSyncValue(edm::Timestamp(10)));
0472 dummyProviderTime->setValidityInterval_forTesting(iovTime);
0473
0474 const edm::ValidityInterval expectedIOV(iovTime.first(), edm::IOVSyncValue::invalidIOVSyncValue());
0475 CPPUNIT_ASSERT(expectedIOV ==
0476 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 7), edm::Timestamp(7))));
0477 }
0478 }
0479
0480 void testdependentrecord::testInvalidIOVAlgorithm() {
0481 const EventSetupRecordKey depRecordKey = DepRecord::keyForClass();
0482 DependentRecordIntervalFinder finder(depRecordKey);
0483
0484 auto dummyProviderEventID = std::make_shared<EventSetupRecordProvider>(DummyRecord::keyForClass(), &activityRegistry);
0485 auto dummyProviderTime = std::make_shared<EventSetupRecordProvider>(DummyRecord::keyForClass(), &activityRegistry);
0486
0487 finder.addProviderWeAreDependentOn(dummyProviderEventID);
0488 finder.addProviderWeAreDependentOn(dummyProviderTime);
0489
0490 {
0491 const edm::ValidityInterval iovEventID(edm::IOVSyncValue(edm::EventID(1, 1, 6)),
0492 edm::IOVSyncValue(edm::EventID(1, 1, 10)));
0493 dummyProviderEventID->setValidityInterval_forTesting(iovEventID);
0494
0495 const edm::ValidityInterval iovTime(edm::IOVSyncValue(edm::Timestamp(7)), edm::IOVSyncValue(edm::Timestamp(10)));
0496 dummyProviderTime->setValidityInterval_forTesting(iovTime);
0497
0498 const edm::ValidityInterval expectedIOV(iovTime.first(), edm::IOVSyncValue::invalidIOVSyncValue());
0499 CPPUNIT_ASSERT(expectedIOV ==
0500 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 7), edm::Timestamp(7))));
0501 }
0502
0503
0504 const edm::ValidityInterval invalid(edm::IOVSyncValue::invalidIOVSyncValue(),
0505 edm::IOVSyncValue::invalidIOVSyncValue());
0506 {
0507 dummyProviderEventID->setValidityInterval_forTesting(invalid);
0508 dummyProviderTime->initializeForNewSyncValue();
0509 const edm::ValidityInterval expectedIOV(edm::IOVSyncValue(edm::Timestamp(7)),
0510 edm::IOVSyncValue::invalidIOVSyncValue());
0511 CPPUNIT_ASSERT(expectedIOV ==
0512 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 11), edm::Timestamp(8))));
0513 }
0514 {
0515 const edm::ValidityInterval iovEventID(edm::IOVSyncValue(edm::EventID(1, 1, 12)),
0516 edm::IOVSyncValue(edm::EventID(1, 1, 20)));
0517 dummyProviderEventID->setValidityInterval_forTesting(iovEventID);
0518 dummyProviderTime->setValidityInterval_forTesting(invalid);
0519 const edm::ValidityInterval expectedIOV(iovEventID.first(), edm::IOVSyncValue::invalidIOVSyncValue());
0520 CPPUNIT_ASSERT(expectedIOV ==
0521 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 13), edm::Timestamp(11))));
0522 }
0523 {
0524 dummyProviderEventID->setValidityInterval_forTesting(invalid);
0525 dummyProviderTime->setValidityInterval_forTesting(invalid);
0526
0527 dummyProviderEventID->initializeForNewSyncValue();
0528 CPPUNIT_ASSERT(invalid ==
0529 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 13), edm::Timestamp(11))));
0530 }
0531 }
0532
0533 void testdependentrecord::testInvalidIOVFirstTime() {
0534 const EventSetupRecordKey depRecordKey = DepRecord::keyForClass();
0535 DependentRecordIntervalFinder finder(depRecordKey);
0536
0537 auto dummyProviderEventID = std::make_shared<EventSetupRecordProvider>(DummyRecord::keyForClass(), &activityRegistry);
0538 auto dummyProviderTime = std::make_shared<EventSetupRecordProvider>(DummyRecord::keyForClass(), &activityRegistry);
0539
0540 finder.addProviderWeAreDependentOn(dummyProviderEventID);
0541 finder.addProviderWeAreDependentOn(dummyProviderTime);
0542
0543 const edm::ValidityInterval invalid(edm::IOVSyncValue::invalidIOVSyncValue(),
0544 edm::IOVSyncValue::invalidIOVSyncValue());
0545 {
0546
0547
0548 const edm::ValidityInterval iovEventID(edm::IOVSyncValue(edm::EventID(1, 1, 1)),
0549 edm::IOVSyncValue(edm::EventID(1, 1, 6)));
0550 dummyProviderEventID->setValidityInterval_forTesting(iovEventID);
0551
0552 dummyProviderTime->setValidityInterval_forTesting(invalid);
0553
0554 const edm::ValidityInterval expectedIOV(iovEventID.first(), edm::IOVSyncValue::invalidIOVSyncValue());
0555
0556 CPPUNIT_ASSERT(expectedIOV ==
0557 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 4), edm::Timestamp(1))));
0558 }
0559 {
0560 const edm::ValidityInterval iovTime(edm::IOVSyncValue(edm::Timestamp(2)), edm::IOVSyncValue(edm::Timestamp(6)));
0561 dummyProviderTime->setValidityInterval_forTesting(iovTime);
0562
0563 const edm::ValidityInterval expectedIOV(iovTime.first(), edm::IOVSyncValue::invalidIOVSyncValue());
0564
0565 dummyProviderEventID->initializeForNewSyncValue();
0566 CPPUNIT_ASSERT(expectedIOV ==
0567 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 5), edm::Timestamp(3))));
0568 }
0569 }
0570
0571 void testdependentrecord::testInvalidIOVFirstEventID() {
0572 const EventSetupRecordKey depRecordKey = DepRecord::keyForClass();
0573 DependentRecordIntervalFinder finder(depRecordKey);
0574
0575 auto dummyProviderEventID = std::make_shared<EventSetupRecordProvider>(DummyRecord::keyForClass(), &activityRegistry);
0576 auto dummyProviderTime = std::make_shared<EventSetupRecordProvider>(DummyRecord::keyForClass(), &activityRegistry);
0577
0578 finder.addProviderWeAreDependentOn(dummyProviderEventID);
0579 finder.addProviderWeAreDependentOn(dummyProviderTime);
0580
0581 const edm::ValidityInterval invalid(edm::IOVSyncValue::invalidIOVSyncValue(),
0582 edm::IOVSyncValue::invalidIOVSyncValue());
0583 {
0584
0585
0586 dummyProviderEventID->setValidityInterval_forTesting(invalid);
0587
0588 const edm::ValidityInterval iovTime(edm::IOVSyncValue(edm::Timestamp(1)), edm::IOVSyncValue(edm::Timestamp(6)));
0589 dummyProviderTime->setValidityInterval_forTesting(iovTime);
0590
0591 const edm::ValidityInterval expectedIOV(iovTime.first(), edm::IOVSyncValue::invalidIOVSyncValue());
0592
0593 CPPUNIT_ASSERT(expectedIOV ==
0594 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 4), edm::Timestamp(3))));
0595 }
0596 {
0597 const edm::ValidityInterval iovEventID(edm::IOVSyncValue(edm::EventID(1, 1, 5)),
0598 edm::IOVSyncValue(edm::EventID(1, 1, 10)));
0599 dummyProviderEventID->setValidityInterval_forTesting(iovEventID);
0600
0601 const edm::ValidityInterval expectedIOV(edm::IOVSyncValue(edm::Timestamp(1)),
0602 edm::IOVSyncValue::invalidIOVSyncValue());
0603 dummyProviderTime->initializeForNewSyncValue();
0604 CPPUNIT_ASSERT(expectedIOV ==
0605 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 5), edm::Timestamp(4))));
0606 }
0607 }
0608
0609 void testdependentrecord::timeAndRunTest() {
0610 edm::ParameterSet pset = createDummyPset();
0611 {
0612 SynchronousEventSetupsController controller;
0613 EventSetupProvider& provider = *controller.makeProvider(pset, &activityRegistry);
0614
0615 std::shared_ptr<edm::eventsetup::ESProductResolverProvider> dummyProv =
0616 std::make_shared<DummyESProductResolverProvider>();
0617 provider.add(dummyProv);
0618
0619 std::shared_ptr<DummyFinder> dummyFinder = std::make_shared<DummyFinder>();
0620 dummyFinder->setInterval(
0621 edm::ValidityInterval(edm::IOVSyncValue(edm::EventID(1, 1, 1)), edm::IOVSyncValue(edm::EventID(1, 1, 5))));
0622 provider.add(std::shared_ptr<edm::EventSetupRecordIntervalFinder>(dummyFinder));
0623
0624 std::shared_ptr<edm::eventsetup::ESProductResolverProvider> depProv =
0625 std::make_shared<DepOn2RecordResolverProvider>();
0626 provider.add(depProv);
0627
0628 std::shared_ptr<Dummy2RecordFinder> dummy2Finder = std::make_shared<Dummy2RecordFinder>();
0629 dummy2Finder->setInterval(
0630 edm::ValidityInterval(edm::IOVSyncValue(edm::Timestamp(1)), edm::IOVSyncValue(edm::Timestamp(5))));
0631 provider.add(std::shared_ptr<edm::EventSetupRecordIntervalFinder>(dummy2Finder));
0632
0633 {
0634 edm::ESParentContext parentC;
0635 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 1), edm::Timestamp(1)));
0636 const edm::EventSetup eventSetup1(provider.eventSetupImpl(), 0, nullptr, parentC);
0637 long long id1 = eventSetup1.get<DepOn2Record>().cacheIdentifier();
0638
0639 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 1), edm::Timestamp(2)));
0640 const edm::EventSetup eventSetup2(provider.eventSetupImpl(), 0, nullptr, parentC);
0641 long long id2 = eventSetup2.get<DepOn2Record>().cacheIdentifier();
0642 CPPUNIT_ASSERT(id1 == id2);
0643
0644 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 2), edm::Timestamp(2)));
0645 const edm::EventSetup eventSetup3(provider.eventSetupImpl(), 0, nullptr, parentC);
0646 long long id3 = eventSetup3.get<DepOn2Record>().cacheIdentifier();
0647 CPPUNIT_ASSERT(id1 == id3);
0648
0649 dummy2Finder->setInterval(
0650 edm::ValidityInterval(edm::IOVSyncValue(edm::Timestamp(6)), edm::IOVSyncValue(edm::Timestamp(10))));
0651
0652 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 4), edm::Timestamp(7)));
0653 const edm::EventSetup eventSetup4(provider.eventSetupImpl(), 0, nullptr, parentC);
0654 long long id4 = eventSetup4.get<DepOn2Record>().cacheIdentifier();
0655 CPPUNIT_ASSERT(id1 != id4);
0656
0657 dummyFinder->setInterval(
0658 edm::ValidityInterval(edm::IOVSyncValue(edm::EventID(1, 1, 6)), edm::IOVSyncValue(edm::EventID(1, 1, 10))));
0659
0660 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 7), edm::Timestamp(8)));
0661 const edm::EventSetup eventSetup5(provider.eventSetupImpl(), 0, nullptr, parentC);
0662 long long id5 = eventSetup5.get<DepOn2Record>().cacheIdentifier();
0663 CPPUNIT_ASSERT(id4 != id5);
0664 }
0665 }
0666
0667 {
0668
0669
0670 SynchronousEventSetupsController controller;
0671 EventSetupProvider& provider = *controller.makeProvider(pset, &activityRegistry);
0672
0673 std::shared_ptr<edm::eventsetup::ESProductResolverProvider> dummyProv =
0674 std::make_shared<DummyESProductResolverProvider>();
0675 provider.add(dummyProv);
0676
0677 std::shared_ptr<DummyFinder> dummyFinder = std::make_shared<DummyFinder>();
0678 dummyFinder->setInterval(
0679 edm::ValidityInterval(edm::IOVSyncValue(edm::EventID(1, 1, 1)), edm::IOVSyncValue::invalidIOVSyncValue()));
0680 provider.add(std::shared_ptr<edm::EventSetupRecordIntervalFinder>(dummyFinder));
0681
0682 std::shared_ptr<edm::eventsetup::ESProductResolverProvider> depProv =
0683 std::make_shared<DepOn2RecordResolverProvider>();
0684 provider.add(depProv);
0685
0686 std::shared_ptr<Dummy2RecordFinder> dummy2Finder = std::make_shared<Dummy2RecordFinder>();
0687 dummy2Finder->setInterval(
0688 edm::ValidityInterval(edm::IOVSyncValue(edm::Timestamp(1)), edm::IOVSyncValue::invalidIOVSyncValue()));
0689 provider.add(std::shared_ptr<edm::EventSetupRecordIntervalFinder>(dummy2Finder));
0690 {
0691 edm::ESParentContext parentC;
0692 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 1), edm::Timestamp(1)));
0693 const edm::EventSetup eventSetup1(provider.eventSetupImpl(), 0, nullptr, parentC);
0694 long long id1 = eventSetup1.get<DepOn2Record>().cacheIdentifier();
0695
0696 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 1), edm::Timestamp(2)));
0697 const edm::EventSetup eventSetup2(provider.eventSetupImpl(), 0, nullptr, parentC);
0698 long long id2 = eventSetup2.get<DepOn2Record>().cacheIdentifier();
0699 CPPUNIT_ASSERT(id1 == id2);
0700
0701 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 2), edm::Timestamp(2)));
0702 const edm::EventSetup eventSetup3(provider.eventSetupImpl(), 0, nullptr, parentC);
0703 long long id3 = eventSetup3.get<DepOn2Record>().cacheIdentifier();
0704 CPPUNIT_ASSERT(id1 == id3);
0705
0706 dummy2Finder->setInterval(
0707 edm::ValidityInterval(edm::IOVSyncValue(edm::Timestamp(6)), edm::IOVSyncValue::invalidIOVSyncValue()));
0708 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 4), edm::Timestamp(7)));
0709 const edm::EventSetup eventSetup4(provider.eventSetupImpl(), 0, nullptr, parentC);
0710 long long id4 = eventSetup4.get<DepOn2Record>().cacheIdentifier();
0711 CPPUNIT_ASSERT(id1 != id4);
0712
0713 dummyFinder->setInterval(
0714 edm::ValidityInterval(edm::IOVSyncValue(edm::EventID(1, 1, 6)), edm::IOVSyncValue::invalidIOVSyncValue()));
0715 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 7), edm::Timestamp(8)));
0716 const edm::EventSetup eventSetup5(provider.eventSetupImpl(), 0, nullptr, parentC);
0717 long long id5 = eventSetup5.get<DepOn2Record>().cacheIdentifier();
0718 CPPUNIT_ASSERT(id4 != id5);
0719 }
0720 }
0721 }
0722
0723 void testdependentrecord::dependentSetproviderTest() {
0724 auto depProvider = std::make_unique<EventSetupRecordProvider>(DepRecord::keyForClass(), &activityRegistry);
0725
0726 auto dummyProvider = std::make_shared<EventSetupRecordProvider>(DummyRecord::keyForClass(), &activityRegistry);
0727
0728 std::shared_ptr<DummyFinder> dummyFinder = std::make_shared<DummyFinder>();
0729 dummyFinder->setInterval(
0730 edm::ValidityInterval(edm::IOVSyncValue(edm::EventID(1, 1, 1)), edm::IOVSyncValue(edm::EventID(1, 1, 3))));
0731 dummyProvider->addFinder(dummyFinder);
0732
0733 CPPUNIT_ASSERT(*(depProvider->dependentRecords().begin()) == dummyProvider->key());
0734
0735 std::vector<std::shared_ptr<EventSetupRecordProvider>> providers;
0736 providers.push_back(dummyProvider);
0737 depProvider->setDependentProviders(providers);
0738 }
0739
0740 void testdependentrecord::getTest() {
0741 SynchronousEventSetupsController controller;
0742 edm::ParameterSet pset = createDummyPset();
0743 EventSetupProvider& provider = *controller.makeProvider(pset, &activityRegistry);
0744
0745 std::shared_ptr<edm::eventsetup::ESProductResolverProvider> dummyProv =
0746 std::make_shared<DummyESProductResolverProvider>();
0747 provider.add(dummyProv);
0748
0749 std::shared_ptr<DummyFinder> dummyFinder = std::make_shared<DummyFinder>();
0750 dummyFinder->setInterval(
0751 edm::ValidityInterval(edm::IOVSyncValue(edm::EventID(1, 1, 1)), edm::IOVSyncValue(edm::EventID(1, 1, 3))));
0752 provider.add(std::shared_ptr<edm::EventSetupRecordIntervalFinder>(dummyFinder));
0753
0754 std::shared_ptr<edm::eventsetup::ESProductResolverProvider> depProv = std::make_shared<DepRecordResolverProvider>();
0755 provider.add(depProv);
0756 edm::ESParentContext parentC;
0757 {
0758 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 1)));
0759 const edm::EventSetup eventSetup1(provider.eventSetupImpl(), 0, nullptr, parentC);
0760 const DepRecord& depRecord = eventSetup1.get<DepRecord>();
0761
0762 depRecord.getRecord<DummyRecord>();
0763
0764 auto dr = depRecord.tryToGetRecord<DummyRecord>();
0765 CPPUNIT_ASSERT(dr.has_value());
0766 }
0767 {
0768 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 4)));
0769 const edm::EventSetup eventSetup2(provider.eventSetupImpl(), 0, nullptr, parentC);
0770 CPPUNIT_ASSERT_THROW(eventSetup2.get<DepRecord>(), edm::eventsetup::NoRecordException<DepRecord>);
0771 }
0772 }
0773
0774 namespace {
0775 template <typename RECORD>
0776 struct DummyDataConsumer : public edm::EDConsumerBase {
0777 explicit DummyDataConsumer(edm::ESInputTag const& iTag)
0778 : m_token{esConsumes<edm::eventsetup::test::DummyData, RECORD>(iTag)} {}
0779
0780 void prefetch(edm::EventSetupImpl const& iImpl) const {
0781 auto const& recs = this->esGetTokenRecordIndicesVector(edm::Transition::Event);
0782 auto const& resolvers = this->esGetTokenIndicesVector(edm::Transition::Event);
0783 for (size_t i = 0; i != resolvers.size(); ++i) {
0784 auto rec = iImpl.findImpl(recs[i]);
0785 if (rec) {
0786 oneapi::tbb::task_group group;
0787 edm::FinalWaitingTask waitTask{group};
0788 edm::ServiceToken token;
0789 rec->prefetchAsync(
0790 edm::WaitingTaskHolder(group, &waitTask), resolvers[i], &iImpl, token, edm::ESParentContext{});
0791 waitTask.wait();
0792 }
0793 }
0794 }
0795 edm::ESGetToken<edm::eventsetup::test::DummyData, RECORD> m_token;
0796 };
0797
0798 template <typename RECORD1, typename RECORD2>
0799 struct DummyDataConsumer2 : public edm::EDConsumerBase {
0800 explicit DummyDataConsumer2(edm::ESInputTag const& iTag1, edm::ESInputTag const& iTag2)
0801 : m_token1{esConsumes<edm::eventsetup::test::DummyData, RECORD1>(iTag1)},
0802 m_token2{esConsumes<edm::eventsetup::test::DummyData, RECORD2>(iTag2)} {}
0803
0804 void prefetch(edm::EventSetupImpl const& iImpl) const {
0805 auto const& recs = this->esGetTokenRecordIndicesVector(edm::Transition::Event);
0806 auto const& resolvers = this->esGetTokenIndicesVector(edm::Transition::Event);
0807 for (size_t i = 0; i != resolvers.size(); ++i) {
0808 auto rec = iImpl.findImpl(recs[i]);
0809 if (rec) {
0810 oneapi::tbb::task_group group;
0811 edm::FinalWaitingTask waitTask{group};
0812 edm::ServiceToken token;
0813 rec->prefetchAsync(
0814 edm::WaitingTaskHolder(group, &waitTask), resolvers[i], &iImpl, token, edm::ESParentContext{});
0815 waitTask.wait();
0816 }
0817 }
0818 }
0819
0820 edm::ESGetToken<edm::eventsetup::test::DummyData, RECORD1> m_token1;
0821 edm::ESGetToken<edm::eventsetup::test::DummyData, RECORD2> m_token2;
0822 };
0823 }
0824
0825 void testdependentrecord::getDataWithESGetTokenTest() {
0826 using edm::eventsetup::test::DummyData;
0827 using edm::eventsetup::test::DummyESProductResolverProvider;
0828 DummyData kGood{1};
0829 DummyData kBad{0};
0830
0831 SynchronousEventSetupsController controller;
0832 edm::ParameterSet pset = createDummyPset();
0833 EventSetupProvider& provider = *controller.makeProvider(pset, &activityRegistry);
0834
0835 try {
0836 {
0837 edm::eventsetup::ComponentDescription description("DummyESProductResolverProvider", "testOne", 0, true);
0838 edm::ParameterSet ps;
0839 ps.addParameter<std::string>("name", "test11");
0840 ps.registerIt();
0841 description.pid_ = ps.id();
0842 auto dummyProv = std::make_shared<DummyESProductResolverProvider>(kBad);
0843 dummyProv->setDescription(description);
0844 provider.add(dummyProv);
0845 }
0846 {
0847 edm::eventsetup::ComponentDescription description("DepRecordResolverProviderWithData", "testTwo", 1, true);
0848 edm::ParameterSet ps;
0849 ps.addParameter<std::string>("name", "test22");
0850 ps.addParameter<std::string>("appendToDataLabel", "blah");
0851 ps.registerIt();
0852 description.pid_ = ps.id();
0853 auto dummyProv = std::make_shared<DepRecordResolverProviderWithData>(kGood);
0854 dummyProv->setDescription(description);
0855 dummyProv->setAppendToDataLabel(ps);
0856 provider.add(dummyProv);
0857 }
0858
0859 std::shared_ptr<DummyFinder> dummyFinder = std::make_shared<DummyFinder>();
0860 dummyFinder->setInterval(
0861 edm::ValidityInterval(edm::IOVSyncValue(edm::EventID(1, 1, 1)), edm::IOVSyncValue(edm::EventID(1, 1, 3))));
0862 provider.add(std::shared_ptr<edm::EventSetupRecordIntervalFinder>(dummyFinder));
0863
0864 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 1)));
0865 edm::ESParentContext parentC;
0866 {
0867 DummyDataConsumer<DepRecord> consumer{edm::ESInputTag{"", "blah"}};
0868 consumer.updateLookup(provider.recordsToResolverIndices());
0869 consumer.prefetch(provider.eventSetupImpl());
0870 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
0871 static_cast<unsigned int>(edm::Transition::Event),
0872 consumer.esGetTokenIndices(edm::Transition::Event),
0873 parentC};
0874 auto const& data = eventSetup.getData(consumer.m_token);
0875 CPPUNIT_ASSERT(kGood.value_ == data.value_);
0876 }
0877 {
0878 DummyDataConsumer<DummyRecord> consumer{edm::ESInputTag{"", ""}};
0879 consumer.updateLookup(provider.recordsToResolverIndices());
0880 consumer.prefetch(provider.eventSetupImpl());
0881 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
0882 static_cast<unsigned int>(edm::Transition::Event),
0883 consumer.esGetTokenIndices(edm::Transition::Event),
0884 parentC};
0885 auto const& data = eventSetup.getData(consumer.m_token);
0886 CPPUNIT_ASSERT(kBad.value_ == data.value_);
0887 }
0888 {
0889 DummyDataConsumer<DepRecord> consumer{edm::ESInputTag{"", "blah"}};
0890 consumer.updateLookup(provider.recordsToResolverIndices());
0891 consumer.prefetch(provider.eventSetupImpl());
0892 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
0893 static_cast<unsigned int>(edm::Transition::Event),
0894 consumer.esGetTokenIndices(edm::Transition::Event),
0895 parentC};
0896 auto const& depRecord = eventSetup.get<DepRecord>();
0897 auto const& data = depRecord.get(consumer.m_token);
0898 CPPUNIT_ASSERT(kGood.value_ == data.value_);
0899 }
0900 {
0901 DummyDataConsumer<DummyRecord> consumer{edm::ESInputTag{"", ""}};
0902 consumer.updateLookup(provider.recordsToResolverIndices());
0903 consumer.prefetch(provider.eventSetupImpl());
0904 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
0905 static_cast<unsigned int>(edm::Transition::Event),
0906 consumer.esGetTokenIndices(edm::Transition::Event),
0907 parentC};
0908 auto const& depRecord = eventSetup.get<DepRecord>();
0909
0910 auto const& data = depRecord.get(consumer.m_token);
0911 CPPUNIT_ASSERT(kBad.value_ == data.value_);
0912 }
0913 {
0914 DummyDataConsumer<DepRecord> consumer{edm::ESInputTag{"", "blah"}};
0915 consumer.updateLookup(provider.recordsToResolverIndices());
0916 consumer.prefetch(provider.eventSetupImpl());
0917 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
0918 static_cast<unsigned int>(edm::Transition::Event),
0919 consumer.esGetTokenIndices(edm::Transition::Event),
0920 parentC};
0921 auto const& depRecord = eventSetup.get<DepRecord>();
0922
0923 auto const& data = depRecord.get(consumer.m_token);
0924 CPPUNIT_ASSERT(kGood.value_ == data.value_);
0925 }
0926 {
0927 DummyDataConsumer2<DummyRecord, DepRecord> consumer{edm::ESInputTag{"", ""}, edm::ESInputTag{"", "blah"}};
0928 consumer.updateLookup(provider.recordsToResolverIndices());
0929 consumer.prefetch(provider.eventSetupImpl());
0930 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
0931 static_cast<unsigned int>(edm::Transition::Event),
0932 consumer.esGetTokenIndices(edm::Transition::Event),
0933 parentC};
0934 auto const& depRecord = eventSetup.get<DepRecord>();
0935
0936 auto const& data1 = depRecord.get(consumer.m_token1);
0937 CPPUNIT_ASSERT(kBad.value_ == data1.value_);
0938
0939 auto const& data2 = depRecord.get(consumer.m_token2);
0940 CPPUNIT_ASSERT(kGood.value_ == data2.value_);
0941 }
0942 {
0943 DummyDataConsumer<DummyRecord> consumer{edm::ESInputTag{"DoesNotExist", ""}};
0944 consumer.updateLookup(provider.recordsToResolverIndices());
0945 consumer.prefetch(provider.eventSetupImpl());
0946 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
0947 static_cast<unsigned int>(edm::Transition::Event),
0948 consumer.esGetTokenIndices(edm::Transition::Event),
0949 parentC};
0950 auto const& depRecord = eventSetup.get<DepRecord>();
0951
0952 CPPUNIT_ASSERT_THROW(depRecord.get(consumer.m_token), cms::Exception);
0953 }
0954 {
0955 DummyDataConsumer<DepRecord> consumer{edm::ESInputTag{"DoesNotExist", "blah"}};
0956 consumer.updateLookup(provider.recordsToResolverIndices());
0957 consumer.prefetch(provider.eventSetupImpl());
0958 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
0959 static_cast<unsigned int>(edm::Transition::Event),
0960 consumer.esGetTokenIndices(edm::Transition::Event),
0961 parentC};
0962 auto const& depRecord = eventSetup.get<DepRecord>();
0963
0964 CPPUNIT_ASSERT_THROW(depRecord.get(consumer.m_token), cms::Exception);
0965 }
0966 } catch (const cms::Exception& iException) {
0967 std::cout << "caught " << iException.explainSelf() << std::endl;
0968 throw;
0969 }
0970 }
0971
0972 void testdependentrecord::getHandleWithESGetTokenTest() {
0973 using edm::eventsetup::test::DummyData;
0974 using edm::eventsetup::test::DummyESProductResolverProvider;
0975 DummyData kGood{1};
0976 DummyData kBad{0};
0977
0978 SynchronousEventSetupsController controller;
0979 edm::ParameterSet pset = createDummyPset();
0980 EventSetupProvider& provider = *controller.makeProvider(pset, &activityRegistry);
0981
0982 try {
0983 {
0984 edm::eventsetup::ComponentDescription description("DummyESProductResolverProvider", "testOne", 0, true);
0985 edm::ParameterSet ps;
0986 ps.addParameter<std::string>("name", "test11");
0987 ps.registerIt();
0988 description.pid_ = ps.id();
0989 auto dummyProv = std::make_shared<DummyESProductResolverProvider>(kBad);
0990 dummyProv->setDescription(description);
0991 provider.add(dummyProv);
0992 }
0993 {
0994 edm::eventsetup::ComponentDescription description("DepRecordResolverProviderWithData", "testTwo", 1, true);
0995 edm::ParameterSet ps;
0996 ps.addParameter<std::string>("name", "test22");
0997 ps.addParameter<std::string>("appendToDataLabel", "blah");
0998 ps.registerIt();
0999 description.pid_ = ps.id();
1000 auto dummyProv = std::make_shared<DepRecordResolverProviderWithData>(kGood);
1001 dummyProv->setDescription(description);
1002 dummyProv->setAppendToDataLabel(ps);
1003 provider.add(dummyProv);
1004 }
1005 std::shared_ptr<DummyFinder> dummyFinder = std::make_shared<DummyFinder>();
1006 dummyFinder->setInterval(
1007 edm::ValidityInterval(edm::IOVSyncValue(edm::EventID(1, 1, 1)), edm::IOVSyncValue(edm::EventID(1, 1, 3))));
1008 provider.add(std::shared_ptr<edm::EventSetupRecordIntervalFinder>(dummyFinder));
1009
1010 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 1)));
1011
1012 edm::ESParentContext parentC;
1013 {
1014 DummyDataConsumer<DepRecord> consumer{edm::ESInputTag{"", "blah"}};
1015 consumer.updateLookup(provider.recordsToResolverIndices());
1016 consumer.prefetch(provider.eventSetupImpl());
1017 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
1018 static_cast<unsigned int>(edm::Transition::Event),
1019 consumer.esGetTokenIndices(edm::Transition::Event),
1020 parentC};
1021 edm::ESHandle<DummyData> data = eventSetup.getHandle(consumer.m_token);
1022 CPPUNIT_ASSERT(kGood.value_ == data->value_);
1023 const edm::eventsetup::ComponentDescription* desc = data.description();
1024 CPPUNIT_ASSERT(desc->label_ == "testTwo");
1025 }
1026 {
1027 DummyDataConsumer<DummyRecord> consumer{edm::ESInputTag{"", ""}};
1028 consumer.updateLookup(provider.recordsToResolverIndices());
1029 consumer.prefetch(provider.eventSetupImpl());
1030 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
1031 static_cast<unsigned int>(edm::Transition::Event),
1032 consumer.esGetTokenIndices(edm::Transition::Event),
1033 parentC};
1034 edm::ESHandle<DummyData> data = eventSetup.getHandle(consumer.m_token);
1035 CPPUNIT_ASSERT(kBad.value_ == data->value_);
1036 const edm::eventsetup::ComponentDescription* desc = data.description();
1037 CPPUNIT_ASSERT(desc->label_ == "testOne");
1038 }
1039 {
1040 DummyDataConsumer<DepRecord> consumer{edm::ESInputTag{"", "blah"}};
1041 consumer.updateLookup(provider.recordsToResolverIndices());
1042 consumer.prefetch(provider.eventSetupImpl());
1043 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
1044 static_cast<unsigned int>(edm::Transition::Event),
1045 consumer.esGetTokenIndices(edm::Transition::Event),
1046 parentC};
1047 auto const& depRecord = eventSetup.get<DepRecord>();
1048
1049 edm::ESHandle<DummyData> data = depRecord.getHandle(consumer.m_token);
1050 CPPUNIT_ASSERT(kGood.value_ == data->value_);
1051 const edm::eventsetup::ComponentDescription* desc = data.description();
1052 CPPUNIT_ASSERT(desc->label_ == "testTwo");
1053 }
1054 {
1055 DummyDataConsumer<DummyRecord> consumer{edm::ESInputTag{"", ""}};
1056 consumer.updateLookup(provider.recordsToResolverIndices());
1057 consumer.prefetch(provider.eventSetupImpl());
1058 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
1059 static_cast<unsigned int>(edm::Transition::Event),
1060 consumer.esGetTokenIndices(edm::Transition::Event),
1061 parentC};
1062 auto const& depRecord = eventSetup.get<DepRecord>();
1063
1064 edm::ESHandle<DummyData> data = depRecord.getHandle(consumer.m_token);
1065 CPPUNIT_ASSERT(kBad.value_ == data->value_);
1066 const edm::eventsetup::ComponentDescription* desc = data.description();
1067 CPPUNIT_ASSERT(desc->label_ == "testOne");
1068 }
1069 {
1070 DummyDataConsumer<DepRecord> consumer{edm::ESInputTag{"", "blah"}};
1071 consumer.updateLookup(provider.recordsToResolverIndices());
1072 consumer.prefetch(provider.eventSetupImpl());
1073 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
1074 static_cast<unsigned int>(edm::Transition::Event),
1075 consumer.esGetTokenIndices(edm::Transition::Event),
1076 parentC};
1077 auto const& depRecord = eventSetup.get<DepRecord>();
1078
1079 edm::ESHandle<DummyData> data = depRecord.getHandle(consumer.m_token);
1080 CPPUNIT_ASSERT(kGood.value_ == data->value_);
1081 const edm::eventsetup::ComponentDescription* desc = data.description();
1082 CPPUNIT_ASSERT(desc->label_ == "testTwo");
1083 }
1084 {
1085 DummyDataConsumer2<DummyRecord, DepRecord> consumer{edm::ESInputTag{"", ""}, edm::ESInputTag{"", "blah"}};
1086 consumer.updateLookup(provider.recordsToResolverIndices());
1087 consumer.prefetch(provider.eventSetupImpl());
1088 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
1089 static_cast<unsigned int>(edm::Transition::Event),
1090 consumer.esGetTokenIndices(edm::Transition::Event),
1091 parentC};
1092 auto const& depRecord = eventSetup.get<DepRecord>();
1093
1094 edm::ESHandle<DummyData> data1 = depRecord.getHandle(consumer.m_token1);
1095 CPPUNIT_ASSERT(kBad.value_ == data1->value_);
1096 const edm::eventsetup::ComponentDescription* desc = data1.description();
1097 CPPUNIT_ASSERT(desc->label_ == "testOne");
1098
1099 edm::ESHandle<DummyData> data2 = depRecord.getHandle(consumer.m_token2);
1100 CPPUNIT_ASSERT(kGood.value_ == data2->value_);
1101 desc = data2.description();
1102 CPPUNIT_ASSERT(desc->label_ == "testTwo");
1103 }
1104 {
1105 DummyDataConsumer<DummyRecord> consumer{edm::ESInputTag{"DoesNotExist", ""}};
1106 consumer.updateLookup(provider.recordsToResolverIndices());
1107 consumer.prefetch(provider.eventSetupImpl());
1108 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
1109 static_cast<unsigned int>(edm::Transition::Event),
1110 consumer.esGetTokenIndices(edm::Transition::Event),
1111 parentC};
1112 auto const& depRecord = eventSetup.get<DepRecord>();
1113
1114 CPPUNIT_ASSERT(not depRecord.getHandle(consumer.m_token));
1115 CPPUNIT_ASSERT_THROW(*depRecord.getHandle(consumer.m_token), cms::Exception);
1116 }
1117 {
1118 DummyDataConsumer<DepRecord> consumer{edm::ESInputTag{"DoesNotExist", "blah"}};
1119 consumer.updateLookup(provider.recordsToResolverIndices());
1120 consumer.prefetch(provider.eventSetupImpl());
1121 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
1122 static_cast<unsigned int>(edm::Transition::Event),
1123 consumer.esGetTokenIndices(edm::Transition::Event),
1124 parentC};
1125 auto const& depRecord = eventSetup.get<DepRecord>();
1126
1127 CPPUNIT_ASSERT(not depRecord.getHandle(consumer.m_token));
1128 CPPUNIT_ASSERT_THROW(*depRecord.getHandle(consumer.m_token), cms::Exception);
1129 }
1130 } catch (const cms::Exception& iException) {
1131 std::cout << "caught " << iException.explainSelf() << std::endl;
1132 throw;
1133 }
1134 }
1135
1136 void testdependentrecord::getTransientHandleWithESGetTokenTest() {
1137 using edm::eventsetup::test::DummyData;
1138 using edm::eventsetup::test::DummyESProductResolverProvider;
1139 DummyData kGood{1};
1140 DummyData kBad{0};
1141
1142 SynchronousEventSetupsController controller;
1143 edm::ParameterSet pset = createDummyPset();
1144 EventSetupProvider& provider = *controller.makeProvider(pset, &activityRegistry);
1145
1146 try {
1147 {
1148 edm::eventsetup::ComponentDescription description("DummyESProductResolverProvider", "testOne", 0, true);
1149 edm::ParameterSet ps;
1150 ps.addParameter<std::string>("name", "test11");
1151 ps.registerIt();
1152 description.pid_ = ps.id();
1153 auto dummyProv = std::make_shared<DummyESProductResolverProvider>(kBad);
1154 dummyProv->setDescription(description);
1155 provider.add(dummyProv);
1156 }
1157 {
1158 edm::eventsetup::ComponentDescription description("DepRecordResolverProviderWithData", "testTwo", 1, true);
1159 edm::ParameterSet ps;
1160 ps.addParameter<std::string>("name", "test22");
1161 ps.addParameter<std::string>("appendToDataLabel", "blah");
1162 ps.registerIt();
1163 description.pid_ = ps.id();
1164 auto dummyProv = std::make_shared<DepRecordResolverProviderWithData>(kGood);
1165 dummyProv->setDescription(description);
1166 dummyProv->setAppendToDataLabel(ps);
1167 provider.add(dummyProv);
1168 }
1169 std::shared_ptr<DummyFinder> dummyFinder = std::make_shared<DummyFinder>();
1170 dummyFinder->setInterval(
1171 edm::ValidityInterval(edm::IOVSyncValue(edm::EventID(1, 1, 1)), edm::IOVSyncValue(edm::EventID(1, 1, 3))));
1172 provider.add(std::shared_ptr<edm::EventSetupRecordIntervalFinder>(dummyFinder));
1173
1174 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 1)));
1175 edm::ESParentContext parentC;
1176 {
1177 DummyDataConsumer<DepRecord> consumer{edm::ESInputTag{"", "blah"}};
1178 consumer.updateLookup(provider.recordsToResolverIndices());
1179 consumer.prefetch(provider.eventSetupImpl());
1180 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
1181 static_cast<unsigned int>(edm::Transition::Event),
1182 consumer.esGetTokenIndices(edm::Transition::Event),
1183 parentC};
1184 edm::ESTransientHandle<DummyData> data = eventSetup.getTransientHandle(consumer.m_token);
1185 CPPUNIT_ASSERT(kGood.value_ == data->value_);
1186 const edm::eventsetup::ComponentDescription* desc = data.description();
1187 CPPUNIT_ASSERT(desc->label_ == "testTwo");
1188 }
1189 {
1190 DummyDataConsumer<DummyRecord> consumer{edm::ESInputTag{"", ""}};
1191 consumer.updateLookup(provider.recordsToResolverIndices());
1192 consumer.prefetch(provider.eventSetupImpl());
1193 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
1194 static_cast<unsigned int>(edm::Transition::Event),
1195 consumer.esGetTokenIndices(edm::Transition::Event),
1196 parentC};
1197 edm::ESTransientHandle<DummyData> data = eventSetup.getTransientHandle(consumer.m_token);
1198 CPPUNIT_ASSERT(kBad.value_ == data->value_);
1199 const edm::eventsetup::ComponentDescription* desc = data.description();
1200 CPPUNIT_ASSERT(desc->label_ == "testOne");
1201 }
1202 {
1203 DummyDataConsumer<DepRecord> consumer{edm::ESInputTag{"", "blah"}};
1204 consumer.updateLookup(provider.recordsToResolverIndices());
1205 consumer.prefetch(provider.eventSetupImpl());
1206 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
1207 static_cast<unsigned int>(edm::Transition::Event),
1208 consumer.esGetTokenIndices(edm::Transition::Event),
1209 parentC};
1210 auto const& depRecord = eventSetup.get<DepRecord>();
1211
1212 edm::ESTransientHandle<DummyData> data = depRecord.getTransientHandle(consumer.m_token);
1213 CPPUNIT_ASSERT(kGood.value_ == data->value_);
1214 const edm::eventsetup::ComponentDescription* desc = data.description();
1215 CPPUNIT_ASSERT(desc->label_ == "testTwo");
1216 }
1217 {
1218 DummyDataConsumer<DummyRecord> consumer{edm::ESInputTag{"", ""}};
1219 consumer.updateLookup(provider.recordsToResolverIndices());
1220 consumer.prefetch(provider.eventSetupImpl());
1221 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
1222 static_cast<unsigned int>(edm::Transition::Event),
1223 consumer.esGetTokenIndices(edm::Transition::Event),
1224 parentC};
1225 auto const& depRecord = eventSetup.get<DepRecord>();
1226
1227 edm::ESTransientHandle<DummyData> data = depRecord.getTransientHandle(consumer.m_token);
1228 CPPUNIT_ASSERT(kBad.value_ == data->value_);
1229 const edm::eventsetup::ComponentDescription* desc = data.description();
1230 CPPUNIT_ASSERT(desc->label_ == "testOne");
1231 }
1232 {
1233 DummyDataConsumer<DepRecord> consumer{edm::ESInputTag{"", "blah"}};
1234 consumer.updateLookup(provider.recordsToResolverIndices());
1235 consumer.prefetch(provider.eventSetupImpl());
1236 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
1237 static_cast<unsigned int>(edm::Transition::Event),
1238 consumer.esGetTokenIndices(edm::Transition::Event),
1239 parentC};
1240 auto const& depRecord = eventSetup.get<DepRecord>();
1241
1242 edm::ESTransientHandle<DummyData> data = depRecord.getTransientHandle(consumer.m_token);
1243 CPPUNIT_ASSERT(kGood.value_ == data->value_);
1244 const edm::eventsetup::ComponentDescription* desc = data.description();
1245 CPPUNIT_ASSERT(desc->label_ == "testTwo");
1246 }
1247 {
1248 DummyDataConsumer2<DummyRecord, DepRecord> consumer{edm::ESInputTag{"", ""}, edm::ESInputTag{"", "blah"}};
1249 consumer.updateLookup(provider.recordsToResolverIndices());
1250 consumer.prefetch(provider.eventSetupImpl());
1251 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
1252 static_cast<unsigned int>(edm::Transition::Event),
1253 consumer.esGetTokenIndices(edm::Transition::Event),
1254 parentC};
1255 auto const& depRecord = eventSetup.get<DepRecord>();
1256
1257 edm::ESTransientHandle<DummyData> data1 = depRecord.getTransientHandle(consumer.m_token1);
1258 CPPUNIT_ASSERT(kBad.value_ == data1->value_);
1259 const edm::eventsetup::ComponentDescription* desc = data1.description();
1260 CPPUNIT_ASSERT(desc->label_ == "testOne");
1261
1262 edm::ESTransientHandle<DummyData> data2 = depRecord.getTransientHandle(consumer.m_token2);
1263 CPPUNIT_ASSERT(kGood.value_ == data2->value_);
1264 desc = data2.description();
1265 CPPUNIT_ASSERT(desc->label_ == "testTwo");
1266 }
1267 {
1268 DummyDataConsumer<DummyRecord> consumer{edm::ESInputTag{"DoesNotExist", ""}};
1269 consumer.updateLookup(provider.recordsToResolverIndices());
1270 consumer.prefetch(provider.eventSetupImpl());
1271 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
1272 static_cast<unsigned int>(edm::Transition::Event),
1273 consumer.esGetTokenIndices(edm::Transition::Event),
1274 parentC};
1275 auto const& depRecord = eventSetup.get<DepRecord>();
1276
1277 edm::ESTransientHandle<DummyData> data = depRecord.getTransientHandle(consumer.m_token);
1278 CPPUNIT_ASSERT(not data);
1279 CPPUNIT_ASSERT_THROW(*data, cms::Exception);
1280 }
1281 {
1282 DummyDataConsumer<DepRecord> consumer{edm::ESInputTag{"DoesNotExist", "blah"}};
1283 consumer.updateLookup(provider.recordsToResolverIndices());
1284 consumer.prefetch(provider.eventSetupImpl());
1285 const edm::EventSetup eventSetup{provider.eventSetupImpl(),
1286 static_cast<unsigned int>(edm::Transition::Event),
1287 consumer.esGetTokenIndices(edm::Transition::Event),
1288 parentC};
1289 auto const& depRecord = eventSetup.get<DepRecord>();
1290
1291 edm::ESTransientHandle<DummyData> data = depRecord.getTransientHandle(consumer.m_token);
1292 CPPUNIT_ASSERT(not data);
1293 CPPUNIT_ASSERT_THROW(*data, cms::Exception);
1294 }
1295 } catch (const cms::Exception& iException) {
1296 std::cout << "caught " << iException.explainSelf() << std::endl;
1297 throw;
1298 }
1299 }
1300
1301 void testdependentrecord::oneOfTwoRecordTest() {
1302 SynchronousEventSetupsController controller;
1303 edm::ParameterSet pset = createDummyPset();
1304 EventSetupProvider& provider = *controller.makeProvider(pset, &activityRegistry);
1305
1306 std::shared_ptr<edm::eventsetup::ESProductResolverProvider> dummyProv =
1307 std::make_shared<DummyESProductResolverProvider>();
1308 provider.add(dummyProv);
1309
1310 std::shared_ptr<DummyFinder> dummyFinder = std::make_shared<DummyFinder>();
1311 dummyFinder->setInterval(
1312 edm::ValidityInterval(edm::IOVSyncValue(edm::EventID(1, 1, 1)), edm::IOVSyncValue(edm::EventID(1, 1, 3))));
1313 provider.add(std::shared_ptr<edm::EventSetupRecordIntervalFinder>(dummyFinder));
1314
1315 std::shared_ptr<edm::eventsetup::ESProductResolverProvider> depProv =
1316 std::make_shared<DepOn2RecordResolverProvider>();
1317 provider.add(depProv);
1318 {
1319 edm::ESParentContext parentC;
1320 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 1)));
1321 const edm::EventSetup eventSetup1(provider.eventSetupImpl(), 0, nullptr, parentC);
1322 const DepOn2Record& depRecord = eventSetup1.get<DepOn2Record>();
1323
1324 depRecord.getRecord<DummyRecord>();
1325 CPPUNIT_ASSERT_THROW(depRecord.getRecord<Dummy2Record>(), edm::eventsetup::NoRecordException<Dummy2Record>);
1326
1327 try {
1328 depRecord.getRecord<Dummy2Record>();
1329 } catch (edm::eventsetup::NoRecordException<Dummy2Record>& e) {
1330
1331 CPPUNIT_ASSERT(0 != strstr(e.what(), "DepOn2Record"));
1332 CPPUNIT_ASSERT(0 != strstr(e.what(), "Dummy2Record"));
1333
1334 }
1335 }
1336 }
1337
1338 void testdependentrecord::resetTest() {
1339 SynchronousEventSetupsController controller;
1340 edm::ParameterSet pset = createDummyPset();
1341 EventSetupProvider& provider = *controller.makeProvider(pset, &activityRegistry);
1342
1343 std::shared_ptr<edm::eventsetup::ESProductResolverProvider> dummyProv =
1344 std::make_shared<DummyESProductResolverProvider>();
1345 provider.add(dummyProv);
1346
1347 std::shared_ptr<DummyFinder> dummyFinder = std::make_shared<DummyFinder>();
1348 dummyFinder->setInterval(
1349 edm::ValidityInterval(edm::IOVSyncValue(edm::EventID(1, 1, 1)), edm::IOVSyncValue(edm::EventID(1, 1, 3))));
1350 provider.add(std::shared_ptr<edm::EventSetupRecordIntervalFinder>(dummyFinder));
1351
1352 std::shared_ptr<edm::eventsetup::ESProductResolverProvider> depProv = std::make_shared<DepRecordResolverProvider>();
1353 provider.add(depProv);
1354 {
1355 edm::ESParentContext parentC;
1356 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 1)));
1357 const edm::EventSetup eventSetup1(provider.eventSetupImpl(), 0, nullptr, parentC);
1358 const DepRecord& depRecord = eventSetup1.get<DepRecord>();
1359 unsigned long long depCacheID = depRecord.cacheIdentifier();
1360 const DummyRecord& dummyRecord = depRecord.getRecord<DummyRecord>();
1361 unsigned long long dummyCacheID = dummyRecord.cacheIdentifier();
1362
1363 provider.resetRecordPlusDependentRecords(dummyRecord.key());
1364 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 1)));
1365 CPPUNIT_ASSERT(dummyCacheID != dummyRecord.cacheIdentifier());
1366 CPPUNIT_ASSERT(depCacheID != depRecord.cacheIdentifier());
1367 }
1368 }
1369
1370 void testdependentrecord::alternateFinderTest() {
1371 auto dummyProvider = std::make_shared<EventSetupRecordProvider>(DummyRecord::keyForClass(), &activityRegistry);
1372
1373 const edm::EventID eID_1(1, 1, 1);
1374 const edm::IOVSyncValue sync_1(eID_1);
1375 const edm::EventID eID_3(1, 1, 3);
1376 const edm::IOVSyncValue sync_3(eID_3);
1377 const edm::EventID eID_4(1, 1, 4);
1378 const edm::ValidityInterval definedInterval(sync_1, edm::IOVSyncValue(eID_4));
1379 std::shared_ptr<DummyFinder> dummyFinder = std::make_shared<DummyFinder>();
1380 dummyFinder->setInterval(definedInterval);
1381 dummyProvider->addFinder(dummyFinder);
1382
1383 std::shared_ptr<DepRecordFinder> depFinder = std::make_shared<DepRecordFinder>();
1384 const edm::EventID eID_2(1, 1, 2);
1385 const edm::IOVSyncValue sync_2(eID_2);
1386 const edm::ValidityInterval depInterval(sync_1, sync_2);
1387 depFinder->setInterval(depInterval);
1388
1389 const EventSetupRecordKey depRecordKey = DepRecord::keyForClass();
1390 DependentRecordIntervalFinder finder(depRecordKey);
1391 finder.setAlternateFinder(depFinder);
1392 finder.addProviderWeAreDependentOn(dummyProvider);
1393
1394 CPPUNIT_ASSERT(depInterval == finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 1))));
1395
1396 const edm::ValidityInterval dep2Interval(sync_3, edm::IOVSyncValue(eID_4));
1397 depFinder->setInterval(dep2Interval);
1398
1399
1400 finder.findIntervalFor(depRecordKey, sync_3);
1401
1402 CPPUNIT_ASSERT(dep2Interval == finder.findIntervalFor(depRecordKey, sync_3));
1403
1404 dummyFinder->setInterval(edm::ValidityInterval::invalidInterval());
1405 depFinder->setInterval(edm::ValidityInterval::invalidInterval());
1406
1407 dummyProvider->initializeForNewSyncValue();
1408 CPPUNIT_ASSERT(edm::ValidityInterval::invalidInterval() ==
1409 finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 5))));
1410
1411 const edm::EventID eID_6(1, 1, 6);
1412 const edm::IOVSyncValue sync_6(eID_6);
1413 const edm::ValidityInterval unknownedEndInterval(sync_6, edm::IOVSyncValue::invalidIOVSyncValue());
1414 dummyFinder->setInterval(unknownedEndInterval);
1415
1416 const edm::EventID eID_7(1, 1, 7);
1417 const edm::IOVSyncValue sync_7(eID_7);
1418 const edm::ValidityInterval iov6_7(sync_6, sync_7);
1419 depFinder->setInterval(iov6_7);
1420
1421 dummyProvider->initializeForNewSyncValue();
1422 CPPUNIT_ASSERT(unknownedEndInterval == finder.findIntervalFor(depRecordKey, sync_6));
1423
1424
1425 dummyFinder->setInterval(depInterval);
1426 depFinder->setInterval(definedInterval);
1427 dummyProvider->initializeForNewSyncValue();
1428 CPPUNIT_ASSERT(depInterval == finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 1))));
1429
1430 dummyFinder->setInterval(dep2Interval);
1431 dummyProvider->initializeForNewSyncValue();
1432 CPPUNIT_ASSERT(dep2Interval == finder.findIntervalFor(depRecordKey, sync_3));
1433 }
1434
1435 void testdependentrecord::invalidRecordTest() {
1436 auto dummyProvider1 = std::make_shared<EventSetupRecordProvider>(DummyRecord::keyForClass(), &activityRegistry);
1437
1438 const edm::ValidityInterval invalid(edm::IOVSyncValue::invalidIOVSyncValue(),
1439 edm::IOVSyncValue::invalidIOVSyncValue());
1440
1441 dummyProvider1->setValidityInterval_forTesting(invalid);
1442
1443 auto dummyProvider2 = std::make_shared<EventSetupRecordProvider>(DummyRecord::keyForClass(), &activityRegistry);
1444 dummyProvider2->setValidityInterval_forTesting(invalid);
1445
1446 const EventSetupRecordKey depRecordKey = DepRecord::keyForClass();
1447 DependentRecordIntervalFinder finder(depRecordKey);
1448 finder.addProviderWeAreDependentOn(dummyProvider1);
1449 finder.addProviderWeAreDependentOn(dummyProvider2);
1450
1451 CPPUNIT_ASSERT(invalid == finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 2))));
1452
1453 const edm::EventID eID_1(1, 1, 5);
1454 const edm::IOVSyncValue sync_1(eID_1);
1455 const edm::ValidityInterval definedInterval1(sync_1, edm::IOVSyncValue(edm::EventID(1, 1, 10)));
1456 const edm::EventID eID_2(1, 1, 2);
1457 const edm::IOVSyncValue sync_2(eID_2);
1458 const edm::ValidityInterval definedInterval2(sync_2, edm::IOVSyncValue(edm::EventID(1, 1, 6)));
1459 dummyProvider2->setValidityInterval_forTesting(definedInterval2);
1460
1461 const edm::ValidityInterval openEnded1(definedInterval2.first(), edm::IOVSyncValue::invalidIOVSyncValue());
1462
1463 dummyProvider1->initializeForNewSyncValue();
1464 dummyProvider2->initializeForNewSyncValue();
1465 CPPUNIT_ASSERT(openEnded1 == finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 4))));
1466
1467 dummyProvider1->setValidityInterval_forTesting(definedInterval1);
1468
1469 const edm::ValidityInterval overlapInterval(std::max(definedInterval1.first(), definedInterval2.first()),
1470 std::min(definedInterval1.last(), definedInterval2.last()));
1471
1472 dummyProvider1->initializeForNewSyncValue();
1473 dummyProvider2->initializeForNewSyncValue();
1474 CPPUNIT_ASSERT(overlapInterval == finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 5))));
1475
1476 dummyProvider2->setValidityInterval_forTesting(invalid);
1477 const edm::ValidityInterval openEnded2(definedInterval1.first(), edm::IOVSyncValue::invalidIOVSyncValue());
1478
1479 dummyProvider1->initializeForNewSyncValue();
1480 dummyProvider2->initializeForNewSyncValue();
1481 CPPUNIT_ASSERT(openEnded2 == finder.findIntervalFor(depRecordKey, edm::IOVSyncValue(edm::EventID(1, 1, 7))));
1482 }
1483
1484 void testdependentrecord::extendIOVTest() {
1485 SynchronousEventSetupsController controller;
1486 edm::ParameterSet pset = createDummyPset();
1487 EventSetupProvider& provider = *controller.makeProvider(pset, &activityRegistry);
1488
1489 std::shared_ptr<edm::eventsetup::ESProductResolverProvider> dummyProv =
1490 std::make_shared<DummyESProductResolverProvider>();
1491 provider.add(dummyProv);
1492
1493 std::shared_ptr<DummyFinder> dummyFinder = std::make_shared<DummyFinder>();
1494
1495 edm::IOVSyncValue startSyncValue{edm::EventID{1, 1, 1}};
1496 dummyFinder->setInterval(edm::ValidityInterval{startSyncValue, edm::IOVSyncValue{edm::EventID{1, 1, 5}}});
1497 provider.add(std::shared_ptr<edm::EventSetupRecordIntervalFinder>{dummyFinder});
1498
1499 std::shared_ptr<edm::eventsetup::ESProductResolverProvider> depProv =
1500 std::make_shared<DepOn2RecordResolverProvider>();
1501 provider.add(depProv);
1502
1503 edm::ESParentContext parentC;
1504 std::shared_ptr<Dummy2RecordFinder> dummy2Finder = std::make_shared<Dummy2RecordFinder>();
1505 dummy2Finder->setInterval(edm::ValidityInterval{startSyncValue, edm::IOVSyncValue{edm::EventID{1, 1, 6}}});
1506 provider.add(std::shared_ptr<edm::EventSetupRecordIntervalFinder>(dummy2Finder));
1507 {
1508 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 1), edm::Timestamp(1)));
1509 const edm::EventSetup eventSetup1(provider.eventSetupImpl(), 0, nullptr, parentC);
1510 unsigned long long id1 = eventSetup1.get<DepOn2Record>().cacheIdentifier();
1511 CPPUNIT_ASSERT(id1 == eventSetup1.get<DummyRecord>().cacheIdentifier());
1512 CPPUNIT_ASSERT(id1 == eventSetup1.get<Dummy2Record>().cacheIdentifier());
1513
1514 {
1515 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 5), edm::Timestamp(2)));
1516 const edm::EventSetup eventSetup(provider.eventSetupImpl(), 0, nullptr, parentC);
1517 unsigned long long id = eventSetup.get<DepOn2Record>().cacheIdentifier();
1518 CPPUNIT_ASSERT(id1 == id);
1519 CPPUNIT_ASSERT(id1 == eventSetup.get<DummyRecord>().cacheIdentifier());
1520 CPPUNIT_ASSERT(id1 == eventSetup.get<Dummy2Record>().cacheIdentifier());
1521 }
1522
1523 dummyFinder->setInterval(edm::ValidityInterval{startSyncValue, edm::IOVSyncValue{edm::EventID{1, 1, 7}}});
1524 {
1525 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 6), edm::Timestamp(7)));
1526 const edm::EventSetup eventSetup(provider.eventSetupImpl(), 0, nullptr, parentC);
1527 unsigned long long id = eventSetup.get<DepOn2Record>().cacheIdentifier();
1528 CPPUNIT_ASSERT(id1 == id);
1529 CPPUNIT_ASSERT(id1 == eventSetup.get<DummyRecord>().cacheIdentifier());
1530 CPPUNIT_ASSERT(id1 == eventSetup.get<Dummy2Record>().cacheIdentifier());
1531 }
1532
1533
1534 dummy2Finder->setInterval(edm::ValidityInterval{startSyncValue, edm::IOVSyncValue{edm::EventID{1, 1, 7}}});
1535
1536 {
1537 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 7), edm::Timestamp(7)));
1538 const edm::EventSetup eventSetup(provider.eventSetupImpl(), 0, nullptr, parentC);
1539 unsigned long long id = eventSetup.get<DepOn2Record>().cacheIdentifier();
1540 CPPUNIT_ASSERT(id1 == id);
1541 CPPUNIT_ASSERT(id1 == eventSetup.get<DummyRecord>().cacheIdentifier());
1542 CPPUNIT_ASSERT(id1 == eventSetup.get<Dummy2Record>().cacheIdentifier());
1543 }
1544
1545 dummy2Finder->setInterval(edm::ValidityInterval{startSyncValue, edm::IOVSyncValue{edm::EventID{1, 1, 8}}});
1546
1547 dummyFinder->setInterval(edm::ValidityInterval{startSyncValue, edm::IOVSyncValue{edm::EventID{1, 1, 8}}});
1548 {
1549 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 8), edm::Timestamp(7)));
1550 const edm::EventSetup eventSetup(provider.eventSetupImpl(), 0, nullptr, parentC);
1551 unsigned long long id = eventSetup.get<DepOn2Record>().cacheIdentifier();
1552 CPPUNIT_ASSERT(id1 == id);
1553 CPPUNIT_ASSERT(id1 == eventSetup.get<DummyRecord>().cacheIdentifier());
1554 CPPUNIT_ASSERT(id1 == eventSetup.get<Dummy2Record>().cacheIdentifier());
1555 }
1556
1557 dummy2Finder->setInterval(edm::ValidityInterval{startSyncValue, edm::IOVSyncValue{edm::EventID{1, 1, 9}}});
1558
1559 dummyFinder->setInterval(
1560 edm::ValidityInterval{edm::IOVSyncValue{edm::EventID{1, 1, 9}}, edm::IOVSyncValue{edm::EventID{1, 1, 9}}});
1561 {
1562 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 9), edm::Timestamp(7)));
1563 const edm::EventSetup eventSetup(provider.eventSetupImpl(), 0, nullptr, parentC);
1564 unsigned long long id = eventSetup.get<DepOn2Record>().cacheIdentifier();
1565 CPPUNIT_ASSERT(id1 + 1 == id);
1566 CPPUNIT_ASSERT(id1 + 1 == eventSetup.get<DummyRecord>().cacheIdentifier());
1567 CPPUNIT_ASSERT(id1 == eventSetup.get<Dummy2Record>().cacheIdentifier());
1568 }
1569
1570 dummy2Finder->setInterval(
1571 edm::ValidityInterval{edm::IOVSyncValue{edm::EventID{1, 1, 10}}, edm::IOVSyncValue{edm::EventID{1, 1, 10}}});
1572
1573 dummyFinder->setInterval(
1574 edm::ValidityInterval{edm::IOVSyncValue{edm::EventID{1, 1, 9}}, edm::IOVSyncValue{edm::EventID{1, 1, 10}}});
1575
1576 {
1577 controller.eventSetupForInstance(edm::IOVSyncValue(edm::EventID(1, 1, 10), edm::Timestamp(7)));
1578 const edm::EventSetup eventSetup(provider.eventSetupImpl(), 0, nullptr, parentC);
1579 unsigned long long id = eventSetup.get<DepOn2Record>().cacheIdentifier();
1580 CPPUNIT_ASSERT(id1 + 2 == id);
1581 CPPUNIT_ASSERT(id1 + 1 == eventSetup.get<DummyRecord>().cacheIdentifier());
1582 CPPUNIT_ASSERT(id1 + 1 == eventSetup.get<Dummy2Record>().cacheIdentifier());
1583 }
1584 }
1585 }