1#include <test/jtx/envconfig.h>
3#include <xrpl/basics/make_SSLContext.h>
4#include <xrpl/beast/core/CurrentThreadName.h>
5#include <xrpl/beast/unit_test/suite.h>
7#include <boost/asio/basic_waitable_timer.hpp>
8#include <boost/asio/bind_executor.hpp>
9#include <boost/asio/buffer.hpp>
10#include <boost/asio/error.hpp>
11#include <boost/asio/executor_work_guard.hpp>
12#include <boost/asio/io_context.hpp>
13#include <boost/asio/ip/address.hpp>
14#include <boost/asio/ip/tcp.hpp>
15#include <boost/asio/post.hpp>
16#include <boost/asio/read_until.hpp>
17#include <boost/asio/ssl/context.hpp>
18#include <boost/asio/ssl/stream.hpp>
19#include <boost/asio/strand.hpp>
20#include <boost/asio/streambuf.hpp>
21#include <boost/asio/write.hpp>
22#include <boost/optional/optional.hpp>
23#include <boost/system/detail/error_code.hpp>
55 using strand_type = boost::asio::strand<io_context_type::executor_type>;
56 using timer_type = boost::asio::basic_waitable_timer<std::chrono::steady_clock>;
65 boost::optional<boost::asio::executor_work_guard<boost::asio::io_context::executor_type>>
work_;
69 template <
class Streambuf>
73 using boost::asio::buffer;
74 using boost::asio::buffer_copy;
75 using boost::asio::buffer_size;
76 boost::asio::const_buffer
const buf(s.
data(), s.
size());
77 sb.commit(buffer_copy(sb.prepare(buffer_size(buf)), buf));
114 assert(
list_.empty());
121 list_.emplace(child.get(), child);
143 for (
auto const& c :
list_)
145 if (
auto p = c.second.lock())
161 while (!
list_.empty())
199 if (!
strand.running_in_this_thread())
222 if (ec != boost::asio::error::operation_aborted)
255 boost::asio::streambuf
buf;
271 if (!
strand.running_in_this_thread())
287 timer.async_wait(bind_executor(
293 self->onHandshake(ec);
302 if (ec != boost::asio::error::operation_aborted)
303 test.log <<
"[server] " << what <<
": " << ec.message() <<
std::endl;
312 if (ec == boost::asio::error::operation_aborted)
328 fail(
"handshake", ec);
331 boost::asio::async_read_until(
339 self->onRead(ec, bytesTransferred);
346 if (ec == boost::asio::error::eof)
351 self->onShutdown(ec);
361 buf.commit(bytesTransferred);
362 buf.consume(bytesTransferred);
364 boost::asio::async_write(
371 self->onWrite(ec, bytesTransferred);
378 buf.consume(bytesTransferred);
384 stream.async_shutdown(bind_executor(
394 fail(
"shutdown", ec);
438 boost::asio::streambuf
buf;
456 if (!
strand.running_in_this_thread())
472 timer.async_wait(bind_executor(
486 if (ec != boost::asio::error::operation_aborted)
487 test.log <<
"[client] " << what <<
": " << ec.message() <<
std::endl;
496 if (ec == boost::asio::error::operation_aborted)
503 test.log <<
"[client] timeout";
518 self->onHandshake(ec);
527 fail(
"handshake", ec);
532 boost::asio::async_write(
539 self->onWrite(ec, bytesTransferred);
546 buf.consume(bytesTransferred);
552 boost::asio::async_read_until(
560 self->onRead(ec, bytesTransferred);
572 buf.commit(bytesTransferred);
573 stream.async_shutdown(bind_executor(
583 fail(
"shutdown", ec);
611 this->ioContext_.run();
void pass()
Record a successful test condition.
std::map< Child *, std::weak_ptr< Child > > list_
std::condition_variable cond_
void add(std::shared_ptr< Child > const &child)
void remove(Child *child)
Client(short_read_test &test, endpoint_type const &ep)
Server(short_read_test &test)
endpoint_type const & endpoint() const
io_context_type ioContext_
boost::asio::ip::tcp::endpoint endpoint_type
boost::asio::io_context io_context_type
boost::asio::ip::address address_type
boost::asio::strand< io_context_type::executor_type > strand_type
void run() override
Runs the suite.
boost::asio::ip::tcp::socket socket_type
~short_read_test() override
boost::system::error_code error_code
std::shared_ptr< boost::asio::ssl::context > context_
boost::asio::ip::tcp::acceptor acceptor_type
boost::asio::basic_waitable_timer< std::chrono::steady_clock > timer_type
boost::asio::ssl::stream< socket_type & > stream_type
static void write(Streambuf &sb, std::string const &s)
boost::optional< boost::asio::executor_work_guard< boost::asio::io_context::executor_type > > work_
T emplace_back(T... args)
void setCurrentThreadName(std::string_view newThreadName)
Changes the name of the caller thread.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::shared_ptr< boost::asio::ssl::context > makeSslContext(std::string const &cipherList)
Create a self-signed SSL context that allows anonymous Diffie Hellman.
BEAST_DEFINE_TESTSUITE(AccountTxPaging, app, xrpl)
T shared_from_this(T... args)
void onTimer(error_code ec)
void onHandshake(error_code ec)
void onConnect(error_code ec)
void onShutdown(error_code ec)
void run(endpoint_type const &ep)
void onRead(error_code ec, std::size_t bytesTransferred)
Connection(Client &client, endpoint_type const &ep)
boost::asio::streambuf buf
void onWrite(error_code ec, std::size_t bytesTransferred)
void fail(std::string const &what, error_code ec)
void fail(std::string const &what, error_code ec)
void onAccept(error_code ec)
Connection(Server &inServer, socket_type &&inSocket)
void onTimer(error_code ec)
void onHandshake(error_code ec)
void onShutdown(error_code ec)
void onRead(error_code ec, std::size_t bytesTransferred)
boost::asio::streambuf buf
void fail(std::string const &what, error_code ec)
void onWrite(error_code ec, std::size_t bytesTransferred)