20 #include <ripple/app/misc/TxQ.h>
21 #include <ripple/beast/utility/temp_dir.h>
22 #include <ripple/protocol/Feature.h>
23 #include <ripple/protocol/jss.h>
24 #include <ripple/resource/ResourceManager.h>
25 #include <ripple/resource/impl/Entry.h>
26 #include <ripple/resource/impl/Tuning.h>
27 #include <ripple/rpc/impl/Tuning.h>
28 #include <boost/algorithm/string/predicate.hpp>
30 #include <test/jtx/envconfig.h>
39 testcase(
"Bad input to noripple_check");
41 using namespace test::jtx;
44 auto const alice = Account{
"alice"};
45 env.fund(XRP(10000), alice);
50 env.rpc(
"json",
"noripple_check",
"{}")[jss::result];
51 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
53 result[jss::error_message] ==
"Missing field 'account'.");
58 params[jss::account] = alice.human();
59 auto const result = env.rpc(
62 boost::lexical_cast<std::string>(params))[jss::result];
63 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
64 BEAST_EXPECT(result[jss::error_message] ==
"Missing field 'role'.");
69 params[jss::account] = alice.human();
70 params[jss::role] =
"not_a_role";
71 auto const result = env.rpc(
74 boost::lexical_cast<std::string>(params))[jss::result];
75 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
76 BEAST_EXPECT(result[jss::error_message] ==
"Invalid field 'role'.");
81 params[jss::account] = alice.human();
82 params[jss::role] =
"user";
83 params[jss::limit] = -1;
84 auto const result = env.rpc(
87 boost::lexical_cast<std::string>(params))[jss::result];
88 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
90 result[jss::error_message] ==
91 "Invalid field 'limit', not unsigned integer.");
96 params[jss::account] = alice.human();
97 params[jss::role] =
"user";
98 params[jss::ledger_hash] = 1;
99 auto const result = env.rpc(
102 boost::lexical_cast<std::string>(params))[jss::result];
103 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
104 BEAST_EXPECT(result[jss::error_message] ==
"ledgerHashNotString");
109 params[jss::account] = Account{
"nobody"}.human();
110 params[jss::role] =
"user";
111 params[jss::ledger] =
"current";
112 auto const result = env.rpc(
115 boost::lexical_cast<std::string>(params))[jss::result];
116 BEAST_EXPECT(result[jss::error] ==
"actNotFound");
117 BEAST_EXPECT(result[jss::error_message] ==
"Account not found.");
124 params[jss::role] =
"user";
125 params[jss::ledger] =
"current";
126 auto const result = env.rpc(
129 boost::lexical_cast<std::string>(params))[jss::result];
130 BEAST_EXPECT(result[jss::error] ==
"actMalformed");
131 BEAST_EXPECT(result[jss::error_message] ==
"Account malformed.");
138 testcase <<
"Request noripple_check for " << (user ?
"user" :
"gateway")
139 <<
" role, expect" << (problems ?
"" :
" no") <<
" problems";
141 using namespace test::jtx;
144 auto const gw = Account{
"gw"};
145 auto const alice = Account{
"alice"};
147 env.fund(XRP(10000), gw, alice);
148 if ((user && problems) || (!user && !problems))
151 env(trust(alice, gw[
"USD"](100)));
161 params[jss::account] = alice.human();
162 params[jss::role] = (user ?
"user" :
"gateway");
163 params[jss::ledger] =
"current";
164 auto result = env.rpc(
167 boost::lexical_cast<std::string>(params))[jss::result];
169 auto const pa = result[
"problems"];
170 if (!BEAST_EXPECT(pa.isArray()))
175 if (!BEAST_EXPECT(pa.size() == 2))
180 BEAST_EXPECT(boost::starts_with(
181 pa[0u].asString(),
"You appear to have set"));
182 BEAST_EXPECT(boost::starts_with(
183 pa[1u].asString(),
"You should probably set"));
187 BEAST_EXPECT(boost::starts_with(
188 pa[0u].asString(),
"You should immediately set"));
190 boost::starts_with(pa[1u].asString(),
"You should clear"));
195 BEAST_EXPECT(pa.size() == 0);
200 params[jss::transactions] =
true;
204 boost::lexical_cast<std::string>(params))[jss::result];
205 if (!BEAST_EXPECT(result[jss::transactions].isArray()))
208 auto const txs = result[jss::transactions];
211 if (!BEAST_EXPECT(txs.size() == (user ? 1 : 2)))
216 BEAST_EXPECT(txs[0u][jss::Account] == alice.human());
217 BEAST_EXPECT(txs[0u][jss::TransactionType] == jss::AccountSet);
221 result[jss::transactions][txs.size() - 1][jss::Account] ==
224 result[jss::transactions][txs.size() - 1]
225 [jss::TransactionType] == jss::TrustSet);
227 result[jss::transactions][txs.size() - 1][jss::LimitAmount] ==
232 BEAST_EXPECT(txs.size() == 0);
241 for (
auto user : {
true,
false})
242 for (
auto problem : {
true,
false})
252 testcase <<
"Check limits in returned data, "
253 << (admin ?
"admin" :
"non-admin");
255 using namespace test::jtx;
257 Env env{*
this, admin ? envconfig() : envconfig(no_admin)};
259 auto const alice = Account{
"alice"};
260 env.fund(XRP(100000), alice);
264 auto checkBalance = [&env]() {
275 auto c = env.app().getResourceManager().newInboundEndpoint(
282 c.entry().local_balance =
292 auto& txq = env.app().getTxQ();
295 auto const baseFee = env.current()->fees().base;
296 env(pay(env.master, gw, XRP(1000)),
299 txq.getMetrics(*env.current()).openLedgerFeeLevel,
306 txq.getMetrics(*env.current()).openLedgerFeeLevel,
310 env(trust(alice, gw[
"USD"](10)),
312 txq.getMetrics(*env.current()).openLedgerFeeLevel,
320 params[jss::account] = alice.human();
321 params[jss::role] =
"user";
322 params[jss::ledger] =
"current";
323 auto result = env.rpc(
326 boost::lexical_cast<std::string>(params))[jss::result];
328 BEAST_EXPECT(result[
"problems"].size() == 301);
331 params[jss::limit] = 9;
335 boost::lexical_cast<std::string>(params))[jss::result];
336 BEAST_EXPECT(result[
"problems"].size() == (admin ? 10 : 11));
339 params[jss::limit] = 10;
343 boost::lexical_cast<std::string>(params))[jss::result];
344 BEAST_EXPECT(result[
"problems"].size() == 11);
347 params[jss::limit] = 400;
351 boost::lexical_cast<std::string>(params))[jss::result];
352 BEAST_EXPECT(result[
"problems"].size() == 401);
355 params[jss::limit] = 401;
359 boost::lexical_cast<std::string>(params))[jss::result];
360 BEAST_EXPECT(result[
"problems"].size() == (admin ? 402 : 401));
367 for (
auto admin : {
true,
false})