20 #include <ripple/app/main/Application.h>
21 #include <ripple/app/misc/SHAMapStore.h>
22 #include <ripple/app/rdb/backend/SQLiteDatabase.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] =
124 ->getLedgerCountMinMax();
126 BEAST_EXPECT(actualRows == rows);
127 BEAST_EXPECT(actualFirst == first);
128 BEAST_EXPECT(actualLast == first + rows - 1);
150 using namespace std::chrono_literals;
156 BEAST_EXPECT(!store.getLastRotated());
161 auto ledger = env.
rpc(
"ledger",
"validated");
164 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
172 using namespace std::chrono_literals;
174 testcase(
"clearPrior");
188 auto ledgerTmp = env.
rpc(
"ledger",
"0");
189 BEAST_EXPECT(
bad(ledgerTmp));
192 BEAST_EXPECT(
goodLedger(env, ledgers[1],
"1"));
195 BEAST_EXPECT(
goodLedger(env, ledgers[2],
"2"));
197 ledgerTmp = env.
rpc(
"ledger",
"current");
198 BEAST_EXPECT(
goodLedger(env, ledgerTmp,
"3"));
200 ledgerTmp = env.
rpc(
"ledger",
"4");
201 BEAST_EXPECT(
bad(ledgerTmp));
203 ledgerTmp = env.
rpc(
"ledger",
"100");
204 BEAST_EXPECT(
bad(ledgerTmp));
207 auto lastRotated = firstSeq - 1;
214 ledgerTmp = env.
rpc(
"ledger",
"current");
217 BEAST_EXPECT(store.getLastRotated() == lastRotated);
236 auto ledger = env.
rpc(
"ledger",
"current");
244 lastRotated = store.getLastRotated();
245 BEAST_EXPECT(lastRotated == 11);
253 for (
auto i = lastRotated - 1; i < lastRotated +
deleteInterval - 1;
258 ledgerTmp = env.
rpc(
"ledger",
"current");
264 store.getLastRotated() == lastRotated ||
273 BEAST_EXPECT(store.getLastRotated() ==
deleteInterval + lastRotated);
283 testcase(
"automatic online_delete");
285 using namespace std::chrono_literals;
291 auto lastRotated = ledgerSeq - 1;
292 BEAST_EXPECT(store.getLastRotated() == lastRotated);
293 BEAST_EXPECT(lastRotated != 2);
297 auto const canDelete = env.
rpc(
"can_delete");
305 auto ledger = env.
rpc(
"ledger",
"validated");
315 BEAST_EXPECT(lastRotated == store.getLastRotated());
321 auto ledger = env.
rpc(
"ledger",
"validated");
328 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
329 BEAST_EXPECT(lastRotated != store.getLastRotated());
331 lastRotated = store.getLastRotated();
338 auto ledger = env.
rpc(
"ledger",
"validated");
346 BEAST_EXPECT(lastRotated != store.getLastRotated());
352 testcase(
"online_delete with advisory_delete");
354 using namespace std::chrono_literals;
361 auto lastRotated = ledgerSeq - 1;
362 BEAST_EXPECT(store.getLastRotated() == lastRotated);
363 BEAST_EXPECT(lastRotated != 2);
365 auto canDelete = env.
rpc(
"can_delete");
367 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] == 0);
369 canDelete = env.
rpc(
"can_delete",
"never");
371 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] == 0);
374 for (; ledgerSeq < firstBatch; ++ledgerSeq)
378 auto ledger = env.
rpc(
"ledger",
"validated");
386 BEAST_EXPECT(lastRotated == store.getLastRotated());
393 canDelete[jss::result][jss::can_delete] ==
399 BEAST_EXPECT(store.getLastRotated() == lastRotated);
405 auto ledger = env.
rpc(
"ledger",
"validated");
412 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
414 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
415 lastRotated = ledgerSeq - 1;
422 auto ledger = env.
rpc(
"ledger",
"validated");
429 BEAST_EXPECT(store.getLastRotated() == lastRotated);
435 auto ledger = env.
rpc(
"ledger",
"validated");
442 ledgerCheck(env, ledgerSeq - firstBatch, firstBatch);
444 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
445 lastRotated = ledgerSeq - 1;
448 canDelete = env.
rpc(
"can_delete",
"always");
451 canDelete[jss::result][jss::can_delete] ==
459 auto ledger = env.
rpc(
"ledger",
"validated");
466 BEAST_EXPECT(store.getLastRotated() == lastRotated);
472 auto ledger = env.
rpc(
"ledger",
"validated");
479 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
481 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
482 lastRotated = ledgerSeq - 1;
485 canDelete = env.
rpc(
"can_delete",
"now");
487 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] == ledgerSeq - 1);
494 auto ledger = env.
rpc(
"ledger",
"validated");
501 BEAST_EXPECT(store.getLastRotated() == lastRotated);
507 auto ledger = env.
rpc(
"ledger",
"validated");
514 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
516 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
517 lastRotated = ledgerSeq - 1;