20 #include <ripple/basics/Log.h>
21 #include <ripple/beast/unit_test.h>
22 #include <ripple/json/json_reader.h>
23 #include <ripple/json/to_string.h>
24 #include <ripple/protocol/SecretKey.h>
25 #include <ripple/protocol/jss.h>
26 #include <ripple/protocol/st.h>
48 testcase(
"parse json array invalid children");
64 "\"ModifiedNode\":{\"Sequence\":1}, "
65 "\"DeletedNode\":{\"Sequence\":1}"
71 unexpected(!parsedOK,
"failed to parse");
73 BEAST_EXPECT(!parsed.
object);
78 unexpected(what.
find(
"First level children of `Template`") != 0);
85 testcase(
"parse json array");
87 "{\"Template\":[{\"ModifiedNode\":{\"Sequence\":1}}]}");
94 BEAST_EXPECT(parsed.
object);
97 BEAST_EXPECT(serialized == json);
101 fail(
"Couldn't parse json: " + json);
108 testcase(
"parse json object");
111 std::string const goodJson(R
"({"CloseResolution":19,"Method":250,)"
112 R"("TransactionResult":"tecFROZEN"})");
118 if (BEAST_EXPECT(parsed.
object))
122 BEAST_EXPECT(serialized == goodJson);
129 R
"({"CloseResolution":19,"Method":"250",)"
130 R"("TransactionResult":"tecFROZEN"})");
132 R
"({"CloseResolution":19,"Method":250,)"
133 R"("TransactionResult":"tecFROZEN"})");
142 if (BEAST_EXPECT(parsed.
object))
146 BEAST_EXPECT(serialized == expectedJson);
152 std::string const json(R
"({"CloseResolution":19,"Method":250,)"
153 R"("TransactionResult":"terQUEUED"})");
159 BEAST_EXPECT(!parsed.
object);
160 BEAST_EXPECT(parsed.
error);
161 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
163 parsed.
error[jss::error_message] ==
164 "Field 'test.TransactionResult' is out of range.");
169 std::string const json(R
"({"CloseResolution":19,"Method":"pony",)"
170 R"("TransactionResult":"tesSUCCESS"})");
176 BEAST_EXPECT(!parsed.
object);
177 BEAST_EXPECT(parsed.
error);
178 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
180 parsed.
error[jss::error_message] ==
181 "Field 'test.Method' has bad type.");
187 R
"({"CloseResolution":19,"Method":3294967296,)"
188 R"("TransactionResult":"tesSUCCESS"})");
194 BEAST_EXPECT(!parsed.
object);
195 BEAST_EXPECT(parsed.
error);
196 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
198 parsed.
error[jss::error_message] ==
199 "Field 'test.Method' is out of range.");
204 std::string const json(R
"({"CloseResolution":-10,"Method":42,)"
205 R"("TransactionResult":"tesSUCCESS"})");
211 BEAST_EXPECT(!parsed.
object);
212 BEAST_EXPECT(parsed.
error);
213 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
215 parsed.
error[jss::error_message] ==
216 "Field 'test.CloseResolution' is out of range.");
222 R
"({"CloseResolution":19,"Method":3.141592653,)"
223 R"("TransactionResult":"tesSUCCESS"})");
229 BEAST_EXPECT(!parsed.
object);
230 BEAST_EXPECT(parsed.
error);
231 BEAST_EXPECT(parsed.
error[jss::error] ==
"invalidParams");
233 parsed.
error[jss::error_message] ==
234 "Field 'test.Method' has bad type.");
242 testcase(
"serialization");
247 except<std::runtime_error>([&]() {
257 BEAST_EXPECT(shouldBeInvalid ==
sfInvalid);
267 except<std::runtime_error>([&]() {
273 except<std::runtime_error>([&]() {
296 STObject object1(elements, sfTestObject);
310 unexpected(!object1.
isFieldPresent(sfTestH256),
"STObject Error 2");
319 fail(
"STObject error 4");
328 unexpected(object1.
isFieldPresent(sfTestH256),
"STObject error 5");
330 unexpected(object1.
getFlags() != 0,
"STObject error 6");
338 unexpected(object1.
isFieldPresent(sfTestH256),
"STObject error 8");
340 unexpected(copy.isFieldPresent(sfTestH256),
"STObject error 9");
344 "STObject error 10");
346 copy.setFieldU32(sfTestU32, 1);
350 "STObject error 11");
352 for (
int i = 0; i < 1000; i++)
362 STObject object3(elements, it, sfTestObject);
364 unexpected(object1.
getFieldVL(sfTestVL) != j,
"STObject error");
366 unexpected(object3.
getFieldVL(sfTestVL) != j,
"STObject error");
372 for (
int i = 0; i < uints.
capacity(); ++i)
382 STObject object3(elements, it, sfTestObject);
387 BEAST_EXPECT(uints1 == uints3);
406 auto const st = [&]() {
413 BEAST_EXPECT(st[sf1Outer] == 1);
414 BEAST_EXPECT(st[sf2Outer] == 2);
415 except<STObject::FieldErr>([&]() { st[sf3Outer]; });
416 BEAST_EXPECT(*st[~sf1Outer] == 1);
417 BEAST_EXPECT(*st[~sf2Outer] == 2);
418 BEAST_EXPECT(st[~sf3Outer] == std::nullopt);
419 BEAST_EXPECT(!!st[~sf1Outer]);
420 BEAST_EXPECT(!!st[~sf2Outer]);
421 BEAST_EXPECT(!st[~sf3Outer]);
422 BEAST_EXPECT(st[sf1Outer] != st[sf2Outer]);
423 BEAST_EXPECT(st[~sf1Outer] != st[~sf2Outer]);
436 auto const st = [&]() {
443 BEAST_EXPECT(st[sf1Outer] == 1);
444 BEAST_EXPECT(st[sf2Outer] == 2);
445 BEAST_EXPECT(st[sf3Outer] == 0);
446 BEAST_EXPECT(*st[~sf1Outer] == 1);
447 BEAST_EXPECT(*st[~sf2Outer] == 2);
448 BEAST_EXPECT(*st[~sf3Outer] == 0);
449 BEAST_EXPECT(!!st[~sf1Outer]);
450 BEAST_EXPECT(!!st[~sf2Outer]);
451 BEAST_EXPECT(!!st[~sf3Outer]);
458 unexcept([&]() { st[sf1Outer]; });
459 except([&]() {
return st[sf1Outer] == 0; });
460 BEAST_EXPECT(st[~sf1Outer] == std::nullopt);
463 BEAST_EXPECT(!st[~sf1Outer]);
465 BEAST_EXPECT(st[sf1Outer] == 2);
466 BEAST_EXPECT(st[~sf1Outer] != std::nullopt);
468 BEAST_EXPECT(!!st[~sf1Outer]);
470 BEAST_EXPECT(st[sf1Outer] == 1);
471 BEAST_EXPECT(!!st[sf1Outer]);
472 BEAST_EXPECT(!!st[~sf1Outer]);
474 BEAST_EXPECT(!st[sf1Outer]);
475 BEAST_EXPECT(!!st[~sf1Outer]);
476 st[~sf1Outer] = std::nullopt;
477 BEAST_EXPECT(!st[~sf1Outer]);
478 BEAST_EXPECT(st[~sf1Outer] == std::nullopt);
480 st[~sf1Outer] = std::nullopt;
481 BEAST_EXPECT(!st[~sf1Outer]);
482 except([&]() {
return st[sf1Outer] == 0; });
483 except([&]() {
return *st[~sf1Outer]; });
485 BEAST_EXPECT(st[sf1Outer] == 1);
486 BEAST_EXPECT(!!st[sf1Outer]);
487 BEAST_EXPECT(!!st[~sf1Outer]);
489 st[sf2Outer] = st[sf1Outer];
490 BEAST_EXPECT(st[sf1Outer] == 3);
491 BEAST_EXPECT(st[sf2Outer] == 3);
492 BEAST_EXPECT(st[sf2Outer] == st[sf1Outer]);
494 st[sf2Outer] = st[sf1Outer];
495 BEAST_EXPECT(st[sf1Outer] == 4);
496 BEAST_EXPECT(st[sf2Outer] == 4);
497 BEAST_EXPECT(st[sf2Outer] == st[sf1Outer]);
504 BEAST_EXPECT(!!st[~sf1Outer]);
505 BEAST_EXPECT(st[~sf1Outer] != std::nullopt);
506 BEAST_EXPECT(st[sf1Outer] == 0);
507 BEAST_EXPECT(*st[~sf1Outer] == 0);
508 BEAST_EXPECT(!st[~sf2Outer]);
509 BEAST_EXPECT(st[~sf2Outer] == std::nullopt);
510 except([&]() {
return st[sf2Outer] == 0; });
511 BEAST_EXPECT(!!st[~sf3Outer]);
512 BEAST_EXPECT(st[~sf3Outer] != std::nullopt);
513 BEAST_EXPECT(st[sf3Outer] == 0);
514 except([&]() { st[~sf1Outer] = std::nullopt; });
516 BEAST_EXPECT(st[sf1Outer] == 1);
517 BEAST_EXPECT(*st[~sf1Outer] == 1);
518 BEAST_EXPECT(!!st[~sf1Outer]);
520 BEAST_EXPECT(st[sf1Outer] == 0);
521 BEAST_EXPECT(*st[~sf1Outer] == 0);
522 BEAST_EXPECT(!!st[~sf1Outer]);
524 BEAST_EXPECT(st[sf2Outer] == 2);
525 BEAST_EXPECT(*st[~sf2Outer] == 2);
526 BEAST_EXPECT(!!st[~sf2Outer]);
527 st[~sf2Outer] = std::nullopt;
528 except([&]() {
return *st[~sf2Outer]; });
529 BEAST_EXPECT(!st[~sf2Outer]);
531 BEAST_EXPECT(st[sf3Outer] == 3);
532 BEAST_EXPECT(*st[~sf3Outer] == 3);
533 BEAST_EXPECT(!!st[~sf3Outer]);
535 BEAST_EXPECT(st[sf3Outer] == 2);
536 BEAST_EXPECT(*st[~sf3Outer] == 2);
537 BEAST_EXPECT(!!st[~sf3Outer]);
539 BEAST_EXPECT(st[sf3Outer] == 0);
540 BEAST_EXPECT(*st[~sf3Outer] == 0);
541 BEAST_EXPECT(!!st[~sf3Outer]);
542 except([&]() { st[~sf3Outer] = std::nullopt; });
543 BEAST_EXPECT(st[sf3Outer] == 0);
544 BEAST_EXPECT(*st[~sf3Outer] == 0);
545 BEAST_EXPECT(!!st[~sf3Outer]);
552 auto const v = ~st[~sf1Outer];
576 BEAST_EXPECT(!b.
empty());
577 st[sf4] = std::move(b);
578 BEAST_EXPECT(b.
empty());
579 BEAST_EXPECT(
Slice(st[sf4]).size() == 1);
580 st[~sf4] = std::nullopt;
581 BEAST_EXPECT(!~st[~sf4]);
584 BEAST_EXPECT(b.
size() == 2);
585 BEAST_EXPECT(
Slice(st[sf4]).size() == 2);
587 BEAST_EXPECT(
Slice(st[sf4]).size() == 2);
588 BEAST_EXPECT(
Slice(st[sf5]).size() == 2);
592 BEAST_EXPECT(st[sf5] ==
Slice{});
593 BEAST_EXPECT(!!st[~sf5]);
594 BEAST_EXPECT(!!~st[~sf5]);
596 st[sf5] = std::move(b);
597 BEAST_EXPECT(b.
empty());
598 BEAST_EXPECT(
Slice(st[sf5]).size() == 1);
599 st[~sf4] = std::nullopt;
600 BEAST_EXPECT(!~st[~sf4]);
608 BEAST_EXPECT(!st[~sf5]);
613 st[~sf5] = std::nullopt;
616 BEAST_EXPECT(pk.size() == 0);
629 st[sf] = std::move(v);
630 auto const& cst = st;
631 BEAST_EXPECT(cst[sf].size() == 2);
632 BEAST_EXPECT(cst[~sf]->size() == 2);
633 BEAST_EXPECT(cst[sf][0] == 1);
634 BEAST_EXPECT(cst[sf][1] == 2);
655 BEAST_EXPECT(cst[sf1].size() == 0);
656 BEAST_EXPECT(!cst[~sf2]);
657 BEAST_EXPECT(cst[sf3].size() == 0);
661 BEAST_EXPECT(cst[sf1].size() == 1);
662 BEAST_EXPECT(cst[sf1][0] ==
uint256{1});
664 BEAST_EXPECT(cst[sf2].size() == 1);
665 BEAST_EXPECT(cst[sf2][0] ==
uint256{1});
666 st[~sf2] = std::nullopt;
667 BEAST_EXPECT(!st[~sf2]);
669 BEAST_EXPECT(cst[sf3].size() == 1);
670 BEAST_EXPECT(cst[sf3][0] ==
uint256{1});
672 BEAST_EXPECT(cst[sf3].size() == 0);
679 testcase(
"Malformed serialized forms");
684 {0xe9, 0x12, 0xab, 0xcd, 0x12, 0xfe, 0xdc}};
686 auto obj = std::make_shared<STArray>(sit,
sfMetadata);
691 BEAST_EXPECT(strcmp(e.
what(),
"Duplicate field detected") == 0);
698 auto obj = std::make_shared<STObject>(sit,
sfMetadata);
703 BEAST_EXPECT(strcmp(e.
what(),
"Duplicate field detected") == 0);