98 std::string
pathA = basePath +
"CachingA";
99 std::string
pathB = basePath +
"CachingB";
100 std::string pathC = basePath +
"CachingC";
101 std::string ccdbObjO =
"testObjectO";
102 std::string ccdbObjN =
"testObjectN";
103 std::string ccdbObjX =
"testObjectX";
104 std::map<std::string, std::string> md = {
109 long start = 1000, stop = 3000;
110 ccdbManager.getCCDBAccessor().storeAsTFileAny<std::string>(&ccdbObjO,
pathA, md,
start, stop);
111 ccdbManager.getCCDBAccessor().storeAsTFileAny<std::string>(&ccdbObjN,
pathB, md,
start, stop);
112 ccdbManager.getCCDBAccessor().storeAsTFileAny<std::string>(&ccdbObjX, pathC, md,
start, stop);
114 ccdbManager.clearCache();
115 ccdbManager.setCaching(
true);
119 std::map<std::string, std::string> headers1, headers2, headers3;
121 auto* obj1 = ccdbManager.getForTimeStamp<std::string>(
pathA, (
start + stop) / 2, &headers1);
122 auto* obj2 = ccdbManager.getForTimeStamp<std::string>(
pathB, (
start + stop) / 2, &headers2);
123 auto* obj3 = ccdbManager.getForTimeStamp<std::string>(
pathA, (
start + stop) / 2, &headers3);
127 BOOST_REQUIRE(obj1 !=
nullptr);
128 BOOST_REQUIRE(obj2 !=
nullptr);
129 BOOST_REQUIRE(obj3 !=
nullptr);
143 (*obj1) =
"ModifiedObject";
148 BOOST_REQUIRE(headers1.size() != 0);
149 BOOST_REQUIRE(headers3.size() != 0);
151 LOG(
debug) <<
"Headers1 size: " << headers1.size();
152 for (
const auto&
h : headers1) {
153 LOG(
debug) <<
" " <<
h.first <<
" -> " <<
h.second;
155 LOG(
debug) <<
"Headers3 size: " << headers3.size();
156 for (
const auto&
h : headers3) {
157 LOG(
debug) <<
" " <<
h.first <<
" -> " <<
h.second;
160 for (
const auto& stableKey : sStableKeys) {
161 LOG(info) <<
"Checking key: " << stableKey;
163 BOOST_REQUIRE(headers1.count(stableKey) > 0);
164 BOOST_REQUIRE(headers3.count(stableKey) > 0);
165 BOOST_TEST(headers1.at(stableKey) == headers3.at(stableKey));
167 BOOST_TEST(headers1 != headers2,
"The headers for different objects should be different");
170 headers1[
"NewKey"] =
"NewValue";
171 headers3[
"NewKey"] =
"DifferentValue";
172 BOOST_TEST(headers1[
"NewKey"] != headers3[
"NewKey"]);
180 std::string
pathA = basePath +
"NonCachingA";
181 std::string
pathB = basePath +
"NonCachingB";
182 std::string ccdbObjO =
"testObjectO";
183 std::string ccdbObjN =
"testObjectN";
184 std::map<std::string, std::string> md = {
189 long start = 1000, stop = 2000;
190 ccdbManager.getCCDBAccessor().storeAsTFileAny(&ccdbObjO,
pathA, md,
start, stop);
191 ccdbManager.getCCDBAccessor().storeAsTFileAny(&ccdbObjN,
pathB, md,
start, stop);
193 ccdbManager.clearCache();
194 ccdbManager.setCaching(
false);
198 std::map<std::string, std::string> headers1, headers2, headers3;
200 auto* obj1 = ccdbManager.getForTimeStamp<std::string>(
pathA, (
start + stop) / 2, &headers1);
201 auto* obj2 = ccdbManager.getForTimeStamp<std::string>(
pathB, (
start + stop) / 2, &headers2);
202 auto* obj3 = ccdbManager.getForTimeStamp<std::string>(
pathA, (
start + stop) / 2, &headers3);
204 ccdbManager.setCaching(
true);
207 BOOST_REQUIRE(obj1 !=
nullptr);
208 BOOST_REQUIRE(obj2 !=
nullptr);
209 BOOST_REQUIRE(obj3 !=
nullptr);
221 (*obj1) =
"ModifiedObject";
225 BOOST_TEST(headers1.size() == headers3.size());
228 headers1.erase(
"Date");
229 headers3.erase(
"Date");
230 BOOST_TEST(headers1 == headers3,
"The headers for the same object should be the same even if not cached");
232 BOOST_TEST(headers1 != headers2,
"The headers for different objects should be different");
236 BOOST_TEST(headers1 != headers2,
"The headers for different objects should be different");
249 std::string
path = basePath +
"ObjA";
250 std::string objV1 =
"ObjectVersion1";
251 std::string objV2 =
"ObjectVersion2";
252 std::map<std::string, std::string> meta1{
253 {
"UserKey1",
"UValue1"},
254 {
"UserKey2",
"UValue2"}};
255 long v1start = 10'000;
256 long v1stop = 20'000;
257 long v2start = v1stop;
258 long v2stop = v2start + (v1stop - v1start);
259 long mid1 = (v1start + v1stop) / 2;
261 mgr.getCCDBAccessor().storeAsTFileAny(&objV1,
path, meta1, v1start, v1stop);
262 mgr.getCCDBAccessor().storeAsTFileAny(&objV2,
path, meta1, v2start, v2stop);
265 mgr.setCaching(
true);
266 mgr.setFatalWhenNull(
true);
267 mgr.setTimestamp(mid1);
270 std::map<std::string, std::string> headers1, headers2, headers4, headers5;
273 auto*
p1 = mgr.getForTimeStamp<std::string>(
path, mid1, &headers1);
274 size_t fetchedSizeAfterFirst = mgr.getFetchedSize();
276 auto*
p2 = mgr.getForTimeStamp<std::string>(
path, mid1, &headers2);
277 size_t fetchedSizeAfterSecond = mgr.getFetchedSize();
279 auto* p3 = mgr.getForTimeStamp<std::string>(
path, mid1);
281 auto* p4 = mgr.getForTimeStamp<std::string>(
path, mid1, &headers4);
283 auto* p5 = mgr.getForTimeStamp<std::string>(
path, mid1, &headers5);
285 mgr.setFatalWhenNull(
false);
294 BOOST_TEST(headers1[
"UserKey1"] ==
"UValue1");
295 BOOST_TEST(headers1[
"UserKey2"] ==
"UValue2");
296 BOOST_TEST(headers1.count(
"Valid-From") == 1);
297 BOOST_TEST(headers1.count(
"Valid-Until") == 1);
309 headers1.erase(
"Date");
310 headers2.erase(
"Date");
311 headers4.erase(
"Date");
312 headers5.erase(
"Date");
316 BOOST_TEST(fetchedSizeAfterSecond == fetchedSizeAfterFirst);
324 headers4[
"UserKey1"] =
"Tampered";
326 BOOST_TEST(headers5[
"UserKey1"] ==
"UValue1");
334 std::string
path = basePath +
"FailThenRecover";
335 std::string content =
"ContentX";
336 std::map<std::string, std::string> meta{{
"Alpha",
"Beta"}};
337 long s = 300'000, e = 310'000;
338 mgr.getCCDBAccessor().storeAsTFileAny(&content,
path, meta, s, e);
340 mgr.setCaching(
true);
341 mgr.setFatalWhenNull(
false);
345 long badTS = s - 1000;
346 long goodTS = (s + e) / 2;
347 std::map<std::string, std::string> hFail, hGood;
348 auto* badObj = mgr.getForTimeStamp<std::string>(
path, badTS, &hFail);
349 auto* goodObj = mgr.getForTimeStamp<std::string>(
path, goodTS, &hGood);
357 mgr.setFatalWhenNull(
true);
364 std::string
path = basePath +
"LateHeaders";
365 std::string body =
"Late";
366 std::map<std::string, std::string> meta{{
"LateKey",
"LateVal"}};
367 long s = 400'000, e = 410'000;
368 mgr.getCCDBAccessor().storeAsTFileAny(&body,
path, meta, s, e);
371 mgr.setCaching(
true);
372 long ts = (s + e) / 2;
375 auto*
first = mgr.getForTimeStamp<std::string>(
path, ts);
380 std::map<std::string, std::string> h2;
381 auto* second = mgr.getForTimeStamp<std::string>(
path, ts, &h2);
393 std::string
path = basePath +
"StableHeaders";
394 std::string body =
"Stable";
395 std::map<std::string, std::string> meta{{
"HK",
"HV"}};
396 long s = 500'000, e = 510'000;
397 mgr.getCCDBAccessor().storeAsTFileAny(&body,
path, meta, s, e);
400 mgr.setCaching(
true);
401 long ts = (s + e) / 2;
403 std::map<std::string, std::string> h1;
404 auto* o1 = mgr.getForTimeStamp<std::string>(
path, ts, &h1);
408 std::string
etag = h1[
"ETag"];
409 for (
int i = 0;
i < 15; ++
i) {
410 std::map<std::string, std::string> hi;
411 auto* oi = mgr.getForTimeStamp<std::string>(
path, ts, &hi);