From 1e06ddf13c952ed4ac780e18be4e0251c7f6fd22 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Mon, 21 Apr 2014 12:52:50 -0700 Subject: [PATCH] Refactor MultiSocket: * Variadic constructor argument list * Tidy up sources and filenames --- Builds/VisualStudio2013/RippleD.vcxproj | 2 +- .../VisualStudio2013/RippleD.vcxproj.filters | 2 +- src/ripple/common/impl/MultiSocket.cpp | 281 +---------------- .../{MultiSocketType.h => MultiSocketImpl.h} | 20 +- src/ripple/common/tests/MultiSocket.test.cpp | 291 ++++++++++++++++++ .../radmap/impl/BasicFullBelowCache.cpp | 1 - 6 files changed, 312 insertions(+), 285 deletions(-) rename src/ripple/common/impl/{MultiSocketType.h => MultiSocketImpl.h} (98%) create mode 100644 src/ripple/common/tests/MultiSocket.test.cpp diff --git a/Builds/VisualStudio2013/RippleD.vcxproj b/Builds/VisualStudio2013/RippleD.vcxproj index 032933601..549a3c512 100644 --- a/Builds/VisualStudio2013/RippleD.vcxproj +++ b/Builds/VisualStudio2013/RippleD.vcxproj @@ -1824,7 +1824,7 @@ True - + True diff --git a/Builds/VisualStudio2013/RippleD.vcxproj.filters b/Builds/VisualStudio2013/RippleD.vcxproj.filters index e870d20e2..b55b37c1c 100644 --- a/Builds/VisualStudio2013/RippleD.vcxproj.filters +++ b/Builds/VisualStudio2013/RippleD.vcxproj.filters @@ -2793,7 +2793,7 @@ src\ripple\common\impl - + src\ripple\common\impl diff --git a/src/ripple/common/impl/MultiSocket.cpp b/src/ripple/common/impl/MultiSocket.cpp index 29457ae55..db3db7e37 100644 --- a/src/ripple/common/impl/MultiSocket.cpp +++ b/src/ripple/common/impl/MultiSocket.cpp @@ -17,13 +17,12 @@ */ //============================================================================== -#include +//#include +//#include +//#include +//#include -#include - -#include - -#include +#include namespace ripple { @@ -32,8 +31,8 @@ MultiSocket* MultiSocket::New ( boost::asio::ssl::context& ssl_context, int flags) { - return new MultiSocketType ( - socket, ssl_context, flags); + return new MultiSocketImpl ( + ssl_context, flags, socket); } //------------------------------------------------------------------------------ @@ -43,270 +42,8 @@ MultiSocket* MultiSocket::New ( boost::asio::ssl::context& ssl_context, int flags) { - return new MultiSocketType ( - io_service, ssl_context, flags); + return new MultiSocketImpl ( + ssl_context, flags, io_service); } -//------------------------------------------------------------------------------ - -class MultiSocket_test : public beast::unit_test::suite -{ -public: - class MultiSocketDetails : public beast::asio::TestPeerDetails - { - public: - typedef int arg_type; - - MultiSocketDetails (int flags) - : m_flags (flags) - { - } - - static beast::String getArgName (arg_type arg) - { - beast::String s; - - if (arg & MultiSocket::Flag::client_role) - s << "client,"; - - if (arg & MultiSocket::Flag::server_role) - s << "server,"; - - if (arg & MultiSocket::Flag::ssl) - s << "ssl,"; - - if (arg & MultiSocket::Flag::ssl_required) - s << "ssl_required,"; - - if (arg & MultiSocket::Flag::proxy) - s << "proxy,"; - - if (s != beast::String::empty) - { - s = "(" + s.substring (0, s.length () - 1) + ")"; - } - - return s; - } - - static boost::asio::ssl::context& getSSLContext () - { - struct ContextHolder - { - ContextHolder () - : context (RippleSSLContext::createAnonymous ( - "ALL:!LOW:!EXP:!MD5:@STRENGTH")) - { - // VFALCO NOTE Not sure if this is needed? - context->get().set_verify_mode ( - boost::asio::ssl::verify_none); - } - - std::unique_ptr context; - }; - - static ContextHolder holder; - - return holder.context->get (); - } - - beast::String name () const - { - return getArgName (m_flags); - } - - arg_type getFlags () const noexcept - { - return m_flags; - } - - protected: - arg_type m_flags; - }; - - //-------------------------------------------------------------------------- - - template - class MultiSocketDetailsType : public MultiSocketDetails - { - protected: - typedef Protocol protocol_type; - typedef typename protocol_type::socket socket_type; - typedef typename protocol_type::acceptor acceptor_type; - typedef typename protocol_type::endpoint endpoint_type; - typedef typename protocol_type::resolver resolver_type; - - public: - typedef socket_type native_socket_type; - typedef acceptor_type native_acceptor_type; - - MultiSocketDetailsType (arg_type flags) - : MultiSocketDetails (flags) - , m_socket (get_io_service ()) - , m_acceptor (get_io_service ()) - , m_multiSocket (m_socket, MultiSocketDetails::getSSLContext (), flags) - , m_acceptor_wrapper (m_acceptor) - { - } - - beast::asio::abstract_socket& - get_socket () - { - return m_multiSocket; - } - - beast::asio::abstract_socket& - get_acceptor () - { - return m_acceptor_wrapper; - } - - socket_type& - get_native_socket () - { - return m_socket; - } - - acceptor_type& - get_native_acceptor () - { - return m_acceptor; - } - - endpoint_type - get_endpoint (beast::asio::PeerRole role) - { - if (role == beast::asio::PeerRole::server) - return endpoint_type (boost::asio::ip::tcp::v6 (), 1052); - else - return endpoint_type (boost::asio::ip::address_v6 ().from_string ("::1"), 1052); - } - - protected: - socket_type m_socket; - acceptor_type m_acceptor; - MultiSocketType m_multiSocket; - beast::asio::socket_wrapper m_acceptor_wrapper; - }; - - //-------------------------------------------------------------------------- - - template - void runProxy (ClientArg const& clientArg, ServerArg const& serverArg) - { - beast::asio::PeerTest::run , - beast::asio::TestPeerLogicProxyClient, - beast::asio::TestPeerLogicSyncServer> ( - clientArg, serverArg, timeoutSeconds).report (*this); - - beast::asio::PeerTest::run , - beast::asio::TestPeerLogicProxyClient, - beast::asio::TestPeerLogicAsyncServer> ( - clientArg, serverArg, timeoutSeconds).report (*this); - } - - //-------------------------------------------------------------------------- - - template - void run (ClientArg const& clientArg, ServerArg const& serverArg) - { - beast::asio::PeerTest::run , - beast::asio::TestPeerLogicSyncClient, - beast::asio::TestPeerLogicSyncServer> - (clientArg, serverArg, timeoutSeconds).report (*this); - - beast::asio::PeerTest::run , - beast::asio::TestPeerLogicAsyncClient, - beast::asio::TestPeerLogicSyncServer> - (clientArg, serverArg, timeoutSeconds).report (*this); - - beast::asio::PeerTest::run , - beast::asio::TestPeerLogicSyncClient, - beast::asio::TestPeerLogicAsyncServer> - (clientArg, serverArg, timeoutSeconds).report (*this); - - beast::asio::PeerTest::run , - beast::asio::TestPeerLogicAsyncClient, - beast::asio::TestPeerLogicAsyncServer> - (clientArg, serverArg, timeoutSeconds).report (*this); - } - - //-------------------------------------------------------------------------- - - template - void testProxyFlags (int extraClientFlags, int extraServerFlags) - { - assert (! MultiSocket::Flag (extraClientFlags).any_set ( - MultiSocket::Flag::client_role | MultiSocket::Flag::server_role)); - - runProxy (MultiSocket::Flag::client_role | extraClientFlags, - MultiSocket::Flag::server_role | extraServerFlags); - } - - //-------------------------------------------------------------------------- - - template - void testFlags (int extraClientFlags, int extraServerFlags) - { - assert (! MultiSocket::Flag (extraClientFlags).any_set ( - MultiSocket::Flag::client_role | MultiSocket::Flag::server_role)); - - run (MultiSocket::Flag::client_role | extraClientFlags, - MultiSocket::Flag::server_role | extraServerFlags); - } - - template - void testProtocol () - { - // Simple tests - run (0, - 0); - - run (MultiSocket::Flag::client_role, - 0); - - run (0, MultiSocket::Flag::server_role); - - run (MultiSocket::Flag::client_role, - MultiSocket::Flag::server_role); - - testFlags (MultiSocket::Flag::ssl, - MultiSocket::Flag::ssl_required); - // SSL-Detect tests - testFlags (0, - MultiSocket::Flag::ssl); - - testFlags (MultiSocket::Flag::ssl, - MultiSocket::Flag::ssl); - - // PROXY Handshake tests - testProxyFlags (MultiSocket::Flag::proxy, - MultiSocket::Flag::proxy); - - testProxyFlags (MultiSocket::Flag::proxy | MultiSocket::Flag::ssl, - MultiSocket::Flag::proxy | MultiSocket::Flag::ssl_required); - - // PROXY + SSL-Detect tests - testProxyFlags (MultiSocket::Flag::proxy, - MultiSocket::Flag::proxy | MultiSocket::Flag::ssl); - - testProxyFlags (MultiSocket::Flag::proxy | MultiSocket::Flag::ssl, - MultiSocket::Flag::proxy | MultiSocket::Flag::ssl); - } - - void run () - { - testProtocol (); - } - - //-------------------------------------------------------------------------- - - enum - { - timeoutSeconds = 10 - }; -}; - -BEAST_DEFINE_TESTSUITE(MultiSocket,common,ripple); - } diff --git a/src/ripple/common/impl/MultiSocketType.h b/src/ripple/common/impl/MultiSocketImpl.h similarity index 98% rename from src/ripple/common/impl/MultiSocketType.h rename to src/ripple/common/impl/MultiSocketImpl.h index 65ea218b1..6ffaaef49 100644 --- a/src/ripple/common/impl/MultiSocketType.h +++ b/src/ripple/common/impl/MultiSocketImpl.h @@ -17,8 +17,8 @@ */ //============================================================================== -#ifndef RIPPLE_COMMON_MULTISOCKETTYPE_H_INCLUDED -#define RIPPLE_COMMON_MULTISOCKETTYPE_H_INCLUDED +#ifndef RIPPLE_COMMON_MULTISOCKETIMPL_H_INCLUDED +#define RIPPLE_COMMON_MULTISOCKETIMPL_H_INCLUDED #include @@ -38,7 +38,7 @@ namespace ripple { /** Template for producing instances of MultiSocket */ template -class MultiSocketType +class MultiSocketImpl : public MultiSocket { private: @@ -77,16 +77,16 @@ public: typedef std::remove_reference_t next_layer_type; typedef typename next_layer_type::lowest_layer_type lowest_layer_type; - template - MultiSocketType (Arg& arg, - boost::asio::ssl::context& ssl_context, int flags) + template + MultiSocketImpl (boost::asio::ssl::context& ssl_context, int flags, + Args&&... args) : m_flags (flags) , m_state (stateNone) , m_ssl_context (ssl_context) , m_verify_mode (0) , m_stream (nullptr) , m_needsShutdown (false) - , m_next_layer (arg) + , m_next_layer (std::forward (args)...) , m_proxyInfoSet (false) , m_native_ssl_handle (nullptr) , m_origFlags (cleaned_flags (flags)) @@ -162,7 +162,7 @@ protected: //-------------------------------------------------------------------------- // - // MultiSocketType + // MultiSocketImpl // //-------------------------------------------------------------------------- @@ -865,7 +865,7 @@ protected: #endif error_handler m_handler; - MultiSocketType & m_owner; + MultiSocketImpl & m_owner; Stream& m_stream; handshake_type const m_type; boost::asio::basic_streambuf m_buffer; @@ -875,7 +875,7 @@ protected: beast::asio::HandshakeDetectLogicSSL3> m_ssl; bool m_first_time; - AsyncOp (MultiSocketType & owner, Stream& stream, + AsyncOp (MultiSocketImpl & owner, Stream& stream, handshake_type type, beast::asio::const_buffers const& buffers, error_handler const& handler) : m_handler (handler) diff --git a/src/ripple/common/tests/MultiSocket.test.cpp b/src/ripple/common/tests/MultiSocket.test.cpp new file mode 100644 index 000000000..4dc1d6ebe --- /dev/null +++ b/src/ripple/common/tests/MultiSocket.test.cpp @@ -0,0 +1,291 @@ +//------------------------------------------------------------------------------ +/* + This file is part of rippled: https://github.com/ripple/rippled + Copyright (c) 2012, 2013 Ripple Labs Inc. + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ +//============================================================================== + +#include "../impl/MultiSocketImpl.h" + +#include "../RippleSSLContext.h" + +#include "../../beast/beast/unit_test/suite.h" + +#include + +namespace ripple { + +class MultiSocket_test : public beast::unit_test::suite +{ +public: + class MultiSocketDetails : public beast::asio::TestPeerDetails + { + public: + typedef int arg_type; + + MultiSocketDetails (int flags) + : m_flags (flags) + { + } + + static beast::String getArgName (arg_type arg) + { + beast::String s; + + if (arg & MultiSocket::Flag::client_role) + s << "client,"; + + if (arg & MultiSocket::Flag::server_role) + s << "server,"; + + if (arg & MultiSocket::Flag::ssl) + s << "ssl,"; + + if (arg & MultiSocket::Flag::ssl_required) + s << "ssl_required,"; + + if (arg & MultiSocket::Flag::proxy) + s << "proxy,"; + + if (s != beast::String::empty) + { + s = "(" + s.substring (0, s.length () - 1) + ")"; + } + + return s; + } + + static boost::asio::ssl::context& getSSLContext () + { + struct ContextHolder + { + ContextHolder () + : context (RippleSSLContext::createAnonymous ( + "ALL:!LOW:!EXP:!MD5:@STRENGTH")) + { + // VFALCO NOTE Not sure if this is needed? + context->get().set_verify_mode ( + boost::asio::ssl::verify_none); + } + + std::unique_ptr context; + }; + + static ContextHolder holder; + + return holder.context->get (); + } + + beast::String name () const + { + return getArgName (m_flags); + } + + arg_type getFlags () const noexcept + { + return m_flags; + } + + protected: + arg_type m_flags; + }; + + //-------------------------------------------------------------------------- + + template + class MultiSocketDetailsType : public MultiSocketDetails + { + protected: + typedef Protocol protocol_type; + typedef typename protocol_type::socket socket_type; + typedef typename protocol_type::acceptor acceptor_type; + typedef typename protocol_type::endpoint endpoint_type; + typedef typename protocol_type::resolver resolver_type; + + public: + typedef socket_type native_socket_type; + typedef acceptor_type native_acceptor_type; + + MultiSocketDetailsType (arg_type flags) + : MultiSocketDetails (flags) + , m_socket (get_io_service ()) + , m_acceptor (get_io_service ()) + , m_multiSocket (MultiSocketDetails::getSSLContext (), + flags, m_socket) + , m_acceptor_wrapper (m_acceptor) + { + } + + beast::asio::abstract_socket& + get_socket () + { + return m_multiSocket; + } + + beast::asio::abstract_socket& + get_acceptor () + { + return m_acceptor_wrapper; + } + + socket_type& + get_native_socket () + { + return m_socket; + } + + acceptor_type& + get_native_acceptor () + { + return m_acceptor; + } + + endpoint_type + get_endpoint (beast::asio::PeerRole role) + { + if (role == beast::asio::PeerRole::server) + return endpoint_type (boost::asio::ip::tcp::v6 (), 1052); + else + return endpoint_type (boost::asio::ip::address_v6 ().from_string ("::1"), 1052); + } + + protected: + socket_type m_socket; + acceptor_type m_acceptor; + MultiSocketImpl m_multiSocket; + beast::asio::socket_wrapper m_acceptor_wrapper; + }; + + //-------------------------------------------------------------------------- + + template + void runProxy (ClientArg const& clientArg, ServerArg const& serverArg) + { + beast::asio::PeerTest::run , + beast::asio::TestPeerLogicProxyClient, + beast::asio::TestPeerLogicSyncServer> ( + clientArg, serverArg, timeoutSeconds).report (*this); + + beast::asio::PeerTest::run , + beast::asio::TestPeerLogicProxyClient, + beast::asio::TestPeerLogicAsyncServer> ( + clientArg, serverArg, timeoutSeconds).report (*this); + } + + //-------------------------------------------------------------------------- + + template + void run (ClientArg const& clientArg, ServerArg const& serverArg) + { + beast::asio::PeerTest::run , + beast::asio::TestPeerLogicSyncClient, + beast::asio::TestPeerLogicSyncServer> + (clientArg, serverArg, timeoutSeconds).report (*this); + + beast::asio::PeerTest::run , + beast::asio::TestPeerLogicAsyncClient, + beast::asio::TestPeerLogicSyncServer> + (clientArg, serverArg, timeoutSeconds).report (*this); + + beast::asio::PeerTest::run , + beast::asio::TestPeerLogicSyncClient, + beast::asio::TestPeerLogicAsyncServer> + (clientArg, serverArg, timeoutSeconds).report (*this); + + beast::asio::PeerTest::run , + beast::asio::TestPeerLogicAsyncClient, + beast::asio::TestPeerLogicAsyncServer> + (clientArg, serverArg, timeoutSeconds).report (*this); + } + + //-------------------------------------------------------------------------- + + template + void testProxyFlags (int extraClientFlags, int extraServerFlags) + { + assert (! MultiSocket::Flag (extraClientFlags).any_set ( + MultiSocket::Flag::client_role | MultiSocket::Flag::server_role)); + + runProxy (MultiSocket::Flag::client_role | extraClientFlags, + MultiSocket::Flag::server_role | extraServerFlags); + } + + //-------------------------------------------------------------------------- + + template + void testFlags (int extraClientFlags, int extraServerFlags) + { + assert (! MultiSocket::Flag (extraClientFlags).any_set ( + MultiSocket::Flag::client_role | MultiSocket::Flag::server_role)); + + run (MultiSocket::Flag::client_role | extraClientFlags, + MultiSocket::Flag::server_role | extraServerFlags); + } + + template + void testProtocol () + { + // Simple tests + run (0, + 0); + + run (MultiSocket::Flag::client_role, + 0); + + run (0, MultiSocket::Flag::server_role); + + run (MultiSocket::Flag::client_role, + MultiSocket::Flag::server_role); + + testFlags (MultiSocket::Flag::ssl, + MultiSocket::Flag::ssl_required); + // SSL-Detect tests + testFlags (0, + MultiSocket::Flag::ssl); + + testFlags (MultiSocket::Flag::ssl, + MultiSocket::Flag::ssl); + + // PROXY Handshake tests + testProxyFlags (MultiSocket::Flag::proxy, + MultiSocket::Flag::proxy); + + testProxyFlags (MultiSocket::Flag::proxy | MultiSocket::Flag::ssl, + MultiSocket::Flag::proxy | MultiSocket::Flag::ssl_required); + + // PROXY + SSL-Detect tests + testProxyFlags (MultiSocket::Flag::proxy, + MultiSocket::Flag::proxy | MultiSocket::Flag::ssl); + + testProxyFlags (MultiSocket::Flag::proxy | MultiSocket::Flag::ssl, + MultiSocket::Flag::proxy | MultiSocket::Flag::ssl); + } + + void run () + { + testProtocol (); + } + + //-------------------------------------------------------------------------- + + enum + { + timeoutSeconds = 10 + }; +}; + +BEAST_DEFINE_TESTSUITE(MultiSocket,common,ripple); + +} diff --git a/src/ripple/radmap/impl/BasicFullBelowCache.cpp b/src/ripple/radmap/impl/BasicFullBelowCache.cpp index 9b2ddc7f7..b9031e214 100644 --- a/src/ripple/radmap/impl/BasicFullBelowCache.cpp +++ b/src/ripple/radmap/impl/BasicFullBelowCache.cpp @@ -17,7 +17,6 @@ */ //============================================================================== - namespace ripple { namespace RadMap {