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 namespace ripple {
31 namespace test {
32 namespace jtx {
33 
34 // Functions used in debugging
36 getAccountOffers(Env& env, AccountID const& acct, bool current = false);
37 
38 inline Json::Value
39 getAccountOffers(Env& env, Account const& acct, bool current = false)
40 {
41  return getAccountOffers(env, acct.id(), current);
42 }
43 
45 getAccountLines(Env& env, AccountID const& acctId);
46 
47 inline Json::Value
48 getAccountLines(Env& env, Account const& acct)
49 {
50  return getAccountLines(env, acct.id());
51 }
52 
53 template <typename... IOU>
55 getAccountLines(Env& env, AccountID const& acctId, IOU... ious)
56 {
57  auto const jrr = getAccountLines(env, acctId);
58  Json::Value res;
59  for (auto const& line : jrr[jss::lines])
60  {
61  for (auto const& iou : {ious...})
62  {
63  if (line[jss::currency].asString() == to_string(iou.currency))
64  {
65  Json::Value v;
66  v[jss::currency] = line[jss::currency];
67  v[jss::balance] = line[jss::balance];
68  v[jss::limit] = line[jss::limit];
69  v[jss::account] = line[jss::account];
70  res[jss::lines].append(v);
71  }
72  }
73  }
74  if (!res.isNull())
75  return res;
76  return jrr;
77 }
78 
79 [[nodiscard]] bool
80 checkArraySize(Json::Value const& val, unsigned int size);
81 
82 /* Path finding */
83 /******************************************************************************/
84 void
85 stpath_append_one(STPath& st, Account const& account);
86 
87 template <class T>
89 stpath_append_one(STPath& st, T const& t)
90 {
91  stpath_append_one(st, Account{t});
92 }
93 
94 void
95 stpath_append_one(STPath& st, STPathElement const& pe);
96 
97 template <class T, class... Args>
98 void
99 stpath_append(STPath& st, T const& t, Args const&... args)
100 {
101  stpath_append_one(st, t);
102  if constexpr (sizeof...(args) > 0)
103  stpath_append(st, args...);
104 }
105 
106 template <class... Args>
107 void
108 stpathset_append(STPathSet& st, STPath const& p, Args const&... args)
109 {
110  st.push_back(p);
111  if constexpr (sizeof...(args) > 0)
112  stpathset_append(st, args...);
113 }
114 
115 bool
116 equal(STAmount const& sa1, STAmount const& sa2);
117 
118 // Issue path element
120 IPE(Issue const& iss);
121 
122 template <class... Args>
123 STPath
124 stpath(Args const&... args)
125 {
126  STPath st;
127  stpath_append(st, args...);
128  return st;
129 }
130 
131 template <class... Args>
132 bool
133 same(STPathSet const& st1, Args const&... args)
134 {
135  STPathSet st2;
136  stpathset_append(st2, args...);
137  if (st1.size() != st2.size())
138  return false;
139 
140  for (auto const& p : st2)
141  {
142  if (std::find(st1.begin(), st1.end(), p) == st1.end())
143  return false;
144  }
145  return true;
146 }
147 
148 /******************************************************************************/
149 
150 XRPAmount
151 txfee(Env const& env, std::uint16_t n);
152 
154 xrpMinusFee(Env const& env, std::int64_t xrpAmount);
155 
156 bool
157 expectLine(
158  Env& env,
159  AccountID const& account,
160  STAmount const& value,
161  bool defaultLimits = false);
162 
163 template <typename... Amts>
164 bool
166  Env& env,
167  AccountID const& account,
168  STAmount const& value,
169  Amts const&... amts)
170 {
171  return expectLine(env, account, value, false) &&
172  expectLine(env, account, amts...);
173 }
174 
175 bool
176 expectLine(Env& env, AccountID const& account, None const& value);
177 
178 bool
180  Env& env,
181  AccountID const& account,
182  std::uint16_t size,
183  std::vector<Amounts> const& toMatch = {});
184 
186 ledgerEntryRoot(Env& env, Account const& acct);
187 
190  Env& env,
191  Account const& acct_a,
192  Account const& acct_b,
193  std::string const& currency);
194 
196 accountBalance(Env& env, Account const& acct);
197 
198 [[nodiscard]] bool
200  Env& env,
201  Account const& acct,
202  STAmount const& expectedValue);
203 
204 /* Escrow */
205 /******************************************************************************/
206 
208 escrow(AccountID const& account, AccountID const& to, STAmount const& amount);
209 
210 inline Json::Value
211 escrow(Account const& account, Account const& to, STAmount const& amount)
212 {
213  return escrow(account.id(), to.id(), amount);
214 }
215 
217 finish(AccountID const& account, AccountID const& from, std::uint32_t seq);
218 
219 inline Json::Value
220 finish(Account const& account, Account const& from, std::uint32_t seq)
221 {
222  return finish(account.id(), from.id(), seq);
223 }
224 
226 cancel(AccountID const& account, Account const& from, std::uint32_t seq);
227 
228 inline Json::Value
229 cancel(Account const& account, Account const& from, std::uint32_t seq)
230 {
231  return cancel(account.id(), from, seq);
232 }
233 
235  {0xA0, 0x25, 0x80, 0x20, 0xE3, 0xB0, 0xC4, 0x42, 0x98, 0xFC,
236  0x1C, 0x14, 0x9A, 0xFB, 0xF4, 0xC8, 0x99, 0x6F, 0xB9, 0x24,
237  0x27, 0xAE, 0x41, 0xE4, 0x64, 0x9B, 0x93, 0x4C, 0xA4, 0x95,
238  0x99, 0x1B, 0x78, 0x52, 0xB8, 0x55, 0x81, 0x01, 0x00}};
239 
240 // A PreimageSha256 fulfillments and its associated condition.
241 std::array<std::uint8_t, 4> const fb1 = {{0xA0, 0x02, 0x80, 0x00}};
242 
245 {
246 private:
248 
249 public:
250  explicit finish_time(NetClock::time_point const& value) : value_(value)
251  {
252  }
253 
254  void
255  operator()(Env&, JTx& jt) const
256  {
258  }
259 };
260 
263 {
264 private:
266 
267 public:
268  explicit cancel_time(NetClock::time_point const& value) : value_(value)
269  {
270  }
271 
272  void
274  {
276  }
277 };
278 
279 struct condition
280 {
281 private:
283 
284 public:
285  explicit condition(Slice const& cond) : value_(strHex(cond))
286  {
287  }
288 
289  template <size_t N>
291  : condition(makeSlice(c))
292  {
293  }
294 
295  void
296  operator()(Env&, JTx& jt) const
297  {
299  }
300 };
301 
303 {
304 private:
306 
307 public:
309  {
310  }
311 
312  template <size_t N>
314  : fulfillment(makeSlice(f))
315  {
316  }
317 
318  void
319  operator()(Env&, JTx& jt) const
320  {
322  }
323 };
324 
325 /* Payment Channel */
326 /******************************************************************************/
327 
329 create(
330  AccountID const& account,
331  AccountID const& to,
332  STAmount const& amount,
333  NetClock::duration const& settleDelay,
334  PublicKey const& pk,
335  std::optional<NetClock::time_point> const& cancelAfter = std::nullopt,
336  std::optional<std::uint32_t> const& dstTag = std::nullopt);
337 
338 inline Json::Value
340  Account const& account,
341  Account const& to,
342  STAmount const& amount,
343  NetClock::duration const& settleDelay,
344  PublicKey const& pk,
345  std::optional<NetClock::time_point> const& cancelAfter = std::nullopt,
346  std::optional<std::uint32_t> const& dstTag = std::nullopt)
347 {
348  return create(
349  account.id(), to.id(), amount, settleDelay, pk, cancelAfter, dstTag);
350 }
351 
353 fund(
354  AccountID const& account,
355  uint256 const& channel,
356  STAmount const& amount,
357  std::optional<NetClock::time_point> const& expiration = std::nullopt);
358 
360 claim(
361  AccountID const& account,
362  uint256 const& channel,
363  std::optional<STAmount> const& balance = std::nullopt,
364  std::optional<STAmount> const& amount = std::nullopt,
365  std::optional<Slice> const& signature = std::nullopt,
366  std::optional<PublicKey> const& pk = std::nullopt);
367 
368 uint256
369 channel(
370  AccountID const& account,
371  AccountID const& dst,
372  std::uint32_t seqProxyValue);
373 
374 inline uint256
375 channel(Account const& account, Account const& dst, std::uint32_t seqProxyValue)
376 {
377  return channel(account.id(), dst.id(), seqProxyValue);
378 }
379 
380 STAmount
381 channelBalance(ReadView const& view, uint256 const& chan);
382 
383 bool
384 channelExists(ReadView const& view, uint256 const& chan);
385 
386 /* Crossing Limits */
387 /******************************************************************************/
388 
389 void
390 n_offers(
391  Env& env,
392  std::size_t n,
393  Account const& account,
394  STAmount const& in,
395  STAmount const& out);
396 
397 /* Pay Strand */
398 /***************************************************************/
399 
400 // Currency path element
402 cpe(Currency const& c);
403 
404 // All path element
406 allpe(AccountID const& a, Issue const& iss);
407 /***************************************************************/
408 
409 /* Check */
410 /***************************************************************/
411 namespace check {
412 
414 // clang-format off
415 template <typename A>
416  requires std::is_same_v<A, AccountID>
418 create(A const& account, A const& dest, STAmount const& sendMax)
419 {
420  Json::Value jv;
421  jv[sfAccount.jsonName] = to_string(account);
423  jv[sfDestination.jsonName] = to_string(dest);
424  jv[sfTransactionType.jsonName] = jss::CheckCreate;
426  return jv;
427 }
428 // clang-format on
429 
430 inline Json::Value
432  jtx::Account const& account,
433  jtx::Account const& dest,
434  STAmount const& sendMax)
435 {
436  return create(account.id(), dest.id(), sendMax);
437 }
438 
439 } // namespace check
440 
441 } // namespace jtx
442 } // namespace test
443 } // namespace ripple
444 
445 #endif // RIPPLE_TEST_JTX_TESTHELPERS_H_INCLUDED
ripple::test::jtx::getAccountOffers
Json::Value getAccountOffers(Env &env, AccountID const &acct, bool current)
Definition: TestHelpers.cpp:32
ripple::test::jtx::cancel_time::operator()
void operator()(jtx::Env &, jtx::JTx &jt) const
Definition: TestHelpers.h:273
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:285
ripple::test::jtx::same
bool same(STPathSet const &st1, Args const &... args)
Definition: TestHelpers.h:133
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:244
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:418
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:268
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:99
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:290
ripple::test::jtx::stpathset_append
void stpathset_append(STPathSet &st, STPath const &p, Args const &... args)
Definition: TestHelpers.h:108
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:302
ripple::test::jtx::finish_time::operator()
void operator()(Env &, JTx &jt) const
Definition: TestHelpers.h:255
ripple::test::jtx::stpath
STPath stpath(Args const &... args)
Definition: TestHelpers.h:124
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:262
ripple::STAmount
Definition: STAmount.h:46
std::chrono::time_point
ripple::test::jtx::cancel_time::value_
NetClock::time_point value_
Definition: TestHelpers.h:265
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:250
ripple::test::jtx::condition::operator()
void operator()(Env &, JTx &jt) const
Definition: TestHelpers.h:296
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:308
ripple::test::jtx::None
Definition: amount.h:57
ripple::test::jtx::seq
Set the sequence number on a JTx.
Definition: seq.h:33
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:282
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
ripple::sfFlags
const SF_UINT32 sfFlags
ripple::test::jtx::condition
Definition: TestHelpers.h:279
ripple::test::jtx::fulfillment::operator()
void operator()(Env &, JTx &jt) const
Definition: TestHelpers.h:319
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:234
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:247
ripple::tfUniversal
constexpr std::uint32_t tfUniversal
Definition: TxFlags.h:59
ripple::test::jtx::fulfillment::value_
std::string value_
Definition: TestHelpers.h:305
ripple::test::jtx::fb1
const std::array< std::uint8_t, 4 > fb1
Definition: TestHelpers.h:241
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:313
ripple::STPathSet::push_back
void push_back(STPath const &e)
Definition: STPathSet.h:509