20 #include <ripple/app/main/Application.h>
21 #include <ripple/app/misc/SHAMapStore.h>
22 #include <ripple/core/ConfigSections.h>
23 #include <ripple/core/DatabaseCon.h>
24 #include <ripple/core/SociDB.h>
25 #include <ripple/protocol/jss.h>
27 #include <test/jtx/envconfig.h>
52 .set(
"advisory_delete",
"1");
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();
80 *db <<
"SELECT LedgerHash,LedgerSeq,PrevHash,TotalCoins, "
81 "ClosingTime,PrevClosingTime,CloseTimeRes,CloseFlags, "
82 "AccountSetHash,TransSetHash "
84 "WHERE LedgerSeq = :seq",
88 soci::into(outParentHash),
90 soci::into(outCloseTime),
91 soci::into(outParentCloseTime),
92 soci::into(outCloseTimeResolution),
93 soci::into(outCloseFlags),
94 soci::into(outAccountHash),
95 soci::into(outTxHash);
98 auto const& ledger =
json[jss::result][jss::ledger];
99 return outHash == ledger[jss::hash].asString() &&
101 outParentHash == ledger[jss::parent_hash].asString() &&
102 outDrops == ledger[jss::total_coins].asString() &&
103 outCloseTime == ledger[jss::close_time].asUInt() &&
104 outParentCloseTime == ledger[jss::parent_close_time].asUInt() &&
105 outCloseTimeResolution == ledger[jss::close_time_resolution].asUInt() &&
106 outCloseFlags == ledger[jss::close_flags].asUInt() &&
107 outAccountHash == ledger[jss::account_hash].asString() &&
108 outTxHash == ledger[jss::transaction_hash].asString();
113 return json.isMember(jss::result)
115 &&
json[jss::result][jss::error_code] == error;
120 BEAST_EXPECT(
json.isMember(jss::result) &&
121 json[jss::result].isMember(jss::ledger) &&
122 json[jss::result][jss::ledger].isMember(jss::hash) &&
123 json[jss::result][jss::ledger][jss::hash].isString());
124 return json[jss::result][jss::ledger][jss::hash].asString();
132 int actualRows, actualFirst, actualLast;
133 *db <<
"SELECT count(*) AS rows, "
134 "min(LedgerSeq) as first, "
135 "max(LedgerSeq) as last "
137 soci::into(actualRows),
138 soci::into(actualFirst),
139 soci::into(actualLast);
141 BEAST_EXPECT(actualRows == rows);
142 BEAST_EXPECT(actualFirst == first);
143 BEAST_EXPECT(actualLast == first + rows - 1);
152 *db <<
"SELECT count(*) AS rows "
153 "FROM Transactions;",
154 soci::into(actualRows);
156 BEAST_EXPECT(actualRows == rows);
164 *db <<
"SELECT count(*) AS rows "
165 "FROM AccountTransactions;",
166 soci::into(actualRows);
168 BEAST_EXPECT(actualRows == rows);
173 using namespace std::chrono_literals;
179 BEAST_EXPECT(!store.getLastRotated());
184 auto ledger = env.
rpc(
"ledger",
"validated");
187 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
194 using namespace std::chrono_literals;
196 testcase(
"clearPrior");
210 auto ledgerTmp = env.
rpc(
"ledger",
"0");
211 BEAST_EXPECT(
bad(ledgerTmp));
214 BEAST_EXPECT(
goodLedger(env, ledgers[1],
"1"));
217 BEAST_EXPECT(
goodLedger(env, ledgers[2],
"2"));
219 ledgerTmp = env.
rpc(
"ledger",
"current");
220 BEAST_EXPECT(
goodLedger(env, ledgerTmp,
"3"));
222 ledgerTmp = env.
rpc(
"ledger",
"4");
223 BEAST_EXPECT(
bad(ledgerTmp));
225 ledgerTmp = env.
rpc(
"ledger",
"100");
226 BEAST_EXPECT(
bad(ledgerTmp));
229 auto lastRotated = firstSeq - 1;
236 ledgerTmp = env.
rpc(
"ledger",
"current");
239 BEAST_EXPECT(store.getLastRotated() == lastRotated);
257 auto ledger = env.
rpc(
"ledger",
"current");
264 lastRotated = store.getLastRotated();
265 BEAST_EXPECT(lastRotated == 11);
273 for (
auto i = lastRotated - 1; i < lastRotated +
deleteInterval - 1; ++i)
277 ledgerTmp = env.
rpc(
"ledger",
"current");
282 BEAST_EXPECT(store.getLastRotated() == lastRotated ||
290 BEAST_EXPECT(store.getLastRotated() ==
deleteInterval + lastRotated);
300 testcase(
"automatic online_delete");
302 using namespace std::chrono_literals;
308 auto lastRotated = ledgerSeq - 1;
309 BEAST_EXPECT(store.getLastRotated() == lastRotated);
310 BEAST_EXPECT(lastRotated != 2);
314 auto const canDelete = env.
rpc(
"can_delete");
322 auto ledger = env.
rpc(
"ledger",
"validated");
331 BEAST_EXPECT(lastRotated == store.getLastRotated());
337 auto ledger = env.
rpc(
"ledger",
"validated");
343 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
344 BEAST_EXPECT(lastRotated != store.getLastRotated());
346 lastRotated = store.getLastRotated();
353 auto ledger = env.
rpc(
"ledger",
"validated");
360 BEAST_EXPECT(lastRotated != store.getLastRotated());
365 testcase(
"online_delete with advisory_delete");
367 using namespace std::chrono_literals;
374 auto lastRotated = ledgerSeq - 1;
375 BEAST_EXPECT(store.getLastRotated() == lastRotated);
376 BEAST_EXPECT(lastRotated != 2);
378 auto canDelete = env.
rpc(
"can_delete");
380 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] == 0);
382 canDelete = env.
rpc(
"can_delete",
"never");
384 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] == 0);
387 for (; ledgerSeq < firstBatch; ++ledgerSeq)
391 auto ledger = env.
rpc(
"ledger",
"validated");
398 BEAST_EXPECT(lastRotated == store.getLastRotated());
404 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] ==
410 BEAST_EXPECT(store.getLastRotated() == lastRotated);
416 auto ledger = env.
rpc(
"ledger",
"validated");
422 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
424 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
425 lastRotated = ledgerSeq - 1;
432 auto ledger = env.
rpc(
"ledger",
"validated");
438 BEAST_EXPECT(store.getLastRotated() == lastRotated);
444 auto ledger = env.
rpc(
"ledger",
"validated");
450 ledgerCheck(env, ledgerSeq - firstBatch, firstBatch);
452 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
453 lastRotated = ledgerSeq - 1;
456 canDelete = env.
rpc(
"can_delete",
"always");
458 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] ==
466 auto ledger = env.
rpc(
"ledger",
"validated");
472 BEAST_EXPECT(store.getLastRotated() == lastRotated);
478 auto ledger = env.
rpc(
"ledger",
"validated");
484 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
486 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
487 lastRotated = ledgerSeq - 1;
490 canDelete = env.
rpc(
"can_delete",
"now");
492 BEAST_EXPECT(canDelete[jss::result][jss::can_delete] == ledgerSeq - 1);
499 auto ledger = env.
rpc(
"ledger",
"validated");
505 BEAST_EXPECT(store.getLastRotated() == lastRotated);
511 auto ledger = env.
rpc(
"ledger",
"validated");
517 ledgerCheck(env, ledgerSeq - lastRotated, lastRotated);
519 BEAST_EXPECT(store.getLastRotated() == ledgerSeq - 1);
520 lastRotated = ledgerSeq - 1;