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>
56 using strand_type = boost::asio::strand<io_context_type::executor_type>;
57 using timer_type = boost::asio::basic_waitable_timer<std::chrono::steady_clock>;
66 boost::optional<boost::asio::executor_work_guard<boost::asio::io_context::executor_type>>
work_;
70 template <
class Streambuf>
74 using boost::asio::buffer;
75 using boost::asio::buffer_copy;
76 using boost::asio::buffer_size;
77 boost::asio::const_buffer
const buf(s.
data(), s.
size());
78 sb.commit(buffer_copy(sb.prepare(buffer_size(buf)), buf));
115 assert(
list_.empty());
122 list_.emplace(child.get(), child);
144 for (
auto const& c :
list_)
146 if (
auto p = c.second.lock())
162 while (!
list_.empty())
200 if (!
strand.running_in_this_thread())
223 if (ec != boost::asio::error::operation_aborted)
256 boost::asio::streambuf
buf;
272 if (!
strand.running_in_this_thread())
288 timer.async_wait(bind_executor(
304 if (ec != boost::asio::error::operation_aborted)
305 test.log <<
"[server] " << what <<
": " << ec.message() <<
std::endl;
314 if (ec == boost::asio::error::operation_aborted)
330 fail(
"handshake", ec);
334 boost::asio::async_read_until(
343 std::placeholders::_1,
344 std::placeholders::_2)));
353 if (ec == boost::asio::error::eof)
356 stream.async_shutdown(bind_executor(
368 buf.commit(bytesTransferred);
369 buf.consume(bytesTransferred);
371 boost::asio::async_write(
379 std::placeholders::_1,
380 std::placeholders::_2)));
386 buf.consume(bytesTransferred);
392 stream.async_shutdown(bind_executor(
402 fail(
"shutdown", ec);
446 boost::asio::streambuf
buf;
464 if (!
strand.running_in_this_thread())
480 timer.async_wait(bind_executor(
496 if (ec != boost::asio::error::operation_aborted)
497 test.log <<
"[client] " << what <<
": " << ec.message() <<
std::endl;
506 if (ec == boost::asio::error::operation_aborted)
513 test.log <<
"[client] timeout";
538 fail(
"handshake", ec);
544 boost::asio::async_write(
552 std::placeholders::_1,
553 std::placeholders::_2)));
555 stream_.async_shutdown(bind_executor(
565 buf.consume(bytesTransferred);
572 boost::asio::async_read_until(
581 std::placeholders::_1,
582 std::placeholders::_2)));
584 stream_.async_shutdown(bind_executor(
599 buf.commit(bytesTransferred);
600 stream.async_shutdown(bind_executor(
610 fail(
"shutdown", ec);
638 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)