1#include <xrpld/overlay/Compression.h>
2#include <xrpld/overlay/Message.h>
3#include <xrpld/overlay/detail/ProtocolMessage.h>
5#include <xrpl/beast/unit_test/suite.h>
7#include <boost/asio/buffer.hpp>
8#include <boost/system/errc.hpp>
91 auto ping = protocol::TMPing{};
92 ping.set_type(protocol::TMPing::ptPING);
93 if (unknownFieldSize > 0)
95 ping.mutable_unknown_fields()->AddLengthDelimited(
101 auto m =
Message{ping, protocol::mtPING};
110 ping.SerializeToString(&payload);
118 return deflated.data();
121 deflated.resize(deflatedSize);
123 auto const type =
static_cast<std::uint16_t>(protocol::mtPING);
126 buffer.push_back(
static_cast<std::uint8_t>((value >> 24) & 0x0F));
127 buffer.push_back(
static_cast<std::uint8_t>((value >> 16) & 0xFF));
128 buffer.push_back(
static_cast<std::uint8_t>((value >> 8) & 0xFF));
129 buffer.push_back(
static_cast<std::uint8_t>(value & 0xFF));
133 buffer.push_back(
static_cast<std::uint8_t>((type >> 8) & 0xFF));
134 buffer.push_back(
static_cast<std::uint8_t>(type & 0xFF));
138 buffer.insert(buffer.end(), deflated.begin(), deflated.end());
145 auto ec = boost::system::error_code{};
149 return header->uncompressedSize + header->headerSize;
165 testcase(
"oversized ping rejected before dispatch");
167 auto runLocalTest = [&](
std::size_t size,
bool compressed =
false) {
170 if (BEAST_EXPECT(declared.has_value()))
176 auto const [bytes, ec] =
invoke(buffer, handler);
178 BEAST_EXPECT(ec ==
make_error_code(boost::system::errc::message_size));
179 BEAST_EXPECT(bytes == 0);
180 BEAST_EXPECT(handler.beginCount == 0);
181 BEAST_EXPECT(handler.messageCount == 0);
182 BEAST_EXPECT(handler.endCount == 0);
196 testcase(
"oversized ping rejected from header alone");
198 auto runLocalTest = [&](
std::size_t size,
bool compressed =
false) {
200 auto const headerSize =
204 auto const headerOnly =
206 BEAST_EXPECT(headerOnly.size() < full.size());
210 auto const [bytes, ec] =
invoke(headerOnly, handler);
212 BEAST_EXPECT(ec ==
make_error_code(boost::system::errc::message_size));
213 BEAST_EXPECT(bytes == 0);
214 BEAST_EXPECT(handler.beginCount == 0);
215 BEAST_EXPECT(handler.messageCount == 0);
216 BEAST_EXPECT(handler.endCount == 0);
231 auto runLocalTest = [&](
std::size_t size,
bool compressed =
false) {
234 if (BEAST_EXPECT(declared.has_value()))
239 auto const [bytes, ec] =
invoke(buffer, handler);
242 BEAST_EXPECT(bytes == buffer.size());
243 BEAST_EXPECT(handler.beginCount == 1);
244 BEAST_EXPECT(handler.messageCount == 1);
245 BEAST_EXPECT(handler.endCount == 1);
248 runLocalTest(0,
true);
254 testcase(
"ping with small unknown field still dispatched");
256 auto runLocalTest = [&](
std::size_t size,
bool compressed =
false) {
259 if (BEAST_EXPECT(declared.has_value()))
264 auto const [bytes, ec] =
invoke(buffer, handler);
267 BEAST_EXPECT(bytes == buffer.size());
268 BEAST_EXPECT(handler.beginCount == 1);
269 BEAST_EXPECT(handler.messageCount == 1);
270 BEAST_EXPECT(handler.endCount == 1);
TestcaseT testcase
Memberspace for declaring test cases.
std::vector< uint8_t > const & getBuffer(Compressed tryCompressed)
Retrieve the packed message data.
void testNormalPingDispatched()
static constexpr std::size_t kPingProtoOverheadWithUnknownLen
void testPingWithSmallUnknownFieldDispatched()
static constexpr std::size_t kMinimumPingSizeCompressedWithEmptyUnknownField
void testOversizedPingRejected()
static std::pair< std::size_t, boost::system::error_code > invoke(std::vector< std::uint8_t > const &buffer, TestHandler &handler)
static std::optional< std::size_t > declaredPingSize(std::vector< std::uint8_t > const &buffer)
static constexpr std::size_t kMinimumPingSizeWithEmptyUnknownField
static std::vector< std::uint8_t > makePingBuffer(std::size_t unknownFieldSize, bool compressed=false)
void testOversizedPingRejectedFromHeaderAlone()
void run() override
Runs the suite.
std::size_t compress(void const *in, std::size_t inSize, BufferFactory &&bf, Algorithm algorithm=Algorithm::LZ4)
Compress input data.
constexpr std::size_t kHeaderBytesCompressed
constexpr std::size_t kHeaderBytes
std::optional< MessageHeader > parseMessageHeader(boost::system::error_code &ec, BufferSequence const &bufs, std::size_t size)
Parse a message header.
BEAST_DEFINE_TESTSUITE(AMMClawback, app, xrpl)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
constexpr std::size_t kMaximumMessageSize
constexpr std::size_t kMaximumPingMessageSize
std::error_code make_error_code(xrpl::TokenCodecErrc e)
std::pair< std::size_t, boost::system::error_code > invokeProtocolMessage(Buffers const &buffers, Handler &handler, std::size_t &hint)
Calls the handler for up to one protocol message in the passed buffers.
void onMessage(std::shared_ptr< T > const &)
void onMessageUnknown(std::uint16_t type)
static std::size_t maxManifestsMessageSize()
bool compressionEnabled() const
void onMessageEnd(std::uint16_t, std::shared_ptr<::google::protobuf::Message > const &)
void onMessageBegin(std::uint16_t type, std::shared_ptr<::google::protobuf::Message > const &, std::size_t, std::size_t, bool)