Skip to content

Commit 60ede12

Browse files
committed
Change unit tests to only use one CCDB api init
This (hopefully) fixes some tests that are fine on desktop but the subprocess aborts even when all tests are green in CI. malloc_consolidate(): invalid chunk size This might have happend because the deconstructor of CCDBApi calling curl global cleanup and with both a CCDB api and a BasicCCDBManager we have one global CURL cleanup called twice, one for the api and one for the manager.
1 parent 2028c5b commit 60ede12

File tree

1 file changed

+44
-56
lines changed

1 file changed

+44
-56
lines changed

CCDB/test/testCcdbApiHeaders.cxx

Lines changed: 44 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,16 @@ bool hostReachable = false;
3939
struct Fixture {
4040
Fixture()
4141
{
42-
o2::ccdb::CcdbApi api;
42+
auto& ccdbManager = o2::ccdb::BasicCCDBManager::instance();
4343
if (std::getenv("ALICEO2_CCDB_HOST")) {
4444
ccdbUrl = std::string(std::getenv("ALICEO2_CCDB_HOST"));
4545
}
46-
api.init(ccdbUrl);
47-
hostReachable = api.isHostReachable();
46+
hostReachable = ccdbManager.getCCDBAccessor().isHostReachable();
4847
char hostname[_POSIX_HOST_NAME_MAX];
4948
gethostname(hostname, _POSIX_HOST_NAME_MAX);
50-
basePath = std::string("Users/m/meide/BasicCCDBManager/");
49+
basePath = std::string("Users/m/meide/Tests/") + hostname + "/pid-" + getpid() + "/BasicCCDBManager/";
50+
51+
ccdbManager.setURL(ccdbUrl);
5152

5253
LOG(info) << "Path we will use in this test suite : " + basePath << std::endl;
5354
LOG(info) << "ccdb url: " << ccdbUrl << std::endl;
@@ -56,9 +57,7 @@ struct Fixture {
5657
~Fixture()
5758
{
5859
if (hostReachable) {
59-
o2::ccdb::CcdbApi api;
60-
api.init(ccdbUrl);
61-
api.truncate(basePath + "*"); // This deletes the data after test is run, disable if you want to inspect the data
60+
o2::ccdb::BasicCCDBManager::instance().getCCDBAccessor().truncate(basePath + "*"); // This deletes the data after test is run, disable if you want to inspect the data
6261
LOG(info) << "Test data truncated/deleted (" << basePath << ")" << std::endl;
6362
}
6463
}
@@ -74,22 +73,6 @@ struct if_reachable {
7473
return hostReachable;
7574
}
7675
};
77-
/**
78-
* Fixture for the tests, i.e. code is ran in every test that uses it, i.e. it is like a setup and teardown for tests.
79-
* Copied from testCcdbApi.cxx
80-
*/
81-
struct test_fixture {
82-
test_fixture()
83-
{
84-
api.init(ccdbUrl);
85-
metadata["Hello"] = "World";
86-
LOG(info) << "*** " << boost::unit_test::framework::current_test_case().p_name << " ***" << std::endl;
87-
}
88-
~test_fixture() = default;
89-
90-
o2::ccdb::CcdbApi api;
91-
std::map<std::string, std::string> metadata;
92-
};
9376

9477
// Only compare known and stable keys (avoid volatile ones like Date)
9578
static const std::set<std::string> sStableKeys = {
@@ -112,23 +95,24 @@ BOOST_AUTO_TEST_CASE(testCachedHeaders, *boost::unit_test::precondition(if_reach
11295
{
11396
/// ━━━━━━━ ARRANGE ━━━━━━━━━
11497
// First store objects to test with
115-
test_fixture f;
116-
98+
auto& ccdbManager = o2::ccdb::BasicCCDBManager::instance();
11799
std::string pathA = basePath + "CachingA";
118100
std::string pathB = basePath + "CachingB";
119101
std::string pathC = basePath + "CachingC";
120102
std::string ccdbObjO = "testObjectO";
121103
std::string ccdbObjN = "testObjectN";
122104
std::string ccdbObjX = "testObjectX";
123-
std::map<std::string, std::string> md = f.metadata;
105+
std::map<std::string, std::string> md = {
106+
{"Hello", "World"},
107+
{"Key1", "Value1"},
108+
{"Key2", "Value2"},
109+
};
124110
long start = 1000, stop = 3000;
125-
f.api.storeAsTFileAny<std::string>(&ccdbObjO, pathA, md, start, stop);
126-
f.api.storeAsTFileAny<std::string>(&ccdbObjN, pathB, md, start, stop);
127-
f.api.storeAsTFileAny<std::string>(&ccdbObjX, pathC, md, start, stop);
111+
ccdbManager.getCCDBAccessor().storeAsTFileAny<std::string>(&ccdbObjO, pathA, md, start, stop);
112+
ccdbManager.getCCDBAccessor().storeAsTFileAny<std::string>(&ccdbObjN, pathB, md, start, stop);
113+
ccdbManager.getCCDBAccessor().storeAsTFileAny<std::string>(&ccdbObjX, pathC, md, start, stop);
128114
// initilize the BasicCCDBManager
129-
o2::ccdb::BasicCCDBManager& ccdbManager = o2::ccdb::BasicCCDBManager::instance();
130115
ccdbManager.clearCache();
131-
ccdbManager.setURL(ccdbUrl);
132116
ccdbManager.setCaching(true); // This is what we want to test.
133117

134118
/// ━━━━━━━━━━━ ACT ━━━━━━━━━━━━
@@ -193,20 +177,21 @@ BOOST_AUTO_TEST_CASE(testNonCachedHeaders, *boost::unit_test::precondition(if_re
193177
{
194178
/// ━━━━━━━ ARRANGE ━━━━━━━━━
195179
// First store objects to test with
196-
test_fixture f;
197-
180+
auto& ccdbManager = o2::ccdb::BasicCCDBManager::instance();
198181
std::string pathA = basePath + "NonCachingA";
199182
std::string pathB = basePath + "NonCachingB";
200183
std::string ccdbObjO = "testObjectO";
201184
std::string ccdbObjN = "testObjectN";
202-
std::map<std::string, std::string> md = f.metadata;
185+
std::map<std::string, std::string> md = {
186+
{"Hello", "World"},
187+
{"Key1", "Value1"},
188+
{"Key2", "Value2"},
189+
};
203190
long start = 1000, stop = 2000;
204-
f.api.storeAsTFileAny(&ccdbObjO, pathA, md, start, stop);
205-
f.api.storeAsTFileAny(&ccdbObjN, pathB, md, start, stop);
191+
ccdbManager.getCCDBAccessor().storeAsTFileAny(&ccdbObjO, pathA, md, start, stop);
192+
ccdbManager.getCCDBAccessor().storeAsTFileAny(&ccdbObjN, pathB, md, start, stop);
206193
// initilize the BasicCCDBManager
207-
o2::ccdb::BasicCCDBManager& ccdbManager = o2::ccdb::BasicCCDBManager::instance();
208194
ccdbManager.clearCache();
209-
ccdbManager.setURL(ccdbUrl);
210195
ccdbManager.setCaching(false); // This is what we want to test, no caching
211196

212197
/// ━━━━━━━━━━━ ACT ━━━━━━━━━━━━
@@ -217,6 +202,7 @@ BOOST_AUTO_TEST_CASE(testNonCachedHeaders, *boost::unit_test::precondition(if_re
217202
auto* obj2 = ccdbManager.getForTimeStamp<std::string>(pathB, (start + stop) / 2, &headers2);
218203
auto* obj3 = ccdbManager.getForTimeStamp<std::string>(pathA, (start + stop) / 2, &headers3); // Should not be cached since explicitly disabled
219204

205+
ccdbManager.setCaching(true); // Restore default state
220206
/// ━━━━━━━━━━━ ASSERT ━━━━━━━━━━━
221207
/// Check that we got something
222208
BOOST_REQUIRE(obj1 != nullptr);
@@ -249,12 +235,17 @@ BOOST_AUTO_TEST_CASE(testNonCachedHeaders, *boost::unit_test::precondition(if_re
249235
BOOST_TEST(headers3.size() != 0);
250236
BOOST_TEST(headers2.size() != 0);
251237
BOOST_TEST(headers1 != headers2, "The headers for different objects should be different");
238+
239+
// cleanup
240+
delete obj1;
241+
delete obj2;
242+
delete obj3;
252243
}
253244

254-
BOOST_AUTO_TEST_CASE(CacheFirstRetrievalAndHeadersPersistence)
245+
BOOST_AUTO_TEST_CASE(CacheFirstRetrievalAndHeadersPersistence, *boost::unit_test::precondition(if_reachable()))
255246
{
256-
test_fixture f;
257247
/// ━━━━━━━ ARRANGE ━━━━━━━━━
248+
auto& mgr = o2::ccdb::BasicCCDBManager::instance();
258249
// Prepare two validity slots for same path to test ETag change later
259250
std::string path = basePath + "ObjA";
260251
std::string objV1 = "ObjectVersion1";
@@ -268,11 +259,9 @@ BOOST_AUTO_TEST_CASE(CacheFirstRetrievalAndHeadersPersistence)
268259
long v2stop = v2start + (v1stop - v1start);
269260
long mid1 = (v1start + v1stop) / 2;
270261
// Store 2 versions
271-
f.api.storeAsTFileAny(&objV1, path, meta1, v1start, v1stop);
272-
f.api.storeAsTFileAny(&objV2, path, meta1, v2start, v2stop);
262+
mgr.getCCDBAccessor().storeAsTFileAny(&objV1, path, meta1, v1start, v1stop);
263+
mgr.getCCDBAccessor().storeAsTFileAny(&objV2, path, meta1, v2start, v2stop);
273264

274-
auto& mgr = o2::ccdb::BasicCCDBManager::instance();
275-
mgr.setURL(ccdbUrl);
276265
mgr.clearCache();
277266
mgr.setCaching(true);
278267
mgr.setFatalWhenNull(true);
@@ -294,6 +283,8 @@ BOOST_AUTO_TEST_CASE(CacheFirstRetrievalAndHeadersPersistence)
294283
// 5) Fifth retrieval with headers again to check persistence
295284
auto* p5 = mgr.getForTimeStamp<std::string>(path, mid1, &headers5);
296285

286+
mgr.setFatalWhenNull(false); // restore default
287+
297288
/// ━━━━━━━ASSERT━━━━━━━━━
298289

299290
BOOST_TEST(p1 != nullptr);
@@ -336,17 +327,16 @@ BOOST_AUTO_TEST_CASE(CacheFirstRetrievalAndHeadersPersistence)
336327
BOOST_TEST(headers5["UserKey1"] == "UValue1"); // internal unchanged
337328
}
338329

339-
BOOST_AUTO_TEST_CASE(FailedFetchDoesNotGiveMetadata)
330+
BOOST_AUTO_TEST_CASE(FailedFetchDoesNotGiveMetadata, *boost::unit_test::precondition(if_reachable()))
340331
{
341-
test_fixture f;
342332

343333
/// ━━━━━━━ ARRANGE ━━━━━━━━━
334+
auto& mgr = o2::ccdb::BasicCCDBManager::instance();
344335
std::string path = basePath + "FailThenRecover";
345336
std::string content = "ContentX";
346337
std::map<std::string, std::string> meta{{"Alpha", "Beta"}};
347338
long s = 300'000, e = 310'000;
348-
f.api.storeAsTFileAny(&content, path, meta, s, e);
349-
auto& mgr = o2::ccdb::BasicCCDBManager::instance();
339+
mgr.getCCDBAccessor().storeAsTFileAny(&content, path, meta, s, e);
350340
mgr.clearCache();
351341
mgr.setCaching(true);
352342
mgr.setFatalWhenNull(false);
@@ -368,17 +358,16 @@ BOOST_AUTO_TEST_CASE(FailedFetchDoesNotGiveMetadata)
368358
mgr.setFatalWhenNull(true);
369359
}
370360

371-
BOOST_AUTO_TEST_CASE(FirstCallWithoutHeadersThenWithHeaders)
361+
BOOST_AUTO_TEST_CASE(FirstCallWithoutHeadersThenWithHeaders, *boost::unit_test::precondition(if_reachable()))
372362
{
373-
test_fixture f;
374363

364+
auto& mgr = o2::ccdb::BasicCCDBManager::instance();
375365
std::string path = basePath + "LateHeaders";
376366
std::string body = "Late";
377367
std::map<std::string, std::string> meta{{"LateKey", "LateVal"}};
378368
long s = 400'000, e = 410'000;
379-
f.api.storeAsTFileAny(&body, path, meta, s, e);
369+
mgr.getCCDBAccessor().storeAsTFileAny(&body, path, meta, s, e);
380370

381-
auto& mgr = o2::ccdb::BasicCCDBManager::instance();
382371
mgr.clearCache();
383372
mgr.setCaching(true);
384373
long ts = (s + e) / 2;
@@ -398,17 +387,16 @@ BOOST_AUTO_TEST_CASE(FirstCallWithoutHeadersThenWithHeaders)
398387
BOOST_TEST(h2.count("Valid-Until") == 1);
399388
}
400389

401-
BOOST_AUTO_TEST_CASE(HeadersAreStableAcrossMultipleHits)
390+
BOOST_AUTO_TEST_CASE(HeadersAreStableAcrossMultipleHits, *boost::unit_test::precondition(if_reachable()))
402391
{
403-
test_fixture f;
404392

393+
auto& mgr = o2::ccdb::BasicCCDBManager::instance();
405394
std::string path = basePath + "StableHeaders";
406395
std::string body = "Stable";
407396
std::map<std::string, std::string> meta{{"HK", "HV"}};
408397
long s = 500'000, e = 510'000;
409-
f.api.storeAsTFileAny(&body, path, meta, s, e);
398+
mgr.getCCDBAccessor().storeAsTFileAny(&body, path, meta, s, e);
410399

411-
auto& mgr = o2::ccdb::BasicCCDBManager::instance();
412400
mgr.clearCache();
413401
mgr.setCaching(true);
414402
long ts = (s + e) / 2;

0 commit comments

Comments
 (0)