8 #include <framework/database/IntervalOfValidity.h>
9 #include <framework/database/Database.h>
10 #include <framework/database/Configuration.h>
11 #include <framework/database/DBObjPtr.h>
12 #include <framework/database/DBArray.h>
13 #include <framework/database/EventDependency.h>
14 #include <framework/database/PayloadFile.h>
15 #include <framework/database/DBPointer.h>
16 #include <framework/datastore/StoreObjPtr.h>
17 #include <framework/dataobjects/EventMetaData.h>
18 #include <framework/utilities/TestHelpers.h>
19 #include <framework/geometry/BFieldManager.h>
20 #include <framework/dbobjects/MagneticField.h>
21 #include <framework/dbobjects/MagneticFieldComponentConstant.h>
24 #include <TClonesArray.h>
26 #include <gtest/gtest.h>
28 #include <boost/filesystem.hpp>
38 class DataBaseTest :
public ::testing::Test {
42 enum EDatabaseType {c_local, c_central, c_chain, c_default};
45 EDatabaseType m_dbType = c_local;
53 DataStore::Instance().setInitializeActive(
true);
55 DataStore::Instance().setInitializeActive(
false);
58 auto& c = Conditions::Configuration::getInstance();
62 c.overrideGlobalTags();
63 c.setMetadataProviders({});
64 c.setNewPayloadLocation(
"testPayloads/TestDatabase.txt");
65 c.appendTestingPayloadLocation(
"testPayloads/TestDatabase.txt");
68 c.setGlobalTags({
"default"});
69 c.overrideGlobalTags();
72 c.setGlobalTags({
"default"});
73 c.overrideGlobalTags();
74 c.setMetadataProviders({});
75 c.setNewPayloadLocation(
"testPayloads/TestDatabase.txt");
76 c.appendTestingPayloadLocation(
"testPayloads/TestDatabase.txt");
82 if (m_dbType != c_central) {
83 list<Database::DBImportQuery> query;
84 TClonesArray array(
"TObject");
85 for (
int experiment = 1; experiment <= 5; experiment++) {
88 TString name =
"Experiment ";
92 new(array[experiment - 1]) TObject;
93 array[experiment - 1]->SetUniqueID(experiment);
94 Database::Instance().storeData(
"TObjects", &array, iov);
96 FILE* f = fopen(
"file.xml",
"w");
97 fprintf(f,
"Experiment %d\n", experiment);
99 Database::Instance().addPayload(
"file.xml",
"file.xml", iov);
101 if (m_dbType != c_chain) {
102 Database::Instance().storeData(query);
106 intraRunDep.add(10,
new TNamed(
"B",
"B"));
107 intraRunDep.add(50,
new TNamed(
"C",
"C"));
109 Database::Instance().storeData(
"IntraRun", &intraRunDep, iov1);
111 Database::Instance().storeData(
"IntraRun",
new TNamed(
"X",
"X"), iov2);
116 void TearDown()
override
118 if (m_dbType != c_central) boost::filesystem::remove_all(
"testPayloads");
120 DataStore::Instance().reset();
149 TEST_F(DataBaseTest, IntervalOfValidityOperations)
183 EXPECT_TRUE(iov1.
empty());
202 EXPECT_TRUE(iov2.
empty());
220 TEST_F(DataBaseTest, getData)
222 EXPECT_TRUE(strcmp(Database::Instance().getData(
"TNamed", 1, 1)->GetName(),
"Experiment 1") == 0);
223 EXPECT_TRUE(strcmp(Database::Instance().getData(
"TNamed", 4, 1)->GetName(),
"Experiment 4") == 0);
224 EXPECT_TRUE(Database::Instance().getData(
"TNamed", 6, 1) == 0);
233 evtPtr->setExperiment(1);
234 DBStore::Instance().update();
236 EXPECT_TRUE(strcmp(named->GetName(),
"Experiment 1") == 0);
237 evtPtr->setExperiment(4);
238 EXPECT_TRUE(strcmp(named->GetName(),
"Experiment 1") == 0);
239 DBStore::Instance().update();
240 EXPECT_TRUE(strcmp(named->GetName(),
"Experiment 4") == 0);
241 evtPtr->setExperiment(7);
242 DBStore::Instance().update();
255 for (
const auto& o : missing) {
263 evtPtr->setExperiment(1);
264 DBStore::Instance().update();
265 EXPECT_TRUE(objects);
266 EXPECT_FALSE(missing);
267 EXPECT_EQ(objects.getEntries(), 1);
268 EXPECT_EQ(objects[0]->GetUniqueID(), 1);
269 evtPtr->setExperiment(4);
270 EXPECT_EQ(objects.getEntries(), 1);
271 DBStore::Instance().update();
272 EXPECT_EQ(objects.getEntries(), 4);
276 for (
const auto& o : objects) {
277 EXPECT_EQ(o.GetUniqueID(), ++i);
285 for (
const auto& o : missing) {
291 evtPtr->setExperiment(7);
292 DBStore::Instance().update();
293 EXPECT_FALSE(objects);
297 for (
const auto& o : objects) {
298 EXPECT_EQ(o.GetUniqueID(), ++i);
305 TEST_F(DataBaseTest, DBArrayRange)
310 evtPtr->setExperiment(3);
311 DBStore::Instance().update();
312 EXPECT_THROW(objects[-1], std::out_of_range);
313 EXPECT_THROW(objects[3], std::out_of_range);
317 TEST_F(DataBaseTest, TypeCheck)
327 TEST_F(DataBaseTest, IntraRun)
332 evtPtr->setExperiment(1);
335 DBStore::Instance().update();
336 DBStore::Instance().updateEvent();
337 EXPECT_TRUE(strcmp(intraRun->GetName(),
"A") == 0);
339 evtPtr->setEvent(10);
340 DBStore::Instance().updateEvent();
341 EXPECT_TRUE(strcmp(intraRun->GetName(),
"B") == 0);
343 evtPtr->setEvent(49);
344 DBStore::Instance().updateEvent();
345 EXPECT_TRUE(strcmp(intraRun->GetName(),
"B") == 0);
348 DBStore::Instance().update();
349 EXPECT_TRUE(strcmp(intraRun->GetName(),
"B") == 0);
351 evtPtr->setEvent(50);
352 DBStore::Instance().updateEvent();
353 EXPECT_TRUE(strcmp(intraRun->GetName(),
"C") == 0);
356 DBStore::Instance().update();
357 EXPECT_TRUE(strcmp(intraRun->GetName(),
"X") == 0);
361 TEST_F(DataBaseTest, HasChanged)
364 evtPtr->setExperiment(0);
365 DBStore::Instance().update();
370 evtPtr->setExperiment(1);
373 DBStore::Instance().update();
377 DBStore::Instance().update();
380 evtPtr->setExperiment(5);
381 DBStore::Instance().update();
384 evtPtr->setExperiment(7);
385 DBStore::Instance().update();
388 evtPtr->setExperiment(1);
392 DBStore::Instance().update();
393 DBStore::Instance().updateEvent();
394 EXPECT_TRUE(intraRun.hasChanged());
397 DBStore::Instance().updateEvent();
398 EXPECT_FALSE(intraRun.hasChanged());
400 evtPtr->setEvent(10);
401 DBStore::Instance().updateEvent();
402 EXPECT_TRUE(intraRun.hasChanged());
404 evtPtr->setEvent(1000);
405 DBStore::Instance().updateEvent();
406 EXPECT_TRUE(intraRun.hasChanged());
409 DBStore::Instance().update();
410 DBStore::Instance().updateEvent();
411 EXPECT_TRUE(intraRun.hasChanged());
420 evtPtr->setExperiment(1);
421 DBStore::Instance().update();
422 EXPECT_EQ(payload->getContent(),
"Experiment 1\n") << payload->getFileName();
423 evtPtr->setExperiment(4);
424 DBStore::Instance().update();
425 EXPECT_EQ(payload->getContent(),
"Experiment 4\n") << payload->getFileName();
426 evtPtr->setExperiment(7);
427 DBStore::Instance().update();
428 EXPECT_FALSE(payload);
432 #if defined(__INTEL_COMPILER)
433 #pragma warning disable 177
437 int callbackCounter = 0;
453 TEST_F(DataBaseTest, Callbacks)
462 EXPECT_EQ(callbackCounter, 0);
464 evtPtr->setExperiment(2);
465 DBStore::Instance().update();
466 EXPECT_EQ(callbackCounter, 1);
468 evtPtr->setExperiment(4);
469 DBStore::Instance().update();
470 EXPECT_EQ(callbackCounter, 2);
471 DBStore::Instance().update();
472 EXPECT_EQ(callbackCounter, 2);
474 evtPtr->setExperiment(6);
475 DBStore::Instance().update();
476 EXPECT_EQ(callbackCounter, 3);
478 evtPtr->setExperiment(7);
479 DBStore::Instance().update();
480 EXPECT_EQ(callbackCounter, 3);
483 objects.addCallback(&callback);
485 evtPtr->setExperiment(1);
486 DBStore::Instance().update();
488 EXPECT_EQ(callbackCounter, 5);
491 intraRun.addCallback(&callbackObject, &Callback::callback);
495 DBStore::Instance().updateEvent();
496 EXPECT_EQ(callbackCounter, 5);
499 DBStore::Instance().updateEvent();
500 EXPECT_EQ(callbackCounter, 5);
502 evtPtr->setEvent(10);
503 DBStore::Instance().updateEvent();
504 EXPECT_EQ(callbackCounter, 6);
507 DBStore::Instance().updateEvent();
508 EXPECT_EQ(callbackCounter, 7);
512 TEST_F(DataBaseTest, KeyAccess)
515 evtPtr->setExperiment(1);
516 DBStore::Instance().update();
519 EXPECT_EQ(objects.getByKey<
unsigned int>(&TObject::GetUniqueID, 1)->GetUniqueID(), 1);
520 EXPECT_EQ(objects.getByKey<
unsigned int>(&TObject::GetUniqueID, 2),
nullptr);
521 EXPECT_EQ(objects.getByKey(&TObject::IsFolder,
false)->GetUniqueID(), 1);
522 EXPECT_EQ(objects.getByKey(&TObject::IsFolder,
true),
nullptr);
524 evtPtr->setExperiment(2);
525 DBStore::Instance().update();
527 EXPECT_EQ(objects.getByKey<
unsigned int>(&TObject::GetUniqueID, 1)->GetUniqueID(), 1);
528 EXPECT_EQ(objects.getByKey<
unsigned int>(&TObject::GetUniqueID, 2)->GetUniqueID(), 2);
535 evtPtr->setExperiment(2);
536 DBStore::Instance().update();
539 EXPECT_EQ(ptr.key(), 1);
540 EXPECT_TRUE(ptr.isValid());
541 EXPECT_EQ(ptr->GetUniqueID(), 1);
543 EXPECT_EQ(ptr->GetUniqueID(), 2);
545 EXPECT_FALSE(ptr.isValid());
548 TEST_F(DataBaseTest, CleanupReattachDeathtest)
551 evtPtr->setExperiment(2);
552 DBStore::Instance().update();
556 double Bz = BFieldManager::getFieldInTesla({0, 0, 0}).Z();
558 DBStore::Instance().reset();
563 EXPECT_B2FATAL(BFieldManager::getFieldInTesla({0, 0, 0}));
569 Bz = BFieldManager::getFieldInTesla({0, 0, 0}).Z();
575 class DataBaseNoDataStoreTest :
public ::testing::Test {
579 enum EDatabaseType {c_local, c_central, c_chain, c_default};
582 EDatabaseType m_dbType = c_local;
588 DataBaseNoDataStoreTest() : m_event(0, 0, 1) {};
591 void SetUp()
override
593 auto& c = Conditions::Configuration::getInstance();
597 c.overrideGlobalTags();
598 c.setMetadataProviders({});
599 c.setNewPayloadLocation(
"testPayloads/TestDatabase.txt");
600 c.appendTestingPayloadLocation(
"testPayloads/TestDatabase.txt");
603 c.setGlobalTags({
"default"});
604 c.overrideGlobalTags();
607 c.setGlobalTags({
"default"});
608 c.overrideGlobalTags();
609 c.setMetadataProviders({});
610 c.setNewPayloadLocation(
"testPayloads/TestDatabase.txt");
611 c.appendTestingPayloadLocation(
"testPayloads/TestDatabase.txt");
617 if (m_dbType != c_central) {
618 list<Database::DBImportQuery> query;
619 TClonesArray array(
"TObject");
620 for (
int experiment = 1; experiment <= 5; experiment++) {
623 TString name =
"Experiment ";
627 new(array[experiment - 1]) TObject;
628 array[experiment - 1]->SetUniqueID(experiment);
629 Database::Instance().storeData(
"TObjects", &array, iov);
631 FILE* f = fopen(
"file.xml",
"w");
632 fprintf(f,
"Experiment %d\n", experiment);
634 Database::Instance().addPayload(
"file.xml",
"file.xml", iov);
636 if (m_dbType != c_chain) {
637 Database::Instance().storeData(query);
641 intraRunDep.add(10,
new TNamed(
"B",
"B"));
642 intraRunDep.add(50,
new TNamed(
"C",
"C"));
644 Database::Instance().storeData(
"IntraRun", &intraRunDep, iov1);
646 Database::Instance().storeData(
"IntraRun",
new TNamed(
"X",
"X"), iov2);
651 void TearDown()
override
653 if (m_dbType != c_central) boost::filesystem::remove_all(
"testPayloads");
662 DBStore::Instance().update(m_event);
665 DBStore::Instance().update(m_event);
667 EXPECT_TRUE(strcmp(named->GetName(),
"Experiment 1") == 0);
669 EXPECT_TRUE(strcmp(named->GetName(),
"Experiment 1") == 0);
670 DBStore::Instance().update(m_event);
671 EXPECT_TRUE(strcmp(named->GetName(),
"Experiment 4") == 0);
673 DBStore::Instance().update(m_event);
680 DBStore::Instance().update(m_event);
686 for (
const auto& o : missing) {
695 DBStore::Instance().update(m_event);
696 EXPECT_TRUE(objects);
697 EXPECT_FALSE(missing);
698 EXPECT_EQ(objects.getEntries(), 1);
699 EXPECT_EQ(objects[0]->GetUniqueID(), 1);
701 EXPECT_EQ(objects.getEntries(), 1);
702 DBStore::Instance().update(m_event);
703 EXPECT_EQ(objects.getEntries(), 4);
707 for (
const auto& o : objects) {
708 EXPECT_EQ(o.GetUniqueID(), ++i);
716 for (
const auto& o : missing) {
723 DBStore::Instance().update(m_event);
724 EXPECT_FALSE(objects);
728 for (
const auto& o : objects) {
729 EXPECT_EQ(o.GetUniqueID(), ++i);
736 TEST_F(DataBaseNoDataStoreTest, DBArrayRange)
741 DBStore::Instance().update(m_event);
742 EXPECT_THROW(objects[-1], std::out_of_range);
743 EXPECT_THROW(objects[3], std::out_of_range);
747 TEST_F(DataBaseNoDataStoreTest, TypeCheck)
757 TEST_F(DataBaseNoDataStoreTest, IntraRun)
764 DBStore::Instance().update(m_event);
765 DBStore::Instance().updateEvent(m_event.
getEvent());
766 EXPECT_TRUE(strcmp(intraRun->GetName(),
"A") == 0);
769 DBStore::Instance().updateEvent(m_event.
getEvent());
770 EXPECT_TRUE(strcmp(intraRun->GetName(),
"B") == 0);
773 DBStore::Instance().updateEvent(m_event.
getEvent());
774 EXPECT_TRUE(strcmp(intraRun->GetName(),
"B") == 0);
777 DBStore::Instance().update(m_event);
778 EXPECT_TRUE(strcmp(intraRun->GetName(),
"B") == 0);
781 DBStore::Instance().updateEvent(m_event.
getEvent());
782 EXPECT_TRUE(strcmp(intraRun->GetName(),
"C") == 0);
785 DBStore::Instance().update(m_event);
786 EXPECT_TRUE(strcmp(intraRun->GetName(),
"X") == 0);
790 TEST_F(DataBaseNoDataStoreTest, HasChanged)
793 DBStore::Instance().update(m_event);
801 DBStore::Instance().update(m_event);
805 DBStore::Instance().update(m_event);
809 DBStore::Instance().update(m_event);
813 DBStore::Instance().update(m_event);
820 DBStore::Instance().update(m_event);
821 DBStore::Instance().updateEvent(m_event.
getEvent());
822 EXPECT_TRUE(intraRun.hasChanged());
825 DBStore::Instance().updateEvent(m_event.
getEvent());
826 EXPECT_FALSE(intraRun.hasChanged());
829 DBStore::Instance().updateEvent(m_event.
getEvent());
830 EXPECT_TRUE(intraRun.hasChanged());
833 DBStore::Instance().updateEvent(m_event.
getEvent());
834 EXPECT_TRUE(intraRun.hasChanged());
837 DBStore::Instance().update(m_event);
838 DBStore::Instance().updateEvent(m_event.
getEvent());
839 EXPECT_TRUE(intraRun.hasChanged());
845 DBStore::Instance().update(m_event);
848 DBStore::Instance().update(m_event);
849 EXPECT_EQ(payload->getContent(),
"Experiment 1\n") << payload->getFileName();
851 DBStore::Instance().update(m_event);
852 EXPECT_EQ(payload->getContent(),
"Experiment 4\n") << payload->getFileName();
854 DBStore::Instance().update(m_event);
855 EXPECT_FALSE(payload);
860 TEST_F(DataBaseNoDataStoreTest, Callbacks)
868 EXPECT_EQ(callbackCounter, 0);
871 DBStore::Instance().update(m_event);
872 EXPECT_EQ(callbackCounter, 1);
875 DBStore::Instance().update(m_event);
876 EXPECT_EQ(callbackCounter, 2);
877 DBStore::Instance().update(m_event);
878 EXPECT_EQ(callbackCounter, 2);
881 DBStore::Instance().update(m_event);
882 EXPECT_EQ(callbackCounter, 3);
885 DBStore::Instance().update(m_event);
886 EXPECT_EQ(callbackCounter, 3);
889 objects.addCallback(&callback);
892 DBStore::Instance().update(m_event);
894 EXPECT_EQ(callbackCounter, 5);
897 intraRun.addCallback(&callbackObject, &Callback::callback);
901 DBStore::Instance().updateEvent(m_event.
getEvent());
902 EXPECT_EQ(callbackCounter, 5);
905 DBStore::Instance().updateEvent(m_event.
getEvent());
906 EXPECT_EQ(callbackCounter, 5);
909 DBStore::Instance().updateEvent(m_event.
getEvent());
910 EXPECT_EQ(callbackCounter, 6);
913 DBStore::Instance().updateEvent(m_event.
getEvent());
914 EXPECT_EQ(callbackCounter, 7);
918 TEST_F(DataBaseNoDataStoreTest, KeyAccess)
921 DBStore::Instance().update(m_event);
924 EXPECT_EQ(objects.getByKey<
unsigned int>(&TObject::GetUniqueID, 1)->GetUniqueID(), 1);
925 EXPECT_EQ(objects.getByKey<
unsigned int>(&TObject::GetUniqueID, 2),
nullptr);
926 EXPECT_EQ(objects.getByKey(&TObject::IsFolder,
false)->GetUniqueID(), 1);
927 EXPECT_EQ(objects.getByKey(&TObject::IsFolder,
true),
nullptr);
930 DBStore::Instance().update(m_event);
932 EXPECT_EQ(objects.getByKey<
unsigned int>(&TObject::GetUniqueID, 1)->GetUniqueID(), 1);
933 EXPECT_EQ(objects.getByKey<
unsigned int>(&TObject::GetUniqueID, 2)->GetUniqueID(), 2);
939 DBStore::Instance().update(m_event);
942 EXPECT_EQ(ptr.key(), 1);
943 EXPECT_TRUE(ptr.isValid());
944 EXPECT_EQ(ptr->GetUniqueID(), 1);
946 EXPECT_EQ(ptr->GetUniqueID(), 2);
948 EXPECT_FALSE(ptr.isValid());
void addCallback(std::function< void(const std::string &)> callback, bool onDestruction=false)
Add a callback method.
bool isValid() const
Check whether a valid object was obtained from the database.
bool hasChanged()
Check whether the object has changed since the last call to hasChanged of the accessor).
Class for accessing arrays of objects in the database.
Specialization of DBObjPtr in case of PayloadFiles.
Class for accessing objects in the database.
Class for pointing to an element in an array stored in the database.
Class for handling changing conditions as a function of event number.
A class that describes the interval of experiments/runs for which an object in the database is valid.
bool trimOverlap(IntervalOfValidity &iov, bool trimOlder=true)
Remove the overlap between two intervals of validity by shortening one of them.
bool empty() const
Function that checks whether the validity interval is empty.
Describe one component of the Geometry.
A wrapper class for payload files used by the Database and DBStore classes.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
Type-safe access to single objects in the data store.
bool construct(Args &&... params)
Construct an object of type T in this StoreObjPtr, using the provided constructor arguments.
changes working directory into a newly created directory, and removes it (and contents) on destructio...
static const double T
[tesla]
TEST_F(GlobalLabelTest, LargeNumberOfTimeDependentParameters)
Test large number of time-dep params for registration and retrieval.
static DBStore & Instance()
Instance of a singleton DBStore.
void addConstantOverride(const std::string &name, TObject *obj, bool oneRun=false)
Add constant override payload.
Abstract base class for different kinds of events.
Struct for bulk write queries.