18 #include <ripple/beast/unit_test.h>
19 #include <ripple/core/JobQueue.h>
20 #include <ripple/protocol/jss.h>
22 #include <test/jtx/WSClient.h>
33 using namespace std::chrono_literals;
36 env.
fund(
XRP(10000),
"alice",
"bob");
44 jv[jss::streams].
append(
"transactions");
45 jv = wsc->invoke(
"subscribe", jv);
46 BEAST_EXPECT(jv[jss::status] ==
"success");
47 if (wsc->version() == 2)
50 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
52 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
53 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
61 payment[jss::tx_json] =
pay(
"alice",
"bob",
XRP(1));
63 auto jv = wsc->invoke(
"submit", payment);
64 if (wsc->version() == 2)
67 jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
69 jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
70 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
73 jv[jss::result][jss::engine_result] ==
"tefMAX_LEDGER");
76 payment[jss::tx_json] =
pay(
"alice",
"bob",
XRP(1));
78 jv = wsc->invoke(
"submit", payment);
79 if (wsc->version() == 2)
82 jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
84 jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
85 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
87 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
"tefPAST_SEQ");
91 jv = wsc->invoke(
"submit", payment);
92 if (wsc->version() == 2)
95 jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
97 jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
98 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
100 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
"terPRE_SEQ");
104 jv = wsc->invoke(
"submit", payment);
105 if (wsc->version() == 2)
108 jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
110 jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
111 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
113 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
"tesSUCCESS");
119 jv = wsc->invoke(
"ledger_accept");
120 if (wsc->version() == 2)
123 jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
125 jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
126 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
128 BEAST_EXPECT(jv[jss::result].isMember(jss::ledger_current_index));
133 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
134 auto const& ff = jv[jss::meta][
"AffectedNodes"][1u]
135 [
"ModifiedNode"][
"FinalFields"];
136 return ff[jss::Account] == Account(
"bob").human() &&
137 ff[
"Balance"] ==
"10001000000";
140 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
141 auto const& ff = jv[jss::meta][
"AffectedNodes"][1u]
142 [
"ModifiedNode"][
"FinalFields"];
143 return ff[jss::Account] == Account(
"bob").human() &&
144 ff[
"Balance"] ==
"10002000000";
152 jv[jss::streams].
append(
"transactions");
153 jv = wsc->invoke(
"unsubscribe", jv);
154 if (wsc->version() == 2)
157 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
159 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
160 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
162 BEAST_EXPECT(jv[jss::status] ==
"success");
182 env.
fund(
XRP(10000),
"alice",
"bob");
190 jv[jss::tx_json] =
pay(
"alice",
"bob",
XRP(1));
191 jv = wsc->invoke(
"submit", jv);
192 if (wsc->version() == 2)
195 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
197 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
198 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
200 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
"tesSUCCESS");
213 jv[jss::ledger_index_min] = -1;
214 jv[jss::ledger_index_max] = -1;
216 jv = wsc->invoke(
"account_tx", jv);
217 if (wsc->version() == 2)
220 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
222 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
223 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
227 auto ff = jv[jss::result][jss::transactions][0u][jss::meta]
228 [
"AffectedNodes"][1u][
"ModifiedNode"][
"FinalFields"];
229 BEAST_EXPECT(ff[jss::Account] ==
Account(
"bob").human());
230 BEAST_EXPECT(ff[
"Balance"] ==
"10001000000");
237 using namespace std::chrono_literals;
240 env.
fund(
XRP(10000),
"alice",
"bob");
248 jv[jss::tx_json] =
pay(
"alice",
"bob",
XRP(1));
249 jv = wsc->invoke(
"submit", jv);
250 if (wsc->version() == 2)
253 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
255 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
256 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
258 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
"tesSUCCESS");
261 jv = wsc->invoke(
"ledger_accept");
262 if (wsc->version() == 2)
265 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
267 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
268 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
270 BEAST_EXPECT(jv[jss::result].isMember(jss::ledger_current_index));
281 jv[jss::streams].
append(
"ledger");
282 jv = wsc->invoke(
"subscribe", jv);
283 if (wsc->version() == 2)
286 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
289 jv[jss::ripplerpc] ==
"2.0");
290 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
292 BEAST_EXPECT(jv[jss::status] ==
"success");
296 for (
auto i = 0; i < 8; ++i)
298 auto jv = wsc->invoke(
"ledger_accept");
299 if (wsc->version() == 2)
302 jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
304 jv.isMember(jss::ripplerpc) &&
305 jv[jss::ripplerpc] ==
"2.0");
306 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
309 jv[jss::result].isMember(jss::ledger_current_index));
314 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jval) {
315 return jval[jss::type] ==
"ledgerClosed";
323 jv[jss::streams].
append(
"ledger");
324 jv = wsc->invoke(
"unsubscribe", jv);
325 if (wsc->version() == 2)
328 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
331 jv[jss::ripplerpc] ==
"2.0");
332 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
334 BEAST_EXPECT(jv[jss::status] ==
"success");
345 jv[jss::streams].
append(
"ledger");
346 jv = wsc->invoke(
"subscribe", jv);
347 if (wsc->version() == 2)
350 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
353 jv[jss::ripplerpc] ==
"2.0");
354 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
356 BEAST_EXPECT(jv[jss::status] ==
"success");
360 for (
auto i = 0; i < 2; ++i)
362 auto jv = wsc->invoke(
"ledger_accept");
363 if (wsc->version() == 2)
366 jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
368 jv.isMember(jss::ripplerpc) &&
369 jv[jss::ripplerpc] ==
"2.0");
370 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
373 jv[jss::result].isMember(jss::ledger_current_index));
378 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jval) {
379 return jval[jss::type] ==
"ledgerClosed";
387 jv[jss::streams].
append(
"ledger");
388 jv = wsc->invoke(
"unsubscribe", jv);
389 if (wsc->version() == 2)
392 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
395 jv[jss::ripplerpc] ==
"2.0");
396 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
398 BEAST_EXPECT(jv[jss::status] ==
"success");
406 jv[jss::ledger_index_min] = -1;
407 jv[jss::ledger_index_max] = -1;
409 jv = wsc->invoke(
"account_tx", jv);
410 if (wsc->version() == 2)
413 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
415 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
416 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
420 auto ff = jv[jss::result][jss::transactions][0u][jss::meta]
421 [
"AffectedNodes"][1u][
"ModifiedNode"][
"FinalFields"];
422 BEAST_EXPECT(ff[jss::Account] ==
Account(
"bob").human());
423 BEAST_EXPECT(ff[
"Balance"] ==
"10001000000");
430 using namespace std::chrono_literals;
442 jv = wsc->invoke(
"subscribe", jv);
443 if (wsc->version() == 2)
446 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
448 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
449 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
451 BEAST_EXPECT(jv[jss::status] ==
"success");
458 jv[jss::tx_json] =
fset(
"alice", 0);
459 jv[jss::tx_json][jss::Fee] = 10;
460 jv = wsc->invoke(
"submit", jv);
461 if (wsc->version() == 2)
464 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
466 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
467 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
469 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
"tesSUCCESS");
474 BEAST_EXPECT(wsc->findMsg(5s, [&](
auto const& jv) {
475 return jv[jss::transaction][jss::TransactionType] ==
485 jv = wsc->invoke(
"unsubscribe", jv);
486 if (wsc->version() == 2)
489 jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
491 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
492 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
494 BEAST_EXPECT(jv[jss::status] ==
"success");