20 #include <ripple/beast/unit_test.h>
21 #include <ripple/json/json_reader.h>
22 #include <ripple/json/to_string.h>
23 #include <ripple/protocol/SecretKey.h>
24 #include <ripple/protocol/jss.h>
25 #include <ripple/protocol/st.h>
47 testcase(
"parse json array invalid children");
63 "\"ModifiedNode\":{\"Sequence\":1}, "
64 "\"DeletedNode\":{\"Sequence\":1}"
70 unexpected(!parsedOK,
"failed to parse");
72 BEAST_EXPECT(!parsed.
object);
77 unexpected(what.
find(
"First level children of `Template`") != 0);
84 testcase(
"parse json array");
86 "{\"Template\":[{\"ModifiedNode\":{\"Sequence\":1}}]}");
93 BEAST_EXPECT(parsed.
object);
96 BEAST_EXPECT(serialized == json);
100 fail(
"Couldn't parse json: " + json);
107 testcase(
"parse json object");
110 std::string const goodJson(R
"({"CloseResolution":19,"Method":250,)"
111 R"("TransactionResult":"tecFROZEN"})");
117 if (BEAST_EXPECT(parsed.
object))
121 BEAST_EXPECT(serialized == goodJson);
128 R
"({"CloseResolution":19,"Method":"250",)"
129 R"("TransactionResult":"tecFROZEN"})");
131 R
"({"CloseResolution":19,"Method":250,)"
132 R"("TransactionResult":"tecFROZEN"})");
141 if (BEAST_EXPECT(parsed.
object))
145 BEAST_EXPECT(serialized == expectedJson);
151 std::string const json(R
"({"CloseResolution":19,"Method":250,)"
152 R"("TransactionResult":"terQUEUED"})");
158 BEAST_EXPECT(!parsed.
object);
159 BEAST_EXPECT(parsed.
error);
160 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
162 parsed.
error[jss::error_message] ==
163 "Field 'test.TransactionResult' is out of range.");
168 std::string const json(R
"({"CloseResolution":19,"Method":"pony",)"
169 R"("TransactionResult":"tesSUCCESS"})");
175 BEAST_EXPECT(!parsed.
object);
176 BEAST_EXPECT(parsed.
error);
177 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
179 parsed.
error[jss::error_message] ==
180 "Field 'test.Method' has bad type.");
186 R
"({"CloseResolution":19,"Method":3294967296,)"
187 R"("TransactionResult":"tesSUCCESS"})");
193 BEAST_EXPECT(!parsed.
object);
194 BEAST_EXPECT(parsed.
error);
195 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
197 parsed.
error[jss::error_message] ==
198 "Field 'test.Method' is out of range.");
203 std::string const json(R
"({"CloseResolution":-10,"Method":42,)"
204 R"("TransactionResult":"tesSUCCESS"})");
210 BEAST_EXPECT(!parsed.
object);
211 BEAST_EXPECT(parsed.
error);
212 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
214 parsed.
error[jss::error_message] ==
215 "Field 'test.CloseResolution' is out of range.");
221 R
"({"CloseResolution":19,"Method":3.141592653,)"
222 R"("TransactionResult":"tesSUCCESS"})");
228 BEAST_EXPECT(!parsed.
object);
229 BEAST_EXPECT(parsed.
error);
230 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
232 parsed.
error[jss::error_message] ==
233 "Field 'test.Method' has bad type.");
241 testcase(
"serialization");
246 except<std::runtime_error>([&]() {
256 BEAST_EXPECT(shouldBeInvalid ==
sfInvalid);
258 testInvalid(STI_VL, 255);
259 testInvalid(STI_UINT256, 255);
260 testInvalid(STI_UINT32, 255);
261 testInvalid(STI_VECTOR256, 255);
262 testInvalid(STI_OBJECT, 255);
266 except<std::runtime_error>([&]() {
272 except<std::runtime_error>([&]() {
295 STObject object1(elements, sfTestObject);
309 unexpected(!object1.
isFieldPresent(sfTestH256),
"STObject Error 2");
318 fail(
"STObject error 4");
327 unexpected(object1.
isFieldPresent(sfTestH256),
"STObject error 5");
329 unexpected(object1.
getFlags() != 0,
"STObject error 6");
337 unexpected(object1.
isFieldPresent(sfTestH256),
"STObject error 8");
339 unexpected(copy.isFieldPresent(sfTestH256),
"STObject error 9");
343 "STObject error 10");
345 copy.setFieldU32(sfTestU32, 1);
349 "STObject error 11");
351 for (
int i = 0; i < 1000; i++)
361 STObject object3(elements, it, sfTestObject);
363 unexpected(object1.
getFieldVL(sfTestVL) != j,
"STObject error");
365 unexpected(object3.
getFieldVL(sfTestVL) != j,
"STObject error");
371 for (
int i = 0; i < uints.
capacity(); ++i)
381 STObject object3(elements, it, sfTestObject);
386 BEAST_EXPECT(uints1 == uints3);
405 auto const st = [&]() {
412 BEAST_EXPECT(st[sf1Outer] == 1);
413 BEAST_EXPECT(st[sf2Outer] == 2);
414 except<STObject::FieldErr>([&]() { st[sf3Outer]; });
415 BEAST_EXPECT(*st[~sf1Outer] == 1);
416 BEAST_EXPECT(*st[~sf2Outer] == 2);
417 BEAST_EXPECT(st[~sf3Outer] == std::nullopt);
418 BEAST_EXPECT(!!st[~sf1Outer]);
419 BEAST_EXPECT(!!st[~sf2Outer]);
420 BEAST_EXPECT(!st[~sf3Outer]);
421 BEAST_EXPECT(st[sf1Outer] != st[sf2Outer]);
422 BEAST_EXPECT(st[~sf1Outer] != st[~sf2Outer]);
435 auto const st = [&]() {
442 BEAST_EXPECT(st[sf1Outer] == 1);
443 BEAST_EXPECT(st[sf2Outer] == 2);
444 BEAST_EXPECT(st[sf3Outer] == 0);
445 BEAST_EXPECT(*st[~sf1Outer] == 1);
446 BEAST_EXPECT(*st[~sf2Outer] == 2);
447 BEAST_EXPECT(*st[~sf3Outer] == 0);
448 BEAST_EXPECT(!!st[~sf1Outer]);
449 BEAST_EXPECT(!!st[~sf2Outer]);
450 BEAST_EXPECT(!!st[~sf3Outer]);
457 unexcept([&]() { st[sf1Outer]; });
458 except([&]() {
return st[sf1Outer] == 0; });
459 BEAST_EXPECT(st[~sf1Outer] == std::nullopt);
462 BEAST_EXPECT(!st[~sf1Outer]);
464 BEAST_EXPECT(st[sf1Outer] == 2);
465 BEAST_EXPECT(st[~sf1Outer] != std::nullopt);
467 BEAST_EXPECT(!!st[~sf1Outer]);
469 BEAST_EXPECT(st[sf1Outer] == 1);
470 BEAST_EXPECT(!!st[sf1Outer]);
471 BEAST_EXPECT(!!st[~sf1Outer]);
473 BEAST_EXPECT(!st[sf1Outer]);
474 BEAST_EXPECT(!!st[~sf1Outer]);
475 st[~sf1Outer] = std::nullopt;
476 BEAST_EXPECT(!st[~sf1Outer]);
477 BEAST_EXPECT(st[~sf1Outer] == std::nullopt);
479 st[~sf1Outer] = std::nullopt;
480 BEAST_EXPECT(!st[~sf1Outer]);
481 except([&]() {
return st[sf1Outer] == 0; });
482 except([&]() {
return *st[~sf1Outer]; });
484 BEAST_EXPECT(st[sf1Outer] == 1);
485 BEAST_EXPECT(!!st[sf1Outer]);
486 BEAST_EXPECT(!!st[~sf1Outer]);
488 st[sf2Outer] = st[sf1Outer];
489 BEAST_EXPECT(st[sf1Outer] == 3);
490 BEAST_EXPECT(st[sf2Outer] == 3);
491 BEAST_EXPECT(st[sf2Outer] == st[sf1Outer]);
493 st[sf2Outer] = st[sf1Outer];
494 BEAST_EXPECT(st[sf1Outer] == 4);
495 BEAST_EXPECT(st[sf2Outer] == 4);
496 BEAST_EXPECT(st[sf2Outer] == st[sf1Outer]);
503 BEAST_EXPECT(!!st[~sf1Outer]);
504 BEAST_EXPECT(st[~sf1Outer] != std::nullopt);
505 BEAST_EXPECT(st[sf1Outer] == 0);
506 BEAST_EXPECT(*st[~sf1Outer] == 0);
507 BEAST_EXPECT(!st[~sf2Outer]);
508 BEAST_EXPECT(st[~sf2Outer] == std::nullopt);
509 except([&]() {
return st[sf2Outer] == 0; });
510 BEAST_EXPECT(!!st[~sf3Outer]);
511 BEAST_EXPECT(st[~sf3Outer] != std::nullopt);
512 BEAST_EXPECT(st[sf3Outer] == 0);
513 except([&]() { st[~sf1Outer] = std::nullopt; });
515 BEAST_EXPECT(st[sf1Outer] == 1);
516 BEAST_EXPECT(*st[~sf1Outer] == 1);
517 BEAST_EXPECT(!!st[~sf1Outer]);
519 BEAST_EXPECT(st[sf1Outer] == 0);
520 BEAST_EXPECT(*st[~sf1Outer] == 0);
521 BEAST_EXPECT(!!st[~sf1Outer]);
523 BEAST_EXPECT(st[sf2Outer] == 2);
524 BEAST_EXPECT(*st[~sf2Outer] == 2);
525 BEAST_EXPECT(!!st[~sf2Outer]);
526 st[~sf2Outer] = std::nullopt;
527 except([&]() {
return *st[~sf2Outer]; });
528 BEAST_EXPECT(!st[~sf2Outer]);
530 BEAST_EXPECT(st[sf3Outer] == 3);
531 BEAST_EXPECT(*st[~sf3Outer] == 3);
532 BEAST_EXPECT(!!st[~sf3Outer]);
534 BEAST_EXPECT(st[sf3Outer] == 2);
535 BEAST_EXPECT(*st[~sf3Outer] == 2);
536 BEAST_EXPECT(!!st[~sf3Outer]);
538 BEAST_EXPECT(st[sf3Outer] == 0);
539 BEAST_EXPECT(*st[~sf3Outer] == 0);
540 BEAST_EXPECT(!!st[~sf3Outer]);
541 except([&]() { st[~sf3Outer] = std::nullopt; });
542 BEAST_EXPECT(st[sf3Outer] == 0);
543 BEAST_EXPECT(*st[~sf3Outer] == 0);
544 BEAST_EXPECT(!!st[~sf3Outer]);
551 auto const v = ~st[~sf1Outer];
575 BEAST_EXPECT(!b.
empty());
576 st[sf4] = std::move(b);
577 BEAST_EXPECT(b.
empty());
578 BEAST_EXPECT(
Slice(st[sf4]).size() == 1);
579 st[~sf4] = std::nullopt;
580 BEAST_EXPECT(!~st[~sf4]);
583 BEAST_EXPECT(b.
size() == 2);
584 BEAST_EXPECT(
Slice(st[sf4]).size() == 2);
586 BEAST_EXPECT(
Slice(st[sf4]).size() == 2);
587 BEAST_EXPECT(
Slice(st[sf5]).size() == 2);
591 BEAST_EXPECT(st[sf5] ==
Slice{});
592 BEAST_EXPECT(!!st[~sf5]);
593 BEAST_EXPECT(!!~st[~sf5]);
595 st[sf5] = std::move(b);
596 BEAST_EXPECT(b.
empty());
597 BEAST_EXPECT(
Slice(st[sf5]).size() == 1);
598 st[~sf4] = std::nullopt;
599 BEAST_EXPECT(!~st[~sf4]);
607 BEAST_EXPECT(!st[~sf5]);
611 st[~sf5] = std::nullopt;
623 st[sf] = std::move(v);
624 auto const& cst = st;
625 BEAST_EXPECT(cst[sf].size() == 2);
626 BEAST_EXPECT(cst[~sf]->size() == 2);
627 BEAST_EXPECT(cst[sf][0] == 1);
628 BEAST_EXPECT(cst[sf][1] == 2);
649 BEAST_EXPECT(cst[sf1].size() == 0);
650 BEAST_EXPECT(!cst[~sf2]);
651 BEAST_EXPECT(cst[sf3].size() == 0);
655 BEAST_EXPECT(cst[sf1].size() == 1);
656 BEAST_EXPECT(cst[sf1][0] ==
uint256{1});
658 BEAST_EXPECT(cst[sf2].size() == 1);
659 BEAST_EXPECT(cst[sf2][0] ==
uint256{1});
660 st[~sf2] = std::nullopt;
661 BEAST_EXPECT(!st[~sf2]);
663 BEAST_EXPECT(cst[sf3].size() == 1);
664 BEAST_EXPECT(cst[sf3][0] ==
uint256{1});
666 BEAST_EXPECT(cst[sf3].size() == 0);
673 testcase(
"Malformed serialized forms");
678 {0xe9, 0x12, 0xab, 0xcd, 0x12, 0xfe, 0xdc}};
680 auto obj = std::make_shared<STArray>(sit,
sfMetadata);
685 BEAST_EXPECT(strcmp(e.
what(),
"Duplicate field detected") == 0);
692 auto obj = std::make_shared<STObject>(sit,
sfMetadata);
697 BEAST_EXPECT(strcmp(e.
what(),
"Duplicate field detected") == 0);