diff --git a/src/ripple/server/impl/Door.h b/src/ripple/server/impl/Door.h index 322c3e1f9b..db78aec8c4 100644 --- a/src/ripple/server/impl/Door.h +++ b/src/ripple/server/impl/Door.h @@ -106,6 +106,11 @@ public: */ void close(); + endpoint_type get_endpoint() const + { + return acceptor_.local_endpoint(); + } + private: template void create (bool ssl, ConstBufferSequence const& buffers, diff --git a/src/ripple/server/impl/ServerImpl.h b/src/ripple/server/impl/ServerImpl.h index 081351fb2f..a1b127f921 100644 --- a/src/ripple/server/impl/ServerImpl.h +++ b/src/ripple/server/impl/ServerImpl.h @@ -33,6 +33,8 @@ namespace ripple { +using Endpoints = std::vector; + /** A multi-protocol server. This server maintains multiple configured listening ports, @@ -58,7 +60,7 @@ public: This may only be called once. */ virtual - void + Endpoints ports (std::vector const& v) = 0; /** Close the server. @@ -85,8 +87,6 @@ private: historySize = 100 }; - using Doors = std::vector >>; - Handler& handler_; beast::Journal j_; boost::asio::io_service& io_service_; @@ -113,7 +113,7 @@ public: return j_; } - void + Endpoints ports (std::vector const& ports) override; void @@ -163,13 +163,15 @@ ServerImpl:: } template -void +Endpoints ServerImpl:: ports (std::vector const& ports) { if (closed()) Throw ("ports() on closed Server"); ports_.reserve(ports.size()); + Endpoints eps; + eps.reserve(ports.size()); for(auto const& port : ports) { ports_.push_back(port); @@ -177,9 +179,11 @@ ports (std::vector const& ports) io_service_, ports_.back(), j_)) { list_.push_back(sp); + eps.push_back(sp->get_endpoint()); sp->run(); } } + return eps; } template diff --git a/src/test/overlay/short_read_test.cpp b/src/test/overlay/short_read_test.cpp index fc525cd0f3..80c111913b 100644 --- a/src/test/overlay/short_read_test.cpp +++ b/src/test/overlay/short_read_test.cpp @@ -433,12 +433,12 @@ private: } void - run() + run(endpoint_type const& ep) { timer_.expires_from_now(std::chrono::seconds(3)); timer_.async_wait(strand_.wrap(std::bind(&Connection::on_timer, shared_from_this(), std::placeholders::_1))); - socket_.async_connect(ep_, strand_.wrap(std::bind( + socket_.async_connect(ep, strand_.wrap(std::bind( &Connection::on_connect, shared_from_this(), std::placeholders::_1))); } @@ -542,7 +542,7 @@ private: { auto const p = std::make_shared(*this, ep); add(p); - p->run(); + p->run(ep); } ~Client() diff --git a/src/test/server/Server_test.cpp b/src/test/server/Server_test.cpp index 4015b86ba8..f3e18de9f1 100644 --- a/src/test/server/Server_test.cpp +++ b/src/test/server/Server_test.cpp @@ -39,10 +39,6 @@ namespace test { class Server_test : public beast::unit_test::suite { public: - enum - { - testPort = 40000 - }; class TestThread { @@ -91,7 +87,7 @@ public: if (level < threshold()) return; - suite_.log << text; + suite_.log << text << std::endl; } }; @@ -156,12 +152,10 @@ public: // Connect to an address template bool - connect (Socket& s, std::string const& addr, int port) + connect (Socket& s, typename Socket::endpoint_type const& ep) { try { - typename Socket::endpoint_type ep ( - boost::asio::ip::address::from_string (addr), port); s.connect (ep); pass(); return true; @@ -222,13 +216,13 @@ public: } void - test_request() + test_request(boost::asio::ip::tcp::endpoint const& ep) { boost::asio::io_service ios; using socket = boost::asio::ip::tcp::socket; socket s (ios); - if (! connect (s, "127.0.0.1", testPort)) + if (! connect (s, ep)) return; if (! write (s, @@ -247,13 +241,13 @@ public: } void - test_keepalive() + test_keepalive(boost::asio::ip::tcp::endpoint const& ep) { boost::asio::io_service ios; using socket = boost::asio::ip::tcp::socket; socket s (ios); - if (! connect (s, "127.0.0.1", testPort)) + if (! connect (s, ep)) return; if (! write (s, @@ -280,6 +274,7 @@ public: void basicTests() { + testcase("Basic client/server"); TestSink sink {*this}; TestThread thread; sink.threshold (beast::severities::Severity::kAll); @@ -287,24 +282,23 @@ public: TestHandler handler; auto s = make_Server (handler, thread.get_io_service(), journal); - std::vector list; - list.resize(1); - list.back().port = testPort; - list.back().ip = boost::asio::ip::address::from_string ( - "127.0.0.1"); - list.back().protocol.insert("http"); - s->ports (list); - - test_request(); - //test_keepalive(); + std::vector serverPort(1); + serverPort.back().ip = + boost::asio::ip::address::from_string ("127.0.0.1"), + serverPort.back().port = 0; + serverPort.back().protocol.insert("http"); + auto eps = s->ports (serverPort); + log << "server listening on port " << eps[0].port() << std::endl; + test_request(eps[0]); + test_keepalive(eps[0]); //s->close(); s = nullptr; - pass(); } void stressTest() { + testcase("stress test"); struct NullHandler { bool @@ -360,14 +354,14 @@ public: TestThread thread; auto s = make_Server(h, thread.get_io_service(), {}); - std::vector list; - list.resize(1); - list.back().port = testPort; - list.back().ip = boost::asio::ip::address::from_string ( - "127.0.0.1"); - list.back().protocol.insert("http"); - s->ports (list); + std::vector serverPort(1); + serverPort.back().ip = + boost::asio::ip::address::from_string ("127.0.0.1"), + serverPort.back().port = 0; + serverPort.back().protocol.insert("http"); + s->ports (serverPort); } + pass(); } /**