From 5d06a79f139ea849ff8bd24fb72d303c2d0bbc61 Mon Sep 17 00:00:00 2001 From: Alex Kremer Date: Tue, 4 Apr 2023 15:16:02 +0100 Subject: [PATCH] Implement nextgen random handler and tests (#576) Fixes #575 --- CMakeLists.txt | 17 +++++---- src/rpc/ngHandlers/Random.cpp | 48 +++++++++++++++++++++++++ src/rpc/ngHandlers/Random.h | 50 +++++++++++++++++++++++++++ unittests/rpc/handlers/PingTest.cpp | 4 +-- unittests/rpc/handlers/RandomTest.cpp | 38 ++++++++++++++++++++ 5 files changed, 148 insertions(+), 9 deletions(-) create mode 100644 src/rpc/ngHandlers/Random.cpp create mode 100644 src/rpc/ngHandlers/Random.h create mode 100644 unittests/rpc/handlers/RandomTest.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 46580ce3..90061ac8 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -73,6 +73,9 @@ target_sources(clio PRIVATE src/rpc/ngHandlers/AccountCurrencies.cpp src/rpc/ngHandlers/AccountLines.cpp src/rpc/ngHandlers/AccountTx.cpp + src/rpc/ngHandlers/AccountTx.cpp + src/rpc/ngHandlers/AccountOffers.cpp + src/rpc/ngHandlers/AccountInfo.cpp src/rpc/ngHandlers/Tx.cpp src/rpc/ngHandlers/GatewayBalances.cpp src/rpc/ngHandlers/LedgerEntry.cpp @@ -84,9 +87,7 @@ target_sources(clio PRIVATE src/rpc/ngHandlers/NFTOffersCommon.cpp src/rpc/ngHandlers/NFTBuyOffers.cpp src/rpc/ngHandlers/NFTSellOffers.cpp - src/rpc/ngHandlers/AccountTx.cpp - src/rpc/ngHandlers/AccountOffers.cpp - src/rpc/ngHandlers/AccountInfo.cpp + src/rpc/ngHandlers/Random.cpp ## RPC Methods # Account src/rpc/handlers/AccountChannels.cpp @@ -145,27 +146,29 @@ if(BUILD_TESTS) unittests/rpc/ErrorTests.cpp unittests/rpc/BaseTests.cpp unittests/rpc/RPCHelpersTest.cpp + ## RPC handlers unittests/rpc/handlers/TestHandlerTests.cpp unittests/rpc/handlers/AccountCurrenciesTest.cpp unittests/rpc/handlers/AccountLinesTest.cpp unittests/rpc/handlers/AccountTxTest.cpp + unittests/rpc/handlers/AccountTxTest.cpp + unittests/rpc/handlers/AccountOffersTest.cpp + unittests/rpc/handlers/AccountInfoTest.cpp unittests/rpc/handlers/DefaultProcessorTests.cpp unittests/rpc/handlers/PingTest.cpp unittests/rpc/handlers/AccountChannelsTest.cpp unittests/rpc/handlers/TxTest.cpp + unittests/rpc/handlers/TransactionEntryTest.cpp unittests/rpc/handlers/GatewayBalancesTest.cpp unittests/rpc/handlers/LedgerEntryTest.cpp unittests/rpc/handlers/LedgerRangeTest.cpp unittests/rpc/handlers/BookOffersTest.cpp unittests/rpc/handlers/NoRippleCheckTest.cpp unittests/rpc/handlers/NFTInfoTest.cpp - unittests/rpc/handlers/AccountTxTest.cpp - unittests/rpc/handlers/AccountOffersTest.cpp - unittests/rpc/handlers/TransactionEntryTest.cpp unittests/rpc/handlers/NFTInfoTest.cpp unittests/rpc/handlers/NFTBuyOffersTest.cpp unittests/rpc/handlers/NFTSellOffersTest.cpp - unittests/rpc/handlers/AccountInfoTest.cpp + unittests/rpc/handlers/RandomTest.cpp # Backend unittests/backend/cassandra/BaseTests.cpp unittests/backend/cassandra/BackendTests.cpp diff --git a/src/rpc/ngHandlers/Random.cpp b/src/rpc/ngHandlers/Random.cpp new file mode 100644 index 00000000..f7fd2089 --- /dev/null +++ b/src/rpc/ngHandlers/Random.cpp @@ -0,0 +1,48 @@ +//------------------------------------------------------------------------------ +/* + 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 + +namespace RPCng { + +RandomHandler::Result +RandomHandler::process() const +{ + ripple::uint256 rand; + beast::rngfill(rand.begin(), rand.size(), ripple::crypto_prng()); + + return Output{ripple::strHex(rand)}; +} + +void +tag_invoke( + boost::json::value_from_tag, + boost::json::value& jv, + RandomHandler::Output const& output) +{ + jv = { + {JS(random), output.random}, + }; +} + +} // namespace RPCng diff --git a/src/rpc/ngHandlers/Random.h b/src/rpc/ngHandlers/Random.h new file mode 100644 index 00000000..4226794f --- /dev/null +++ b/src/rpc/ngHandlers/Random.h @@ -0,0 +1,50 @@ +//------------------------------------------------------------------------------ +/* + 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 + +namespace RPCng { + +class RandomHandler +{ +public: + struct Output + { + std::string random; + }; + + using Result = HandlerReturnType; + + Result + process() const; + +private: + friend void + tag_invoke( + boost::json::value_from_tag, + boost::json::value& jv, + Output const& output); +}; +} // namespace RPCng diff --git a/unittests/rpc/handlers/PingTest.cpp b/unittests/rpc/handlers/PingTest.cpp index 2d926b59..42c56dca 100644 --- a/unittests/rpc/handlers/PingTest.cpp +++ b/unittests/rpc/handlers/PingTest.cpp @@ -23,12 +23,12 @@ using namespace RPCng; -class RPCHandlerTest : public NoLoggerFixture +class RPCPingHandlerTest : public NoLoggerFixture { }; // example handler tests -TEST_F(RPCHandlerTest, Ping) +TEST_F(RPCPingHandlerTest, Default) { auto const handler = AnyHandler{PingHandler{}}; auto const output = handler.process(boost::json::parse(R"({})")); diff --git a/unittests/rpc/handlers/RandomTest.cpp b/unittests/rpc/handlers/RandomTest.cpp new file mode 100644 index 00000000..f4d1a68f --- /dev/null +++ b/unittests/rpc/handlers/RandomTest.cpp @@ -0,0 +1,38 @@ +//------------------------------------------------------------------------------ +/* + 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; + +class RPCRandomHandlerTest : public NoLoggerFixture +{ +}; + +TEST_F(RPCRandomHandlerTest, Default) +{ + auto const handler = AnyHandler{RandomHandler{}}; + auto const output = handler.process(boost::json::parse(R"({})")); + ASSERT_TRUE(output); + EXPECT_TRUE(output->as_object().contains(JS(random))); + EXPECT_EQ(output->as_object().at(JS(random)).as_string().size(), 64u); +}