1#include <test/jtx/Env.h>
3#include <xrpld/app/main/Application.h>
4#include <xrpld/overlay/Compression.h>
5#include <xrpld/overlay/Message.h>
6#include <xrpld/overlay/Peer.h>
7#include <xrpld/overlay/detail/OverlayImpl.h>
8#include <xrpld/overlay/detail/PeerImp.h>
9#include <xrpld/overlay/detail/ProtocolVersion.h>
10#include <xrpld/overlay/detail/Tuning.h>
11#include <xrpld/peerfinder/Slot.h>
13#include <xrpl/basics/Blob.h>
14#include <xrpl/basics/base_uint.h>
15#include <xrpl/basics/make_SSLContext.h>
16#include <xrpl/beast/net/IPEndpoint.h>
17#include <xrpl/beast/unit_test/suite.h>
18#include <xrpl/nodestore/NodeObject.h>
19#include <xrpl/protocol/KeyType.h>
20#include <xrpl/protocol/PublicKey.h>
21#include <xrpl/protocol/SecretKey.h>
22#include <xrpl/protocol/digest.h>
23#include <xrpl/resource/Consumer.h>
24#include <xrpl/server/Handoff.h>
26#include <boost/asio/ip/address.hpp>
27#include <boost/asio/ip/tcp.hpp>
28#include <boost/asio/ssl/context.hpp>
29#include <boost/beast/core/tcp_stream.hpp>
30#include <boost/beast/ssl/ssl_stream.hpp>
131 auto& overlay =
dynamic_cast<OverlayImpl&
>(env.
app().getOverlay());
132 boost::beast::http::request<boost::beast::http::dynamic_body> request;
140 auto consumer = overlay.resourceManager().newInboundEndpoint(remote);
141 auto [slot, _] = overlay.peerFinder().newInboundSlot(local, remote);
150 std::move(streamPtr),
153 overlay.addActive(peer);
166 for (
int i = 0; i < numObjects; ++i)
171 Blob data(100,
static_cast<unsigned char>(i % 256));
178 request->set_type(protocol::TMGetObjectByHash_ObjectType_otLEDGER);
179 request->set_query(
true);
181 for (
int i = 0; i < numObjects; ++i)
183 auto object = request->add_objects();
184 object->set_hash(hashes[i].data(), hashes[i].size());
185 object->set_ledgerseq(i);
209 peer->runProcessGetObjectByHash(request);
212 auto sentMessage = peer->getLastSentMessage();
213 BEAST_EXPECT(sentMessage !=
nullptr);
218 BEAST_EXPECT(buffer.size() > 6);
220 protocol::TMGetObjectByHash reply;
221 BEAST_EXPECT(reply.ParseFromArray(buffer.data() + 6, buffer.size() - 6) ==
true);
224 BEAST_EXPECT(reply.objects_size() == expectedReplySize);
A version-independent IP address and port combination.
TestcaseT testcase
Memberspace for declaring test cases.
std::shared_ptr< PeerFinder::Slot > const & slot()
PeerImp(PeerImp const &)=delete
void processGetObjectByHash(std::shared_ptr< protocol::TMGetObjectByHash > const &m)
Process a generic-query TMGetObjectByHash message.
std::uint32_t id_t
Uniquely identifies a peer.
An endpoint that consumes resources.
virtual NodeStore::Database & getNodeStore()=0
virtual boost::asio::io_context & getIOContext()=0
void runProcessGetObjectByHash(std::shared_ptr< protocol::TMGetObjectByHash > const &m)
~PeerTest() override=default
PeerTest(Application &app, std::shared_ptr< PeerFinder::Slot > const &slot, http_request_type &&request, PublicKey const &publicKey, ProtocolVersion protocol, Resource::Consumer consumer, std::unique_ptr< TMGetObjectByHash_test::stream_type > &&streamPtr, OverlayImpl &overlay)
std::shared_ptr< Message > getLastSentMessage() const
void send(std::shared_ptr< Message > const &m) override
std::shared_ptr< Message > lastSentMessage_
Test for TMGetObjectByHash reply size limiting.
static std::shared_ptr< protocol::TMGetObjectByHash > createRequest(size_t const numObjects, Env &env)
boost::beast::ssl_stream< middle_type > stream_type
void testReplyLimit(size_t const numObjects, int const expectedReplySize)
Test that reply is limited to hardMaxReplyNodes when more objects are requested than the limit allows...
boost::beast::tcp_stream middle_type
std::shared_ptr< PeerTest > createPeer(jtx::Env &env)
ProtocolVersion protocolVersion_
std::shared_ptr< boost::asio::ssl::context > shared_context
boost::asio::ip::tcp::socket socket_type
void run() override
Runs the suite.
A transaction testing environment.
static constexpr auto kHardMaxReplyNodes
The hard cap on the number of ledger entries in a single reply.
BEAST_DEFINE_TESTSUITE(AMMClawback, app, xrpl)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::pair< PublicKey, SecretKey > randomKeyPair(KeyType type)
Create a key pair using secure random numbers.
sha512_half_hasher::result_type sha512Half(Args const &... args)
Returns the SHA512-Half of a series of objects.
std::shared_ptr< boost::asio::ssl::context > makeSslContext(std::string const &cipherList)
Create a self-signed SSL context that allows anonymous Diffie Hellman.
std::pair< std::uint16_t, std::uint16_t > ProtocolVersion
Represents a particular version of the peer-to-peer protocol.
boost::beast::http::request< boost::beast::http::dynamic_body > http_request_type
std::vector< unsigned char > Blob
Storage for linear binary data.