From 00bf61b3b7fcf9250e0053486a0d2611a9890c87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Ludwig?= Date: Sat, 19 Jan 2019 15:26:18 +0100 Subject: [PATCH 1/2] Make the test for #115 actually fail if a socket gets leaked. --- tests/issue-115-connect-fail-leak.d | 41 ++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/tests/issue-115-connect-fail-leak.d b/tests/issue-115-connect-fail-leak.d index 5a6577c..196f9db 100644 --- a/tests/issue-115-connect-fail-leak.d +++ b/tests/issue-115-connect-fail-leak.d @@ -10,13 +10,36 @@ import vibe.core.net; void main() { - foreach (_; 0 .. 20) { - TCPConnection conn; - try { - conn = connectTCP("127.0.0.1", 16565); - logError("Connection: %s", conn); - conn.close(); - assert(false, "Didn't expect TCP connection on port 16565 to succeed"); - } catch (Exception) { } + auto initial = determineSocketCount(); + + TCPConnection conn; + try { + conn = connectTCP("127.0.0.1", 16565); + logError("Connection: %s", conn); + conn.close(); + assert(false, "Didn't expect TCP connection on port 16565 to succeed"); + } catch (Exception) { } + + assert(determineSocketCount() == initial, "Sockets leaked!"); +} + +size_t determineSocketCount() +{ + import std.algorithm.searching : count; + import std.range : iota; + + version (Posix) { + import core.sys.posix.sys.resource : getrlimit, rlimit, RLIMIT_NOFILE; + import core.sys.posix.fcntl : fcntl, F_GETFD; + + rlimit rl; + enforce(getrlimit(RLIMIT_NOFILE, &rl) == 0); + return iota(rl.rlim_cur).count(fd => fcntl(fd, F_GETFD) != -1); + } else { + import core.sys.windows.winsock2 : getsockopt, SOL_SOCKET, SO_TYPE; + + int st; + int stlen = st.sizeof; + return iota(65536).count!(s => getsockopt(s, SOL_SOCKET, SO_TYPE, cast(void*)&st, &stlen) == 0); } -} \ No newline at end of file +} From cb6a79a86fb86663f4ba4e3ad32fcd4f2e27f9de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B6nke=20Ludwig?= Date: Sun, 20 Jan 2019 11:16:53 +0100 Subject: [PATCH 2/2] Make the test for #115 actually fail if a socket gets leaked. --- tests/issue-115-connect-fail-leak.d | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/tests/issue-115-connect-fail-leak.d b/tests/issue-115-connect-fail-leak.d index 196f9db..9af3afc 100644 --- a/tests/issue-115-connect-fail-leak.d +++ b/tests/issue-115-connect-fail-leak.d @@ -8,8 +8,15 @@ import vibe.core.core; import vibe.core.log; import vibe.core.net; +import core.time; + + void main() { + // make sure that the internal driver is initialized, so that + // base resources are all allocated + sleep(1.msecs); + auto initial = determineSocketCount(); TCPConnection conn; @@ -26,6 +33,7 @@ void main() size_t determineSocketCount() { import std.algorithm.searching : count; + import std.exception : enforce; import std.range : iota; version (Posix) { @@ -34,7 +42,7 @@ size_t determineSocketCount() rlimit rl; enforce(getrlimit(RLIMIT_NOFILE, &rl) == 0); - return iota(rl.rlim_cur).count(fd => fcntl(fd, F_GETFD) != -1); + return iota(rl.rlim_cur).count!((fd) => fcntl(cast(int)fd, F_GETFD) != -1); } else { import core.sys.windows.winsock2 : getsockopt, SOL_SOCKET, SO_TYPE;