From 21eeb9ae022c96cc74ec88a6a0c07dad7305fbd5 Mon Sep 17 00:00:00 2001 From: Alex Kremer Date: Tue, 21 Mar 2023 14:14:43 +0000 Subject: [PATCH] Implement ledger_range rpc handler (#548) Fixes #549 --- CMakeLists.txt | 2 + src/rpc/ngHandlers/LedgerRange.cpp | 54 ++++++++++++++++ src/rpc/ngHandlers/LedgerRange.h | 59 ++++++++++++++++++ unittests/rpc/handlers/LedgerRangeTest.cpp | 71 ++++++++++++++++++++++ 4 files changed, 186 insertions(+) create mode 100644 src/rpc/ngHandlers/LedgerRange.cpp create mode 100644 src/rpc/ngHandlers/LedgerRange.h create mode 100644 unittests/rpc/handlers/LedgerRangeTest.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index dce4d996..ade3c1a3 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,6 +62,7 @@ target_sources(clio PRIVATE src/rpc/ngHandlers/Tx.cpp src/rpc/ngHandlers/GatewayBalances.cpp src/rpc/ngHandlers/LedgerEntry.cpp + src/rpc/ngHandlers/LedgerRange.cpp src/rpc/ngHandlers/BookOffers.cpp ## RPC Methods # Account @@ -128,6 +129,7 @@ if(BUILD_TESTS) unittests/rpc/handlers/TxTest.cpp unittests/rpc/handlers/GatewayBalancesTest.cpp unittests/rpc/handlers/LedgerEntryTest.cpp + unittests/rpc/handlers/LedgerRangeTest.cpp unittests/rpc/handlers/BookOffersTest.cpp) include(CMake/deps/gtest.cmake) diff --git a/src/rpc/ngHandlers/LedgerRange.cpp b/src/rpc/ngHandlers/LedgerRange.cpp new file mode 100644 index 00000000..b1f374dd --- /dev/null +++ b/src/rpc/ngHandlers/LedgerRange.cpp @@ -0,0 +1,54 @@ +//------------------------------------------------------------------------------ +/* + This file is part of clio: https://github.com/XRPLF/clio + Copyright (c) 2023, the clio developers. + + Permission to use, copy, modify, and distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include +#include + +#include + +namespace RPCng { + +LedgerRangeHandler::Result +LedgerRangeHandler::process() const +{ + if (auto const maybeRange = sharedPtrBackend_->fetchLedgerRange(); + maybeRange) + { + return Output{*maybeRange}; + } + else + { + return Error{ + RPC::Status{RPC::RippledError::rpcNOT_READY, "rangeNotFound"}}; + }; +} + +void +tag_invoke( + boost::json::value_from_tag, + boost::json::value& jv, + LedgerRangeHandler::Output const& output) +{ + jv = boost::json::object{ + {JS(ledger_index_min), output.range.minSequence}, + {JS(ledger_index_max), output.range.maxSequence}, + }; +} + +} // namespace RPCng diff --git a/src/rpc/ngHandlers/LedgerRange.h b/src/rpc/ngHandlers/LedgerRange.h new file mode 100644 index 00000000..3a893e6c --- /dev/null +++ b/src/rpc/ngHandlers/LedgerRange.h @@ -0,0 +1,59 @@ +//------------------------------------------------------------------------------ +/* + This file is part of clio: https://github.com/XRPLF/clio + Copyright (c) 2023, the clio developers. + + Permission to use, copy, modify, and distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#pragma once + +#include +#include + +#include + +#include + +namespace RPCng { + +class LedgerRangeHandler +{ + std::shared_ptr sharedPtrBackend_; + +public: + struct Output + { + Backend::LedgerRange range; + }; + + using Result = HandlerReturnType; + + LedgerRangeHandler( + std::shared_ptr const& sharedPtrBackend) + : sharedPtrBackend_(sharedPtrBackend) + { + } + + Result + process() const; +}; + +void +tag_invoke( + boost::json::value_from_tag, + boost::json::value& jv, + LedgerRangeHandler::Output const& output); + +} // namespace RPCng diff --git a/unittests/rpc/handlers/LedgerRangeTest.cpp b/unittests/rpc/handlers/LedgerRangeTest.cpp new file mode 100644 index 00000000..2a44dbe6 --- /dev/null +++ b/unittests/rpc/handlers/LedgerRangeTest.cpp @@ -0,0 +1,71 @@ +//------------------------------------------------------------------------------ +/* + This file is part of clio: https://github.com/XRPLF/clio + Copyright (c) 2023, the clio developers. + + Permission to use, copy, modify, and distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include +#include +#include + +#include + +using namespace RPCng; +namespace json = boost::json; +using namespace testing; + +constexpr static auto RANGEMIN = 10; +constexpr static auto RANGEMAX = 30; + +class RPCLedgerRangeTest : public HandlerBaseTest +{ +}; + +TEST_F(RPCLedgerRangeTest, LedgerRangeNotFound) +{ + auto const handler = AnyHandler{LedgerRangeHandler{mockBackendPtr}}; + auto const req = json::parse("{}"); + auto const output = handler.process(req); + ASSERT_FALSE(output); + auto const err = RPC::makeError(output.error()); + EXPECT_EQ(err.at("error").as_string(), "notReady"); + EXPECT_EQ(err.at("error_message").as_string(), "rangeNotFound"); +} + +TEST_F(RPCLedgerRangeTest, LedgerRangeMinMaxSame) +{ + mockBackendPtr->updateRange(RANGEMIN); + auto const handler = AnyHandler{LedgerRangeHandler{mockBackendPtr}}; + auto const req = json::parse("{}"); + auto const output = handler.process(req); + ASSERT_TRUE(output); + auto const json = output.value(); + EXPECT_EQ(json.at("ledger_index_min").as_uint64(), RANGEMIN); + EXPECT_EQ(json.at("ledger_index_max").as_uint64(), RANGEMIN); +} + +TEST_F(RPCLedgerRangeTest, LedgerRangeFullySet) +{ + mockBackendPtr->updateRange(RANGEMIN); + mockBackendPtr->updateRange(RANGEMAX); + auto const handler = AnyHandler{LedgerRangeHandler{mockBackendPtr}}; + auto const req = json::parse("{}"); + auto const output = handler.process(req); + ASSERT_TRUE(output); + auto const json = output.value(); + EXPECT_EQ(json.at("ledger_index_min").as_uint64(), RANGEMIN); + EXPECT_EQ(json.at("ledger_index_max").as_uint64(), RANGEMAX); +}