20 #include <ripple/app/main/Application.h>
21 #include <ripple/app/misc/SHAMapStore.h>
22 #include <ripple/app/rdb/backend/RelationalDBInterfaceSqlite.h>
23 #include <ripple/core/ConfigSections.h>
24 #include <ripple/protocol/jss.h>
26 #include <test/jtx/envconfig.h>
59 auto good =
json.isMember(jss::result) &&
61 json[jss::result][jss::ledger][jss::ledger_index] == ledgerID;
62 if (!good || !checkDB)
65 auto const seq =
json[jss::result][jss::ledger_index].asUInt();
87 auto const& ledger =
json[jss::result][jss::ledger];
88 return outHash == ledger[jss::hash].asString() && outSeq ==
seq &&
89 outParentHash == ledger[jss::parent_hash].asString() &&
90 outDrops == ledger[jss::total_coins].asString() &&
91 outCloseTime == ledger[jss::close_time].asUInt() &&
92 outParentCloseTime == ledger[jss::parent_close_time].asUInt() &&
93 outCloseTimeResolution ==
94 ledger[jss::close_time_resolution].asUInt() &&
95 outCloseFlags == ledger[jss::close_flags].asUInt() &&
96 outAccountHash == ledger[jss::account_hash].asString() &&
97 outTxHash == ledger[jss::transaction_hash].asString();
103 return json.isMember(jss::result) &&
105 json[jss::result][jss::error_code] == error;
112 json.isMember(jss::result) &&
113 json[jss::result].isMember(jss::ledger) &&
114 json[jss::result][jss::ledger].isMember(jss::hash) &&
115 json[jss::result][jss::ledger][jss::hash].isString());
116 return json[jss::result][jss::ledger][jss::hash].asString();
122 const auto [actualRows, actualFirst, actualLast] =
125 ->getLedgerCountMinMax();
127 BEAST_EXPECT(actualRows == rows);
128 BEAST_EXPECT(actualFirst == first);
129 BEAST_EXPECT(actualLast == first + rows - 1);
153 using namespace std::chrono_literals;
159 BEAST_EXPECT(!store.getLastRotated());
164 auto ledger = env.
rpc(
"ledger",
"validated");
167 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
175 using namespace std::chrono_literals;
177 testcase(
"clearPrior");
191 auto ledgerTmp = env.
rpc(
"ledger",
"0");
192 BEAST_EXPECT(
bad(ledgerTmp));
195 BEAST_EXPECT(
goodLedger(env, ledgers[1],
"1"));
198 BEAST_EXPECT(
goodLedger(env, ledgers[2],
"2"));
200 ledgerTmp = env.
rpc(
"ledger",
"current");
201 BEAST_EXPECT(
goodLedger(env, ledgerTmp,
"3"));
203 ledgerTmp = env.
rpc(
"ledger",
"4");
204 BEAST_EXPECT(
bad(ledgerTmp));
206 ledgerTmp = env.
rpc(
"ledger",
"100");
207 BEAST_EXPECT(
bad(ledgerTmp));
210 auto lastRotated = firstSeq - 1;
217 ledgerTmp = env.
rpc(
"ledger",
"current");
220 BEAST_EXPECT(store.getLastRotated() == lastRotated);
239 auto ledger = env.
rpc(
"ledger",
"current");
247 lastRotated = store.getLastRotated();
248 BEAST_EXPECT(lastRotated == 11);
256 for (
auto i = lastRotated - 1; i < lastRotated +
deleteInterval - 1;
261 ledgerTmp = env.
rpc(
"ledger",
"current");
267 store.getLastRotated() == lastRotated ||
276 BEAST_EXPECT(store.getLastRotated() ==
deleteInterval + lastRotated);
286 testcase(
"automatic online_delete");
288 using namespace std::chrono_literals;
294 auto lastRotated = ledgerSeq - 1;
295 BEAST_EXPECT(store.getLastRotated() == lastRotated);
296 BEAST_EXPECT(lastRotated != 2);
300 auto const canDelete = env.
rpc(
"can_delete");
308 auto ledger = env.
rpc(
"ledger",
"validated");
318 BEAST_EXPECT(lastRotated == store.getLastRotated());
324 auto ledger = env.
rpc(
"ledger",
"validated");
331 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
332 BEAST_EXPECT(lastRotated != store.getLastRotated());
334 lastRotated = store.getLastRotated();
341 auto ledger = env.
rpc(
"ledger",
"validated");
349 BEAST_EXPECT(lastRotated != store.getLastRotated());
355 testcase(
"online_delete with advisory_delete");
357 using namespace std::chrono_literals;
364 auto lastRotated = ledgerSeq - 1;
365 BEAST_EXPECT(store.getLastRotated() == lastRotated);
366 BEAST_EXPECT(lastRotated != 2);
368 auto canDelete = env.
rpc(
"can_delete");
370 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] == 0);
372 canDelete = env.
rpc(
"can_delete",
"never");
374 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] == 0);
377 for (; ledgerSeq < firstBatch; ++ledgerSeq)
381 auto ledger = env.
rpc(
"ledger",
"validated");
389 BEAST_EXPECT(lastRotated == store.getLastRotated());
396 canDelete[jss::result][jss::can_delete] ==
402 BEAST_EXPECT(store.getLastRotated() == lastRotated);
408 auto ledger = env.
rpc(
"ledger",
"validated");
415 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
417 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
418 lastRotated = ledgerSeq - 1;
425 auto ledger = env.
rpc(
"ledger",
"validated");
432 BEAST_EXPECT(store.getLastRotated() == lastRotated);
438 auto ledger = env.
rpc(
"ledger",
"validated");
445 ledgerCheck(env, ledgerSeq - firstBatch, firstBatch);
447 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
448 lastRotated = ledgerSeq - 1;
451 canDelete = env.
rpc(
"can_delete",
"always");
454 canDelete[jss::result][jss::can_delete] ==
462 auto ledger = env.
rpc(
"ledger",
"validated");
469 BEAST_EXPECT(store.getLastRotated() == lastRotated);
475 auto ledger = env.
rpc(
"ledger",
"validated");
482 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
484 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
485 lastRotated = ledgerSeq - 1;
488 canDelete = env.
rpc(
"can_delete",
"now");
490 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] == ledgerSeq - 1);
497 auto ledger = env.
rpc(
"ledger",
"validated");
504 BEAST_EXPECT(store.getLastRotated() == lastRotated);
510 auto ledger = env.
rpc(
"ledger",
"validated");
517 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
519 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
520 lastRotated = ledgerSeq - 1;