Fix discrepancies in ledger_entry (#739)

Fixes #738
This commit is contained in:
Alex Kremer
2023-07-07 12:04:59 +01:00
committed by GitHub
parent dcbc4577c2
commit 9f4f5d319e
2 changed files with 63 additions and 55 deletions

View File

@@ -97,16 +97,22 @@ public:
return MaybeError{};
}};
static auto const malformedRequestHexStringValidator =
validation::WithCustomError{validation::Uint256HexStringValidator, Status(ClioError::rpcMALFORMED_REQUEST)};
static auto const malformedRequestIntValidator =
validation::WithCustomError{validation::Type<uint32_t>{}, Status(ClioError::rpcMALFORMED_REQUEST)};
static auto const rpcSpec = RpcSpec{
{JS(binary), validation::Type<bool>{}},
{JS(ledger_hash), validation::Uint256HexStringValidator},
{JS(ledger_index), validation::LedgerIndexValidator},
{JS(index), validation::Uint256HexStringValidator},
{JS(index), malformedRequestHexStringValidator},
{JS(account_root), validation::AccountBase58Validator},
{JS(check), validation::Uint256HexStringValidator},
{JS(check), malformedRequestHexStringValidator},
{JS(deposit_preauth),
validation::Type<std::string, boost::json::object>{},
validation::IfType<std::string>{validation::Uint256HexStringValidator},
validation::IfType<std::string>{malformedRequestHexStringValidator},
validation::IfType<boost::json::object>{
validation::Section{
{JS(owner),
@@ -118,33 +124,33 @@ public:
}},
{JS(directory),
validation::Type<std::string, boost::json::object>{},
validation::IfType<std::string>{validation::Uint256HexStringValidator},
validation::IfType<std::string>{malformedRequestHexStringValidator},
validation::IfType<boost::json::object>{validation::Section{
{JS(owner), validation::AccountBase58Validator},
{JS(dir_root), validation::Uint256HexStringValidator},
{JS(sub_index), validation::Type<uint32_t>{}}}}},
{JS(sub_index), malformedRequestIntValidator}}}},
{JS(escrow),
validation::Type<std::string, boost::json::object>{},
validation::IfType<std::string>{validation::Uint256HexStringValidator},
validation::IfType<std::string>{malformedRequestHexStringValidator},
validation::IfType<boost::json::object>{
validation::Section{
{JS(owner),
validation::Required{},
validation::WithCustomError{
validation::AccountBase58Validator, Status(ClioError::rpcMALFORMED_OWNER)}},
{JS(seq), validation::Required{}, validation::Type<uint32_t>{}},
{JS(seq), validation::Required{}, malformedRequestIntValidator},
},
}},
{JS(offer),
validation::Type<std::string, boost::json::object>{},
validation::IfType<std::string>{validation::Uint256HexStringValidator},
validation::IfType<std::string>{malformedRequestHexStringValidator},
validation::IfType<boost::json::object>{
validation::Section{
{JS(account), validation::Required{}, validation::AccountBase58Validator},
{JS(seq), validation::Required{}, validation::Type<uint32_t>{}},
{JS(seq), validation::Required{}, malformedRequestIntValidator},
},
}},
{JS(payment_channel), validation::Uint256HexStringValidator},
{JS(payment_channel), malformedRequestHexStringValidator},
{JS(ripple_state),
validation::Type<boost::json::object>{},
validation::Section{
@@ -153,14 +159,14 @@ public:
}},
{JS(ticket),
validation::Type<std::string, boost::json::object>{},
validation::IfType<std::string>{validation::Uint256HexStringValidator},
validation::IfType<std::string>{malformedRequestHexStringValidator},
validation::IfType<boost::json::object>{
validation::Section{
{JS(account), validation::Required{}, validation::AccountBase58Validator},
{JS(ticket_seq), validation::Required{}, validation::Type<uint32_t>{}},
{JS(ticket_seq), validation::Required{}, malformedRequestIntValidator},
},
}},
{JS(nft_page), validation::Uint256HexStringValidator},
{JS(nft_page), malformedRequestHexStringValidator},
};
return rpcSpec;

View File

