rippled
TestHelpers.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2023 Ripple Labs Inc.
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 #ifndef RIPPLE_TEST_JTX_TESTHELPERS_H_INCLUDED
20 #define RIPPLE_TEST_JTX_TESTHELPERS_H_INCLUDED
21 
22 #include <ripple/basics/base_uint.h>
23 #include <ripple/json/json_value.h>
24 #include <ripple/protocol/AccountID.h>
25 #include <ripple/protocol/Quality.h>
26 #include <ripple/protocol/TxFlags.h>
27 #include <ripple/protocol/jss.h>
28 #include <test/jtx/Env.h>
29 
30 #include <ranges>
31 
32 namespace ripple {
33 namespace test {
34 namespace jtx {
35 
36 // Helper to make vector from iterable
37 auto
38 make_vector(auto const& input) requires std::ranges::range<decltype(input)>
39 {
40  return std::vector(std::ranges::begin(input), std::ranges::end(input));
41 }
42 
43 // Functions used in debugging
45 getAccountOffers(Env& env, AccountID const& acct, bool current = false);
46 
47 inline Json::Value
48 getAccountOffers(Env& env, Account const& acct, bool current = false)
49 {
50  return getAccountOffers(env, acct.id(), current);
51 }
52 
54 getAccountLines(Env& env, AccountID const& acctId);
55 
56 inline Json::Value
57 getAccountLines(Env& env, Account const& acct)
58 {
59  return getAccountLines(env, acct.id());
60 }
61 
62 template <typename... IOU>
64 getAccountLines(Env& env, AccountID const& acctId, IOU... ious)
65 {
66  auto const jrr = getAccountLines(env, acctId);
67  Json::Value res;
68  for (auto const& line : jrr[jss::lines])
69  {
70  for (auto const& iou : {ious...})
71  {
72  if (line[jss::currency].asString() == to_string(iou.currency))
73  {
74  Json::Value v;
75  v[jss::currency] = line[jss::currency];
76  v[jss::balance] = line[jss::balance];
77  v[jss::limit] = line[jss::limit];
78  v[jss::account] = line[jss::account];
79  res[jss::lines].append(v);
80  }
81  }
82  }
83  if (!res.isNull())
84  return res;
85  return jrr;
86 }
87 
88 [[nodiscard]] bool
89 checkArraySize(Json::Value const& val, unsigned int size);
90 
91 /* Path finding */
92 /******************************************************************************/
93 void
94 stpath_append_one(STPath& st, Account const& account);
95 
96 template <class T>
98 stpath_append_one(STPath& st, T const& t)
99 {
100  stpath_append_one(st, Account{t});
101 }
102 
103 void
104 stpath_append_one(STPath& st, STPathElement const& pe);
105 
106 template <class T, class... Args>
107 void
108 stpath_append(STPath& st, T const& t, Args const&... args)
109 {
110  stpath_append_one(st, t);
111  if constexpr (sizeof...(args) > 0)
112  stpath_append(st, args...);
113 }
114 
115 template <class... Args>
116 void
117 stpathset_append(STPathSet& st, STPath const& p, Args const&... args)
118 {
119  st.push_back(p);
120  if constexpr (sizeof...(args) > 0)
121  stpathset_append(st, args...);
122 }
123 
124 bool
125 equal(STAmount const& sa1, STAmount const& sa2);
126 
127 // Issue path element
129 IPE(Issue const& iss);
130 
131 template <class... Args>
132 STPath
133 stpath(Args const&... args)
134 {
135  STPath st;
136  stpath_append(st, args...);
137  return st;
138 }
139 
140 template <class... Args>
141 bool
142 same(STPathSet const& st1, Args const&... args)
143 {
144  STPathSet st2;
145  stpathset_append(st2, args...);
146  if (st1.size() != st2.size())
147  return false;
148 
149  for (auto const& p : st2)
150  {
151  if (std::find(st1.begin(), st1.end(), p) == st1.end())
152  return false;
153  }
154  return true;
155 }
156 
157 /******************************************************************************/
158 
159 XRPAmount
160 txfee(Env const& env, std::uint16_t n);
161 
163 xrpMinusFee(Env const& env, std::int64_t xrpAmount);
164 
165 bool
166 expectLine(
167  Env& env,
168  AccountID const& account,
169  STAmount const& value,
170  bool defaultLimits = false);
171 
172 template <typename... Amts>
173 bool
175  Env& env,
176  AccountID const& account,
177  STAmount const& value,
178  Amts const&... amts)
179 {
180  return expectLine(env, account, value, false) &&
181  expectLine(env, account, amts...);
182 }
183 
184 bool
185 expectLine(Env& env, AccountID const& account, None const& value);
186 
187 bool
189  Env& env,
190  AccountID const& account,
191  std::uint16_t size,
192  std::vector<Amounts> const& toMatch = {});
193 
195 ledgerEntryRoot(Env& env, Account const& acct);
196 
199  Env& env,
200  Account const& acct_a,
201  Account const& acct_b,
202  std::string const& currency);
203 
205 accountBalance(Env& env, Account const& acct);
206 
207 [[nodiscard]] bool
209  Env& env,
210  Account const& acct,
211  STAmount const& expectedValue);
212 
213 /* Escrow */
214 /******************************************************************************/
215 
217 escrow(AccountID const& account, AccountID const& to, STAmount const& amount);
218 
219 inline Json::Value
220 escrow(Account const& account, Account const& to, STAmount const& amount)
221 {
222  return escrow(account.id(), to.id(), amount);
223 }
224 
226 finish(AccountID const& account, AccountID const& from, std::uint32_t seq);
227 
228 inline Json::Value
229 finish(Account const& account, Account const& from, std::uint32_t seq)
230 {
231  return finish(account.id(), from.id(), seq);
232 }
233 
235 cancel(AccountID const& account, Account const& from, std::uint32_t seq);
236 
237 inline Json::Value
238 cancel(Account const& account, Account const& from, std::uint32_t seq)
239 {
240  return cancel(account.id(), from, seq);
241 }
242 
244  {0xA0, 0x25, 0x80, 0x20, 0xE3, 0xB0, 0xC4, 0x42, 0x98, 0xFC,
245  0x1C, 0x14, 0x9A, 0xFB, 0xF4, 0xC8, 0x99, 0x6F, 0xB9, 0x24,
246  0x27, 0xAE, 0x41, 0xE4, 0x64, 0x9B, 0x93, 0x4C, 0xA4, 0x95,
247  0x99, 0x1B, 0x78, 0x52, 0xB8, 0x55, 0x81, 0x01, 0x00}};
248 
249 // A PreimageSha256 fulfillments and its associated condition.
250 std::array<std::uint8_t, 4> const fb1 = {{0xA0, 0x02, 0x80, 0x00}};
251 
254 {
255 private:
257 
258 public:
259  explicit finish_time(NetClock::time_point const& value) : value_(value)
260  {
261  }
262 
263  void
264  operator()(Env&, JTx& jt) const
265  {
267  }
268 };
269 
272 {
273 private:
275 
276 public:
277  explicit cancel_time(NetClock::time_point const& value) : value_(value)
278  {
279  }
280 
281  void
283  {
285  }
286 };
287 
288 struct condition
289 {
290 private:
292 
293 public:
294  explicit condition(Slice const& cond) : value_(strHex(cond))
295  {
296  }
297 
298  template <size_t N>
300  : condition(makeSlice(c))
301  {
302  }
303 
304  void
305  operator()(Env&, JTx& jt) const
306  {
308  }
309 };
310 
312 {
313 private:
315 
316 public:
318  {
319  }
320 
321  template <size_t N>
323  : fulfillment(makeSlice(f))
324  {
325  }
326 
327  void
328  operator()(Env&, JTx& jt) const
329  {
331  }
332 };
333 
334 /* Payment Channel */
335 /******************************************************************************/
336 
338 create(
339  AccountID const& account,
340  AccountID const& to,
341  STAmount const& amount,
342  NetClock::duration const& settleDelay,
343  PublicKey const& pk,
344  std::optional<NetClock::time_point> const& cancelAfter = std::nullopt,
345  std::optional<std::uint32_t> const& dstTag = std::nullopt);
346 
347 inline Json::Value
349  Account const& account,
350  Account const& to,
351  STAmount const& amount,
352  NetClock::duration const& settleDelay,
353  PublicKey const& pk,
354  std::optional<NetClock::time_point> const& cancelAfter = std::nullopt,
355  std::optional<std::uint32_t> const& dstTag = std::nullopt)
356 {
357  return create(
358  account.id(), to.id(), amount, settleDelay, pk, cancelAfter, dstTag);
359 }
360 
362 fund(
363  AccountID const& account,
364  uint256 const& channel,
365  STAmount const& amount,
366  std::optional<NetClock::time_point> const& expiration = std::nullopt);
367 
369 claim(
370  AccountID const& account,
371  uint256 const& channel,
372  std::optional<STAmount> const& balance = std::nullopt,
373  std::optional<STAmount> const& amount = std::nullopt,
374  std::optional<Slice> const& signature = std::nullopt,
375  std::optional<PublicKey> const& pk = std::nullopt);
376 
377 uint256
378 channel(
379  AccountID const& account,
380  AccountID const& dst,
381  std::uint32_t seqProxyValue);
382 
383 inline uint256
384 channel(Account const& account, Account const& dst, std::uint32_t seqProxyValue)
385 {
386  return channel(account.id(), dst.id(), seqProxyValue);
387 }
388 
389 STAmount
390 channelBalance(ReadView const& view, uint256 const& chan);
391 
392 bool
393 channelExists(ReadView const& view, uint256 const& chan);
394 
395 /* Crossing Limits */
396 /******************************************************************************/
397 
398 void
399 n_offers(
400  Env& env,
401  std::size_t n,
402  Account const& account,
403  STAmount const& in,
404  STAmount const& out);
405 
406 /* Pay Strand */
407 /***************************************************************/
408 
409 // Currency path element
411 cpe(Currency const& c);
412 
413 // All path element
415 allpe(AccountID const& a, Issue const& iss);
416 /***************************************************************/
417 
418 /* Check */
419 /***************************************************************/
420 namespace check {
421 
423 // clang-format off
424 template <typename A>
425  requires std::is_same_v<A, AccountID>
427 create(A const& account, A const& dest, STAmount const& sendMax)
428 {
429  Json::Value jv;
430  jv[sfAccount.jsonName] = to_string(account);
432  jv[sfDestination.jsonName] = to_string(dest);
433  jv[sfTransactionType.jsonName] = jss::CheckCreate;
435  return jv;
436 }
437 // clang-format on
438 
439 inline Json::Value
441  jtx::Account const& account,
442  jtx::Account const& dest,
443  STAmount const& sendMax)
444 {
445  return create(account.id(), dest.id(), sendMax);
446 }
447 
448 } // namespace check
449 
450 } // namespace jtx
451 } // namespace test
452 } // namespace ripple
453 
454 #endif // RIPPLE_TEST_JTX_TESTHELPERS_H_INCLUDED
ripple::test::jtx::cancel_time::operator()
void operator()(jtx::Env &, jtx::JTx &jt) const
Definition: TestHelpers.h:282
ripple::makeSlice
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
Definition: Slice.h:241
ripple::test::jtx::claim
Json::Value claim(AccountID const &account, uint256 const &channel, std::optional< STAmount > const &balance, std::optional< STAmount > const &amount, std::optional< Slice > const &signature, std::optional< PublicKey > const &pk)
Definition: TestHelpers.cpp:293
ripple::Issue
A currency issued by an account.
Definition: Issue.h:35
ripple::test::jtx::checkArraySize
bool checkArraySize(Json::Value const &val, unsigned int size)
Definition: TestHelpers.cpp:48
ripple::sfSendMax
const SF_AMOUNT sfSendMax
std::string
STL class.
ripple::test::jtx::condition::condition
condition(Slice const &cond)
Definition: TestHelpers.h:294
ripple::test::jtx::same
bool same(STPathSet const &st1, Args const &... args)
Definition: TestHelpers.h:142
ripple::test::jtx::finish
Json::Value finish(AccountID const &account, AccountID const &from, std::uint32_t seq)
Definition: TestHelpers.cpp:224
ripple::sfDestination
const SF_ACCOUNT sfDestination
ripple::test::jtx::stpath_append_one
void stpath_append_one(STPath &st, Account const &account)
Definition: TestHelpers.cpp:56
ripple::test::jtx::ledgerEntryState
Json::Value ledgerEntryState(Env &env, Account const &acct_a, Account const &acct_b, std::string const &currency)
Definition: TestHelpers.cpp:177
ripple::test::jtx::finish_time
Set the "FinishAfter" time tag on a JTx.
Definition: TestHelpers.h:253
ripple::Slice
An immutable linear range of bytes.
Definition: Slice.h:44
ripple::test::jtx::balance
A balance matches.
Definition: balance.h:38
ripple::test::jtx::check::create
requires std::is_same_v< A, AccountID > Json::Value create(A const &account, A const &dest, STAmount const &sendMax)
Create a check.
Definition: TestHelpers.h:427
std::vector
STL class.
std::find
T find(T... args)
ripple::STAmount::getJson
Json::Value getJson(JsonOptions) const override
Definition: STAmount.cpp:653
std::chrono::duration
ripple::test::jtx::xrpMinusFee
PrettyAmount xrpMinusFee(Env const &env, std::int64_t xrpAmount)
Definition: TestHelpers.cpp:93
ripple::test::jtx::channelExists
bool channelExists(ReadView const &view, uint256 const &chan)
Definition: TestHelpers.cpp:337
Json::Value::isNull
bool isNull() const
isNull() tests to see if this field is null.
Definition: json_value.cpp:967
ripple::STPathSet::end
std::vector< STPath >::const_iterator end() const
Definition: STPathSet.h:491
ripple::SField::jsonName
const Json::StaticString jsonName
Definition: SField.h:163
ripple::test::jtx::n_offers
void n_offers(Env &env, std::size_t n, Account const &account, STAmount const &in, STAmount const &out)
Definition: TestHelpers.cpp:347
ripple::STPathSet
Definition: STPathSet.h:176
ripple::test::jtx::equal
bool equal(STAmount const &sa1, STAmount const &sa2)
Definition: TestHelpers.cpp:68
ripple::requires
requires(T::ConsequencesFactory==Transactor::Normal) TxConsequences consequences_helper(PreflightContext const &ctx)
Definition: applySteps.cpp:181
ripple::test::jtx::Account::id
AccountID id() const
Returns the Account ID.
Definition: Account.h:106
ripple::test::jtx::expiration
Set Expiration on a JTx.
Definition: Check_test.cpp:29
ripple::base_uint< 160, detail::AccountIDTag >
ripple::sfTransactionType
const SF_UINT16 sfTransactionType
ripple::test::jtx::cancel_time::cancel_time
cancel_time(NetClock::time_point const &value)
Definition: TestHelpers.h:277
std::chrono::time_point::time_since_epoch
T time_since_epoch(T... args)
Json::Value::append
Value & append(const Value &value)
Append value to array at the end.
Definition: json_value.cpp:882
ripple::test::jtx::channel
uint256 channel(AccountID const &account, AccountID const &dst, std::uint32_t seqProxyValue)
Definition: TestHelpers.cpp:318
ripple::STPathSet::size
std::vector< STPath >::size_type size() const
Definition: STPathSet.h:497
ripple::PublicKey
A public key.
Definition: PublicKey.h:61
std::enable_if_t
ripple::test::jtx::stpath_append
void stpath_append(STPath &st, T const &t, Args const &... args)
Definition: TestHelpers.h:108
ripple::test::jtx::IPE
STPathElement IPE(Issue const &iss)
Definition: TestHelpers.cpp:75
ripple::JsonOptions::none
@ none
ripple::test::jtx::condition::condition
condition(std::array< std::uint8_t, N > const &c)
Definition: TestHelpers.h:299
ripple::test::jtx::stpathset_append
void stpathset_append(STPathSet &st, STPath const &p, Args const &... args)
Definition: TestHelpers.h:117
ripple::test::jtx::JTx
Execution context for applying a JSON transaction.
Definition: JTx.h:42
ripple::test::jtx::JTx::jv
Json::Value jv
Definition: JTx.h:44
ripple::test::jtx::fulfillment
Definition: TestHelpers.h:311
ripple::test::jtx::finish_time::operator()
void operator()(Env &, JTx &jt) const
Definition: TestHelpers.h:264
ripple::test::jtx::stpath
STPath stpath(Args const &... args)
Definition: TestHelpers.h:133
ripple::test::jtx::expectOffers
bool expectOffers(Env &env, AccountID const &account, std::uint16_t size, std::vector< Amounts > const &toMatch)
Definition: TestHelpers.cpp:140
std::array< std::uint8_t, 39 >
ripple::test::jtx::cancel_time
Set the "CancelAfter" time tag on a JTx.
Definition: TestHelpers.h:271
ripple::STAmount
Definition: STAmount.h:46
std::chrono::time_point
ripple::test::jtx::cancel_time::value_
NetClock::time_point value_
Definition: TestHelpers.h:274
ripple::ValStatus::current
@ current
This was a new validation and was added.
std::uint16_t
ripple::test::jtx::cpe
STPathElement cpe(Currency const &c)
Definition: TestHelpers.cpp:368
ripple::test::jtx::allpe
STPathElement allpe(AccountID const &a, Issue const &iss)
Definition: TestHelpers.cpp:376
ripple::test::jtx::cancel
Json::Value cancel(AccountID const &account, Account const &from, std::uint32_t seq)
Definition: TestHelpers.cpp:236
ripple::test::jtx::finish_time::finish_time
finish_time(NetClock::time_point const &value)
Definition: TestHelpers.h:259
ripple::test::jtx::condition::operator()
void operator()(Env &, JTx &jt) const
Definition: TestHelpers.h:305
ripple::test::jtx::channelBalance
STAmount channelBalance(ReadView const &view, uint256 const &chan)
Definition: TestHelpers.cpp:328
ripple::test::jtx::fulfillment::fulfillment
fulfillment(Slice condition)
Definition: TestHelpers.h:317
ripple::test::jtx::None
Definition: amount.h:57
ripple::test::jtx::seq
Set the sequence number on a JTx.
Definition: seq.h:33
ranges
ripple::ReadView
A view into a ledger.
Definition: ReadView.h:54
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::test::jtx::condition::value_
std::string value_
Definition: TestHelpers.h:291
ripple::test::jtx::IOU
Converts to IOU Issue or STAmount.
Definition: amount.h:291
ripple::STPathSet::begin
std::vector< STPath >::const_iterator begin() const
Definition: STPathSet.h:485
ripple::sfCondition
const SF_VL sfCondition
ripple::STPathElement
Definition: STPathSet.h:34
std::ranges::begin
T begin(T... args)
ripple::sfFlags
const SF_UINT32 sfFlags
ripple::test::jtx::condition
Definition: TestHelpers.h:288
ripple::test::jtx::fulfillment::operator()
void operator()(Env &, JTx &jt) const
Definition: TestHelpers.h:328
ripple::test::jtx::accountBalance
Json::Value accountBalance(Env &env, Account const &acct)
Definition: TestHelpers.cpp:193
ripple::test::jtx::fund
void fund(jtx::Env &env, jtx::Account const &gw, std::vector< jtx::Account > const &accounts, std::vector< STAmount > const &amts, Fund how)
Definition: AMMTest.cpp:35
ripple::test::jtx::cb1
constexpr std::array< std::uint8_t, 39 > cb1
Definition: TestHelpers.h:243
ripple::sfCancelAfter
const SF_UINT32 sfCancelAfter
std::optional
std::size_t
ripple::to_string
std::string to_string(Manifest const &m)
Format the specified manifest to a string for debugging purposes.
Definition: app/misc/impl/Manifest.cpp:41
ripple::sfFinishAfter
const SF_UINT32 sfFinishAfter
ripple::test::jtx::Account
Immutable cryptographic account descriptor.
Definition: Account.h:37
ripple::sfAccount
const SF_ACCOUNT sfAccount
ripple::strHex
std::string strHex(FwdIt begin, FwdIt end)
Definition: strHex.h:30
ripple::test::jtx::finish_time::value_
NetClock::time_point value_
Definition: TestHelpers.h:256
ripple::tfUniversal
constexpr std::uint32_t tfUniversal
Definition: TxFlags.h:59
ripple::test::jtx::fulfillment::value_
std::string value_
Definition: TestHelpers.h:314
ripple::test::jtx::fb1
const std::array< std::uint8_t, 4 > fb1
Definition: TestHelpers.h:250
ripple::test::jtx::getAccountOffers
auto make_vector(auto const &input) requires std Json::Value getAccountOffers(Env &env, Account const &acct, bool current=false)
Definition: TestHelpers.h:48
ripple::STPath
Definition: STPathSet.h:118
ripple::test::jtx::escrow
Json::Value escrow(AccountID const &account, AccountID const &to, STAmount const &amount)
Definition: TestHelpers.cpp:212
ripple::test::jtx::expectLedgerEntryRoot
bool expectLedgerEntryRoot(Env &env, Account const &acct, STAmount const &expectedValue)
Definition: TestHelpers.cpp:200
ripple::sfFulfillment
const SF_VL sfFulfillment
ripple::test::jtx::expectLine
bool expectLine(Env &env, AccountID const &account, STAmount const &value, bool defaultLimits)
Definition: TestHelpers.cpp:100
ripple::test::jtx::create
Json::Value create(AccountID const &account, AccountID const &to, STAmount const &amount, NetClock::duration const &settleDelay, PublicKey const &pk, std::optional< NetClock::time_point > const &cancelAfter, std::optional< std::uint32_t > const &dstTag)
Definition: TestHelpers.cpp:250
ripple::test::jtx::txfee
XRPAmount txfee(Env const &env, std::uint16_t n)
Definition: TestHelpers.cpp:87
ripple::test::jtx::Env
A transaction testing environment.
Definition: Env.h:117
ripple::test::jtx::getAccountLines
Json::Value getAccountLines(Env &env, AccountID const &acctId)
Definition: TestHelpers.cpp:40
ripple::test::jtx::ledgerEntryRoot
Json::Value ledgerEntryRoot(Env &env, Account const &acct)
Definition: TestHelpers.cpp:168
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::test::jtx::PrettyAmount
Represents an XRP or IOU quantity This customizes the string conversion and supports XRP conversions ...
Definition: amount.h:73
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::test::jtx::fulfillment::fulfillment
fulfillment(std::array< std::uint8_t, N > f)
Definition: TestHelpers.h:322
ripple::STPathSet::push_back
void push_back(STPath const &e)
Definition: STPathSet.h:509