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