diff options
author | Haavard <havardpe@yahoo-inc.com> | 2017-04-21 14:33:12 +0000 |
---|---|---|
committer | Haavard <havardpe@yahoo-inc.com> | 2017-04-21 21:04:33 +0000 |
commit | bbf11af22fff91b6f8f757a252ee4255bd018166 (patch) | |
tree | 7f8306230bfc0d37a7baa91589705c0cdd571a0c /vespalib/src/tests | |
parent | 33390132c1249768e445d8272bbfe421c6d2a5fc (diff) |
let socket handle handle more socket stuff
very simple Socket/SimpleSocket
stop using fastos sockets in websocket experimental code
stop using fastos sockets in vbench
Diffstat (limited to 'vespalib/src/tests')
-rw-r--r-- | vespalib/src/tests/net/socket/socket_client.cpp | 15 | ||||
-rw-r--r-- | vespalib/src/tests/net/socket/socket_server.cpp | 23 | ||||
-rw-r--r-- | vespalib/src/tests/net/socket/socket_test.cpp | 134 | ||||
-rw-r--r-- | vespalib/src/tests/websocket/websocket_test.cpp | 39 |
4 files changed, 89 insertions, 122 deletions
diff --git a/vespalib/src/tests/net/socket/socket_client.cpp b/vespalib/src/tests/net/socket/socket_client.cpp index e12fe5330d0..fd4abd2813d 100644 --- a/vespalib/src/tests/net/socket/socket_client.cpp +++ b/vespalib/src/tests/net/socket/socket_client.cpp @@ -11,7 +11,7 @@ using namespace vespalib; -vespalib::string read_msg(Socket &socket) { +vespalib::string read_msg(SocketHandle &socket) { vespalib::string msg; for (;;) { char c; @@ -27,7 +27,7 @@ vespalib::string read_msg(Socket &socket) { } } -void write_msg(Socket &socket, const vespalib::string &msg) { +void write_msg(SocketHandle &socket, const vespalib::string &msg) { for (size_t i = 0; i < msg.size(); ++i) { ssize_t ret = socket.write(&msg[i], 1); if (ret != 1) { @@ -53,14 +53,15 @@ int main(int argc, char **argv) { fprintf(stderr, " %s\n", addr.spec().c_str()); } } - Socket::UP socket = Socket::connect(SocketSpec::from_host_port(host, port)); - if (!socket->valid()) { + SocketHandle socket = SocketSpec::from_host_port(host, port).client_address().connect(); + if (!socket.valid()) { fprintf(stderr, "connect failed\n"); return 1; } fprintf(stderr, "connected to: %s (local address: %s)\n", - socket->peer_address().spec().c_str(), socket->address().spec().c_str()); - write_msg(*socket, "hello from client\n"); - fprintf(stderr, "message from server: '%s'\n", read_msg(*socket).c_str()); + SocketAddress::peer_address(socket.get()).spec().c_str(), + SocketAddress::address_of(socket.get()).spec().c_str()); + write_msg(socket, "hello from client\n"); + fprintf(stderr, "message from server: '%s'\n", read_msg(socket).c_str()); return 0; } diff --git a/vespalib/src/tests/net/socket/socket_server.cpp b/vespalib/src/tests/net/socket/socket_server.cpp index ff8d77f317d..c14c69caa70 100644 --- a/vespalib/src/tests/net/socket/socket_server.cpp +++ b/vespalib/src/tests/net/socket/socket_server.cpp @@ -12,7 +12,7 @@ using namespace vespalib; -vespalib::string read_msg(Socket &socket) { +vespalib::string read_msg(SocketHandle &socket) { vespalib::string msg; for (;;) { char c; @@ -28,7 +28,7 @@ vespalib::string read_msg(Socket &socket) { } } -void write_msg(Socket &socket, const vespalib::string &msg) { +void write_msg(SocketHandle &socket, const vespalib::string &msg) { for (size_t i = 0; i < msg.size(); ++i) { ssize_t ret = socket.write(&msg[i], 1); if (ret != 1) { @@ -39,8 +39,8 @@ void write_msg(Socket &socket, const vespalib::string &msg) { } int main(int, char **) { - ServerSocket::UP server = ServerSocket::listen(SocketSpec::from_port(0)); - if (!server->valid()) { + ServerSocket server(0); + if (!server.valid()) { fprintf(stderr, "listen failed, exiting\n"); return 1; } @@ -52,18 +52,19 @@ int main(int, char **) { fprintf(stderr, " %s\n", addr.spec().c_str()); } } - fprintf(stderr, "listening to %s\n", server->address().spec().c_str()); + fprintf(stderr, "listening to %s\n", server.address().spec().c_str()); fprintf(stderr, "client command: ./vespalib_socket_client_app %s %d\n", - HostName::get().c_str(), server->address().port()); + HostName::get().c_str(), server.address().port()); fprintf(stderr, "use ^C (SIGINT) to exit\n"); SignalHandler::INT.hook(); while (!SignalHandler::INT.check()) { - Socket::UP socket = server->accept(); - if (socket->valid()) { + SocketHandle socket = server.accept(); + if (socket.valid()) { fprintf(stderr, "got connection from: %s (local address: %s)\n", - socket->peer_address().spec().c_str(), socket->address().spec().c_str()); - fprintf(stderr, "message from client: '%s'\n", read_msg(*socket).c_str()); - write_msg(*socket, "hello from server\n"); + SocketAddress::peer_address(socket.get()).spec().c_str(), + SocketAddress::address_of(socket.get()).spec().c_str()); + fprintf(stderr, "message from client: '%s'\n", read_msg(socket).c_str()); + write_msg(socket, "hello from server\n"); } else { fprintf(stderr, "(got invalid socket from accept)\n"); } diff --git a/vespalib/src/tests/net/socket/socket_test.cpp b/vespalib/src/tests/net/socket/socket_test.cpp index bf0a5a2f273..c4b1e5286b2 100644 --- a/vespalib/src/tests/net/socket/socket_test.cpp +++ b/vespalib/src/tests/net/socket/socket_test.cpp @@ -74,7 +74,7 @@ vespalib::string get_meta(const SocketAddress &addr) { return meta; } -vespalib::string read_bytes(Socket &socket, size_t wanted_bytes) { +vespalib::string read_bytes(SocketHandle &socket, size_t wanted_bytes) { char tmp[64]; vespalib::string result; while (result.size() < wanted_bytes) { @@ -88,7 +88,7 @@ vespalib::string read_bytes(Socket &socket, size_t wanted_bytes) { return result; } -void verify_socket_io(bool is_server, Socket &socket) { +void verify_socket_io(bool is_server, SocketHandle &socket) { vespalib::string server_message = "hello, this is the server speaking"; vespalib::string client_message = "please pick up, I need to talk to you"; if(is_server) { @@ -104,7 +104,7 @@ void verify_socket_io(bool is_server, Socket &socket) { } } -Socket::UP connect_sockets(bool is_server, ServerSocket &server_socket) { +SocketHandle connect_sockets(bool is_server, ServerSocket &server_socket) { if (is_server) { return server_socket.accept(); } else { @@ -113,7 +113,7 @@ Socket::UP connect_sockets(bool is_server, ServerSocket &server_socket) { auto client = SocketSpec(spec).client_address(); fprintf(stderr, "connecting to '%s' (server: %s) (client: %s)\n", spec.c_str(), get_meta(server).c_str(), get_meta(client).c_str()); - return Socket::connect(SocketSpec(spec)); + return client.connect(); } } @@ -187,84 +187,79 @@ TEST("local client/server addresses") { fprintf(stderr, "server(tcp/123): %s (%s)\n", server.spec().c_str(), get_meta(server).c_str()); } -struct ServerWrapper { - ServerSocket::UP server; - ServerWrapper(const vespalib::string &spec) : server(ServerSocket::listen(SocketSpec(spec))) {} -}; - -TEST_MT_FF("require that basic socket io works", 2, ServerWrapper("tcp/0"), TimeBomb(60)) { +TEST_MT_FF("require that basic socket io works", 2, ServerSocket("tcp/0"), TimeBomb(60)) { bool is_server = (thread_id == 0); - Socket::UP socket = connect_sockets(is_server, *f1.server); - TEST_DO(verify_socket_io(is_server, *socket)); + SocketHandle socket = connect_sockets(is_server, f1); + TEST_DO(verify_socket_io(is_server, socket)); } TEST_MT_FF("require that basic unix domain socket io works (path)", 2, - ServerWrapper("ipc/file:my_socket"), TimeBomb(60)) + ServerSocket("ipc/file:my_socket"), TimeBomb(60)) { bool is_server = (thread_id == 0); - Socket::UP socket = connect_sockets(is_server, *f1.server); - TEST_DO(verify_socket_io(is_server, *socket)); + SocketHandle socket = connect_sockets(is_server, f1); + TEST_DO(verify_socket_io(is_server, socket)); } TEST_MT_FF("require that basic unix domain socket io works (name)", 2, - ServerWrapper(make_string("ipc/name:my_socket-%d", int(getpid()))), TimeBomb(60)) + ServerSocket(make_string("ipc/name:my_socket-%d", int(getpid()))), TimeBomb(60)) { bool is_server = (thread_id == 0); - Socket::UP socket = connect_sockets(is_server, *f1.server); - TEST_DO(verify_socket_io(is_server, *socket)); + SocketHandle socket = connect_sockets(is_server, f1); + TEST_DO(verify_socket_io(is_server, socket)); } -TEST_MT_FF("require that server accept can be interrupted", 2, ServerWrapper("tcp/0"), TimeBomb(60)) { +TEST_MT_FF("require that server accept can be interrupted", 2, ServerSocket("tcp/0"), TimeBomb(60)) { bool is_server = (thread_id == 0); if (is_server) { fprintf(stderr, "--> calling accept\n"); - Socket::UP socket = f1.server->accept(); + SocketHandle socket = f1.accept(); fprintf(stderr, "<-- accept returned\n"); - EXPECT_TRUE(!socket->valid()); + EXPECT_TRUE(!socket.valid()); } else { std::this_thread::sleep_for(std::chrono::milliseconds(500)); fprintf(stderr, "--- closing server socket\n"); - f1.server->shutdown(); + f1.shutdown(); } } TEST("require that socket file is removed by server socket when destructed") { remove_file("my_socket"); - ServerSocket::UP server = ServerSocket::listen(SocketSpec("ipc/file:my_socket")); - EXPECT_TRUE(server->valid()); + ServerSocket server("ipc/file:my_socket"); + EXPECT_TRUE(server.valid()); EXPECT_TRUE(is_socket("my_socket")); - server.reset(); + server = ServerSocket("invalid"); EXPECT_TRUE(!is_socket("my_socket")); } TEST("require that socket file is only removed on destruction if it is a socket") { remove_file("my_socket"); - ServerSocket::UP server = ServerSocket::listen(SocketSpec("ipc/file:my_socket")); - EXPECT_TRUE(server->valid()); + ServerSocket server("ipc/file:my_socket"); + EXPECT_TRUE(server.valid()); EXPECT_TRUE(is_socket("my_socket")); replace_file("my_socket", "hello\n"); - server.reset(); + server = ServerSocket("invalid"); EXPECT_TRUE(is_file("my_socket")); remove_file("my_socket"); } TEST("require that a server socket will fail to listen to a path that is already a regular file") { replace_file("my_socket", "hello\n"); - ServerSocket::UP server = ServerSocket::listen(SocketSpec("ipc/file:my_socket")); - EXPECT_TRUE(!server->valid()); - server.reset(); + ServerSocket server("ipc/file:my_socket"); + EXPECT_TRUE(!server.valid()); + server = ServerSocket("invalid"); EXPECT_TRUE(is_file("my_socket")); remove_file("my_socket"); } TEST("require that a server socket will fail to listen to a path that is already taken by another server") { remove_file("my_socket"); - ServerSocket::UP server1 = ServerSocket::listen(SocketSpec("ipc/file:my_socket")); - ServerSocket::UP server2 = ServerSocket::listen(SocketSpec("ipc/file:my_socket")); - EXPECT_TRUE(server1->valid()); - EXPECT_TRUE(!server2->valid()); + ServerSocket server1("ipc/file:my_socket"); + ServerSocket server2("ipc/file:my_socket"); + EXPECT_TRUE(server1.valid()); + EXPECT_TRUE(!server2.valid()); EXPECT_TRUE(is_socket("my_socket")); - server1.reset(); + server1 = ServerSocket("invalid"); EXPECT_TRUE(!is_socket("my_socket")); } @@ -275,55 +270,54 @@ TEST("require that a server socket will remove an old socket file if it cannot b EXPECT_TRUE(is_socket("my_socket")); } EXPECT_TRUE(is_socket("my_socket")); - ServerSocket::UP server = ServerSocket::listen(SocketSpec("ipc/file:my_socket")); - EXPECT_TRUE(server->valid()); - server.reset(); + ServerSocket server("ipc/file:my_socket"); + EXPECT_TRUE(server.valid()); + server = ServerSocket("invalid"); EXPECT_TRUE(!is_socket("my_socket")); } TEST("require that two server sockets cannot have the same abstract unix domain socket name") { vespalib::string spec = make_string("ipc/name:my_socket-%d", int(getpid())); - ServerSocket::UP server1 = ServerSocket::listen(SocketSpec(spec)); - ServerSocket::UP server2 = ServerSocket::listen(SocketSpec(spec)); - EXPECT_TRUE(server1->valid()); - EXPECT_TRUE(!server2->valid()); + ServerSocket server1(spec); + ServerSocket server2(spec); + EXPECT_TRUE(server1.valid()); + EXPECT_TRUE(!server2.valid()); } TEST("require that abstract socket names are freed when the server socket is destructed") { vespalib::string spec = make_string("ipc/name:my_socket-%d", int(getpid())); - ServerSocket::UP server1 = ServerSocket::listen(SocketSpec(spec)); - EXPECT_TRUE(server1->valid()); - server1.reset(); - ServerSocket::UP server2 = ServerSocket::listen(SocketSpec(spec)); - EXPECT_TRUE(server2->valid()); + ServerSocket server1(spec); + EXPECT_TRUE(server1.valid()); + server1 = ServerSocket("invalid"); + ServerSocket server2(spec); + EXPECT_TRUE(server2.valid()); } TEST("require that abstract sockets do not have socket files") { vespalib::string name = make_string("my_socket-%d", int(getpid())); - vespalib::string spec = make_string("ipc/name:%s", name.c_str()); - ServerSocket::UP server = ServerSocket::listen(SocketSpec(spec)); - EXPECT_TRUE(server->valid()); + ServerSocket server(SocketSpec::from_name(name)); + EXPECT_TRUE(server.valid()); EXPECT_TRUE(!is_socket(name)); EXPECT_TRUE(!is_file(name)); } TEST_MT_FFF("require that abstract and file-based unix domain sockets are not in conflict", 4, - ServerWrapper(make_string("ipc/file:my_socket-%d", int(getpid()))), - ServerWrapper(make_string("ipc/name:my_socket-%d", int(getpid()))), TimeBomb(60)) + ServerSocket(make_string("ipc/file:my_socket-%d", int(getpid()))), + ServerSocket(make_string("ipc/name:my_socket-%d", int(getpid()))), TimeBomb(60)) { bool is_server = ((thread_id % 2) == 0); - ServerSocket &server_socket = ((thread_id / 2) == 0) ? *f1.server : *f2.server; - Socket::UP socket = connect_sockets(is_server, server_socket); - TEST_DO(verify_socket_io(is_server, *socket)); + ServerSocket &server_socket = ((thread_id / 2) == 0) ? f1 : f2; + SocketHandle socket = connect_sockets(is_server, server_socket); + TEST_DO(verify_socket_io(is_server, socket)); } TEST("require that sockets can be set blocking and non-blocking") { SocketHandle handle(socket(my_inet(), SOCK_STREAM, 0)); test::SocketOptionsVerifier verifier(handle.get()); EXPECT_TRUE(!SocketOptions::set_blocking(-1, true)); - EXPECT_TRUE(SocketOptions::set_blocking(handle.get(), true)); + EXPECT_TRUE(handle.set_blocking(true)); TEST_DO(verifier.verify_blocking(true)); - EXPECT_TRUE(SocketOptions::set_blocking(handle.get(), false)); + EXPECT_TRUE(handle.set_blocking(false)); TEST_DO(verifier.verify_blocking(false)); } @@ -331,9 +325,9 @@ TEST("require that tcp nodelay can be enabled and disabled") { SocketHandle handle(socket(my_inet(), SOCK_STREAM, 0)); test::SocketOptionsVerifier verifier(handle.get()); EXPECT_TRUE(!SocketOptions::set_nodelay(-1, true)); - EXPECT_TRUE(SocketOptions::set_nodelay(handle.get(), true)); + EXPECT_TRUE(handle.set_nodelay(true)); TEST_DO(verifier.verify_nodelay(true)); - EXPECT_TRUE(SocketOptions::set_nodelay(handle.get(), false)); + EXPECT_TRUE(handle.set_nodelay(false)); TEST_DO(verifier.verify_nodelay(false)); } @@ -341,9 +335,9 @@ TEST("require that reuse addr can be set and cleared") { SocketHandle handle(socket(my_inet(), SOCK_STREAM, 0)); test::SocketOptionsVerifier verifier(handle.get()); EXPECT_TRUE(!SocketOptions::set_reuse_addr(-1, true)); - EXPECT_TRUE(SocketOptions::set_reuse_addr(handle.get(), true)); + EXPECT_TRUE(handle.set_reuse_addr(true)); TEST_DO(verifier.verify_reuse_addr(true)); - EXPECT_TRUE(SocketOptions::set_reuse_addr(handle.get(), false)); + EXPECT_TRUE(handle.set_reuse_addr(false)); TEST_DO(verifier.verify_reuse_addr(false)); } @@ -352,9 +346,9 @@ TEST("require that ipv6_only can be set and cleared") { SocketHandle handle(socket(my_inet(), SOCK_STREAM, 0)); test::SocketOptionsVerifier verifier(handle.get()); EXPECT_TRUE(!SocketOptions::set_ipv6_only(-1, true)); - EXPECT_TRUE(SocketOptions::set_ipv6_only(handle.get(), true)); + EXPECT_TRUE(handle.set_ipv6_only(true)); TEST_DO(verifier.verify_ipv6_only(true)); - EXPECT_TRUE(SocketOptions::set_ipv6_only(handle.get(), false)); + EXPECT_TRUE(handle.set_ipv6_only(false)); TEST_DO(verifier.verify_ipv6_only(false)); } else { fprintf(stderr, "WARNING: skipping ipv6_only test since ipv6 is disabled"); @@ -365,9 +359,9 @@ TEST("require that tcp keepalive can be set and cleared") { SocketHandle handle(socket(my_inet(), SOCK_STREAM, 0)); test::SocketOptionsVerifier verifier(handle.get()); EXPECT_TRUE(!SocketOptions::set_keepalive(-1, true)); - EXPECT_TRUE(SocketOptions::set_keepalive(handle.get(), true)); + EXPECT_TRUE(handle.set_keepalive(true)); TEST_DO(verifier.verify_keepalive(true)); - EXPECT_TRUE(SocketOptions::set_keepalive(handle.get(), false)); + EXPECT_TRUE(handle.set_keepalive(false)); TEST_DO(verifier.verify_keepalive(false)); } @@ -375,13 +369,13 @@ TEST("require that tcp lingering can be adjusted") { SocketHandle handle(socket(my_inet(), SOCK_STREAM, 0)); test::SocketOptionsVerifier verifier(handle.get()); EXPECT_TRUE(!SocketOptions::set_linger(-1, true, 0)); - EXPECT_TRUE(SocketOptions::set_linger(handle.get(), true, 0)); + EXPECT_TRUE(handle.set_linger(true, 0)); TEST_DO(verifier.verify_linger(true, 0)); - EXPECT_TRUE(SocketOptions::set_linger(handle.get(), true, 10)); + EXPECT_TRUE(handle.set_linger(true, 10)); TEST_DO(verifier.verify_linger(true, 10)); - EXPECT_TRUE(SocketOptions::set_linger(handle.get(), false, 0)); + EXPECT_TRUE(handle.set_linger(false, 0)); TEST_DO(verifier.verify_linger(false, 0)); - EXPECT_TRUE(SocketOptions::set_linger(handle.get(), false, 10)); + EXPECT_TRUE(handle.set_linger(false, 10)); TEST_DO(verifier.verify_linger(false, 0)); } diff --git a/vespalib/src/tests/websocket/websocket_test.cpp b/vespalib/src/tests/websocket/websocket_test.cpp index 962a78c5606..748b0fd5c1e 100644 --- a/vespalib/src/tests/websocket/websocket_test.cpp +++ b/vespalib/src/tests/websocket/websocket_test.cpp @@ -1,7 +1,6 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include <vespa/vespalib/testkit/test_kit.h> -#include <vespa/vespalib/websocket/socket.h> -#include <vespa/vespalib/websocket/server_socket.h> +#include <vespa/vespalib/net/socket_spec.h> #include <vespa/vespalib/websocket/handler.h> #include <vespa/vespalib/websocket/acceptor.h> #include <vespa/vespalib/websocket/key.h> @@ -11,6 +10,7 @@ #include <functional> #include <chrono> +using namespace vespalib; using namespace vespalib::ws; template <typename T> @@ -62,14 +62,6 @@ void verify_socket_io_async(Socket &server, Socket &client) { client_thread.join(); } -Socket::UP connect_sockets(bool is_server, ServerSocket &server_socket) { - if (is_server) { - return server_socket.accept(); - } else { - return Socket::UP(new Socket("localhost", server_socket.port())); - } -} - void check_buffer_stats(const Buffer &buffer, size_t dead, size_t used, size_t free) { EXPECT_EQUAL(dead, buffer.dead()); EXPECT_EQUAL(used, buffer.used()); @@ -109,34 +101,13 @@ TEST("require that buffer moves contained data when more space is needed") { EXPECT_EQUAL('z', *buffer.obtain()); } -TEST_MT_F("require that basic socket io works", 2, ServerSocket(0)) { - bool is_server = (thread_id == 0); - Socket::UP socket = connect_sockets(is_server, f1); - TEST_DO(verify_socket_io(is_server, *socket)); -} - -TEST_MT_F("require that server accept can be interrupted", 2, ServerSocket(0)) { - bool is_server = (thread_id == 0); - if (is_server) { - fprintf(stderr, "--> calling accept\n"); - Socket::UP socket = f1.accept(); - fprintf(stderr, "<-- accept returned\n"); - EXPECT_TRUE(socket.get() == nullptr); - EXPECT_TRUE(f1.is_closed()); - } else { - std::this_thread::sleep_for(std::chrono::milliseconds(500)); - fprintf(stderr, "--- closing server socket\n"); - f1.close(); - } -} - TEST("require that an acceptor can accept connections asynchronously") { Receptor<Socket> server; Acceptor acceptor(0, server); - Socket::UP client(new Socket("localhost", acceptor.port())); + Socket::UP client = SimpleSocket::connect(SocketSpec::from_port(acceptor.port())); server.gate.await(60000); - EXPECT_TRUE(server.obj.get() != nullptr); - EXPECT_TRUE(client.get() != nullptr); + ASSERT_TRUE(server.obj.get() != nullptr); + ASSERT_TRUE(client.get() != nullptr); TEST_DO(verify_socket_io_async(*server.obj, *client)); } |