//------------------------------------------------------------------------------ /* Copyright (c) 2011-2013, OpenCoin, Inc. */ //============================================================================== MultiSocket* MultiSocket::New ( boost::asio::io_service& io_service, boost::asio::ssl::context& ssl_context, int flags) { return new MultiSocketType ( io_service, ssl_context, flags); } //------------------------------------------------------------------------------ class MultiSocketTests : public UnitTest { public: class MultiSocketDetails : public TestPeerDetails { public: typedef int arg_type; MultiSocketDetails (int flags) : m_flags (flags) { } static String getArgName (arg_type arg) { 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 != 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); } ScopedPointer context; }; static ContextHolder holder; return holder.context->get (); } String name () { 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) { } Socket& get_socket () { return m_multiSocket; } 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 (PeerRole role) { if (role == 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; SocketWrapper m_acceptor_wrapper; }; //-------------------------------------------------------------------------- template void runProxy (ClientArg const& clientArg, ServerArg const& serverArg) { PeerTest::run , TestPeerLogicProxyClient, TestPeerLogicSyncServer> (clientArg, serverArg, timeoutSeconds).report (*this); PeerTest::run , TestPeerLogicProxyClient, TestPeerLogicAsyncServer> (clientArg, serverArg, timeoutSeconds).report (*this); } //-------------------------------------------------------------------------- template void run (ClientArg const& clientArg, ServerArg const& serverArg) { PeerTest::run , TestPeerLogicSyncClient, TestPeerLogicSyncServer> (clientArg, serverArg, timeoutSeconds).report (*this); PeerTest::run , TestPeerLogicAsyncClient, TestPeerLogicSyncServer> (clientArg, serverArg, timeoutSeconds).report (*this); PeerTest::run , TestPeerLogicSyncClient, TestPeerLogicAsyncServer> (clientArg, serverArg, timeoutSeconds).report (*this); PeerTest::run , TestPeerLogicAsyncClient, TestPeerLogicAsyncServer> (clientArg, serverArg, timeoutSeconds).report (*this); } //-------------------------------------------------------------------------- template void testProxyFlags (int extraClientFlags, int extraServerFlags) { check_precondition (! 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) { check_precondition (! 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 runTest () { testProtocol (); } //-------------------------------------------------------------------------- enum { timeoutSeconds = 10 }; MultiSocketTests () : UnitTest ("MultiSocket", "ripple") { } }; static MultiSocketTests multiSocketTests;