2#include <test/jtx/CaptureLogs.h> 
    3#include <test/jtx/envconfig.h> 
    4#include <test/unit_test/SuiteJournal.h> 
    6#include <xrpld/core/ConfigSections.h> 
    8#include <xrpl/basics/make_SSLContext.h> 
    9#include <xrpl/beast/rfc2616.h> 
   10#include <xrpl/beast/unit_test.h> 
   11#include <xrpl/server/Server.h> 
   12#include <xrpl/server/Session.h> 
   14#include <boost/asio.hpp> 
   15#include <boost/asio/executor_work_guard.hpp> 
   16#include <boost/beast/core/tcp_stream.hpp> 
   17#include <boost/beast/ssl/ssl_stream.hpp> 
   18#include <boost/utility/in_place_factory.hpp> 
   39            boost::asio::io_context::executor_type>>
 
   46            , 
thread_([&]() { this->io_context_.run(); })
 
 
   56        boost::asio::io_context&
 
 
  108            boost::asio::ip::tcp::endpoint remote_address)
 
 
  117            boost::asio::ip::tcp::endpoint remote_address)
 
 
 
  153    template <
class Socket>
 
  155    connect(Socket& s, 
typename Socket::endpoint_type 
const& ep)
 
 
  172    template <
class SyncWriteStream>
 
  178            boost::asio::write(s, boost::asio::buffer(text));
 
 
  190    template <
class SyncReadStream>
 
  194        boost::asio::streambuf b(1000);  
 
  197            auto const n = boost::asio::read_until(s, b, 
'\n');
 
  198            if (BEAST_EXPECT(n == 
match.size()))
 
  202                boost::asio::buffer_copy(
 
  203                    boost::asio::buffer(&got[0], n), b.data());
 
  204                return BEAST_EXPECT(got == 
match);
 
 
  221        boost::asio::io_context ios;
 
  222        using socket = boost::asio::ip::tcp::socket;
 
  231                "Connection: close\r\n" 
  238        boost::system::error_code ec;
 
  239        s.shutdown(socket::shutdown_both, ec);
 
 
  247        boost::asio::io_context ios;
 
  248        using socket = boost::asio::ip::tcp::socket;
 
  257                "Connection: Keep-Alive\r\n" 
  267                "Connection: close\r\n" 
  274        boost::system::error_code ec;
 
  275        s.shutdown(socket::shutdown_both, ec);
 
 
  289        serverPort.
back().ip =
 
  291        serverPort.
back().port = 0;
 
  292        serverPort.
back().protocol.insert(
"http");
 
  293        auto eps = s->ports(serverPort);
 
 
  308            onAccept(
Session& session, boost::asio::ip::tcp::endpoint endpoint)
 
  318                boost::asio::ip::tcp::endpoint remote_address)
 
  327                boost::asio::ip::tcp::endpoint remote_address)
 
  345            onClose(
Session& session, boost::system::error_code 
const&)
 
  359        for (
int i = 0; i < 1000; ++i)
 
  364            serverPort.
back().ip =
 
  366            serverPort.
back().port = 0;
 
  367            serverPort.
back().protocol.insert(
"http");
 
  368            s->ports(serverPort);
 
 
  376        testcase(
"Server config - invalid options");
 
  377        using namespace test::jtx;
 
  385                    (*cfg).deprecatedClearSection(
"port_rpc");
 
  391            messages.
find(
"Missing 'ip' in [port_rpc]") != std::string::npos);
 
  397                    (*cfg).deprecatedClearSection(
"port_rpc");
 
  404            messages.
find(
"Missing 'port' in [port_rpc]") != std::string::npos);
 
  410                    (*cfg).deprecatedClearSection(
"port_rpc");
 
  412                    (*cfg)[
"port_rpc"].set(
"port", 
"0");
 
  418            messages.
find(
"Invalid value '0' for key 'port' in [port_rpc]") ==
 
  425                    (*cfg)[
"server"].set(
"port", 
"0");
 
  431            messages.
find(
"Invalid value '0' for key 'port' in [server]") !=
 
  438                    (*cfg).deprecatedClearSection(
"port_rpc");
 
  440                    (*cfg)[
"port_rpc"].set(
"port", 
"8081");
 
  441                    (*cfg)[
"port_rpc"].set(
"protocol", 
"");
 
  447            messages.
