rippled
GatewayBalances_test.cpp
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of rippled: https://github.com/ripple/rippled
4  Copyright (c) 2012, 2013 Ripple Labs Inc.
5  Permission to use, copy, modify, and/or distribute this software for any
6  purpose with or without fee is hereby granted, provided that the above
7  copyright notice and this permission notice appear in all copies.
8  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16 //==============================================================================
17 
18 #include <ripple/protocol/Feature.h>
19 #include <ripple/protocol/jss.h>
20 #include <test/jtx/WSClient.h>
21 #include <test/jtx.h>
22 #include <ripple/beast/unit_test.h>
23 
24 namespace ripple {
25 namespace test {
26 
27 class GatewayBalances_test : public beast::unit_test::suite
28 {
29 public:
30 
31  void
33  {
34  using namespace std::chrono_literals;
35  using namespace jtx;
36  Env env(*this, features);
37 
38  // Gateway account and assets
39  Account const alice {"alice"};
40  env.fund(XRP(10000), "alice");
41  auto USD = alice["USD"];
42  auto CNY = alice["CNY"];
43  auto JPY = alice["JPY"];
44 
45  // Create a hotwallet
46  Account const hw {"hw"};
47  env.fund(XRP(10000), "hw");
48  env(trust(hw, USD(10000)));
49  env(trust(hw, JPY(10000)));
50  env(pay(alice, hw, USD(5000)));
51  env(pay(alice, hw, JPY(5000)));
52 
53  // Create some clients
54  Account const bob {"bob"};
55  env.fund(XRP(10000), "bob");
56  env(trust(bob, USD(100)));
57  env(trust(bob, CNY(100)));
58  env(pay(alice, bob, USD(50)));
59 
60  Account const charley {"charley"};
61  env.fund(XRP(10000), "charley");
62  env(trust(charley, CNY(500)));
63  env(trust(charley, JPY(500)));
64  env(pay(alice, charley, CNY(250)));
65  env(pay(alice, charley, JPY(250)));
66 
67  Account const dave {"dave"};
68  env.fund(XRP(10000), "dave");
69  env(trust(dave, CNY(100)));
70  env(pay(alice, dave, CNY(30)));
71 
72  // give the gateway an asset
73  env(trust(alice, charley["USD"](50)));
74  env(pay(charley, alice, USD(10)));
75 
76  // freeze dave
77  env(trust(alice, dave["CNY"](0), dave, tfSetFreeze));
78 
79  env.close();
80 
81  auto wsc = makeWSClient(env.app().config());
82 
83  Json::Value qry;
84  qry[jss::account] = alice.human();
85  qry[jss::hotwallet] = hw.human();
86 
87  auto jv = wsc->invoke("gateway_balances", qry);
88  expect(jv[jss::status] == "success");
89  if (wsc->version() == 2)
90  {
91  expect(jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] == "2.0");
92  expect(jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] == "2.0");
93  expect(jv.isMember(jss::id) && jv[jss::id] == 5);
94  }
95 
96  auto const& result = jv[jss::result];
97  expect(result[jss::account] == alice.human());
98  expect(result[jss::status] == "success");
99 
100  {
101  auto const& balances = result[jss::balances];
102  expect (balances.isObject(), "balances is not an object");
103  expect (balances.size() == 1, "balances size is not 1");
104 
105  auto const& hwBalance = balances[hw.human()];
106  expect (hwBalance.isArray(), "hwBalance is not an array");
107  expect (hwBalance.size() == 2);
108  auto c1 = hwBalance[0u][jss::currency];
109  auto c2 = hwBalance[1u][jss::currency];
110  expect (c1 == "USD" || c2 == "USD");
111  expect (c1 == "JPY" || c2 == "JPY");
112  expect (hwBalance[0u][jss::value] == "5000" &&
113  hwBalance[1u][jss::value] == "5000");
114  }
115 
116  {
117  auto const& fBalances = result[jss::frozen_balances];
118  expect (fBalances.isObject());
119  expect (fBalances.size() == 1);
120 
121  auto const& fBal = fBalances[dave.human()];
122  expect (fBal.isArray());
123  expect (fBal.size() == 1);
124  expect (fBal[0u].isObject());
125  expect (fBal[0u][jss::currency] == "CNY");
126  expect (fBal[0u][jss::value] == "30");
127  }
128 
129  {
130  auto const& assets = result[jss::assets];
131  expect (assets.isObject(), "assets it not an object");
132  expect (assets.size() == 1, "assets size is not 1");
133 
134  auto const& cAssets = assets[charley.human()];
135  expect (cAssets.isArray());
136  expect (cAssets.size() == 1);
137  expect (cAssets[0u][jss::currency] == "USD");
138  expect (cAssets[0u][jss::value] == "10");
139  }
140 
141  {
142  auto const& obligations = result[jss::obligations];
143  expect (obligations.isObject(), "obligations is not an object");
144  expect (obligations.size() == 3);
145  expect (obligations["CNY"] == "250");
146  expect (obligations["JPY"] == "250");
147  expect (obligations["USD"] == "50");
148  }
149 
150  }
151 
152  void
153  run() override
154  {
155  using namespace jtx;
156  auto const sa = supported_amendments();
158  testGWB(sa);
159  }
160 };
161 
162 BEAST_DEFINE_TESTSUITE(GatewayBalances,app,ripple);
163 
164 } // test
165 } // ripple
ripple::test::jtx::XRP
const XRP_t XRP
Converts to XRP Issue or STAmount.
Definition: amount.cpp:109
ripple::test::GatewayBalances_test::run
void run() override
Definition: GatewayBalances_test.cpp:153
ripple::test::BEAST_DEFINE_TESTSUITE
BEAST_DEFINE_TESTSUITE(AccountDelete, app, ripple)
ripple::test::jtx::trust
Json::Value trust(Account const &account, STAmount const &amount, std::uint32_t flags)
Modify a trust line.
Definition: trust.cpp:30
ripple::test::jtx::Env::app
Application & app()
Definition: Env.h:237
ripple::test::GatewayBalances_test::testGWB
void testGWB(FeatureBitset features)
Definition: GatewayBalances_test.cpp:32
ripple::Application::config
virtual Config & config()=0
ripple::test::jtx::supported_amendments
FeatureBitset supported_amendments()
Definition: Env.h:71
ripple::tfSetFreeze
const std::uint32_t tfSetFreeze
Definition: TxFlags.h:92
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::test::jtx::pay
Json::Value pay(Account const &account, Account const &to, AnyAmount amount)
Create a payment.
Definition: pay.cpp:29
ripple::test::jtx::Env::close
void close(NetClock::time_point closeTime, boost::optional< std::chrono::milliseconds > consensusDelay=boost::none)
Close and advance the ledger.
Definition: Env.cpp:114
ripple::test::jtx::Env::fund
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
Definition: Env.cpp:214
ripple::FeatureBitset
Definition: Feature.h:153
ripple::test::makeWSClient
std::unique_ptr< WSClient > makeWSClient(Config const &cfg, bool v2, unsigned rpc_version, std::unordered_map< std::string, std::string > const &headers)
Returns a client operating through WebSockets/S.
Definition: WSClient.cpp:307
ripple::test::jtx::Account
Immutable cryptographic account descriptor.
Definition: Account.h:37
ripple::test::GatewayBalances_test
Definition: GatewayBalances_test.cpp:27
ripple::featureFlowCross
const uint256 featureFlowCross
Definition: Feature.cpp:161
ripple::test::jtx::Env
A transaction testing environment.
Definition: Env.h:117
Json::Value
Represents a JSON value.
Definition: json_value.h:141