From 4dadab63e346b3b1b9376d7482bff4ef96993b52 Mon Sep 17 00:00:00 2001 From: Peter Chen Date: Tue, 13 Jun 2023 10:20:53 -0400 Subject: [PATCH 1/5] Changed error messages on AccountTx --- src/ripple/rpc/handlers/AccountTx.cpp | 29 +++++++++++++++-- src/ripple/rpc/impl/RPCHelpers.h | 2 +- src/test/rpc/AccountTx_test.cpp | 45 +++++++++++++++++++++++++-- 3 files changed, 71 insertions(+), 5 deletions(-) diff --git a/src/ripple/rpc/handlers/AccountTx.cpp b/src/ripple/rpc/handlers/AccountTx.cpp index f65657d92ea..bfbc76362a3 100644 --- a/src/ripple/rpc/handlers/AccountTx.cpp +++ b/src/ripple/rpc/handlers/AccountTx.cpp @@ -53,9 +53,23 @@ using LedgerSpecifier = RelationalDatabase::LedgerSpecifier; // parses args into a ledger specifier, or returns a Json object on error std::variant, Json::Value> -parseLedgerArgs(Json::Value const& params) +parseLedgerArgs(RPC::Context& context, Json::Value const& params) { Json::Value response; + // if ledger_index_min or max is specified, then ledger_hash or ledger_index + // should not be specified. Error out if it is + if (context.apiVersion > 1) + { + if ((params.isMember(jss::ledger_index_min) || + params.isMember(jss::ledger_index_max)) && + (params.isMember(jss::ledger_hash) || + params.isMember(jss::ledger_index))) + { + RPC::Status status{rpcINVALID_PARAMS, "invalidParams"}; + status.inject(response); + return response; + } + } if (params.isMember(jss::ledger_index_min) || params.isMember(jss::ledger_index_max)) { @@ -145,6 +159,17 @@ getLedgerRange( using T = std::decay_t; if constexpr (std::is_same_v) { + // if ledger_index_min or ledger_index_max is out of + // valid ledger range, error out. exclude -1 as + // it is a valid input + if (context.apiVersion > 1) + { + if ((ls.max > uValidatedMax && ls.max != -1) || + (ls.min < uValidatedMin && ls.min != 0)) + { + return rpcLGR_IDX_MALFORMED; + } + } if (ls.min > uValidatedMin) { uLedgerMin = ls.min; @@ -379,7 +404,7 @@ doAccountTxJson(RPC::JsonContext& context) args.account = *account; - auto parseRes = parseLedgerArgs(params); + auto parseRes = parseLedgerArgs(context, params); if (auto jv = std::get_if(&parseRes)) { return *jv; diff --git a/src/ripple/rpc/impl/RPCHelpers.h b/src/ripple/rpc/impl/RPCHelpers.h index 6184b357515..768374d5f48 100644 --- a/src/ripple/rpc/impl/RPCHelpers.h +++ b/src/ripple/rpc/impl/RPCHelpers.h @@ -241,7 +241,7 @@ extern beast::SemanticVersion const lastVersion; constexpr unsigned int apiInvalidVersion = 0; constexpr unsigned int apiVersionIfUnspecified = 1; constexpr unsigned int apiMinimumSupportedVersion = 1; -constexpr unsigned int apiMaximumSupportedVersion = 1; +constexpr unsigned int apiMaximumSupportedVersion = 2; constexpr unsigned int apiBetaVersion = 2; static_assert(apiMinimumSupportedVersion >= apiVersionIfUnspecified); diff --git a/src/test/rpc/AccountTx_test.cpp b/src/test/rpc/AccountTx_test.cpp index 75147875d1a..fdafd2d391d 100644 --- a/src/test/rpc/AccountTx_test.cpp +++ b/src/test/rpc/AccountTx_test.cpp @@ -166,11 +166,21 @@ class AccountTx_test : public beast::unit_test::suite p[jss::ledger_index_min] = 0; p[jss::ledger_index_max] = 100; - BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); + RPC::apiMaximumSupportedVersion == 1 + ? BEAST_EXPECT( + hasTxs(env.rpc("json", "account_tx", to_string(p)))) + : BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + rpcLGR_IDX_MALFORMED)); p[jss::ledger_index_min] = 1; p[jss::ledger_index_max] = 2; - BEAST_EXPECT(noTxs(env.rpc("json", "account_tx", to_string(p)))); + RPC::apiMaximumSupportedVersion == 1 + ? BEAST_EXPECT( + noTxs(env.rpc("json", "account_tx", to_string(p)))) + : BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + rpcLGR_IDX_MALFORMED)); p[jss::ledger_index_min] = 2; p[jss::ledger_index_max] = 1; @@ -187,6 +197,14 @@ class AccountTx_test : public beast::unit_test::suite BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); p[jss::ledger_index_min] = 1; + RPC::apiMaximumSupportedVersion == 1 + ? BEAST_EXPECT( + hasTxs(env.rpc("json", "account_tx", to_string(p)))) + : BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + rpcLGR_IDX_MALFORMED)); + + p[jss::ledger_index_min] = 2; BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); p[jss::ledger_index_min] = env.current()->info().seq; @@ -203,6 +221,14 @@ class AccountTx_test : public beast::unit_test::suite BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); p[jss::ledger_index_max] = env.current()->info().seq; + RPC::apiMaximumSupportedVersion == 1 + ? BEAST_EXPECT( + hasTxs(env.rpc("json", "account_tx", to_string(p)))) + : BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + rpcLGR_IDX_MALFORMED)); + + p[jss::ledger_index_max] = 3; BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); p[jss::ledger_index_max] = env.closed()->info().seq; @@ -212,6 +238,21 @@ class AccountTx_test : public beast::unit_test::suite BEAST_EXPECT(noTxs(env.rpc("json", "account_tx", to_string(p)))); } + // Ledger index max/min/index + // ERRORS out with invalid Parenthesis + { + Json::Value p{jParms}; + p[jss::ledger_index_max] = -1; + p[jss::ledger_index_min] = -1; + p[jss::ledger_index] = -1; + RPC::apiMaximumSupportedVersion == 1 + ? BEAST_EXPECT( + hasTxs(env.rpc("json", "account_tx", to_string(p)))) + : BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + rpcINVALID_PARAMS)); + } + // Ledger Sequence { Json::Value p{jParms}; From 2f3c7e38cf5d2774207987b2d1c7acebf2c65ecc Mon Sep 17 00:00:00 2001 From: Peter Chen Date: Wed, 14 Jun 2023 10:48:24 -0400 Subject: [PATCH 2/5] Fixed unit test based on comments given --- src/ripple/rpc/impl/RPCHelpers.h | 2 +- src/test/rpc/AccountTx_test.cpp | 127 ++++++++++++++++++++----------- 2 files changed, 85 insertions(+), 44 deletions(-) diff --git a/src/ripple/rpc/impl/RPCHelpers.h b/src/ripple/rpc/impl/RPCHelpers.h index 768374d5f48..6184b357515 100644 --- a/src/ripple/rpc/impl/RPCHelpers.h +++ b/src/ripple/rpc/impl/RPCHelpers.h @@ -241,7 +241,7 @@ extern beast::SemanticVersion const lastVersion; constexpr unsigned int apiInvalidVersion = 0; constexpr unsigned int apiVersionIfUnspecified = 1; constexpr unsigned int apiMinimumSupportedVersion = 1; -constexpr unsigned int apiMaximumSupportedVersion = 2; +constexpr unsigned int apiMaximumSupportedVersion = 1; constexpr unsigned int apiBetaVersion = 2; static_assert(apiMinimumSupportedVersion >= apiVersionIfUnspecified); diff --git a/src/test/rpc/AccountTx_test.cpp b/src/test/rpc/AccountTx_test.cpp index fdafd2d391d..9aeef8e1097 100644 --- a/src/test/rpc/AccountTx_test.cpp +++ b/src/test/rpc/AccountTx_test.cpp @@ -143,6 +143,7 @@ class AccountTx_test : public beast::unit_test::suite }; Json::Value jParms; + jParms[jss::api_version] = 1; BEAST_EXPECT(isErr( env.rpc("json", "account_tx", to_string(jParms)), @@ -166,27 +167,17 @@ class AccountTx_test : public beast::unit_test::suite p[jss::ledger_index_min] = 0; p[jss::ledger_index_max] = 100; - RPC::apiMaximumSupportedVersion == 1 - ? BEAST_EXPECT( - hasTxs(env.rpc("json", "account_tx", to_string(p)))) - : BEAST_EXPECT(isErr( - env.rpc("json", "account_tx", to_string(p)), - rpcLGR_IDX_MALFORMED)); + BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); p[jss::ledger_index_min] = 1; p[jss::ledger_index_max] = 2; - RPC::apiMaximumSupportedVersion == 1 - ? BEAST_EXPECT( - noTxs(env.rpc("json", "account_tx", to_string(p)))) - : BEAST_EXPECT(isErr( - env.rpc("json", "account_tx", to_string(p)), - rpcLGR_IDX_MALFORMED)); + BEAST_EXPECT(noTxs(env.rpc("json", "account_tx", to_string(p)))); p[jss::ledger_index_min] = 2; p[jss::ledger_index_max] = 1; BEAST_EXPECT(isErr( env.rpc("json", "account_tx", to_string(p)), - (RPC::apiMaximumSupportedVersion == 1 ? rpcLGR_IDXS_INVALID + (RPC::apiMaximumSupportedVersion == 1 ? rpcLGR_IDXS_INVALID : rpcINVALID_LGR_RANGE))); } @@ -197,20 +188,12 @@ class AccountTx_test : public beast::unit_test::suite BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); p[jss::ledger_index_min] = 1; - RPC::apiMaximumSupportedVersion == 1 - ? BEAST_EXPECT( - hasTxs(env.rpc("json", "account_tx", to_string(p)))) - : BEAST_EXPECT(isErr( - env.rpc("json", "account_tx", to_string(p)), - rpcLGR_IDX_MALFORMED)); - - p[jss::ledger_index_min] = 2; BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); p[jss::ledger_index_min] = env.current()->info().seq; BEAST_EXPECT(isErr( env.rpc("json", "account_tx", to_string(p)), - (RPC::apiMaximumSupportedVersion == 1 ? rpcLGR_IDXS_INVALID + (RPC::apiMaximumSupportedVersion == 1 ? rpcLGR_IDXS_INVALID : rpcINVALID_LGR_RANGE))); } @@ -221,12 +204,7 @@ class AccountTx_test : public beast::unit_test::suite BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); p[jss::ledger_index_max] = env.current()->info().seq; - RPC::apiMaximumSupportedVersion == 1 - ? BEAST_EXPECT( - hasTxs(env.rpc("json", "account_tx", to_string(p)))) - : BEAST_EXPECT(isErr( - env.rpc("json", "account_tx", to_string(p)), - rpcLGR_IDX_MALFORMED)); + BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); p[jss::ledger_index_max] = 3; BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); @@ -238,21 +216,6 @@ class AccountTx_test : public beast::unit_test::suite BEAST_EXPECT(noTxs(env.rpc("json", "account_tx", to_string(p)))); } - // Ledger index max/min/index - // ERRORS out with invalid Parenthesis - { - Json::Value p{jParms}; - p[jss::ledger_index_max] = -1; - p[jss::ledger_index_min] = -1; - p[jss::ledger_index] = -1; - RPC::apiMaximumSupportedVersion == 1 - ? BEAST_EXPECT( - hasTxs(env.rpc("json", "account_tx", to_string(p)))) - : BEAST_EXPECT(isErr( - env.rpc("json", "account_tx", to_string(p)), - rpcINVALID_PARAMS)); - } - // Ledger Sequence { Json::Value p{jParms}; @@ -285,6 +248,83 @@ class AccountTx_test : public beast::unit_test::suite } } + void + testParametersApiV2() + { + using namespace test::jtx; + // test for API version 2 + Env env{*this, envconfig([](std::unique_ptr c) { + c->loadFromString("\n[beta_rpc_api]\n1\n"); + return c; + })}; + Account A1{"A1"}; + env.fund(XRP(10000), A1); + env.close(); + + auto hasTxs = [](Json::Value const& j) { + return j.isMember(jss::result) && + (j[jss::result][jss::status] == "success") && + (j[jss::result][jss::transactions].size() == 2) && + (j[jss::result][jss::transactions][0u][jss::tx] + [jss::TransactionType] == jss::AccountSet) && + (j[jss::result][jss::transactions][1u][jss::tx] + [jss::TransactionType] == jss::Payment); + }; + + auto isErr = [](Json::Value const& j, error_code_i code) { + return j.isMember(jss::result) && + j[jss::result].isMember(jss::error) && + j[jss::result][jss::error] == RPC::get_error_info(code).token; + }; + + Json::Value jParms; + jParms[jss::api_version] = 2; + jParms[jss::account] = A1.human(); + + // Ledger index max/min/index all specified + // ERRORS out with invalid Parenthesis + { + Json::Value p{jParms}; + + p[jss::ledger_index_max] = -1; + p[jss::ledger_index_min] = -1; + p[jss::ledger_index] = -1; + + BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + rpcINVALID_PARAMS)); + } + + // Ledger index min/max only + { + Json::Value p{jParms}; + p[jss::ledger_index_max] = 100; + p[jss::ledger_index_min] = 0; + BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + rpcLGR_IDX_MALFORMED)); + + p[jss::ledger_index_max] = -1; + p[jss::ledger_index_min] = -1; + BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); + + p[jss::ledger_index_min] = 2; + p[jss::ledger_index_max] = 1; + BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + rpcINVALID_LGR_RANGE)); + } + + // Ledger index max only + { + Json::Value p{jParms}; + p[jss::ledger_index_max] = env.current()->info().seq; + BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + rpcLGR_IDX_MALFORMED)); + } + } + void testContents() { @@ -635,6 +675,7 @@ class AccountTx_test : public beast::unit_test::suite run() override { testParameters(); + testParametersApiV2(); testContents(); testAccountDelete(); } From f12318879d382a0b474574bac2f6310e297e4ea1 Mon Sep 17 00:00:00 2001 From: Peter Chen Date: Wed, 14 Jun 2023 10:56:43 -0400 Subject: [PATCH 3/5] Added clang format --- src/test/rpc/AccountTx_test.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/rpc/AccountTx_test.cpp b/src/test/rpc/AccountTx_test.cpp index 9aeef8e1097..bed612a4388 100644 --- a/src/test/rpc/AccountTx_test.cpp +++ b/src/test/rpc/AccountTx_test.cpp @@ -177,7 +177,7 @@ class AccountTx_test : public beast::unit_test::suite p[jss::ledger_index_max] = 1; BEAST_EXPECT(isErr( env.rpc("json", "account_tx", to_string(p)), - (RPC::apiMaximumSupportedVersion == 1 ? rpcLGR_IDXS_INVALID + (RPC::apiMaximumSupportedVersion == 1 ? rpcLGR_IDXS_INVALID : rpcINVALID_LGR_RANGE))); } @@ -193,7 +193,7 @@ class AccountTx_test : public beast::unit_test::suite p[jss::ledger_index_min] = env.current()->info().seq; BEAST_EXPECT(isErr( env.rpc("json", "account_tx", to_string(p)), - (RPC::apiMaximumSupportedVersion == 1 ? rpcLGR_IDXS_INVALID + (RPC::apiMaximumSupportedVersion == 1 ? rpcLGR_IDXS_INVALID : rpcINVALID_LGR_RANGE))); } @@ -256,7 +256,7 @@ class AccountTx_test : public beast::unit_test::suite Env env{*this, envconfig([](std::unique_ptr c) { c->loadFromString("\n[beta_rpc_api]\n1\n"); return c; - })}; + })}; Account A1{"A1"}; env.fund(XRP(10000), A1); env.close(); @@ -276,7 +276,7 @@ class AccountTx_test : public beast::unit_test::suite j[jss::result].isMember(jss::error) && j[jss::result][jss::error] == RPC::get_error_info(code).token; }; - + Json::Value jParms; jParms[jss::api_version] = 2; jParms[jss::account] = A1.human(); From ac88045b19fb399dbe47e27135fab5d546c8f5b2 Mon Sep 17 00:00:00 2001 From: Peter Chen Date: Fri, 23 Jun 2023 10:24:08 -0400 Subject: [PATCH 4/5] changed unit test based on Ed's change --- src/test/rpc/AccountTx_test.cpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/test/rpc/AccountTx_test.cpp b/src/test/rpc/AccountTx_test.cpp index bed612a4388..9d928e8c1b0 100644 --- a/src/test/rpc/AccountTx_test.cpp +++ b/src/test/rpc/AccountTx_test.cpp @@ -253,10 +253,7 @@ class AccountTx_test : public beast::unit_test::suite { using namespace test::jtx; // test for API version 2 - Env env{*this, envconfig([](std::unique_ptr c) { - c->loadFromString("\n[beta_rpc_api]\n1\n"); - return c; - })}; + Env env{*this}; Account A1{"A1"}; env.fund(XRP(10000), A1); env.close(); From 86a9b31ca15681add370503d266cdad9d81064e9 Mon Sep 17 00:00:00 2001 From: Peter Chen Date: Tue, 27 Jun 2023 13:20:05 -0400 Subject: [PATCH 5/5] changed unittest based on Arihant's comment --- src/test/rpc/AccountTx_test.cpp | 310 ++++++++++++++++---------------- 1 file changed, 155 insertions(+), 155 deletions(-) diff --git a/src/test/rpc/AccountTx_test.cpp b/src/test/rpc/AccountTx_test.cpp index 9d928e8c1b0..2e09ad93b86 100644 --- a/src/test/rpc/AccountTx_test.cpp +++ b/src/test/rpc/AccountTx_test.cpp @@ -108,7 +108,7 @@ class AccountTx_test : public beast::unit_test::suite }; void - testParameters() + testParameters(unsigned int apiVersion) { using namespace test::jtx; @@ -143,182 +143,178 @@ class AccountTx_test : public beast::unit_test::suite }; Json::Value jParms; - jParms[jss::api_version] = 1; + jParms[jss::api_version] = apiVersion; - BEAST_EXPECT(isErr( - env.rpc("json", "account_tx", to_string(jParms)), - rpcINVALID_PARAMS)); - - jParms[jss::account] = "0xDEADBEEF"; - - BEAST_EXPECT(isErr( - env.rpc("json", "account_tx", to_string(jParms)), - rpcACT_MALFORMED)); - - jParms[jss::account] = A1.human(); - BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(jParms)))); - - // Ledger min/max index + if (apiVersion < 2) { - Json::Value p{jParms}; - p[jss::ledger_index_min] = -1; - p[jss::ledger_index_max] = -1; - BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); - - p[jss::ledger_index_min] = 0; - p[jss::ledger_index_max] = 100; - BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); - - p[jss::ledger_index_min] = 1; - p[jss::ledger_index_max] = 2; - BEAST_EXPECT(noTxs(env.rpc("json", "account_tx", to_string(p)))); - - p[jss::ledger_index_min] = 2; - p[jss::ledger_index_max] = 1; BEAST_EXPECT(isErr( - env.rpc("json", "account_tx", to_string(p)), - (RPC::apiMaximumSupportedVersion == 1 ? rpcLGR_IDXS_INVALID - : rpcINVALID_LGR_RANGE))); - } - - // Ledger index min only - { - Json::Value p{jParms}; - p[jss::ledger_index_min] = -1; - BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); + env.rpc("json", "account_tx", to_string(jParms)), + rpcINVALID_PARAMS)); - p[jss::ledger_index_min] = 1; - BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); + jParms[jss::account] = "0xDEADBEEF"; - p[jss::ledger_index_min] = env.current()->info().seq; BEAST_EXPECT(isErr( - env.rpc("json", "account_tx", to_string(p)), - (RPC::apiMaximumSupportedVersion == 1 ? rpcLGR_IDXS_INVALID - : rpcINVALID_LGR_RANGE))); - } + env.rpc("json", "account_tx", to_string(jParms)), + rpcACT_MALFORMED)); - // Ledger index max only - { - Json::Value p{jParms}; - p[jss::ledger_index_max] = -1; - BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); - - p[jss::ledger_index_max] = env.current()->info().seq; - BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); + jParms[jss::account] = A1.human(); + BEAST_EXPECT( + hasTxs(env.rpc("json", "account_tx", to_string(jParms)))); - p[jss::ledger_index_max] = 3; - BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); + // Ledger min/max index + { + Json::Value p{jParms}; + p[jss::ledger_index_min] = -1; + p[jss::ledger_index_max] = -1; + BEAST_EXPECT( + hasTxs(env.rpc("json", "account_tx", to_string(p)))); + + p[jss::ledger_index_min] = 0; + p[jss::ledger_index_max] = 100; + BEAST_EXPECT( + hasTxs(env.rpc("json", "account_tx", to_string(p)))); + + p[jss::ledger_index_min] = 1; + p[jss::ledger_index_max] = 2; + BEAST_EXPECT( + noTxs(env.rpc("json", "account_tx", to_string(p)))); + + p[jss::ledger_index_min] = 2; + p[jss::ledger_index_max] = 1; + BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + (RPC::apiMaximumSupportedVersion == 1 + ? rpcLGR_IDXS_INVALID + : rpcINVALID_LGR_RANGE))); + } - p[jss::ledger_index_max] = env.closed()->info().seq; - BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); + // Ledger index min only + { + Json::Value p{jParms}; + p[jss::ledger_index_min] = -1; + BEAST_EXPECT( + hasTxs(env.rpc("json", "account_tx", to_string(p)))); + + p[jss::ledger_index_min] = 1; + BEAST_EXPECT( + hasTxs(env.rpc("json", "account_tx", to_string(p)))); + + p[jss::ledger_index_min] = env.current()->info().seq; + BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + (RPC::apiMaximumSupportedVersion == 1 + ? rpcLGR_IDXS_INVALID + : rpcINVALID_LGR_RANGE))); + } - p[jss::ledger_index_max] = env.closed()->info().seq - 1; - BEAST_EXPECT(noTxs(env.rpc("json", "account_tx", to_string(p)))); - } + // Ledger index max only + { + Json::Value p{jParms}; + p[jss::ledger_index_max] = -1; + BEAST_EXPECT( + hasTxs(env.rpc("json", "account_tx", to_string(p)))); + + p[jss::ledger_index_max] = env.current()->info().seq; + BEAST_EXPECT( + hasTxs(env.rpc("json", "account_tx", to_string(p)))); + + p[jss::ledger_index_max] = 3; + BEAST_EXPECT( + hasTxs(env.rpc("json", "account_tx", to_string(p)))); + + p[jss::ledger_index_max] = env.closed()->info().seq; + BEAST_EXPECT( + hasTxs(env.rpc("json", "account_tx", to_string(p)))); + + p[jss::ledger_index_max] = env.closed()->info().seq - 1; + BEAST_EXPECT( + noTxs(env.rpc("json", "account_tx", to_string(p)))); + } - // Ledger Sequence - { - Json::Value p{jParms}; + // Ledger Sequence + { + Json::Value p{jParms}; - p[jss::ledger_index] = env.closed()->info().seq; - BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); + p[jss::ledger_index] = env.closed()->info().seq; + BEAST_EXPECT( + hasTxs(env.rpc("json", "account_tx", to_string(p)))); - p[jss::ledger_index] = env.closed()->info().seq - 1; - BEAST_EXPECT(noTxs(env.rpc("json", "account_tx", to_string(p)))); + p[jss::ledger_index] = env.closed()->info().seq - 1; + BEAST_EXPECT( + noTxs(env.rpc("json", "account_tx", to_string(p)))); - p[jss::ledger_index] = env.current()->info().seq; - BEAST_EXPECT(isErr( - env.rpc("json", "account_tx", to_string(p)), - rpcLGR_NOT_VALIDATED)); + p[jss::ledger_index] = env.current()->info().seq; + BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + rpcLGR_NOT_VALIDATED)); - p[jss::ledger_index] = env.current()->info().seq + 1; - BEAST_EXPECT(isErr( - env.rpc("json", "account_tx", to_string(p)), rpcLGR_NOT_FOUND)); - } + p[jss::ledger_index] = env.current()->info().seq + 1; + BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + rpcLGR_NOT_FOUND)); + } - // Ledger Hash - { - Json::Value p{jParms}; + // Ledger Hash + { + Json::Value p{jParms}; - p[jss::ledger_hash] = to_string(env.closed()->info().hash); - BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); + p[jss::ledger_hash] = to_string(env.closed()->info().hash); + BEAST_EXPECT( + hasTxs(env.rpc("json", "account_tx", to_string(p)))); - p[jss::ledger_hash] = to_string(env.closed()->info().parentHash); - BEAST_EXPECT(noTxs(env.rpc("json", "account_tx", to_string(p)))); + p[jss::ledger_hash] = + to_string(env.closed()->info().parentHash); + BEAST_EXPECT( + noTxs(env.rpc("json", "account_tx", to_string(p)))); + } } - } - - void - testParametersApiV2() - { - using namespace test::jtx; - // test for API version 2 - Env env{*this}; - Account A1{"A1"}; - env.fund(XRP(10000), A1); - env.close(); - - auto hasTxs = [](Json::Value const& j) { - return j.isMember(jss::result) && - (j[jss::result][jss::status] == "success") && - (j[jss::result][jss::transactions].size() == 2) && - (j[jss::result][jss::transactions][0u][jss::tx] - [jss::TransactionType] == jss::AccountSet) && - (j[jss::result][jss::transactions][1u][jss::tx] - [jss::TransactionType] == jss::Payment); - }; - - auto isErr = [](Json::Value const& j, error_code_i code) { - return j.isMember(jss::result) && - j[jss::result].isMember(jss::error) && - j[jss::result][jss::error] == RPC::get_error_info(code).token; - }; - - Json::Value jParms; - jParms[jss::api_version] = 2; - jParms[jss::account] = A1.human(); - - // Ledger index max/min/index all specified - // ERRORS out with invalid Parenthesis + else { - Json::Value p{jParms}; - - p[jss::ledger_index_max] = -1; - p[jss::ledger_index_min] = -1; - p[jss::ledger_index] = -1; - - BEAST_EXPECT(isErr( - env.rpc("json", "account_tx", to_string(p)), - rpcINVALID_PARAMS)); - } + // Ledger index max/min/index all specified + // ERRORS out with invalid Parenthesis + { + jParms[jss::account] = "0xDEADBEEF"; + jParms[jss::account] = A1.human(); + Json::Value p{jParms}; - // Ledger index min/max only - { - Json::Value p{jParms}; - p[jss::ledger_index_max] = 100; - p[jss::ledger_index_min] = 0; - BEAST_EXPECT(isErr( - env.rpc("json", "account_tx", to_string(p)), - rpcLGR_IDX_MALFORMED)); + p[jss::ledger_index_max] = -1; + p[jss::ledger_index_min] = -1; + p[jss::ledger_index] = -1; - p[jss::ledger_index_max] = -1; - p[jss::ledger_index_min] = -1; - BEAST_EXPECT(hasTxs(env.rpc("json", "account_tx", to_string(p)))); + BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + rpcINVALID_PARAMS)); + } - p[jss::ledger_index_min] = 2; - p[jss::ledger_index_max] = 1; - BEAST_EXPECT(isErr( - env.rpc("json", "account_tx", to_string(p)), - rpcINVALID_LGR_RANGE)); - } + // Ledger index min/max only + { + Json::Value p{jParms}; + p[jss::ledger_index_max] = 100; + p[jss::ledger_index_min] = 0; + BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + rpcLGR_IDX_MALFORMED)); + + p[jss::ledger_index_max] = -1; + p[jss::ledger_index_min] = -1; + BEAST_EXPECT( + hasTxs(env.rpc("json", "account_tx", to_string(p)))); + + p[jss::ledger_index_min] = 2; + p[jss::ledger_index_max] = 1; + BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + rpcINVALID_LGR_RANGE)); + } - // Ledger index max only - { - Json::Value p{jParms}; - p[jss::ledger_index_max] = env.current()->info().seq; - BEAST_EXPECT(isErr( - env.rpc("json", "account_tx", to_string(p)), - rpcLGR_IDX_MALFORMED)); + // Ledger index max only + { + Json::Value p{jParms}; + p[jss::ledger_index_max] = env.current()->info().seq; + BEAST_EXPECT(isErr( + env.rpc("json", "account_tx", to_string(p)), + rpcLGR_IDX_MALFORMED)); + } } } @@ -671,8 +667,12 @@ class AccountTx_test : public beast::unit_test::suite void run() override { - testParameters(); - testParametersApiV2(); + for (auto testVersion = RPC::apiMinimumSupportedVersion; + testVersion <= RPC::apiBetaVersion; + ++testVersion) + { + testParameters(testVersion); + } testContents(); testAccountDelete(); }