20 #include <ripple/app/misc/NetworkOPs.h>
21 #include <ripple/beast/unit_test.h>
22 #include <ripple/core/JobQueue.h>
23 #include <ripple/protocol/jss.h>
25 #include <test/jtx/WSClient.h>
36 using namespace std::chrono_literals;
39 env.
fund(
XRP(10000),
"alice",
"bob");
47 jv[jss::streams].
append(
"transactions");
48 jv = wsc->invoke(
"subscribe", jv);
49 BEAST_EXPECT(jv[jss::status] ==
"success");
50 if (wsc->version() == 2)
53 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
55 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
56 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
64 payment[jss::tx_json] = pay(
"alice",
"bob",
XRP(1));
66 auto jv = wsc->invoke(
"submit", payment);
67 if (wsc->version() == 2)
70 jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
72 jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
73 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
76 jv[jss::result][jss::engine_result] ==
"tefMAX_LEDGER");
79 payment[jss::tx_json] = pay(
"alice",
"bob",
XRP(1));
81 jv = wsc->invoke(
"submit", payment);
82 if (wsc->version() == 2)
85 jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
87 jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
88 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
90 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
"tefPAST_SEQ");
95 jv = wsc->invoke(
"submit", payment);
96 if (wsc->version() == 2)
99 jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
101 jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
102 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
104 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
"terPRE_SEQ");
108 jv = wsc->invoke(
"submit", payment);
109 if (wsc->version() == 2)
112 jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
114 jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
115 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
117 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
"tesSUCCESS");
125 jv = wsc->invoke(
"ledger_accept");
126 if (wsc->version() == 2)
129 jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
131 jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
132 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
134 BEAST_EXPECT(jv[jss::result].isMember(jss::ledger_current_index));
139 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
140 auto const& ff = jv[jss::meta][
"AffectedNodes"][1u]
141 [
"ModifiedNode"][
"FinalFields"];
142 return ff[jss::Account] == Account(
"bob").human() &&
143 ff[
"Balance"] ==
"10001000000";
146 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
147 auto const& ff = jv[jss::meta][
"AffectedNodes"][1u]
148 [
"ModifiedNode"][
"FinalFields"];
149 return ff[jss::Account] == Account(
"bob").human() &&
150 ff[
"Balance"] ==
"10002000000";
158 jv[jss::streams].
append(
"transactions");
159 jv = wsc->invoke(
"unsubscribe", jv);
160 if (wsc->version() == 2)
163 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
165 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
166 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
168 BEAST_EXPECT(jv[jss::status] ==
"success");
188 env.
fund(
XRP(10000),
"alice",
"bob");
196 jv[jss::tx_json] = pay(
"alice",
"bob",
XRP(1));
197 jv = wsc->invoke(
"submit", jv);
198 if (wsc->version() == 2)
201 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
203 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
204 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
206 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
"tesSUCCESS");
219 jv[jss::ledger_index_min] = -1;
220 jv[jss::ledger_index_max] = -1;
222 jv = wsc->invoke(
"account_tx", jv);
223 if (wsc->version() == 2)
226 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
228 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
229 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
233 auto ff = jv[jss::result][jss::transactions][0u][jss::meta]
234 [
"AffectedNodes"][1u][
"ModifiedNode"][
"FinalFields"];
235 BEAST_EXPECT(ff[jss::Account] ==
Account(
"bob").human());
236 BEAST_EXPECT(ff[
"Balance"] ==
"10001000000");
243 using namespace std::chrono_literals;
246 env.
fund(
XRP(10000),
"alice",
"bob");
254 jv[jss::tx_json] = pay(
"alice",
"bob",
XRP(1));
255 jv = wsc->invoke(
"submit", jv);
256 if (wsc->version() == 2)
259 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
261 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
262 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
264 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
"tesSUCCESS");
267 jv = wsc->invoke(
"ledger_accept");
268 if (wsc->version() == 2)
271 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
273 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
274 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
276 BEAST_EXPECT(jv[jss::result].isMember(jss::ledger_current_index));
287 jv[jss::streams].
append(
"ledger");
288 jv = wsc->invoke(
"subscribe", jv);
289 if (wsc->version() == 2)
292 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
295 jv[jss::ripplerpc] ==
"2.0");
296 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
298 BEAST_EXPECT(jv[jss::status] ==
"success");
302 for (
auto i = 0; i < 8; ++i)
304 auto jv = wsc->invoke(
"ledger_accept");
305 if (wsc->version() == 2)
308 jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
310 jv.isMember(jss::ripplerpc) &&
311 jv[jss::ripplerpc] ==
"2.0");
312 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
315 jv[jss::result].isMember(jss::ledger_current_index));
320 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jval) {
321 return jval[jss::type] ==
"ledgerClosed";
329 jv[jss::streams].
append(
"ledger");
330 jv = wsc->invoke(
"unsubscribe", jv);
331 if (wsc->version() == 2)
334 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
337 jv[jss::ripplerpc] ==
"2.0");
338 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
340 BEAST_EXPECT(jv[jss::status] ==
"success");
351 jv[jss::streams].
append(
"ledger");
352 jv = wsc->invoke(
"subscribe", jv);
353 if (wsc->version() == 2)
356 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
359 jv[jss::ripplerpc] ==
"2.0");
360 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
362 BEAST_EXPECT(jv[jss::status] ==
"success");
366 for (
auto i = 0; i < 2; ++i)
368 auto jv = wsc->invoke(
"ledger_accept");
369 if (wsc->version() == 2)
372 jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
374 jv.isMember(jss::ripplerpc) &&
375 jv[jss::ripplerpc] ==
"2.0");
376 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
379 jv[jss::result].isMember(jss::ledger_current_index));
384 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jval) {
385 return jval[jss::type] ==
"ledgerClosed";
393 jv[jss::streams].
append(
"ledger");
394 jv = wsc->invoke(
"unsubscribe", jv);
395 if (wsc->version() == 2)
398 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
401 jv[jss::ripplerpc] ==
"2.0");
402 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
404 BEAST_EXPECT(jv[jss::status] ==
"success");
412 jv[jss::ledger_index_min] = -1;
413 jv[jss::ledger_index_max] = -1;
415 jv = wsc->invoke(
"account_tx", jv);
416 if (wsc->version() == 2)
419 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
421 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
422 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
426 auto ff = jv[jss::result][jss::transactions][0u][jss::meta]
427 [
"AffectedNodes"][1u][
"ModifiedNode"][
"FinalFields"];
428 BEAST_EXPECT(ff[jss::Account] ==
Account(
"bob").human());
429 BEAST_EXPECT(ff[
"Balance"] ==
"10001000000");
436 using namespace std::chrono_literals;
448 jv = wsc->invoke(
"subscribe", jv);
449 if (wsc->version() == 2)
452 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
454 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
455 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
457 BEAST_EXPECT(jv[jss::status] ==
"success");
464 jv[jss::tx_json] =
fset(
"alice", 0);
465 jv[jss::tx_json][jss::Fee] = 10;
466 jv = wsc->invoke(
"submit", jv);
467 if (wsc->version() == 2)
470 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
472 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
473 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
475 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
"tesSUCCESS");
480 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
481 return jv[jss::transaction][jss::TransactionType] ==
491 jv = wsc->invoke(
"unsubscribe", jv);
492 if (wsc->version() == 2)
495 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
497 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
498 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
500 BEAST_EXPECT(jv[jss::status] ==
"success");