18 #include <ripple/core/JobQueue.h>
19 #include <ripple/protocol/jss.h>
21 #include <test/jtx/WSClient.h>
22 #include <ripple/beast/unit_test.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)
49 BEAST_EXPECT(jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
50 BEAST_EXPECT(jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
51 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
59 payment[jss::tx_json] =
pay(
"alice",
"bob",
XRP(1));
61 auto jv = wsc->invoke(
"submit", payment);
62 if (wsc->version() == 2)
64 BEAST_EXPECT(jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
65 BEAST_EXPECT(jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
66 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
68 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
72 payment[jss::tx_json] =
pay(
"alice",
"bob",
XRP(1));
75 jv = wsc->invoke(
"submit", payment);
76 if (wsc->version() == 2)
78 BEAST_EXPECT(jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
79 BEAST_EXPECT(jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
80 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
82 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
88 jv = wsc->invoke(
"submit", payment);
89 if (wsc->version() == 2)
91 BEAST_EXPECT(jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
92 BEAST_EXPECT(jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
93 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
95 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
101 jv = wsc->invoke(
"submit", payment);
102 if (wsc->version() == 2)
104 BEAST_EXPECT(jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
105 BEAST_EXPECT(jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
106 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
108 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
115 jv = wsc->invoke(
"ledger_accept");
116 if (wsc->version() == 2)
118 BEAST_EXPECT(jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
119 BEAST_EXPECT(jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
120 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
122 BEAST_EXPECT(jv[jss::result].isMember(
123 jss::ledger_current_index));
128 BEAST_EXPECT(wsc->findMsg(5s,
131 auto const& ff = jv[jss::meta][
"AffectedNodes"]
132 [1u][
"ModifiedNode"][
"FinalFields"];
133 return ff[jss::Account] == Account(
"bob").human() &&
134 ff[
"Balance"] ==
"10001000000";
137 BEAST_EXPECT(wsc->findMsg(5s,
140 auto const& ff = jv[jss::meta][
"AffectedNodes"]
141 [1u][
"ModifiedNode"][
"FinalFields"];
142 return ff[jss::Account] == Account(
"bob").human() &&
143 ff[
"Balance"] ==
"10002000000";
151 jv[jss::streams].
append(
"transactions");
152 jv = wsc->invoke(
"unsubscribe", jv);
153 if (wsc->version() == 2)
155 BEAST_EXPECT(jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
156 BEAST_EXPECT(jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
157 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
159 BEAST_EXPECT(jv[jss::status] ==
"success");
179 env.
fund(
XRP(10000),
"alice",
"bob");
187 jv[jss::tx_json] =
pay(
"alice",
"bob",
XRP(1));
188 jv = wsc->invoke(
"submit", jv);
189 if (wsc->version() == 2)
191 BEAST_EXPECT(jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
192 BEAST_EXPECT(jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
193 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
195 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
209 jv[jss::ledger_index_min] = -1;
210 jv[jss::ledger_index_max] = -1;
212 jv = wsc->invoke(
"account_tx", jv);
213 if (wsc->version() == 2)
215 BEAST_EXPECT(jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
216 BEAST_EXPECT(jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
217 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
221 auto ff = jv[jss::result][jss::transactions][0u][jss::meta]
222 [
"AffectedNodes"][1u][
"ModifiedNode"][
"FinalFields"];
223 BEAST_EXPECT(ff[jss::Account] ==
225 BEAST_EXPECT(ff[
"Balance"] ==
"10001000000");
232 using namespace std::chrono_literals;
235 env.
fund(
XRP(10000),
"alice",
"bob");
243 jv[jss::tx_json] =
pay(
"alice",
"bob",
XRP(1));
244 jv = wsc->invoke(
"submit", jv);
245 if (wsc->version() == 2)
247 BEAST_EXPECT(jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
248 BEAST_EXPECT(jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
249 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
251 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
255 jv = wsc->invoke(
"ledger_accept");
256 if (wsc->version() == 2)
258 BEAST_EXPECT(jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
259 BEAST_EXPECT(jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
260 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
262 BEAST_EXPECT(jv[jss::result].isMember(
263 jss::ledger_current_index));
274 jv[jss::streams].
append(
"ledger");
275 jv = wsc->invoke(
"subscribe", jv);
276 if (wsc->version() == 2)
278 BEAST_EXPECT(jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
279 BEAST_EXPECT(jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
280 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
282 BEAST_EXPECT(jv[jss::status] ==
"success");
286 for(
auto i = 0; i < 8; ++i)
288 auto jv = wsc->invoke(
"ledger_accept");
289 if (wsc->version() == 2)
291 BEAST_EXPECT(jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
292 BEAST_EXPECT(jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
293 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
295 BEAST_EXPECT(jv[jss::result].
296 isMember(jss::ledger_current_index));
301 BEAST_EXPECT(wsc->findMsg(5s,
302 [&](
auto const& jval)
304 return jval[jss::type] ==
"ledgerClosed";
312 jv[jss::streams].
append(
"ledger");
313 jv = wsc->invoke(
"unsubscribe", jv);
314 if (wsc->version() == 2)
316 BEAST_EXPECT(jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
317 BEAST_EXPECT(jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
318 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
320 BEAST_EXPECT(jv[jss::status] ==
"success");
331 jv[jss::streams].
append(
"ledger");
332 jv = wsc->invoke(
"subscribe", jv);
333 if (wsc->version() == 2)
335 BEAST_EXPECT(jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
336 BEAST_EXPECT(jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
337 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
339 BEAST_EXPECT(jv[jss::status] ==
"success");
343 for (
auto i = 0; i < 2; ++i)
345 auto jv = wsc->invoke(
"ledger_accept");
346 if (wsc->version() == 2)
348 BEAST_EXPECT(jv.isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
349 BEAST_EXPECT(jv.isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
350 BEAST_EXPECT(jv.isMember(jss::id) && jv[jss::id] == 5);
352 BEAST_EXPECT(jv[jss::result].
353 isMember(jss::ledger_current_index));
358 BEAST_EXPECT(wsc->findMsg(5s,
359 [&](
auto const& jval)
361 return jval[jss::type] ==
"ledgerClosed";
369 jv[jss::streams].
append(
"ledger");
370 jv = wsc->invoke(
"unsubscribe", jv);
371 if (wsc->version() == 2)
373 BEAST_EXPECT(jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
374 BEAST_EXPECT(jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
375 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
377 BEAST_EXPECT(jv[jss::status] ==
"success");
385 jv[jss::ledger_index_min] = -1;
386 jv[jss::ledger_index_max] = -1;
388 jv = wsc->invoke(
"account_tx", jv);
389 if (wsc->version() == 2)
391 BEAST_EXPECT(jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
392 BEAST_EXPECT(jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
393 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
397 auto ff = jv[jss::result][jss::transactions][0u][jss::meta]
398 [
"AffectedNodes"][1u][
"ModifiedNode"][
"FinalFields"];
399 BEAST_EXPECT(ff[jss::Account] ==
401 BEAST_EXPECT(ff[
"Balance"] ==
"10001000000");
408 using namespace std::chrono_literals;
419 jv[jss::accounts_proposed].
append(
421 jv = wsc->invoke(
"subscribe", jv);
422 if (wsc->version() == 2)
424 BEAST_EXPECT(jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
425 BEAST_EXPECT(jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
426 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
428 BEAST_EXPECT(jv[jss::status] ==
"success");
435 jv[jss::tx_json] =
fset(
"alice", 0);
436 jv[jss::tx_json][jss::Fee] = 10;
437 jv = wsc->invoke(
"submit", jv);
438 if (wsc->version() == 2)
440 BEAST_EXPECT(jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
441 BEAST_EXPECT(jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
442 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
444 BEAST_EXPECT(jv[jss::result][jss::engine_result] ==
450 BEAST_EXPECT(wsc->findMsg(5s,
453 return jv[jss::transaction][jss::TransactionType] ==
462 jv[jss::accounts_proposed].
append(
464 jv = wsc->invoke(
"unsubscribe", jv);
465 if (wsc->version() == 2)
467 BEAST_EXPECT(jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0");
468 BEAST_EXPECT(jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0");
469 BEAST_EXPECT(jv.
isMember(jss::id) && jv[jss::id] == 5);
471 BEAST_EXPECT(jv[jss::status] ==
"success");