21#include <xrpl/beast/unit_test.h>
22#include <xrpl/json/json_reader.h>
23#include <xrpl/json/to_string.h>
24#include <xrpl/protocol/SecretKey.h>
25#include <xrpl/protocol/jss.h>
26#include <xrpl/protocol/st.h>
47 testcase(
"parse json array invalid children");
63 "\"ModifiedNode\":{\"Sequence\":1}, "
64 "\"DeletedNode\":{\"Sequence\":1}"
72 BEAST_EXPECT(!parsed.
object);
86 "{\"Template\":[{\"ModifiedNode\":{\"Sequence\":1}}]}");
93 BEAST_EXPECT(parsed.
object);
96 BEAST_EXPECT(serialized == json);
100 fail(
"Couldn't parse json: " + json);
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.");
246 except<std::runtime_error>(
255 BEAST_EXPECT(shouldBeInvalid ==
sfInvalid);
257 testInvalid(STI_VL, 255);
258 testInvalid(STI_UINT256, 255);
259 testInvalid(STI_UINT32, 255);
260 testInvalid(STI_VECTOR256, 255);
261 testInvalid(STI_OBJECT, 255);
265 except<std::runtime_error>(
270 except<std::runtime_error>([&]() {
279 SField const& sfTestVL = sfMasterSignature;
280 SField const& sfTestH256 = sfCheckID;
281 SField const& sfTestU32 = sfSettleDelay;
282 SField const& sfTestV256 = sfAmendments;
283 SField const& sfTestObject = sfMajority;
293 STObject object1(elements, sfTestObject);
316 fail(
"STObject error 4");
337 unexpected(copy.isFieldPresent(sfTestH256),
"STObject error 9");
341 "STObject error 10");
343 copy.setFieldU32(sfTestU32, 1);
347 "STObject error 11");
349 for (
int i = 0; i < 1000; i++)
359 STObject object3(elements, it, sfTestObject);
369 for (
int i = 0; i < uints.
capacity(); ++i)
379 STObject object3(elements, it, sfTestObject);
384 BEAST_EXPECT(uints1 == uints3);
394 auto const& sf1Outer = sfSequence;
395 auto const& sf2Outer = sfExpiration;
396 auto const& sf3Outer = sfQualityIn;
397 auto const& sf4Outer = sfAmount;
398 auto const& sf4 = sfSignature;
399 auto const& sf5 = sfPublicKey;
404 auto const st = [&]() {
411 BEAST_EXPECT(st[sf1Outer] == 1);
412 BEAST_EXPECT(st[sf2Outer] == 2);
413 except<STObject::FieldErr>([&]() { st[sf3Outer]; });
414 BEAST_EXPECT(*st[~sf1Outer] == 1);
415 BEAST_EXPECT(*st[~sf2Outer] == 2);
416 BEAST_EXPECT(st[~sf3Outer] == std::nullopt);
417 BEAST_EXPECT(!!st[~sf1Outer]);
418 BEAST_EXPECT(!!st[~sf2Outer]);
419 BEAST_EXPECT(!st[~sf3Outer]);
420 BEAST_EXPECT(st[sf1Outer] != st[sf2Outer]);
421 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]);
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]);
498 BEAST_EXPECT(st[sf1Outer] == 5);
500 BEAST_EXPECT(st[sf4Outer] ==
STAmount{1});
502 BEAST_EXPECT(st[sf4Outer] ==
STAmount{2});
504 BEAST_EXPECT(st[sf1Outer] == 4);
506 BEAST_EXPECT(st[sf4Outer] ==
STAmount{1});
513 BEAST_EXPECT(!!st[~sf1Outer]);
514 BEAST_EXPECT(st[~sf1Outer] != std::nullopt);
515 BEAST_EXPECT(st[sf1Outer] == 0);
516 BEAST_EXPECT(*st[~sf1Outer] == 0);
517 BEAST_EXPECT(!st[~sf2Outer]);
518 BEAST_EXPECT(st[~sf2Outer] == std::nullopt);
519 except([&]() {
return st[sf2Outer] == 0; });
520 BEAST_EXPECT(!!st[~sf3Outer]);
521 BEAST_EXPECT(st[~sf3Outer] != std::nullopt);
522 BEAST_EXPECT(st[sf3Outer] == 0);
523 except([&]() { st[~sf1Outer] = std::nullopt; });
525 BEAST_EXPECT(st[sf1Outer] == 1);
526 BEAST_EXPECT(*st[~sf1Outer] == 1);
527 BEAST_EXPECT(!!st[~sf1Outer]);
529 BEAST_EXPECT(st[sf1Outer] == 0);
530 BEAST_EXPECT(*st[~sf1Outer] == 0);
531 BEAST_EXPECT(!!st[~sf1Outer]);
533 BEAST_EXPECT(st[sf2Outer] == 2);
534 BEAST_EXPECT(*st[~sf2Outer] == 2);
535 BEAST_EXPECT(!!st[~sf2Outer]);
536 st[~sf2Outer] = std::nullopt;
537 except([&]() {
return *st[~sf2Outer]; });
538 BEAST_EXPECT(!st[~sf2Outer]);
540 BEAST_EXPECT(st[sf3Outer] == 3);
541 BEAST_EXPECT(*st[~sf3Outer] == 3);
542 BEAST_EXPECT(!!st[~sf3Outer]);
544 BEAST_EXPECT(st[sf3Outer] == 2);
545 BEAST_EXPECT(*st[~sf3Outer] == 2);
546 BEAST_EXPECT(!!st[~sf3Outer]);
548 BEAST_EXPECT(st[sf3Outer] == 0);
549 BEAST_EXPECT(*st[~sf3Outer] == 0);
550 BEAST_EXPECT(!!st[~sf3Outer]);
551 except([&]() { st[~sf3Outer] = std::nullopt; });
552 BEAST_EXPECT(st[sf3Outer] == 0);
553 BEAST_EXPECT(*st[~sf3Outer] == 0);
554 BEAST_EXPECT(!!st[~sf3Outer]);
556 BEAST_EXPECT(st[sf1Outer] == 1);
558 BEAST_EXPECT(st[sf4Outer] ==
STAmount{1});
560 BEAST_EXPECT(st[sf4Outer] ==
STAmount{2});
562 BEAST_EXPECT(st[sf1Outer] == 0);
564 BEAST_EXPECT(st[sf4Outer] ==
STAmount{1});
571 auto const v = ~st[~sf1Outer];
597 BEAST_EXPECT(!b.
empty());
598 st[sf4] = std::move(b);
599 BEAST_EXPECT(b.
empty());
600 BEAST_EXPECT(
Slice(st[sf4]).size() == 1);
601 st[~sf4] = std::nullopt;
602 BEAST_EXPECT(!~st[~sf4]);
605 BEAST_EXPECT(b.
size() == 2);
606 BEAST_EXPECT(
Slice(st[sf4]).size() == 2);
608 BEAST_EXPECT(
Slice(st[sf4]).size() == 2);
609 BEAST_EXPECT(
Slice(st[sf5]).size() == 2);
613 BEAST_EXPECT(st[sf5] ==
Slice{});
614 BEAST_EXPECT(!!st[~sf5]);
615 BEAST_EXPECT(!!~st[~sf5]);
617 st[sf5] = std::move(b);
618 BEAST_EXPECT(b.
empty());
619 BEAST_EXPECT(
Slice(st[sf5]).size() == 1);
620 st[~sf4] = std::nullopt;
621 BEAST_EXPECT(!~st[~sf4]);
629 BEAST_EXPECT(!st[~sf5]);
633 st[~sf5] = std::nullopt;
639 auto const& sf = sfIndexes;
645 st[sf] = std::move(v);
646 auto const& cst = st;
647 BEAST_EXPECT(cst[sf].size() == 2);
648 BEAST_EXPECT(cst[~sf]->size() == 2);
649 BEAST_EXPECT(cst[sf][0] == 1);
650 BEAST_EXPECT(cst[sf][1] == 2);
653 decltype(cst[sfIndexes]),
661 auto const& sf1 = sfIndexes;
662 auto const& sf2 = sfHashes;
663 auto const& sf3 = sfAmendments;
672 BEAST_EXPECT(cst[sf1].size() == 0);
673 BEAST_EXPECT(!cst[~sf2]);
674 BEAST_EXPECT(cst[sf3].size() == 0);
678 BEAST_EXPECT(cst[sf1].size() == 1);
679 BEAST_EXPECT(cst[sf1][0] ==
uint256{1});
681 BEAST_EXPECT(cst[sf2].size() == 1);
682 BEAST_EXPECT(cst[sf2][0] ==
uint256{1});
683 st[~sf2] = std::nullopt;
684 BEAST_EXPECT(!st[~sf2]);
686 BEAST_EXPECT(cst[sf3].size() == 1);
687 BEAST_EXPECT(cst[sf3][0] ==
uint256{1});
689 BEAST_EXPECT(cst[sf3].size() == 0);
696 testcase(
"Malformed serialized forms");
701 {0xe9, 0x12, 0xab, 0xcd, 0x12, 0xfe, 0xdc}};
703 auto obj = std::make_shared<STArray>(sit, sfMetadata);
708 BEAST_EXPECT(strcmp(e.
what(),
"Duplicate field detected") == 0);
715 auto obj = std::make_shared<STObject>(sit, sfMetadata);
720 BEAST_EXPECT(strcmp(e.
what(),
"Duplicate field detected") == 0);
Unserialize a JSON document into a Value.
bool parse(std::string const &document, Value &root)
Read a Value from a JSON document.
log_os< char > log
Logging output stream.
void pass()
Record a successful test condition.
bool unexpected(Condition shouldBeFalse, String const &reason)
testcase_t testcase
Memberspace for declaring test cases.
bool unexcept(F &&f, String const &reason)
bool except(F &&f, String const &reason)
void fail(String const &reason, char const *file, int line)
Record a failure.
Like std::vector<char> but better.
std::size_t size() const noexcept
Returns the number of bytes in the buffer.
bool empty() const noexcept
static const SField & getField(int fieldCode)
Defines the fields and their attributes within a STObject.
void testParseJSONEdgeCases()
void testParseJSONArrayWithInvalidChildrenObjects()
void run() override
Runs the suite.
void testParseJSONArray()
bool parseJSONString(std::string const &json, Json::Value &to)
Blob getFieldVL(SField const &field) const
const STVector256 & getFieldV256(SField const &field) const
void makeFieldAbsent(SField const &field)
Serializer getSerializer() const
STBase * makeFieldPresent(SField const &field)
void add(Serializer &s) const override
bool isFieldPresent(SField const &field) const
void setFieldV256(SField const &field, STVector256 const &v)
Json::Value getJson(JsonOptions options) const override
void setFieldU32(SField const &field, std::uint32_t)
void setFieldVL(SField const &field, Blob const &)
std::uint32_t getFlags() const
uint256 getFieldH256(SField const &field) const
Holds the serialized result of parsing an input JSON object.
std::optional< STObject > object
The STObject if the parse was successful.
Json::Value error
On failure, an appropriate set of error values.
Slice slice() const noexcept
An immutable linear range of bytes.
A transaction testing environment.
T emplace_back(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
base_uint< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
std::pair< PublicKey, SecretKey > generateKeyPair(KeyType type, Seed const &seed)
Generate a key pair deterministically.
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
std::string to_string(base_uint< Bits, Tag > const &a)
Seed generateSeed(std::string const &passPhrase)
Generate a seed deterministically.