find(
"Missing 'protocol' in [port_rpc]") !=
 
  462                        cfg->deprecatedClearSection(
 
  464                        cfg->legacy(
"database_path", 
"");
 
  465                        cfg->setupControl(
true, 
true, 
true);
 
  467                        (*cfg)[
"port_peer"].set(
"port", 
"8080");
 
  468                        (*cfg)[
"port_peer"].set(
"protocol", 
"peer");
 
  470                        (*cfg)[
"port_rpc"].set(
"port", 
"8081");
 
  471                        (*cfg)[
"port_rpc"].set(
"protocol", 
"http,ws2");
 
  474                        (*cfg)[
"port_ws"].set(
"port", 
"8082");
 
  475                        (*cfg)[
"port_ws"].set(
"protocol", 
"ws");
 
  482            messages.
find(
"Required section [server] is missing") !=
 
  496                           cfg->deprecatedClearSection(
 
  498                           cfg->legacy(
"database_path", 
"");
 
  499                           cfg->setupControl(
true, 
true, 
true);
 
  500                           (*cfg)[
"server"].append(
"port_peer");
 
  501                           (*cfg)[
"server"].append(
"port_rpc");
 
  502                           (*cfg)[
"server"].append(
"port_ws");
 
  508            messages.
find(
"Missing section: [port_peer]") != std::string::npos);
 
 
 
Abstraction for the underlying message destination.
 
virtual Severity threshold() const
Returns the minimum severity level this sink will report.
 
A generic endpoint for log messages.
 
log_os< char > log
Logging output stream.
 
void pass()
Record a successful test condition.
 
testcase_t testcase
Memberspace for declaring test cases.
 
bool except(F &&f, String const &reason)
 
void fail(String const &reason, char const *file, int line)
Record a failure.
 
Persistent state information for a connection session.
 
virtual void close(bool graceful)=0
Close the session.
 
virtual http_request_type & request()=0
Returns the current HTTP request.
 
void write(std::string const &s)
Send a copy of data asynchronously.
 
virtual void complete()=0
Indicate that the response is complete.
 
void writeAlways(beast::severities::Severity level, std::string const &text) override
Bypass filter and write text to the sink at the specified severity.
 
TestSink(beast::unit_test::suite &suite)
 
void write(beast::severities::Severity level, std::string const &text) override
Write text to the sink at the specified severity.
 
beast::unit_test::suite & suite_
 
boost::asio::io_context & get_io_context()
 
boost::asio::io_context io_context_
 
std::optional< boost::asio::executor_work_guard< boost::asio::io_context::executor_type > > work_
 
bool expect_read(SyncReadStream &s, std::string const &match)
 
bool connect(Socket &s, typename Socket::endpoint_type const &ep)
 
bool write(SyncWriteStream &s, std::string const &text)
 
void test_keepalive(boost::asio::ip::tcp::endpoint const &ep)
 
void test_request(boost::asio::ip::tcp::endpoint const &ep)
 
void run() override
Runs the suite.
 
A transaction testing environment.
 
bool is_keep_alive(boost::beast::http::message< isRequest, Body, Fields > const &m)
 
A namespace for easy access to logging severity values.
 
Severity
Severity level / threshold of a Journal message.
 
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
 
boost::beast::tcp_stream socket_type
 
boost::beast::ssl_stream< socket_type > stream_type
 
char const * getEnvLocalhostAddr()
 
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
 
std::unique_ptr< Server > make_Server(Handler &handler, boost::asio::io_context &io_context, beast::Journal journal)
Create the HTTP server using the specified handler.
 
boost::beast::http::request< boost::beast::http::dynamic_body > http_request_type
 
static std::string nodeDatabase()
 
static std::string importNodeDatabase()
 
Used to indicate the result of a server connection handoff.
 
void onClose(Session &session, boost::system::error_code const &)
 
bool onAccept(Session &session, boost::asio::ip::tcp::endpoint endpoint)
 
Handoff onHandoff(Session &session, std::unique_ptr< stream_type > &&bundle, http_request_type &&request, boost::asio::ip::tcp::endpoint remote_address)
 
void onWSMessage(std::shared_ptr< WSSession > session, std::vector< boost::asio::const_buffer > const &)
 
void onRequest(Session &session)
 
void onStopped(Server &server)
 
Handoff onHandoff(Session &session, http_request_type &&request, boost::asio::ip::tcp::endpoint remote_address)