summaryrefslogtreecommitdiff
path: root/deps/uv/test/test-poll.c
diff options
context:
space:
mode:
Diffstat (limited to 'deps/uv/test/test-poll.c')
-rw-r--r--deps/uv/test/test-poll.c52
1 files changed, 45 insertions, 7 deletions
diff --git a/deps/uv/test/test-poll.c b/deps/uv/test/test-poll.c
index be8b00c32c..bfb75af133 100644
--- a/deps/uv/test/test-poll.c
+++ b/deps/uv/test/test-poll.c
@@ -21,7 +21,9 @@
#include <errno.h>
-#ifndef _WIN32
+#ifdef _WIN32
+# include <fcntl.h>
+#else
# include <sys/socket.h>
# include <unistd.h>
#endif
@@ -49,7 +51,7 @@ typedef struct connection_context_s {
size_t read, sent;
int is_server_connection;
int open_handles;
- int got_fin, sent_fin;
+ int got_fin, sent_fin, got_disconnect;
unsigned int events, delayed_events;
} connection_context_t;
@@ -70,6 +72,8 @@ static int closed_connections = 0;
static int valid_writable_wakeups = 0;
static int spurious_writable_wakeups = 0;
+static int disconnects = 0;
+
static int got_eagain(void) {
#ifdef _WIN32
@@ -140,6 +144,7 @@ static connection_context_t* create_connection_context(
context->delayed_events = 0;
context->got_fin = 0;
context->sent_fin = 0;
+ context->got_disconnect = 0;
r = uv_poll_init_socket(uv_default_loop(), &context->poll_handle, sock);
context->open_handles++;
@@ -373,7 +378,13 @@ static void connection_poll_cb(uv_poll_t* handle, int status, int events) {
}
}
- if (context->got_fin && context->sent_fin) {
+ if (events & UV_DISCONNECT) {
+ context->got_disconnect = 1;
+ ++disconnects;
+ new_events &= ~UV_DISCONNECT;
+ }
+
+ if (context->got_fin && context->sent_fin && context->got_disconnect) {
/* Sent and received FIN. Close and destroy context. */
close_socket(context->sock);
destroy_connection_context(context);
@@ -461,9 +472,9 @@ static void server_poll_cb(uv_poll_t* handle, int status, int events) {
#endif
connection_context = create_connection_context(sock, 1);
- connection_context->events = UV_READABLE | UV_WRITABLE;
+ connection_context->events = UV_READABLE | UV_WRITABLE | UV_DISCONNECT;
r = uv_poll_start(&connection_context->poll_handle,
- UV_READABLE | UV_WRITABLE,
+ UV_READABLE | UV_WRITABLE | UV_DISCONNECT,
connection_poll_cb);
ASSERT(r == 0);
@@ -505,9 +516,9 @@ static void start_client(void) {
sock = create_bound_socket(addr);
context = create_connection_context(sock, 0);
- context->events = UV_READABLE | UV_WRITABLE;
+ context->events = UV_READABLE | UV_WRITABLE | UV_DISCONNECT;
r = uv_poll_start(&context->poll_handle,
- UV_READABLE | UV_WRITABLE,
+ UV_READABLE | UV_WRITABLE | UV_DISCONNECT,
connection_poll_cb);
ASSERT(r == 0);
@@ -541,6 +552,7 @@ static void start_poll_test(void) {
spurious_writable_wakeups > 20);
ASSERT(closed_connections == NUM_CLIENTS * 2);
+ ASSERT(disconnects == NUM_CLIENTS * 2);
MAKE_VALGRIND_HAPPY();
}
@@ -558,3 +570,29 @@ TEST_IMPL(poll_unidirectional) {
start_poll_test();
return 0;
}
+
+
+/* Windows won't let you open a directory so we open a file instead.
+ * OS X lets you poll a file so open the $PWD instead. Both fail
+ * on Linux so it doesn't matter which one we pick. Both succeed
+ * on FreeBSD, Solaris and AIX so skip the test on those platforms.
+ */
+TEST_IMPL(poll_bad_fdtype) {
+#if !defined(__DragonFly__) && !defined(__FreeBSD__) && !defined(__sun) && \
+ !defined(_AIX)
+ uv_poll_t poll_handle;
+ int fd;
+
+#if defined(_WIN32)
+ fd = open("test/fixtures/empty_file", O_RDONLY);
+#else
+ fd = open(".", O_RDONLY);
+#endif
+ ASSERT(fd != -1);
+ ASSERT(0 != uv_poll_init(uv_default_loop(), &poll_handle, fd));
+ ASSERT(0 == close(fd));
+#endif
+
+ MAKE_VALGRIND_HAPPY();
+ return 0;
+}