1 #include <framework/database/IntervalOfValidity.h>
2 #include <framework/database/Database.h>
3 #include <framework/database/Configuration.h>
4 #include <framework/database/DBObjPtr.h>
5 #include <framework/database/DBArray.h>
6 #include <framework/database/EventDependency.h>
7 #include <framework/database/PayloadFile.h>
8 #include <framework/database/DBPointer.h>
9 #include <framework/datastore/StoreObjPtr.h>
10 #include <framework/dataobjects/EventMetaData.h>
11 #include <framework/utilities/TestHelpers.h>
12 #include <framework/geometry/BFieldManager.h>
13 #include <framework/dbobjects/MagneticField.h>
14 #include <framework/dbobjects/MagneticFieldComponentConstant.h>
17 #include <TClonesArray.h>
19 #include <gtest/gtest.h>
21 #include <boost/filesystem.hpp>
31 class DataBaseTest :
public ::testing::Test {
35 enum EDatabaseType {c_local, c_central, c_chain, c_default};
38 EDatabaseType m_dbType = c_local;
46 DataStore::Instance().setInitializeActive(
true);
47 evtPtr.registerInDataStore();
48 DataStore::Instance().setInitializeActive(
false);
51 auto& c = Conditions::Configuration::getInstance();
55 c.overrideGlobalTags();
56 c.setMetadataProviders({});
57 c.setNewPayloadLocation(
"testPayloads/TestDatabase.txt");
58 c.appendTestingPayloadLocation(
"testPayloads/TestDatabase.txt");
61 c.setGlobalTags({
"default"});
62 c.overrideGlobalTags();
65 c.setGlobalTags({
"default"});
66 c.overrideGlobalTags();
67 c.setMetadataProviders({});
68 c.setNewPayloadLocation(
"testPayloads/TestDatabase.txt");
69 c.appendTestingPayloadLocation(
"testPayloads/TestDatabase.txt");
75 if (m_dbType != c_central) {
76 list<Database::DBImportQuery> query;
77 TClonesArray array(
"TObject");
78 for (
int experiment = 1; experiment <= 5; experiment++) {
81 TString name =
"Experiment ";
85 new(array[experiment - 1]) TObject;
86 array[experiment - 1]->SetUniqueID(experiment);
87 Database::Instance().storeData(
"TObjects", &array, iov);
89 FILE* f = fopen(
"file.xml",
"w");
90 fprintf(f,
"Experiment %d\n", experiment);
92 Database::Instance().addPayload(
"file.xml",
"file.xml", iov);
94 if (m_dbType != c_chain) {
95 Database::Instance().storeData(query);
99 intraRunDep.add(10,
new TNamed(
"B",
"B"));
100 intraRunDep.add(50,
new TNamed(
"C",
"C"));
102 Database::Instance().storeData(
"IntraRun", &intraRunDep, iov1);
104 Database::Instance().storeData(
"IntraRun",
new TNamed(
"X",
"X"), iov2);
109 void TearDown()
override
111 if (m_dbType != c_central) boost::filesystem::remove_all(
"testPayloads");
113 DataStore::Instance().reset();
142 TEST_F(DataBaseTest, IntervalOfValidityOperations)
176 EXPECT_TRUE(iov1.
empty());
195 EXPECT_TRUE(iov2.
empty());
218 evtPtr->setExperiment(1);
219 DBStore::Instance().update();
221 EXPECT_TRUE(strcmp(named->GetName(),
"Experiment 1") == 0);
222 evtPtr->setExperiment(4);
223 EXPECT_TRUE(strcmp(named->GetName(),
"Experiment 1") == 0);
224 DBStore::Instance().update();
225 EXPECT_TRUE(strcmp(named->GetName(),
"Experiment 4") == 0);
226 evtPtr->setExperiment(7);
227 DBStore::Instance().update();
240 for (
const auto& o : missing) {
248 evtPtr->setExperiment(1);
249 DBStore::Instance().update();
250 EXPECT_TRUE(objects);
251 EXPECT_FALSE(missing);
252 EXPECT_EQ(objects.getEntries(), 1);
253 EXPECT_EQ(objects[0]->GetUniqueID(), 1);
254 evtPtr->setExperiment(4);
255 EXPECT_EQ(objects.getEntries(), 1);
256 DBStore::Instance().update();
257 EXPECT_EQ(objects.getEntries(), 4);
261 for (
const auto& o : objects) {
262 EXPECT_EQ(o.GetUniqueID(), ++i);
270 for (
const auto& o : missing) {
276 evtPtr->setExperiment(7);
277 DBStore::Instance().update();
278 EXPECT_FALSE(objects);
282 for (
const auto& o : objects) {
283 EXPECT_EQ(o.GetUniqueID(), ++i);
290 TEST_F(DataBaseTest, DBArrayRange)
295 evtPtr->setExperiment(3);
296 DBStore::Instance().update();
297 EXPECT_THROW(objects[-1], std::out_of_range);
298 EXPECT_THROW(objects[3], std::out_of_range);
302 TEST_F(DataBaseTest, TypeCheck)
312 TEST_F(DataBaseTest, IntraRun)
317 evtPtr->setExperiment(1);
320 DBStore::Instance().update();
321 DBStore::Instance().updateEvent();
322 EXPECT_TRUE(strcmp(intraRun->GetName(),
"A") == 0);
324 evtPtr->setEvent(10);
325 DBStore::Instance().updateEvent();
326 EXPECT_TRUE(strcmp(intraRun->GetName(),
"B") == 0);
328 evtPtr->setEvent(49);
329 DBStore::Instance().updateEvent();
330 EXPECT_TRUE(strcmp(intraRun->GetName(),
"B") == 0);
333 DBStore::Instance().update();
334 EXPECT_TRUE(strcmp(intraRun->GetName(),
"B") == 0);
336 evtPtr->setEvent(50);
337 DBStore::Instance().updateEvent();
338 EXPECT_TRUE(strcmp(intraRun->GetName(),
"C") == 0);
341 DBStore::Instance().update();
342 EXPECT_TRUE(strcmp(intraRun->GetName(),
"X") == 0);
346 TEST_F(DataBaseTest, HasChanged)
349 evtPtr->setExperiment(0);
350 DBStore::Instance().update();
355 evtPtr->setExperiment(1);
358 DBStore::Instance().update();
362 DBStore::Instance().update();
365 evtPtr->setExperiment(5);
366 DBStore::Instance().update();
369 evtPtr->setExperiment(7);
370 DBStore::Instance().update();
373 evtPtr->setExperiment(1);
377 DBStore::Instance().update();
378 DBStore::Instance().updateEvent();
379 EXPECT_TRUE(intraRun.hasChanged());
382 DBStore::Instance().updateEvent();
383 EXPECT_FALSE(intraRun.hasChanged());
385 evtPtr->setEvent(10);
386 DBStore::Instance().updateEvent();
387 EXPECT_TRUE(intraRun.hasChanged());
389 evtPtr->setEvent(1000);
390 DBStore::Instance().updateEvent();
391 EXPECT_TRUE(intraRun.hasChanged());
394 DBStore::Instance().update();
395 DBStore::Instance().updateEvent();
396 EXPECT_TRUE(intraRun.hasChanged());
405 evtPtr->setExperiment(1);
406 DBStore::Instance().update();
407 EXPECT_EQ(payload->getContent(),
"Experiment 1\n") << payload->getFileName();
408 evtPtr->setExperiment(4);
409 DBStore::Instance().update();
410 EXPECT_EQ(payload->getContent(),
"Experiment 4\n") << payload->getFileName();
411 evtPtr->setExperiment(7);
412 DBStore::Instance().update();
413 EXPECT_FALSE(payload);
417 #if defined(__INTEL_COMPILER)
418 #pragma warning disable 177
422 int callbackCounter = 0;
438 TEST_F(DataBaseTest, Callbacks)
447 EXPECT_EQ(callbackCounter, 0);
449 evtPtr->setExperiment(2);
450 DBStore::Instance().update();
451 EXPECT_EQ(callbackCounter, 1);
453 evtPtr->setExperiment(4);
454 DBStore::Instance().update();
455 EXPECT_EQ(callbackCounter, 2);
456 DBStore::Instance().update();
457 EXPECT_EQ(callbackCounter, 2);
459 evtPtr->setExperiment(6);
460 DBStore::Instance().update();
461 EXPECT_EQ(callbackCounter, 3);
463 evtPtr->setExperiment(7);
464 DBStore::Instance().update();
465 EXPECT_EQ(callbackCounter, 3);
468 objects.addCallback(&callback);
470 evtPtr->setExperiment(1);
471 DBStore::Instance().update();
473 EXPECT_EQ(callbackCounter, 5);
476 intraRun.addCallback(&callbackObject, &Callback::callback);
480 DBStore::Instance().updateEvent();
481 EXPECT_EQ(callbackCounter, 5);
484 DBStore::Instance().updateEvent();
485 EXPECT_EQ(callbackCounter, 5);
487 evtPtr->setEvent(10);
488 DBStore::Instance().updateEvent();
489 EXPECT_EQ(callbackCounter, 6);
492 DBStore::Instance().updateEvent();
493 EXPECT_EQ(callbackCounter, 7);
497 TEST_F(DataBaseTest, KeyAccess)
500 evtPtr->setExperiment(1);
501 DBStore::Instance().update();
504 EXPECT_EQ(objects.getByKey<
unsigned int>(&TObject::GetUniqueID, 1)->GetUniqueID(), 1);
505 EXPECT_EQ(objects.getByKey<
unsigned int>(&TObject::GetUniqueID, 2),
nullptr);
506 EXPECT_EQ(objects.getByKey(&TObject::IsFolder,
false)->GetUniqueID(), 1);
507 EXPECT_EQ(objects.getByKey(&TObject::IsFolder,
true),
nullptr);
509 evtPtr->setExperiment(2);
510 DBStore::Instance().update();
512 EXPECT_EQ(objects.getByKey<
unsigned int>(&TObject::GetUniqueID, 1)->GetUniqueID(), 1);
513 EXPECT_EQ(objects.getByKey<
unsigned int>(&TObject::GetUniqueID, 2)->GetUniqueID(), 2);
520 evtPtr->setExperiment(2);
521 DBStore::Instance().update();
524 EXPECT_EQ(ptr.key(), 1);
525 EXPECT_TRUE(ptr.isValid());
526 EXPECT_EQ(ptr->GetUniqueID(), 1);
528 EXPECT_EQ(ptr->GetUniqueID(), 2);
530 EXPECT_FALSE(ptr.isValid());
533 TEST_F(DataBaseTest, CleanupReattachDeathtest)
536 evtPtr->setExperiment(2);
537 DBStore::Instance().update();
541 double Bz = BFieldManager::getFieldInTesla({0, 0, 0}).Z();
543 DBStore::Instance().reset();
548 EXPECT_B2FATAL(BFieldManager::getFieldInTesla({0, 0, 0}));
554 Bz = BFieldManager::getFieldInTesla({0, 0, 0}).Z();
560 class DataBaseNoDataStoreTest :
public ::testing::Test {
564 enum EDatabaseType {c_local, c_central, c_chain, c_default};
567 EDatabaseType m_dbType = c_local;
573 DataBaseNoDataStoreTest() : m_event(0, 0, 1) {};
576 void SetUp()
override
578 auto& c = Conditions::Configuration::getInstance();
582 c.overrideGlobalTags();
583 c.setMetadataProviders({});
584 c.setNewPayloadLocation(
"testPayloads/TestDatabase.txt");
585 c.appendTestingPayloadLocation(
"testPayloads/TestDatabase.txt");
588 c.setGlobalTags({
"default"});
589 c.overrideGlobalTags();
592 c.setGlobalTags({
"default"});
593 c.overrideGlobalTags();
594 c.setMetadataProviders({});
595 c.setNewPayloadLocation(
"testPayloads/TestDatabase.txt");
596 c.appendTestingPayloadLocation(
"testPayloads/TestDatabase.txt");
602 if (m_dbType != c_central) {
603 list<Database::DBImportQuery> query;
604 TClonesArray array(
"TObject");
605 for (
int experiment = 1; experiment <= 5; experiment++) {
608 TString name =
"Experiment ";
612 new(array[experiment - 1]) TObject;
613 array[experiment - 1]->SetUniqueID(experiment);
614 Database::Instance().storeData(
"TObjects", &array, iov);
616 FILE* f = fopen(
"file.xml",
"w");
617 fprintf(f,
"Experiment %d\n", experiment);
619 Database::Instance().addPayload(
"file.xml",
"file.xml", iov);
621 if (m_dbType != c_chain) {
622 Database::Instance().storeData(query);
626 intraRunDep.add(10,
new TNamed(
"B",
"B"));
627 intraRunDep.add(50,
new TNamed(
"C",
"C"));
629 Database::Instance().storeData(
"IntraRun", &intraRunDep, iov1);
631 Database::Instance().storeData(
"IntraRun",
new TNamed(
"X",
"X"), iov2);
636 void TearDown()
override
638 if (m_dbType != c_central) boost::filesystem::remove_all(
"testPayloads");
647 DBStore::Instance().update(m_event);
650 DBStore::Instance().update(m_event);
652 EXPECT_TRUE(strcmp(named->GetName(),
"Experiment 1") == 0);
654 EXPECT_TRUE(strcmp(named->GetName(),
"Experiment 1") == 0);
655 DBStore::Instance().update(m_event);
656 EXPECT_TRUE(strcmp(named->GetName(),
"Experiment 4") == 0);
658 DBStore::Instance().update(m_event);
665 DBStore::Instance().update(m_event);
671 for (
const auto& o : missing) {
680 DBStore::Instance().update(m_event);
681 EXPECT_TRUE(objects);
682 EXPECT_FALSE(missing);
683 EXPECT_EQ(objects.getEntries(), 1);
684 EXPECT_EQ(objects[0]->GetUniqueID(), 1);
686 EXPECT_EQ(objects.getEntries(), 1);
687 DBStore::Instance().update(m_event);
688 EXPECT_EQ(objects.getEntries(), 4);
692 for (
const auto& o : objects) {
693 EXPECT_EQ(o.GetUniqueID(), ++i);
701 for (
const auto& o : missing) {
708 DBStore::Instance().update(m_event);
709 EXPECT_FALSE(objects);
713 for (
const auto& o : objects) {
714 EXPECT_EQ(o.GetUniqueID(), ++i);
721 TEST_F(DataBaseNoDataStoreTest, DBArrayRange)
726 DBStore::Instance().update(m_event);
727 EXPECT_THROW(objects[-1], std::out_of_range);
728 EXPECT_THROW(objects[3], std::out_of_range);
732 TEST_F(DataBaseNoDataStoreTest, TypeCheck)
742 TEST_F(DataBaseNoDataStoreTest, IntraRun)
749 DBStore::Instance().update(m_event);
750 DBStore::Instance().updateEvent(m_event.
getEvent());
751 EXPECT_TRUE(strcmp(intraRun->GetName(),
"A") == 0);
754 DBStore::Instance().updateEvent(m_event.
getEvent());
755 EXPECT_TRUE(strcmp(intraRun->GetName(),
"B") == 0);
758 DBStore::Instance().updateEvent(m_event.
getEvent());
759 EXPECT_TRUE(strcmp(intraRun->GetName(),
"B") == 0);
762 DBStore::Instance().update(m_event);
763 EXPECT_TRUE(strcmp(intraRun->GetName(),
"B") == 0);
766 DBStore::Instance().updateEvent(m_event.
getEvent());
767 EXPECT_TRUE(strcmp(intraRun->GetName(),
"C") == 0);
770 DBStore::Instance().update(m_event);
771 EXPECT_TRUE(strcmp(intraRun->GetName(),
"X") == 0);
775 TEST_F(DataBaseNoDataStoreTest, HasChanged)
778 DBStore::Instance().update(m_event);
786 DBStore::Instance().update(m_event);
790 DBStore::Instance().update(m_event);
794 DBStore::Instance().update(m_event);
798 DBStore::Instance().update(m_event);
805 DBStore::Instance().update(m_event);
806 DBStore::Instance().updateEvent(m_event.
getEvent());
807 EXPECT_TRUE(intraRun.hasChanged());
810 DBStore::Instance().updateEvent(m_event.
getEvent());
811 EXPECT_FALSE(intraRun.hasChanged());
814 DBStore::Instance().updateEvent(m_event.
getEvent());
815 EXPECT_TRUE(intraRun.hasChanged());
818 DBStore::Instance().updateEvent(m_event.
getEvent());
819 EXPECT_TRUE(intraRun.hasChanged());
822 DBStore::Instance().update(m_event);
823 DBStore::Instance().updateEvent(m_event.
getEvent());
824 EXPECT_TRUE(intraRun.hasChanged());
830 DBStore::Instance().update(m_event);
833 DBStore::Instance().update(m_event);
834 EXPECT_EQ(payload->getContent(),
"Experiment 1\n") << payload->getFileName();
836 DBStore::Instance().update(m_event);
837 EXPECT_EQ(payload->getContent(),
"Experiment 4\n") << payload->getFileName();
839 DBStore::Instance().update(m_event);
840 EXPECT_FALSE(payload);
845 TEST_F(DataBaseNoDataStoreTest, Callbacks)
853 EXPECT_EQ(callbackCounter, 0);
856 DBStore::Instance().update(m_event);
857 EXPECT_EQ(callbackCounter, 1);
860 DBStore::Instance().update(m_event);
861 EXPECT_EQ(callbackCounter, 2);
862 DBStore::Instance().update(m_event);
863 EXPECT_EQ(callbackCounter, 2);
866 DBStore::Instance().update(m_event);
867 EXPECT_EQ(callbackCounter, 3);
870 DBStore::Instance().update(m_event);
871 EXPECT_EQ(callbackCounter, 3);
874 objects.addCallback(&callback);
877 DBStore::Instance().update(m_event);
879 EXPECT_EQ(callbackCounter, 5);
882 intraRun.addCallback(&callbackObject, &Callback::callback);
886 DBStore::Instance().updateEvent(m_event.
getEvent());
887 EXPECT_EQ(callbackCounter, 5);
890 DBStore::Instance().updateEvent(m_event.
getEvent());
891 EXPECT_EQ(callbackCounter, 5);
894 DBStore::Instance().updateEvent(m_event.
getEvent());
895 EXPECT_EQ(callbackCounter, 6);
898 DBStore::Instance().updateEvent(m_event.
getEvent());
899 EXPECT_EQ(callbackCounter, 7);
903 TEST_F(DataBaseNoDataStoreTest, KeyAccess)
906 DBStore::Instance().update(m_event);
909 EXPECT_EQ(objects.getByKey<
unsigned int>(&TObject::GetUniqueID, 1)->GetUniqueID(), 1);
910 EXPECT_EQ(objects.getByKey<
unsigned int>(&TObject::GetUniqueID, 2),
nullptr);
911 EXPECT_EQ(objects.getByKey(&TObject::IsFolder,
false)->GetUniqueID(), 1);
912 EXPECT_EQ(objects.getByKey(&TObject::IsFolder,
true),
nullptr);
915 DBStore::Instance().update(m_event);
917 EXPECT_EQ(objects.getByKey<
unsigned int>(&TObject::GetUniqueID, 1)->GetUniqueID(), 1);
918 EXPECT_EQ(objects.getByKey<
unsigned int>(&TObject::GetUniqueID, 2)->GetUniqueID(), 2);
924 DBStore::Instance().update(m_event);
927 EXPECT_EQ(ptr.key(), 1);
928 EXPECT_TRUE(ptr.isValid());
929 EXPECT_EQ(ptr->GetUniqueID(), 1);
931 EXPECT_EQ(ptr->GetUniqueID(), 2);
933 EXPECT_FALSE(ptr.isValid());