rippled
AMMTest.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_AMMTEST_H_INCLUDED
20 #define RIPPLE_TEST_JTX_AMMTEST_H_INCLUDED
21 
22 #include <ripple/beast/unit_test/suite.hpp>
23 #include <ripple/protocol/Feature.h>
24 #include <test/jtx/Account.h>
25 #include <test/jtx/amount.h>
26 #include <test/jtx/ter.h>
27 
28 namespace ripple {
29 namespace test {
30 namespace jtx {
31 
32 class AMM;
33 
34 enum class Fund { All, Acct, Gw, IOUOnly };
35 
36 void
37 fund(
38  jtx::Env& env,
39  jtx::Account const& gw,
40  std::vector<jtx::Account> const& accounts,
41  std::vector<STAmount> const& amts,
42  Fund how);
43 
44 void
45 fund(
46  jtx::Env& env,
47  jtx::Account const& gw,
48  std::vector<jtx::Account> const& accounts,
49  STAmount const& xrp,
50  std::vector<STAmount> const& amts = {},
51  Fund how = Fund::All);
52 
53 void
54 fund(
55  jtx::Env& env,
56  std::vector<jtx::Account> const& accounts,
57  STAmount const& xrp,
58  std::vector<STAmount> const& amts = {},
59  Fund how = Fund::All);
60 
61 class AMMTestBase : public beast::unit_test::suite
62 {
63 protected:
68  jtx::IOU const USD;
69  jtx::IOU const EUR;
70  jtx::IOU const GBP;
71  jtx::IOU const BTC;
72  jtx::IOU const BAD;
73 
74 public:
75  AMMTestBase();
76 
77 protected:
81  void
82  testAMM(
83  std::function<void(jtx::AMM&, jtx::Env&)>&& cb,
84  std::optional<std::pair<STAmount, STAmount>> const& pool = std::nullopt,
85  std::uint16_t tfee = 0,
86  std::optional<jtx::ter> const& ter = std::nullopt,
87  std::optional<FeatureBitset> const& features = std::nullopt);
88 };
89 
90 class AMMTest : public jtx::AMMTestBase
91 {
92 protected:
93  XRPAmount
94  reserve(jtx::Env& env, std::uint32_t count) const;
95 
96  XRPAmount
97  ammCrtFee(jtx::Env& env) const;
98 
99  /* Path_test */
100  /************************************************/
101  class gate
102  {
103  private:
106  bool signaled_ = false;
107 
108  public:
109  // Thread safe, blocks until signaled or period expires.
110  // Returns `true` if signaled.
111  template <class Rep, class Period>
112  bool
114  {
116  auto b = cv_.wait_for(lk, rel_time, [this] { return signaled_; });
117  signaled_ = false;
118  return b;
119  }
120 
121  void
123  {
125  signaled_ = true;
126  cv_.notify_all();
127  }
128  };
129 
130  jtx::Env
131  pathTestEnv();
132 
135  jtx::Env& env,
136  jtx::Account const& src,
137  jtx::Account const& dst,
138  STAmount const& saDstAmount,
139  std::optional<STAmount> const& saSendMax = std::nullopt,
140  std::optional<Currency> const& saSrcCurrency = std::nullopt);
141 
143  find_paths(
144  jtx::Env& env,
145  jtx::Account const& src,
146  jtx::Account const& dst,
147  STAmount const& saDstAmount,
148  std::optional<STAmount> const& saSendMax = std::nullopt,
149  std::optional<Currency> const& saSrcCurrency = std::nullopt);
150 };
151 
152 } // namespace jtx
153 } // namespace test
154 } // namespace ripple
155 
156 #endif // RIPPLE_TEST_JTX_AMMTEST_H_INCLUDED
ripple::test::jtx::AMMTestBase::USD
const jtx::IOU USD
Definition: AMMTest.h:68
ripple::test::jtx::AMMTest::ammCrtFee
XRPAmount ammCrtFee(jtx::Env &env) const
Definition: AMMTest.cpp:153
ripple::test::jtx::ter
Set the expected result code for a JTx The test will fail if the code doesn't match.
Definition: ter.h:33
ripple::test::jtx::AMMTest
Definition: AMMTest.h:90
std::pair
std::vector
STL class.
ripple::test::jtx::AMMTest::gate::wait_for
bool wait_for(std::chrono::duration< Rep, Period > const &rel_time)
Definition: AMMTest.h:113
ripple::test::jtx::Fund::Acct
@ Acct
std::chrono::duration
ripple::test::jtx::AMMTestBase::gw
const jtx::Account gw
Definition: AMMTest.h:64
ripple::test::jtx::AMMTestBase::carol
const jtx::Account carol
Definition: AMMTest.h:65
std::lock_guard
STL class.
ripple::test::jtx::AMMTestBase::alice
const jtx::Account alice
Definition: AMMTest.h:66
std::tuple
ripple::test::jtx::AMM
Convenience class to test AMM functionality.
Definition: AMM.h:62
std::function
ripple::test::jtx::Fund::IOUOnly
@ IOUOnly
ripple::test::jtx::AMMTest::find_paths
std::tuple< STPathSet, STAmount, STAmount > find_paths(jtx::Env &env, jtx::Account const &src, jtx::Account const &dst, STAmount const &saDstAmount, std::optional< STAmount > const &saSendMax=std::nullopt, std::optional< Currency > const &saSrcCurrency=std::nullopt)
Definition: AMMTest.cpp:232
ripple::test::jtx::AMMTestBase::BAD
const jtx::IOU BAD
Definition: AMMTest.h:72
ripple::test::jtx::AMMTestBase::bob
const jtx::Account bob
Definition: AMMTest.h:67
ripple::test::jtx::AMMTestBase::GBP
const jtx::IOU GBP
Definition: AMMTest.h:70
ripple::test::jtx::AMMTestBase
Definition: AMMTest.h:61
ripple::test::jtx::AMMTestBase::BTC
const jtx::IOU BTC
Definition: AMMTest.h:71
ripple::test::jtx::AMMTest::gate
Definition: AMMTest.h:101
ripple::test::jtx::Fund::All
@ All
ripple::test::jtx::Fund
Fund
Definition: AMMTest.h:34
ripple::test::jtx::AMMTest::reserve
XRPAmount reserve(jtx::Env &env, std::uint32_t count) const
Definition: AMMTest.cpp:147
std::unique_lock
STL class.
ripple::STAmount
Definition: STAmount.h:45
ripple::test::jtx::Fund::Gw
@ Gw
ripple::test::jtx::AMMTest::pathTestEnv
jtx::Env pathTestEnv()
Definition: AMMTest.cpp:159
std::uint16_t
ripple::LedgerNameSpace::AMM
@ AMM
std::condition_variable::wait_for
T wait_for(T... args)
ripple::test::jtx::AMMTestBase::AMMTestBase
AMMTestBase()
Definition: AMMTest.cpp:87
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::test::jtx::AMMTestBase::EUR
const jtx::IOU EUR
Definition: AMMTest.h:69
ripple::test::jtx::IOU
Converts to IOU Issue or STAmount.
Definition: amount.h:291
std::condition_variable
ripple::test::jtx::AMMTest::gate::mutex_
std::mutex mutex_
Definition: AMMTest.h:105
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::AMMTest::gate::cv_
std::condition_variable cv_
Definition: AMMTest.h:104
std::optional
std::mutex
STL class.
ripple::test::jtx::AMMTest::gate::signaled_
bool signaled_
Definition: AMMTest.h:106
ripple::test::jtx::Account
Immutable cryptographic account descriptor.
Definition: Account.h:37
ripple::test::jtx::AMMTest::find_paths_request
Json::Value find_paths_request(jtx::Env &env, jtx::Account const &src, jtx::Account const &dst, STAmount const &saDstAmount, std::optional< STAmount > const &saSendMax=std::nullopt, std::optional< Currency > const &saSrcCurrency=std::nullopt)
Definition: AMMTest.cpp:173
ripple::test::jtx::AMMTestBase::testAMM
void testAMM(std::function< void(jtx::AMM &, jtx::Env &)> &&cb, std::optional< std::pair< STAmount, STAmount >> const &pool=std::nullopt, std::uint16_t tfee=0, std::optional< jtx::ter > const &ter=std::nullopt, std::optional< FeatureBitset > const &features=std::nullopt)
testAMM() funds 30,000XRP and 30,000IOU for each non-XRP asset to Alice and Carol
Definition: AMMTest.cpp:101
std::condition_variable::notify_all
T notify_all(T... args)
ripple::test::jtx::Env
A transaction testing environment.
Definition: Env.h:117
Json::Value
Represents a JSON value.
Definition: json_value.h:145
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::test::jtx::AMMTest::gate::signal
void signal()
Definition: AMMTest.h:122