summaryrefslogtreecommitdiffstats
path: root/vespalib/src/tests/net/socket/socket_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vespalib/src/tests/net/socket/socket_test.cpp')
-rw-r--r--vespalib/src/tests/net/socket/socket_test.cpp81
1 files changed, 77 insertions, 4 deletions
diff --git a/vespalib/src/tests/net/socket/socket_test.cpp b/vespalib/src/tests/net/socket/socket_test.cpp
index 5447f0de9bf..1c6b027a2b3 100644
--- a/vespalib/src/tests/net/socket/socket_test.cpp
+++ b/vespalib/src/tests/net/socket/socket_test.cpp
@@ -52,6 +52,9 @@ vespalib::string get_meta(const SocketAddress &addr) {
if (addr.is_wildcard()) {
meta += " wildcard";
}
+ if (addr.is_abstract()) {
+ meta += " abstract";
+ }
return meta;
}
@@ -105,6 +108,9 @@ TEST("my local address") {
fprintf(stderr, "resolve(4080):\n");
for (const auto &addr: list) {
EXPECT_TRUE(addr.is_wildcard());
+ EXPECT_TRUE(addr.is_ipv4() || addr.is_ipv6());
+ EXPECT_TRUE(!addr.is_ipc());
+ EXPECT_TRUE(!addr.is_abstract());
EXPECT_EQUAL(addr.port(), 4080);
fprintf(stderr, " %s (%s)\n", addr.spec().c_str(), get_meta(addr).c_str());
}
@@ -115,17 +121,38 @@ TEST("yahoo.com address") {
fprintf(stderr, "resolve(80, 'yahoo.com'):\n");
for (const auto &addr: list) {
EXPECT_TRUE(!addr.is_wildcard());
+ EXPECT_TRUE(addr.is_ipv4() || addr.is_ipv6());
+ EXPECT_TRUE(!addr.is_ipc());
+ EXPECT_TRUE(!addr.is_abstract());
EXPECT_EQUAL(addr.port(), 80);
fprintf(stderr, " %s (%s)\n", addr.spec().c_str(), get_meta(addr).c_str());
}
}
-TEST("ipc address") {
+TEST("ipc address (path)") {
auto addr = SocketAddress::from_path("my_socket");
+ EXPECT_TRUE(!addr.is_ipv4());
+ EXPECT_TRUE(!addr.is_ipv6());
EXPECT_TRUE(addr.is_ipc());
+ EXPECT_TRUE(!addr.is_abstract());
EXPECT_TRUE(!addr.is_wildcard());
EXPECT_EQUAL(addr.port(), -1);
EXPECT_EQUAL(vespalib::string("my_socket"), addr.path());
+ EXPECT_TRUE(addr.name().empty());
+ fprintf(stderr, "from_path(my_socket)\n");
+ fprintf(stderr, " %s (%s)\n", addr.spec().c_str(), get_meta(addr).c_str());
+}
+
+TEST("ipc address (name)") {
+ auto addr = SocketAddress::from_name("my_socket");
+ EXPECT_TRUE(!addr.is_ipv4());
+ EXPECT_TRUE(!addr.is_ipv6());
+ EXPECT_TRUE(addr.is_ipc());
+ EXPECT_TRUE(addr.is_abstract());
+ EXPECT_TRUE(!addr.is_wildcard());
+ EXPECT_EQUAL(addr.port(), -1);
+ EXPECT_TRUE(addr.path().empty());
+ EXPECT_EQUAL(vespalib::string("my_socket"), addr.name());
fprintf(stderr, "from_path(my_socket)\n");
fprintf(stderr, " %s (%s)\n", addr.spec().c_str(), get_meta(addr).c_str());
}
@@ -147,19 +174,29 @@ struct ServerWrapper {
ServerWrapper(const vespalib::string &spec) : server(ServerSocket::listen(SocketSpec(spec))) {}
};
-TEST_MT_F("require that basic socket io works", 2, ServerWrapper("tcp/0")) {
+TEST_MT_FF("require that basic socket io works", 2, ServerWrapper("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));
}
-TEST_MT_F("require that basic unix domain socket io works", 2, ServerWrapper("ipc/file:my_socket")) {
+TEST_MT_FF("require that basic unix domain socket io works (path)", 2,
+ ServerWrapper("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));
}
-TEST_MT_F("require that server accept can be interrupted", 2, ServerWrapper("tcp/0")) {
+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))
+{
+ bool is_server = (thread_id == 0);
+ Socket::UP socket = connect_sockets(is_server, *f1.server);
+ TEST_DO(verify_socket_io(is_server, *socket));
+}
+
+TEST_MT_FF("require that server accept can be interrupted", 2, ServerWrapper("tcp/0"), TimeBomb(60)) {
bool is_server = (thread_id == 0);
if (is_server) {
fprintf(stderr, "--> calling accept\n");
@@ -226,4 +263,40 @@ TEST("require that a server socket will remove an old socket file if it cannot b
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());
+}
+
+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());
+}
+
+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());
+ 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))
+{
+ 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));
+}
+
TEST_MAIN() { TEST_RUN_ALL(); }