@@ -96,11 +96,14 @@ generateTestValuesForParametersTest()
"account_rootNotString"},
ParamTestCaseBundle{
"UnknownOption",
"InvalidLedgerIndex",
R"({
"ledger_index": "wrong"
})",
"unknownOption",
"Unknown option."},
"invalidParams",
"ledgerIndexMalformed"},
ParamTestCaseBundle{"UnknownOption", R"({})", "unknownOption", "Unknown option."},
ParamTestCaseBundle{
"InvalidDepositPreauthType",
@@ -115,14 +118,13 @@ generateTestValuesForParametersTest()
R"({
"deposit_preauth": "invalid"
})",
"invalidParams",
"deposit_preauthMalformed"},
"malformedRequest",
"Malformed request."},
ParamTestCaseBundle{
"InvalidDepositPreauthEmtpyJson",
R"({
"deposit_preauth": {
}
"deposit_preauth": {}
})",
"invalidParams",
"Required field 'owner' missing"},
@@ -175,8 +177,8 @@ generateTestValuesForParametersTest()
R"({
"ticket": "invalid"
})",
"invalidParams",
"ticketMalformed"},
"malformedRequest",
"Malformed request."},
ParamTestCaseBundle{
"InvalidTicketEmptyJson",
@@ -218,8 +220,8 @@ generateTestValuesForParametersTest()
}}
}})",
ACCOUNT),
"invalidParams",
"Invalid parameters."},
"malformedRequest",
"Malformed request."},
ParamTestCaseBundle{
"InvalidOfferType",
@@ -234,8 +236,8 @@ generateTestValuesForParametersTest()
R"({
"offer": "invalid"
})",
"invalidParams",
"offerMalformed"},
"malformedRequest",
"Malformed request."},
ParamTestCaseBundle{
"InvalidOfferEmptyJson",
@@ -277,8 +279,8 @@ generateTestValuesForParametersTest()
}}
}})",
ACCOUNT),
"invalidParams",
"Invalid parameters."},
"malformedRequest",
"Malformed request."},
ParamTestCaseBundle{
"InvalidEscrowType",
@@ -293,8 +295,8 @@ generateTestValuesForParametersTest()
R"({
"escrow": "invalid"
})",
"invalidParams",
"escrowMalformed"},
"malformedRequest",
"Malformed request."},
ParamTestCaseBundle{
"InvalidEscrowEmptyJson",
@@ -336,8 +338,8 @@ generateTestValuesForParametersTest()
}}
}})",
ACCOUNT),
"invalidParams",
"Invalid parameters."},
"malformedRequest",
"Malformed request."},
ParamTestCaseBundle{
"InvalidRippleStateType",
@@ -360,8 +362,7 @@ generateTestValuesForParametersTest()
ParamTestCaseBundle{
"InvalidRippleStateEmtpyJson",
R"({
"ripple_state": {
}
"ripple_state": {}
})",
"invalidParams",
"Required field 'accounts' missing"},
@@ -459,8 +460,8 @@ generateTestValuesForParametersTest()
R"({
"directory": "123"
})",
"invalidParams",
"directoryMalformed"},
"malformedRequest",
"Malformed request."},
ParamTestCaseBundle{
"InvalidDirectoryEmtpyJson",
@@ -534,8 +535,9 @@ generateTestValuesForParametersTest()
}}
}})",
INDEX1),
"invalidParams",
"Invalid parameters."}};
"malformedRequest",
"Malformed request."},
};
}
INSTANTIATE_TEST_CASE_P(
@@ -573,11 +575,11 @@ struct IndexTest : public HandlerBaseTest, public WithParamInterface<std::string
};
};
// content of index, payment_channel, check, nft_page fields is ledger index
// content of index, payment_channel, nft_page and check fields is ledger index.
INSTANTIATE_TEST_CASE_P(
RPCLedgerEntryGroup3,
IndexTest,
Values("index", "payment_channel", "check", "nft_page"),
Values("index", "nft_page", "payment_channel", "check"),
IndexTest::NameGenerator{});
TEST_P(IndexTest, InvalidIndexUint256)
@@ -594,8 +596,8 @@ TEST_P(IndexTest, InvalidIndexUint256)
ASSERT_FALSE(output);
auto const err = RPC::makeError(output.error());
EXPECT_EQ(err.at("error").as_string(), "invalidParams");
EXPECT_EQ(err.at("error_message").as_string(), index + "Malformed");
EXPECT_EQ(err.at("error").as_string(), "malformedRequest");
EXPECT_EQ(err.at("error_message").as_string(), "Malformed request.");
});
}
@@ -613,8 +615,8 @@ TEST_P(IndexTest, InvalidIndexNotString)
ASSERT_FALSE(output);
auto const err = RPC::makeError(output.error());
EXPECT_EQ(err.at("error").as_string(), "invalidParams");
EXPECT_EQ(err.at("error_message").as_string(), index + "NotString");
EXPECT_EQ(err.at("error").as_string(), "malformedRequest");
EXPECT_EQ(err.at("error_message").as_string(), "Malformed request.");
});
}