diff --git a/include/bitcoin/network/channels/channel_rpc.hpp b/include/bitcoin/network/channels/channel_rpc.hpp index 55d055e47..6d13e3133 100644 --- a/include/bitcoin/network/channels/channel_rpc.hpp +++ b/include/bitcoin/network/channels/channel_rpc.hpp @@ -60,17 +60,17 @@ class BCT_API channel_rpc { } + /// Serialize and write response to client (requires strand). + /// Completion handler is always invoked on the channel strand. + void send(rpc::response_t&& message, size_t size_hint, + result_handler&& handler) NOEXCEPT; + /// Resume reading from the socket (requires strand). void resume() NOEXCEPT override; /// Must call after successful message handling if no stop. virtual void receive() NOEXCEPT; - /// Serialize and write response to client (requires strand). - /// Completion handler is always invoked on the channel strand. - virtual void send(rpc::response_t&& message, size_t size_hint, - result_handler&& handler) NOEXCEPT; - protected: /// Stranded handler invoked from stop(). void stopping(const code& ec) NOEXCEPT override; diff --git a/include/bitcoin/network/net.hpp b/include/bitcoin/network/net.hpp index ff843ee0e..4a00a682d 100644 --- a/include/bitcoin/network/net.hpp +++ b/include/bitcoin/network/net.hpp @@ -214,9 +214,10 @@ class BCT_API net friend class session; /// I/O factories. - virtual acceptor::ptr create_acceptor() NOEXCEPT; - virtual connector::ptr create_connector(bool seed=false) NOEXCEPT; + virtual acceptor::ptr create_acceptor(size_t maximum) NOEXCEPT; virtual connectors_ptr create_connectors(size_t count) NOEXCEPT; + virtual connector::ptr create_connector(size_t maximum) NOEXCEPT; + virtual connector::ptr create_connector() NOEXCEPT; /// Sequences. virtual void do_start(const result_handler& handler) NOEXCEPT; diff --git a/include/bitcoin/network/net/acceptor.hpp b/include/bitcoin/network/net/acceptor.hpp index 1e1395ba9..5d5f8bc59 100644 --- a/include/bitcoin/network/net/acceptor.hpp +++ b/include/bitcoin/network/net/acceptor.hpp @@ -47,8 +47,8 @@ class BCT_API acceptor // ------------------------------------------------------------------------ /// Construct an instance. - acceptor(const logger& log, asio::strand& strand, - asio::io_context& service, std::atomic_bool& suspended) NOEXCEPT; + acceptor(const logger& log, asio::strand& strand, asio::io_context& service, + size_t maximum_request, std::atomic_bool& suspended) NOEXCEPT; /// Asserts/logs stopped. virtual ~acceptor() NOEXCEPT; @@ -81,6 +81,7 @@ class BCT_API acceptor virtual code start(const asio::endpoint& point) NOEXCEPT; // These are thread safe. + const size_t maximum_; asio::io_context& service_; asio::strand& strand_; std::atomic_bool& suspended_; diff --git a/include/bitcoin/network/net/connector.hpp b/include/bitcoin/network/net/connector.hpp index 6317d8dd1..1e81a4110 100644 --- a/include/bitcoin/network/net/connector.hpp +++ b/include/bitcoin/network/net/connector.hpp @@ -52,7 +52,7 @@ class BCT_API connector /// Construct an instance. connector(const logger& log, asio::strand& strand, asio::io_context& service, const steady_clock::duration& timeout, - std::atomic_bool& suspended) NOEXCEPT; + size_t maximum_request, std::atomic_bool& suspended) NOEXCEPT; /// Asserts/logs stopped. virtual ~connector() NOEXCEPT; @@ -88,6 +88,7 @@ class BCT_API connector const config::address& host, socket_handler&& handler) NOEXCEPT; // These are thread safe + const size_t maximum_; asio::io_context& service_; asio::strand& strand_; std::atomic_bool& suspended_; diff --git a/include/bitcoin/network/net/socket.hpp b/include/bitcoin/network/net/socket.hpp index 1ae02a5b0..2b5159300 100644 --- a/include/bitcoin/network/net/socket.hpp +++ b/include/bitcoin/network/net/socket.hpp @@ -44,11 +44,12 @@ class BCT_API socket DELETE_COPY_MOVE(socket); /// Use only for incoming connections (defaults outgoing address). - socket(const logger& log, asio::io_context& service) NOEXCEPT; + socket(const logger& log, asio::io_context& service, + size_t maximum_request) NOEXCEPT; /// Use only for outgoing connections (retains outgoing address). socket(const logger& log, asio::io_context& service, - const config::address& address) NOEXCEPT; + size_t maximum_request, const config::address& address) NOEXCEPT; /// Asserts/logs stopped. virtual ~socket() NOEXCEPT; @@ -284,12 +285,12 @@ class BCT_API socket protected: // These are thread safe. + const size_t maximum_; asio::strand strand_; asio::io_context& service_; std::atomic_bool stopped_{}; // These are protected by strand (see also handle_accept). - size_t maximum_; asio::socket socket_; config::address address_; config::authority authority_{}; diff --git a/include/bitcoin/network/sessions/session.hpp b/include/bitcoin/network/sessions/session.hpp index b7ad69ea3..42ddfd0db 100644 --- a/include/bitcoin/network/sessions/session.hpp +++ b/include/bitcoin/network/sessions/session.hpp @@ -187,10 +187,13 @@ class BCT_API session /// ----------------------------------------------------------------------- /// Call to create channel acceptor. - virtual acceptor::ptr create_acceptor() NOEXCEPT; + virtual acceptor::ptr create_acceptor(size_t maximum) NOEXCEPT; - /// Call to create channel connector (option for seed connection timeout). - virtual connector::ptr create_connector(bool seed=false) NOEXCEPT; + /// Call to create channel connector for seed connections. + virtual connector::ptr create_connector() NOEXCEPT; + + /// Call to create channel connector for manual/outbound connections. + virtual connector::ptr create_connector(size_t maximum) NOEXCEPT; /// Call to create a set of channel connectors. virtual connectors_ptr create_connectors(size_t count) NOEXCEPT; diff --git a/include/bitcoin/network/settings.hpp b/include/bitcoin/network/settings.hpp index 699b7d1d3..7208029e6 100644 --- a/include/bitcoin/network/settings.hpp +++ b/include/bitcoin/network/settings.hpp @@ -238,7 +238,6 @@ struct BCT_API settings /// Helpers. virtual bool witness_node() const NOEXCEPT; - virtual size_t maximum_payload() const NOEXCEPT; virtual steady_clock::duration retry_timeout() const NOEXCEPT; virtual steady_clock::duration connect_timeout() const NOEXCEPT; virtual steady_clock::duration channel_handshake() const NOEXCEPT; diff --git a/src/channels/channel_peer.cpp b/src/channels/channel_peer.cpp index 7c4f54076..c9e2e7f44 100644 --- a/src/channels/channel_peer.cpp +++ b/src/channels/channel_peer.cpp @@ -219,7 +219,7 @@ void channel_peer::handle_read_heading(const code& ec, size_t) NOEXCEPT return; } - if (head->payload_size > settings().maximum_payload()) + if (head->payload_size > options().maximum_request) { LOGR("Oversized payload indicated by " << head->command << " heading from [" << authority() << "] (" diff --git a/src/net.cpp b/src/net.cpp index 45afa4734..438f73cf7 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -68,32 +68,41 @@ net::~net() NOEXCEPT // I/O factories. // ---------------------------------------------------------------------------- -acceptor::ptr net::create_acceptor() NOEXCEPT +// inbound/server +acceptor::ptr net::create_acceptor(size_t maximum) NOEXCEPT { - return emplace_shared(log, strand(), service(), + return emplace_shared(log, strand(), service(), maximum, accept_suspended_); } -connector::ptr net::create_connector(bool seed) NOEXCEPT -{ - const auto timeout = seed ? settings_.outbound.seeding_timeout() : - settings_.connect_timeout(); - - return emplace_shared(log, strand(), service(), timeout, - connect_suspended_); -} - +// outbound (batch) connectors_ptr net::create_connectors(size_t count) NOEXCEPT { const auto connects = to_shared(); connects->reserve(count); + const auto maximum = settings_.outbound.maximum_request; for (size_t connect{}; connect < count; ++connect) - connects->push_back(create_connector()); + connects->push_back(create_connector(maximum)); return connects; } +// manual/outbound +connector::ptr net::create_connector(size_t maximum) NOEXCEPT +{ + return emplace_shared(log, strand(), service(), + settings_.connect_timeout(), maximum, connect_suspended_); +} + +// seed +connector::ptr net::create_connector() NOEXCEPT +{ + return emplace_shared(log, strand(), service(), + settings_.outbound.seeding_timeout(), + settings_.outbound.maximum_request, connect_suspended_); +} + // Start sequence. // ---------------------------------------------------------------------------- diff --git a/src/net/acceptor.cpp b/src/net/acceptor.cpp index 5d7bd8052..54a06f04a 100644 --- a/src/net/acceptor.cpp +++ b/src/net/acceptor.cpp @@ -43,8 +43,10 @@ using namespace std::placeholders; // Calls are stranded to protect the acceptor member. acceptor::acceptor(const logger& log, asio::strand& strand, - asio::io_context& service, std::atomic_bool& suspended) NOEXCEPT - : service_(service), + asio::io_context& service, size_t maximum_request, + std::atomic_bool& suspended) NOEXCEPT + : maximum_(maximum_request), + service_(service), strand_(strand), suspended_(suspended), acceptor_(strand_), @@ -144,7 +146,8 @@ void acceptor::accept(socket_handler&& handler) NOEXCEPT } // Create the socket. - const auto socket = std::make_shared(log, service_); + const auto socket = std::make_shared(log, service_, + maximum_); // Posts handle_accept to the acceptor's strand. // Establishes a socket connection by waiting on the socket. diff --git a/src/net/connector.cpp b/src/net/connector.cpp index cfeca212c..10c2be207 100644 --- a/src/net/connector.cpp +++ b/src/net/connector.cpp @@ -44,8 +44,9 @@ using namespace std::placeholders; connector::connector(const logger& log, asio::strand& strand, asio::io_context& service, const steady_clock::duration& timeout, - std::atomic_bool& suspended) NOEXCEPT - : service_(service), + size_t maximum_request, std::atomic_bool& suspended) NOEXCEPT + : maximum_(maximum_request), + service_(service), strand_(strand), suspended_(suspended), resolver_(strand), @@ -122,7 +123,8 @@ void connector::start(const std::string& hostname, uint16_t port, // Create a socket and shared finish context. const auto finish = std::make_shared(false); - const auto socket = std::make_shared(log, service_, host); + const auto socket = std::make_shared(log, service_, + maximum_, host); // Posts handle_timer to strand. timer_->start( diff --git a/src/net/socket.cpp b/src/net/socket.cpp index 82ac1457d..292246df7 100644 --- a/src/net/socket.cpp +++ b/src/net/socket.cpp @@ -47,18 +47,19 @@ BC_PUSH_WARNING(NO_THROW_IN_NOEXCEPT) // ---------------------------------------------------------------------------- // authority_.port() zero implies inbound connection. -socket::socket(const logger& log, asio::io_context& service) NOEXCEPT - : socket(log, service, config::address{}) +socket::socket(const logger& log, asio::io_context& service, + size_t maximum_request) NOEXCEPT + : socket(log, service, maximum_request, config::address{}) { } // authority_.port() nonzero implies outbound connection. socket::socket(const logger& log, asio::io_context& service, - const config::address& address) NOEXCEPT - : strand_(service.get_executor()), - maximum_(5u * 1024u * 1024u), - socket_(strand_), + size_t maximum_request, const config::address& address) NOEXCEPT + : maximum_(maximum_request), + strand_(service.get_executor()), service_(service), + socket_(strand_), address_(address), reporter(log), tracker(log) diff --git a/src/sessions/session.cpp b/src/sessions/session.cpp index 750cb7280..37e483f49 100644 --- a/src/sessions/session.cpp +++ b/src/sessions/session.cpp @@ -342,19 +342,28 @@ void session::unsubscribe_close() NOEXCEPT // Factories. // ---------------------------------------------------------------------------- -acceptor::ptr session::create_acceptor() NOEXCEPT +// inbound/server +acceptor::ptr session::create_acceptor(size_t maximum) NOEXCEPT { - return network_.create_acceptor(); + return network_.create_acceptor(maximum); } -connector::ptr session::create_connector(bool seed) NOEXCEPT +// outbound (batch) +connectors_ptr session::create_connectors(size_t count) NOEXCEPT { - return network_.create_connector(seed); + return network_.create_connectors(count); } -connectors_ptr session::create_connectors(size_t count) NOEXCEPT +// manual/outbound +connector::ptr session::create_connector(size_t maximum) NOEXCEPT { - return network_.create_connectors(count); + return network_.create_connector(maximum); +} + +// seed +connector::ptr session::create_connector() NOEXCEPT +{ + return network_.create_connector(); } // Properties. diff --git a/src/sessions/session_inbound.cpp b/src/sessions/session_inbound.cpp index 11a092748..2f80ecd59 100644 --- a/src/sessions/session_inbound.cpp +++ b/src/sessions/session_inbound.cpp @@ -79,9 +79,10 @@ void session_inbound::handle_started(const code& ec, LOGN("Accepting " << settings().inbound.connections << " peers on " << settings().inbound.binds.size() << " bindings."); + const auto maximum = settings().inbound.maximum_request; for (const auto& bind: settings().inbound.binds) { - const auto acceptor = create_acceptor(); + const auto acceptor = create_acceptor(maximum); // Require that all acceptors at least start. if (const auto error_code = acceptor->start(bind)) diff --git a/src/sessions/session_manual.cpp b/src/sessions/session_manual.cpp index 071e09c91..30cb2d8dd 100644 --- a/src/sessions/session_manual.cpp +++ b/src/sessions/session_manual.cpp @@ -85,7 +85,7 @@ void session_manual::connect(const config::endpoint& peer, BC_ASSERT(stranded()); // Create a persistent connector for the manual connection. - const auto connector = create_connector(); + const auto connector = create_connector(settings().manual.maximum_request); subscribe_stop([=](const code&) NOEXCEPT { diff --git a/src/sessions/session_seed.cpp b/src/sessions/session_seed.cpp index bf95f1dc4..42c2ba42a 100644 --- a/src/sessions/session_seed.cpp +++ b/src/sessions/session_seed.cpp @@ -122,7 +122,7 @@ void session_seed::handle_started(const code& ec, for (const auto& seed: settings().outbound.seeds) { - const auto connector = create_connector(true); + const auto connector = create_connector(); subscribe_stop([=](const code&) NOEXCEPT { connector->stop(); diff --git a/src/sessions/session_server.cpp b/src/sessions/session_server.cpp index 9d2561d16..fc91e447e 100644 --- a/src/sessions/session_server.cpp +++ b/src/sessions/session_server.cpp @@ -81,9 +81,10 @@ void session_server::handle_started(const code& ec, LOGN("Accepting " << options_.connections << " " << name_ << " connections on " << options_.binds.size() << " bindings."); + const auto maximum = options_.maximum_request; for (const auto& bind: options_.binds) { - const auto acceptor = create_acceptor(); + const auto acceptor = create_acceptor(maximum); // Require that all acceptors at least start. if (const auto error_code = acceptor->start(bind)) diff --git a/src/settings.cpp b/src/settings.cpp index 3d8d98ff9..8cb10d4ff 100644 --- a/src/settings.cpp +++ b/src/settings.cpp @@ -170,12 +170,6 @@ bool settings::witness_node() const NOEXCEPT return to_bool(services_minimum & service::node_witness); } -size_t settings::maximum_payload() const NOEXCEPT -{ - return heading::maximum_payload(protocol_maximum, - to_bool(services_maximum & service::node_witness)); -} - // Randomized from 50% to maximum milliseconds (specified in seconds). steady_clock::duration settings::retry_timeout() const NOEXCEPT { diff --git a/test/channels/channel.cpp b/test/channels/channel.cpp index 474ed5e08..a6e615e2b 100644 --- a/test/channels/channel.cpp +++ b/test/channels/channel.cpp @@ -40,7 +40,7 @@ BOOST_AUTO_TEST_CASE(channel__stopped__default__false) threadpool pool{ one }; asio::strand strand(pool.service().get_executor()); const settings set(bc::system::chain::selection::mainnet); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto channel_ptr = std::make_shared(log, socket_ptr, expected, set, set.outbound); BOOST_REQUIRE(!channel_ptr->stopped()); BOOST_REQUIRE_NE(channel_ptr->nonce(), zero); diff --git a/test/channels/channel_http.cpp b/test/channels/channel_http.cpp index 8cc1bef26..fd0aea3d3 100644 --- a/test/channels/channel_http.cpp +++ b/test/channels/channel_http.cpp @@ -63,7 +63,7 @@ BOOST_AUTO_TEST_CASE(channel_http__stopped__default__false) threadpool pool(1); asio::strand strand(pool.service().get_executor()); const settings set(system::chain::selection::mainnet); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto channel_ptr = std::make_shared(log, socket_ptr, expected, set, options); BOOST_REQUIRE(!channel_ptr->stopped()); @@ -81,7 +81,7 @@ BOOST_AUTO_TEST_CASE(channel_http__properties__default__expected) threadpool pool(1); asio::strand strand(pool.service().get_executor()); const settings set(system::chain::selection::mainnet); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto channel_ptr = std::make_shared(log, socket_ptr, 42, set, options); BOOST_REQUIRE(!channel_ptr->address()); @@ -98,7 +98,7 @@ BOOST_AUTO_TEST_CASE(channel_http__subscribe_message__subscribed__expected) threadpool pool(2); asio::strand strand(pool.service().get_executor()); const settings set(system::chain::selection::mainnet); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto channel_ptr = std::make_shared(log, socket_ptr, 42, set, options); constexpr auto expected_ec = error::invalid_magic; @@ -136,7 +136,7 @@ BOOST_AUTO_TEST_CASE(channel_http__stop__all_subscribed__expected) threadpool pool(2); asio::strand strand(pool.service().get_executor()); const settings set(system::chain::selection::mainnet); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto channel_ptr = std::make_shared(log, socket_ptr, 42, set, options); constexpr auto expected_ec = error::invalid_magic; @@ -195,7 +195,7 @@ BOOST_AUTO_TEST_CASE(channel_http__send__not_connected__expected) threadpool pool(2); asio::strand strand(pool.service().get_executor()); const settings set(system::chain::selection::mainnet); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto channel_ptr = std::make_shared(log, socket_ptr, 42, set, options); auto result = true; @@ -227,7 +227,7 @@ BOOST_AUTO_TEST_CASE(channel_http__send__not_connected_move__expected) threadpool pool(2); asio::strand strand(pool.service().get_executor()); const settings set(system::chain::selection::mainnet); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto channel_ptr = std::make_shared(log, socket_ptr, 42, set, options); auto result = true; @@ -258,7 +258,7 @@ BOOST_AUTO_TEST_CASE(channel_http__paused__resume_after_read_fail__true) threadpool pool(2); asio::strand strand(pool.service().get_executor()); const settings set(system::chain::selection::mainnet); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto channel_ptr = std::make_shared(log, socket_ptr, 42, set, options); std::promise paused_after_resume; diff --git a/test/channels/channel_peer.cpp b/test/channels/channel_peer.cpp index 86e1f25ee..17d55c829 100644 --- a/test/channels/channel_peer.cpp +++ b/test/channels/channel_peer.cpp @@ -63,7 +63,7 @@ BOOST_AUTO_TEST_CASE(channel_peer__stopped__default__false) threadpool pool(1); asio::strand strand(pool.service().get_executor()); const settings set(bc::system::chain::selection::mainnet); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto channel_ptr = std::make_shared(memory, log, socket_ptr, expected, set, options); BOOST_REQUIRE(!channel_ptr->stopped()); @@ -81,7 +81,7 @@ BOOST_AUTO_TEST_CASE(channel_peer__properties__default__expected) threadpool pool(1); asio::strand strand(pool.service().get_executor()); const settings set(bc::system::chain::selection::mainnet); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto channel_ptr = std::make_shared(log, socket_ptr, 42, set, options); const auto payload_maximum = [](const settings& settings) NOEXCEPT @@ -99,7 +99,7 @@ BOOST_AUTO_TEST_CASE(channel_peer__properties__default__expected) // TODO: compare to default instance. BOOST_REQUIRE(channel_ptr->peer_version()); - BOOST_REQUIRE_EQUAL(channel_ptr->settings().maximum_payload(), payload_maximum(set)); + BOOST_REQUIRE_EQUAL(channel_ptr->options().maximum_request, payload_maximum(set)); BOOST_REQUIRE_EQUAL(channel_ptr->settings().identifier, set.identifier); BOOST_REQUIRE_EQUAL(channel_ptr->settings().validate_checksum, set.validate_checksum); @@ -114,7 +114,7 @@ BOOST_AUTO_TEST_CASE(channel_peer__subscribe_message__subscribed__expected) threadpool pool(2); asio::strand strand(pool.service().get_executor()); const settings set(bc::system::chain::selection::mainnet); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto channel_ptr = std::make_shared(log, socket_ptr, 42, set, options); constexpr auto expected_ec = error::invalid_magic; @@ -148,7 +148,7 @@ BOOST_AUTO_TEST_CASE(channel_peer__stop__all_subscribed__expected) threadpool pool(2); asio::strand strand(pool.service().get_executor()); const settings set(bc::system::chain::selection::mainnet); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto channel_ptr = std::make_shared(log, socket_ptr, 42, set, options); constexpr auto expected_ec = error::invalid_magic; @@ -203,7 +203,7 @@ BOOST_AUTO_TEST_CASE(channel_peer__send__not_connected__expected) threadpool pool(2); asio::strand strand(pool.service().get_executor()); const settings set(bc::system::chain::selection::mainnet); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto channel_ptr = std::make_shared(log, socket_ptr, 42, set, options); auto result = true; @@ -236,7 +236,7 @@ BOOST_AUTO_TEST_CASE(channel_peer__send__not_connected_move__expected) threadpool pool(2); asio::strand strand(pool.service().get_executor()); const settings set(bc::system::chain::selection::mainnet); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto channel_ptr = std::make_shared(log, socket_ptr, 42, set, options); auto result = true; @@ -268,7 +268,7 @@ BOOST_AUTO_TEST_CASE(channel_peer__paused__resume_after_read_fail__true) threadpool pool(2); asio::strand strand(pool.service().get_executor()); const settings set(bc::system::chain::selection::mainnet); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto channel_ptr = std::make_shared(log, socket_ptr, 42, set, options); std::promise paused_after_resume; diff --git a/test/net/acceptor.cpp b/test/net/acceptor.cpp index c2c40266c..ab6810033 100644 --- a/test/net/acceptor.cpp +++ b/test/net/acceptor.cpp @@ -41,6 +41,11 @@ class accessor return acceptor_; } + size_t get_maximum_request() const NOEXCEPT + { + return maximum_; + } + bool get_stopped() const NOEXCEPT { return stopped_; @@ -53,14 +58,16 @@ BOOST_AUTO_TEST_CASE(acceptor__construct__default__stopped_expected) { const logger log{}; threadpool pool(1); + constexpr auto maximum = 42u; std::atomic_bool suspended{ false }; asio::strand strand(pool.service().get_executor()); - auto instance = std::make_shared(log, strand, pool.service(), suspended); + auto instance = std::make_shared(log, strand, pool.service(), maximum, suspended); BOOST_REQUIRE(&instance->get_service() == &pool.service()); BOOST_REQUIRE(&instance->get_strand() == &strand); BOOST_REQUIRE(!instance->get_acceptor().is_open()); BOOST_REQUIRE(instance->get_stopped()); + BOOST_REQUIRE_EQUAL(instance->get_maximum_request(), maximum); } // TODO: There is no way to fake failures in start. @@ -70,7 +77,7 @@ BOOST_AUTO_TEST_CASE(acceptor__start__stop__success) threadpool pool(1); std::atomic_bool suspended{ false }; asio::strand strand(pool.service().get_executor()); - auto instance = std::make_shared(log, strand, pool.service(), suspended); + auto instance = std::make_shared(log, strand, pool.service(), 42, suspended); // Result codes inconsistent due to context. instance->start(messages::peer::address_item{ 0, 0, 0, 42 }); @@ -93,7 +100,7 @@ BOOST_AUTO_TEST_CASE(acceptor__accept__stop_suspended__service_stopped_or_suspen threadpool pool(2); std::atomic_bool suspended{ true }; asio::strand strand(pool.service().get_executor()); - auto instance = std::make_shared(log, strand, pool.service(), suspended); + auto instance = std::make_shared(log, strand, pool.service(), 42, suspended); // Result codes inconsistent due to context. instance->start(messages::peer::address_item{ 0, 0, 0, 42 }); @@ -125,7 +132,7 @@ BOOST_AUTO_TEST_CASE(acceptor__accept__stop__channel_stopped) threadpool pool(2); std::atomic_bool suspended{ false }; asio::strand strand(pool.service().get_executor()); - auto instance = std::make_shared(log, strand, pool.service(), suspended); + auto instance = std::make_shared(log, strand, pool.service(), 42, suspended); // Result codes inconsistent due to context. instance->start(messages::peer::address_item{ 0, 0, 0, 42 }); diff --git a/test/net/connector.cpp b/test/net/connector.cpp index b70125ef7..09cda3932 100644 --- a/test/net/connector.cpp +++ b/test/net/connector.cpp @@ -41,6 +41,11 @@ class accessor return timer_; } + size_t get_maximum_request() const NOEXCEPT + { + return maximum_; + } + bool get_stopped() const NOEXCEPT { return !racer_.running(); @@ -52,14 +57,16 @@ BOOST_AUTO_TEST_CASE(connector__construct__default__stopped_expected) logger log{}; log.stop(); threadpool pool(1); + constexpr auto maximum = 42u; std::atomic_bool suspended{ false }; asio::strand strand(pool.service().get_executor()); - auto instance = std::make_shared(log, strand, pool.service(), seconds(10), suspended); + auto instance = std::make_shared(log, strand, pool.service(), seconds(10), maximum, suspended); BOOST_REQUIRE(&instance->get_service() == &pool.service()); BOOST_REQUIRE(&instance->get_strand() == &strand); BOOST_REQUIRE(instance->get_timer()); BOOST_REQUIRE(instance->get_stopped()); + BOOST_REQUIRE_EQUAL(instance->get_maximum_request(), maximum); } BOOST_AUTO_TEST_CASE(connector__connect_address__bogus_address_suspended__service_suspended) @@ -69,7 +76,7 @@ BOOST_AUTO_TEST_CASE(connector__connect_address__bogus_address_suspended__servic threadpool pool(2); std::atomic_bool suspended{ true }; asio::strand strand(pool.service().get_executor()); - auto instance = std::make_shared(log, strand, pool.service(), microseconds(1), suspended); + auto instance = std::make_shared(log, strand, pool.service(), microseconds(1), 42, suspended); auto result = true; boost::asio::post(strand, [&]() NOEXCEPT @@ -98,7 +105,7 @@ BOOST_AUTO_TEST_CASE(connector__connect_address__bogus_address__operation_timeou threadpool pool(2); std::atomic_bool suspended{ false }; asio::strand strand(pool.service().get_executor()); - auto instance = std::make_shared(log, strand, pool.service(), microseconds(1), suspended); + auto instance = std::make_shared(log, strand, pool.service(), microseconds(1), 42, suspended); auto result = true; boost::asio::post(strand, [&]() NOEXCEPT @@ -128,7 +135,7 @@ BOOST_AUTO_TEST_CASE(connector__connect_authority__bogus_authority__operation_ti threadpool pool(2); std::atomic_bool suspended{ false }; asio::strand strand(pool.service().get_executor()); - auto instance = std::make_shared(log, strand, pool.service(), microseconds(1), suspended); + auto instance = std::make_shared(log, strand, pool.service(), microseconds(1), 42, suspended); auto result = true; boost::asio::post(strand, [&, instance]() NOEXCEPT @@ -158,7 +165,7 @@ BOOST_AUTO_TEST_CASE(connector__connect_endpoint__bogus_hostname__resolve_failed threadpool pool(2); std::atomic_bool suspended{ false }; asio::strand strand(pool.service().get_executor()); - auto instance = std::make_shared(log, strand, pool.service(), microseconds(1), suspended); + auto instance = std::make_shared(log, strand, pool.service(), microseconds(1), 42, suspended); auto result = true; boost::asio::post(strand, [&, instance]() NOEXCEPT @@ -186,7 +193,7 @@ BOOST_AUTO_TEST_CASE(connector__connect__stop__resolve_failed_race_operation_can threadpool pool(2); std::atomic_bool suspended{ false }; asio::strand strand(pool.service().get_executor()); - auto instance = std::make_shared(log, strand, pool.service(), seconds(1000), suspended); + auto instance = std::make_shared(log, strand, pool.service(), seconds(1000), 42, suspended); auto result = true; boost::asio::post(strand, [&, instance]()NOEXCEPT @@ -215,7 +222,7 @@ BOOST_AUTO_TEST_CASE(connector__connect__started_start__operation_failed) threadpool pool(2); std::atomic_bool suspended{ false }; asio::strand strand(pool.service().get_executor()); - auto instance = std::make_shared(log, strand, pool.service(), seconds(1000), suspended); + auto instance = std::make_shared(log, strand, pool.service(), seconds(1000), 42, suspended); auto result = true; boost::asio::post(strand, [&, instance]() NOEXCEPT diff --git a/test/net/proxy.cpp b/test/net/proxy.cpp index 967e66948..f485fbcfe 100644 --- a/test/net/proxy.cpp +++ b/test/net/proxy.cpp @@ -41,7 +41,7 @@ BOOST_AUTO_TEST_CASE(proxy__paused__default__true) { const logger log{}; threadpool pool(1); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto proxy_ptr = std::make_shared(socket_ptr); std::promise paused; @@ -58,7 +58,7 @@ BOOST_AUTO_TEST_CASE(proxy__paused__pause__true) { const logger log{}; threadpool pool(1); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto proxy_ptr = std::make_shared(socket_ptr); std::promise paused; @@ -76,7 +76,7 @@ BOOST_AUTO_TEST_CASE(proxy__paused__resume__false) { const logger log{}; threadpool pool(1); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto proxy_ptr = std::make_shared(socket_ptr); std::promise paused; @@ -104,7 +104,7 @@ BOOST_AUTO_TEST_CASE(proxy__paused__resume_pause__true) { const logger log{}; threadpool pool(1); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto proxy_ptr = std::make_shared(socket_ptr); std::promise paused; @@ -133,7 +133,7 @@ BOOST_AUTO_TEST_CASE(proxy__stopped__default__false) { const logger log{}; threadpool pool(2); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto proxy_ptr = std::make_shared(socket_ptr); BOOST_REQUIRE(!proxy_ptr->stopped()); @@ -144,7 +144,7 @@ BOOST_AUTO_TEST_CASE(proxy__stranded__default__false) { const logger log{}; threadpool pool(2); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto proxy_ptr = std::make_shared(socket_ptr); BOOST_REQUIRE(!proxy_ptr->stranded()); @@ -156,7 +156,7 @@ BOOST_AUTO_TEST_CASE(proxy__authority__default__expected) const logger log{}; threadpool pool(2); const config::authority default_authority{}; - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto proxy_ptr = std::make_shared(socket_ptr); BOOST_REQUIRE(proxy_ptr->authority() == default_authority); @@ -167,7 +167,7 @@ BOOST_AUTO_TEST_CASE(proxy__subscribe_stop__subscribed__expected) { const logger log{}; threadpool pool(2); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto proxy_ptr = std::make_shared(socket_ptr); constexpr auto expected_ec = error::invalid_magic; @@ -195,7 +195,7 @@ BOOST_AUTO_TEST_CASE(proxy__do_subscribe_stop__subscribed__expected) { const logger log{}; threadpool pool(2); - auto socket_ptr = std::make_shared(log, pool.service()); + auto socket_ptr = std::make_shared(log, pool.service(), 42); auto proxy_ptr = std::make_shared(socket_ptr); constexpr auto expected_ec = error::invalid_magic; diff --git a/test/net/socket.cpp b/test/net/socket.cpp index 0de6e2ec7..842713426 100644 --- a/test/net/socket.cpp +++ b/test/net/socket.cpp @@ -40,27 +40,15 @@ class socket_accessor { return authority_; } -}; -class acceptor_accessor - : public acceptor -{ -public: - using acceptor::acceptor; - - const asio::io_context& get_service() const NOEXCEPT + const config::address& get_address() const NOEXCEPT { - return service_; - } - - const asio::strand& get_strand() const NOEXCEPT - { - return strand_; + return address_; } - asio::acceptor& get_acceptor() NOEXCEPT + size_t get_maximum_request() const NOEXCEPT { - return acceptor_; + return maximum_; } }; @@ -68,13 +56,17 @@ BOOST_AUTO_TEST_CASE(socket__construct__default__closed_not_stopped_expected) { const logger log{}; threadpool pool(1); - const auto instance = std::make_shared(log, pool.service()); + constexpr auto maximum = 42u; + const auto instance = std::make_shared(log, pool.service(), maximum); BOOST_REQUIRE(!instance->stranded()); BOOST_REQUIRE(!instance->get_socket().is_open()); BOOST_REQUIRE(&instance->get_strand() == &instance->strand()); BOOST_REQUIRE(instance->get_authority() == instance->authority()); BOOST_REQUIRE(instance->get_authority().ip().is_unspecified()); + BOOST_REQUIRE(instance->get_address() == instance->address()); + BOOST_REQUIRE(instance->get_address() == config::address{}); + BOOST_REQUIRE_EQUAL(instance->get_maximum_request(), maximum); instance->stop(); } @@ -82,7 +74,7 @@ BOOST_AUTO_TEST_CASE(socket__accept__cancel_acceptor__channel_stopped) { const logger log{}; threadpool pool(2); - const auto instance = std::make_shared(log, pool.service()); + const auto instance = std::make_shared(log, pool.service(), 42); asio::strand strand(pool.service().get_executor()); asio::acceptor acceptor(strand); @@ -130,7 +122,7 @@ BOOST_AUTO_TEST_CASE(socket__accept__cancel_acceptor__channel_stopped) ////{ //// const logger log{}; //// threadpool pool(2); -//// const auto instance = std::make_shared(log, pool.service()); +//// const auto instance = std::make_shared(log, pool.service(), 42); //// asio::strand strand(pool.service().get_executor()); //// //// const asio::endpoint endpoint(asio::tcp::v6(), 42); @@ -168,7 +160,7 @@ BOOST_AUTO_TEST_CASE(socket__accept__cancel_acceptor__channel_stopped) ////{ //// const logger log{}; //// threadpool pool(2); -//// const auto instance = std::make_shared(log, pool.service()); +//// const auto instance = std::make_shared(log, pool.service(), 42); //// //// system::data_array<42> data{}; //// instance->read_some(asio::mutable_buffer{ data.data(), data.size() }, @@ -193,7 +185,7 @@ BOOST_AUTO_TEST_CASE(socket__read__disconnected__error) { const logger log{}; threadpool pool(2); - const auto instance = std::make_shared(log, pool.service()); + const auto instance = std::make_shared(log, pool.service(), 42); system::data_array<42> data; instance->read(asio::mutable_buffer{ data.data(), data.size() }, @@ -218,7 +210,7 @@ BOOST_AUTO_TEST_CASE(socket__write__disconnected__bad_stream) { const logger log{}; threadpool pool(2); - const auto instance = std::make_shared(log, pool.service()); + const auto instance = std::make_shared(log, pool.service(), 42); system::data_array<42> data; instance->write(asio::const_buffer{ data.data(), data.size() }, diff --git a/test/protocols/protocol.cpp b/test/protocols/protocol.cpp index f554d33f1..4c7d899ec 100644 --- a/test/protocols/protocol.cpp +++ b/test/protocols/protocol.cpp @@ -57,8 +57,8 @@ class mock_acceptor { public: mock_acceptor(const logger& log, asio::strand& strand, - asio::io_context& service) NOEXCEPT - : acceptor(log, strand, service, suspended_), + asio::io_context& service, size_t maximum) NOEXCEPT + : acceptor(log, strand, service, maximum, suspended_), stopped_(false), port_(0) { } @@ -91,7 +91,7 @@ class mock_acceptor // Inject mock channel. void accept(socket_handler&& handler) NOEXCEPT override { - const auto socket = std::make_shared(log, service_); + const auto socket = std::make_shared(log, service_, maximum_); // Must be asynchronous or is an infinite recursion. // This error code will set the re-listener timer and channel pointer is ignored. @@ -113,8 +113,10 @@ class mock_connector { public: mock_connector(const logger& log, asio::strand& strand, - asio::io_context& service, const settings& settings) NOEXCEPT - : connector(log, strand, service, settings.connect_timeout(), suspended_), + asio::io_context& service, const settings& settings, + size_t maximum) NOEXCEPT + : connector(log, strand, service, settings.connect_timeout(), maximum, + suspended_), stopped_(false) { } @@ -135,7 +137,8 @@ class mock_connector void start(const std::string&, uint16_t, const config::address&, socket_handler&& handler) NOEXCEPT override { - const auto socket = std::make_shared(log, service_); + const auto socket = std::make_shared(log, service_, + maximum_); handler(error::success, socket); } @@ -152,16 +155,17 @@ class mock_net using net::net; // Create mock acceptor to inject mock channel. - acceptor::ptr create_acceptor() NOEXCEPT override + acceptor::ptr create_acceptor(size_t maximum) NOEXCEPT override { - return std::make_shared(log, strand(), service()); + return std::make_shared(log, strand(), service(), + maximum); } // Create mock connector to inject mock channel. - connector::ptr create_connector(bool =false) NOEXCEPT override + connector::ptr create_connector(size_t maximum) NOEXCEPT override { return std::make_shared(log, strand(), service(), - network_settings()); + network_settings(), maximum); } }; diff --git a/test/sessions/session.cpp b/test/sessions/session.cpp index 93b38f7b3..137596ab5 100644 --- a/test/sessions/session.cpp +++ b/test/sessions/session.cpp @@ -117,19 +117,24 @@ class mock_session return session_peer::stranded(); } - acceptor::ptr create_acceptor() NOEXCEPT override + acceptor::ptr create_acceptor(size_t maximum) NOEXCEPT override { - return session_peer::create_acceptor(); + return session_peer::create_acceptor(maximum); } - connector::ptr create_connector(bool seed=false) NOEXCEPT override + connectors_ptr create_connectors(size_t count) NOEXCEPT override { - return session_peer::create_connector(seed); + return session_peer::create_connectors(count); } - connectors_ptr create_connectors(size_t count) NOEXCEPT override + connector::ptr create_connector(size_t maximum) NOEXCEPT override { - return session_peer::create_connectors(count); + return session_peer::create_connector(maximum); + } + + connector::ptr create_connector() NOEXCEPT override + { + return session_peer::create_connector(); } ////size_t address_count() const NOEXCEPT override @@ -201,10 +206,10 @@ class mock_net public: using net::net; - acceptor::ptr create_acceptor() NOEXCEPT override + acceptor::ptr create_acceptor(size_t maximum) NOEXCEPT override { ++acceptors_; - return net::create_acceptor(); + return net::create_acceptor(maximum); } size_t acceptors() const NOEXCEPT @@ -212,10 +217,16 @@ class mock_net return acceptors_; } - connector::ptr create_connector(bool seed=false) NOEXCEPT override + connector::ptr create_connector() NOEXCEPT override { ++connectors_; - return net::create_connector(seed); + return net::create_connector(); + } + + connector::ptr create_connector(size_t maximum) NOEXCEPT override + { + ++connectors_; + return net::create_connector(maximum); } size_t connectors() const NOEXCEPT @@ -384,31 +395,41 @@ BOOST_AUTO_TEST_CASE(session__create_acceptor__always__expected) settings set(selection::mainnet); mock_net net(set, log); mock_session session(net, 1); - BOOST_REQUIRE(session.create_acceptor()); + BOOST_REQUIRE(session.create_acceptor(42)); BOOST_REQUIRE_EQUAL(net.acceptors(), 1u); } +BOOST_AUTO_TEST_CASE(session__create_connectors__always__expected) +{ + const logger log{}; + settings set(selection::mainnet); + mock_net net(set, log); + mock_session session(net, 1); + constexpr auto expected = 42u; + const auto connectors = session.create_connectors(expected); + BOOST_REQUIRE(connectors); + BOOST_REQUIRE_EQUAL(connectors->size(), expected); + BOOST_REQUIRE_EQUAL(net.connectors(), expected); +} + BOOST_AUTO_TEST_CASE(session__create_connector__always__expected) { const logger log{}; settings set(selection::mainnet); mock_net net(set, log); mock_session session(net, 1); - BOOST_REQUIRE(session.create_connector()); + BOOST_REQUIRE(session.create_connector(42u)); BOOST_REQUIRE_EQUAL(net.connectors(), 1u); } -BOOST_AUTO_TEST_CASE(session__create_connectors__always__expected) +BOOST_AUTO_TEST_CASE(session__create_connector_seed__always__expected) { const logger log{}; settings set(selection::mainnet); mock_net net(set, log); mock_session session(net, 1); - constexpr auto expected = 42u; - const auto connectors = session.create_connectors(expected); - BOOST_REQUIRE(connectors); - BOOST_REQUIRE_EQUAL(connectors->size(), expected); - BOOST_REQUIRE_EQUAL(net.connectors(), expected); + BOOST_REQUIRE(session.create_connector()); + BOOST_REQUIRE_EQUAL(net.connectors(), 1u); } // utilities @@ -596,7 +617,7 @@ BOOST_AUTO_TEST_CASE(session__start_channel__session_not_started__handlers_servi auto session = std::make_shared(net, 1); BOOST_REQUIRE(session->stopped()); - const auto socket = std::make_shared(net.log, net.service()); + const auto socket = std::make_shared(net.log, net.service(), 42); const auto channel = std::make_shared(memory, net.log, socket, 42, session->settings(), options); std::promise started_channel; @@ -652,7 +673,7 @@ BOOST_AUTO_TEST_CASE(session__start_channel__channel_not_started__handlers_chann BOOST_REQUIRE_EQUAL(started.get_future().get(), error::success); - const auto socket = std::make_shared(net.log, net.service()); + const auto socket = std::make_shared(net.log, net.service(), 42); const auto channel = std::make_shared(memory, net.log, socket, 42, session->settings(), options); // Stop the channel (started by default). @@ -742,7 +763,7 @@ BOOST_AUTO_TEST_CASE(session__start_channel__all_started__handlers_expected_chan BOOST_REQUIRE_EQUAL(started.get_future().get(), error::success); - const auto socket = std::make_shared(net.log, net.service()); + const auto socket = std::make_shared(net.log, net.service(), 42); const auto channel = std::make_shared(memory, net.log, socket, 42, session->settings(), options); std::promise started_channel; @@ -824,7 +845,7 @@ BOOST_AUTO_TEST_CASE(session__start_channel__outbound_all_started__handlers_expe BOOST_REQUIRE_EQUAL(started.get_future().get(), error::success); - const auto socket = std::make_shared(net.log, net.service()); + const auto socket = std::make_shared(net.log, net.service(), 42); const auto channel = std::make_shared(memory, net.log, socket, 42, session->settings(), options); std::promise started_channel; @@ -908,7 +929,7 @@ BOOST_AUTO_TEST_CASE(session__start_channel__inbound_all_started__handlers_expec BOOST_REQUIRE_EQUAL(started.get_future().get(), error::success); - const auto socket = std::make_shared(net.log, net.service()); + const auto socket = std::make_shared(net.log, net.service(), 42); const auto channel = std::make_shared(memory, net.log, socket, 42, session->settings(), options); std::promise started_channel; diff --git a/test/sessions/session_inbound.cpp b/test/sessions/session_inbound.cpp index 2f8f3811e..5ac2f62de 100644 --- a/test/sessions/session_inbound.cpp +++ b/test/sessions/session_inbound.cpp @@ -73,7 +73,7 @@ class mock_acceptor_start_success_accept_success void accept(socket_handler&& handler) NOEXCEPT override { ++accepts_; - const auto socket = std::make_shared(log, service_); + const auto socket = std::make_shared(log, service_, 42); // Must be asynchronous or is an infinite recursion. // This error code will set the re-listener timer and channel pointer is ignored. @@ -321,10 +321,10 @@ class mock_net } // Create mock acceptor to inject mock channel. - acceptor::ptr create_acceptor() NOEXCEPT override + acceptor::ptr create_acceptor(size_t maximum) NOEXCEPT override { return ((acceptor_ = std::make_shared(log, strand(), - service(), suspended_))); + service(), maximum, suspended_))); } session_inbound::ptr attach_inbound_session() NOEXCEPT override diff --git a/test/sessions/session_manual.cpp b/test/sessions/session_manual.cpp index acdc51d12..5de8d7bb8 100644 --- a/test/sessions/session_manual.cpp +++ b/test/sessions/session_manual.cpp @@ -65,7 +65,7 @@ class mock_connector_connect_success if (is_zero(connects_++)) peer_ = peer; - const auto socket = std::make_shared(log, service_); + const auto socket = std::make_shared(log, service_, 42); // Must be asynchronous or is an infinite recursion. boost::asio::post(strand_, [=]() NOEXCEPT @@ -230,10 +230,11 @@ class mock_net } // Create mock connector to inject mock channel. - connector::ptr create_connector(bool =false) NOEXCEPT override + connector::ptr create_connector(size_t maximum) NOEXCEPT override { return ((connector_ = std::make_shared(log, strand(), - service(), network_settings().connect_timeout(), suspended_))); + service(), network_settings().connect_timeout(), maximum, + suspended_))); } session_inbound::ptr attach_inbound_session() NOEXCEPT override diff --git a/test/sessions/session_outbound.cpp b/test/sessions/session_outbound.cpp index c8980d0c6..4df5450c3 100644 --- a/test/sessions/session_outbound.cpp +++ b/test/sessions/session_outbound.cpp @@ -85,7 +85,7 @@ class mock_connector_connect_success port_ = port; } - const auto socket = std::make_shared(log, service_); + const auto socket = std::make_shared(log, service_, 42); // Must be asynchronous or is an infinite recursion. boost::asio::post(strand_, [=]() NOEXCEPT @@ -236,10 +236,11 @@ class mock_net } // Create mock connector to inject mock channel. - connector::ptr create_connector(bool =false) NOEXCEPT override + connector::ptr create_connector(size_t maximum) NOEXCEPT override { return ((connector_ = std::make_shared(log, strand(), - service(), network_settings().connect_timeout(), suspended_))); + service(), network_settings().connect_timeout(), maximum, + suspended_))); } session_inbound::ptr attach_inbound_session() NOEXCEPT override @@ -305,10 +306,10 @@ class mock_connector_stop_connect typedef std::shared_ptr ptr; mock_connector_stop_connect(const logger& log, asio::strand& strand, - asio::io_context& service, const settings& settings, + asio::io_context& service, const settings& settings, size_t maximum, mock_session_outbound::ptr session) NOEXCEPT : mock_connector_connect_success(log, strand, service, - settings.connect_timeout(), suspended_), + settings.connect_timeout(), maximum, suspended_), session_(session) { } @@ -349,13 +350,13 @@ class mock_net_stop_connect } // Create mock connector to inject mock channel. - connector::ptr create_connector(bool =false) NOEXCEPT override + connector::ptr create_connector(size_t maximum) NOEXCEPT override { if (connector_) return connector_; return ((connector_ = std::make_shared( - log, strand(), service(), network_settings(), session_))); + log, strand(), service(), network_settings(), maximum, session_))); } session_inbound::ptr attach_inbound_session() NOEXCEPT override diff --git a/test/sessions/session_seed.cpp b/test/sessions/session_seed.cpp index 4546fd3ba..c50c88db1 100644 --- a/test/sessions/session_seed.cpp +++ b/test/sessions/session_seed.cpp @@ -78,7 +78,7 @@ class mock_connector_connect_success port_ = port; } - const auto socket = std::make_shared(log, service_); + const auto socket = std::make_shared(log, service_, 42); // Must be asynchronous or is an infinite recursion. boost::asio::post(strand_, [=]() NOEXCEPT @@ -228,10 +228,11 @@ class mock_net } // Create mock connector to inject mock channel. - connector::ptr create_connector(bool =false) NOEXCEPT override + connector::ptr create_connector() NOEXCEPT override { return ((connector_ = std::make_shared(log, strand(), - service(), network_settings().connect_timeout(), suspended_))); + service(), network_settings().connect_timeout(), + network_settings().outbound.maximum_request, suspended_))); } session_inbound::ptr attach_inbound_session() NOEXCEPT override @@ -323,7 +324,8 @@ class mock_connector_stop_connect asio::io_context& service, const settings& settings, mock_session_seed::ptr session) NOEXCEPT : mock_connector_connect_success(log, strand, service, - settings.outbound.seeding_timeout(), suspended_), + settings.outbound.seeding_timeout(), + settings.outbound.maximum_request, suspended_), session_(session) { } @@ -364,7 +366,7 @@ class mock_net_stop_connect } // Create mock connector to inject mock channel. - connector::ptr create_connector(bool =false) NOEXCEPT override + connector::ptr create_connector() NOEXCEPT override { if (connector_) return connector_; diff --git a/test/settings.cpp b/test/settings.cpp index 617b59ce4..4e220af8b 100644 --- a/test/settings.cpp +++ b/test/settings.cpp @@ -93,44 +93,6 @@ BOOST_AUTO_TEST_CASE(settings__witness_node__node_witness__true) BOOST_REQUIRE(instance.witness_node()); } -BOOST_AUTO_TEST_CASE(settings__maximum_payload__default__expected) -{ - settings instance{ system::chain::selection::mainnet }; - BOOST_REQUIRE_EQUAL(instance.maximum_payload(), 4'000'000u); -} - -BOOST_AUTO_TEST_CASE(settings__maximum_payload__zero_node_none__expected) -{ - settings instance{ system::chain::selection::mainnet }; - instance.protocol_maximum = 0; - instance.services_maximum = service::node_none; - BOOST_REQUIRE_EQUAL(instance.maximum_payload(), 1'800'003u); -} - -BOOST_AUTO_TEST_CASE(settings__maximum_payload__zero_node_witness__expected) -{ - settings instance{ system::chain::selection::mainnet }; - instance.protocol_maximum = 0; - instance.services_maximum = service::node_witness; - BOOST_REQUIRE_EQUAL(instance.maximum_payload(), 4'000'000u); -} - -BOOST_AUTO_TEST_CASE(settings__maximum_payload__maximum_node_witness__expected) -{ - settings instance{ system::chain::selection::mainnet }; - instance.protocol_maximum = max_uint32; - instance.services_maximum = service::node_witness; - BOOST_REQUIRE_EQUAL(instance.maximum_payload(), 4'000'000u); -} - -BOOST_AUTO_TEST_CASE(settings__maximum_payload__maximum_maximum_services__expected) -{ - settings instance{ system::chain::selection::mainnet }; - instance.protocol_maximum = max_uint32; - instance.services_maximum = service::maximum_services; - BOOST_REQUIRE_EQUAL(instance.maximum_payload(), 4'000'000u); -} - BOOST_AUTO_TEST_CASE(settings__retry_timeout__always__between_zero_and_retry_timeout_seconds) { settings instance{ system::chain::selection::mainnet };