summaryrefslogtreecommitdiff
path: root/deps/uv/test
diff options
context:
space:
mode:
Diffstat (limited to 'deps/uv/test')
-rw-r--r--deps/uv/test/runner-unix.c2
-rw-r--r--deps/uv/test/task.h10
-rw-r--r--deps/uv/test/test-condvar.c100
-rw-r--r--deps/uv/test/test-eintr-handling.c94
-rw-r--r--deps/uv/test/test-fs-event.c28
-rw-r--r--deps/uv/test/test-fs-poll.c1
-rw-r--r--deps/uv/test/test-get-passwd.c80
-rw-r--r--deps/uv/test/test-homedir.c21
-rw-r--r--deps/uv/test/test-list.h29
-rw-r--r--deps/uv/test/test-pipe-close-stdout-read-stdin.c3
-rw-r--r--deps/uv/test/test-pipe-getsockname.c1
-rw-r--r--deps/uv/test/test-platform-output.c11
-rw-r--r--deps/uv/test/test-poll.c52
-rw-r--r--deps/uv/test/test-tcp-close-while-connecting.c2
-rw-r--r--deps/uv/test/test-thread.c21
-rw-r--r--deps/uv/test/test-timer.c27
-rw-r--r--deps/uv/test/test-tmpdir.c71
-rw-r--r--deps/uv/test/test-tty.c39
18 files changed, 545 insertions, 47 deletions
diff --git a/deps/uv/test/runner-unix.c b/deps/uv/test/runner-unix.c
index 2264d1e89d..2405fa878c 100644
--- a/deps/uv/test/runner-unix.c
+++ b/deps/uv/test/runner-unix.c
@@ -226,7 +226,7 @@ int process_wait(process_info_t* vec, int n, int timeout) {
tv = timebase;
for (;;) {
/* Check that gettimeofday() doesn't jump back in time. */
- assert(tv.tv_sec == timebase.tv_sec ||
+ assert(tv.tv_sec > timebase.tv_sec ||
(tv.tv_sec == timebase.tv_sec && tv.tv_usec >= timebase.tv_usec));
elapsed_ms =
diff --git a/deps/uv/test/task.h b/deps/uv/test/task.h
index d18c1daa36..96cc6377cb 100644
--- a/deps/uv/test/task.h
+++ b/deps/uv/test/task.h
@@ -108,10 +108,10 @@ typedef enum {
/* This macro cleans up the main loop. This is used to avoid valgrind
* warnings about memory being "leaked" by the main event loop.
*/
-#define MAKE_VALGRIND_HAPPY() \
- do { \
- close_loop(uv_default_loop()); \
- uv_loop_delete(uv_default_loop()); \
+#define MAKE_VALGRIND_HAPPY() \
+ do { \
+ close_loop(uv_default_loop()); \
+ ASSERT(0 == uv_loop_close(uv_default_loop())); \
} while (0)
/* Just sugar for wrapping the main() for a task or helper. */
@@ -207,7 +207,7 @@ UNUSED static int can_ipv6(void) {
int i;
if (uv_interface_addresses(&addr, &count))
- return 1; /* Assume IPv6 support on failure. */
+ return 0; /* Assume no IPv6 support on failure. */
supported = 0;
for (i = 0; supported == 0 && i < count; i += 1)
diff --git a/deps/uv/test/test-condvar.c b/deps/uv/test/test-condvar.c
index dbacdba384..83b28494ad 100644
--- a/deps/uv/test/test-condvar.c
+++ b/deps/uv/test/test-condvar.c
@@ -25,24 +25,33 @@
#include <string.h>
#include <errno.h>
-typedef struct {
+typedef struct worker_config {
uv_mutex_t mutex;
uv_cond_t cond;
- int delay;
+ int signal_delay;
+ int wait_delay;
int use_broadcast;
- volatile int posted;
+ volatile int posted_1;
+ volatile int posted_2;
+ void (*signal_cond)(struct worker_config* c, volatile int* flag);
+ void (*wait_cond)(struct worker_config* c, const volatile int* flag);
} worker_config;
static void worker(void* arg) {
worker_config* c = arg;
+ c->signal_cond(c, &c->posted_1);
+ c->wait_cond(c, &c->posted_2);
+}
+
- if (c->delay)
- uv_sleep(c->delay);
+static void condvar_signal(worker_config* c, volatile int* flag) {
+ if (c->signal_delay)
+ uv_sleep(c->signal_delay);
uv_mutex_lock(&c->mutex);
- ASSERT(c->posted == 0);
- c->posted = 1;
+ ASSERT(*flag == 0);
+ *flag = 1;
if (c->use_broadcast)
uv_cond_broadcast(&c->cond);
else
@@ -51,21 +60,33 @@ static void worker(void* arg) {
}
+static void condvar_wait(worker_config* c, const volatile int* flag) {
+ uv_mutex_lock(&c->mutex);
+ if (c->wait_delay)
+ uv_sleep(c->wait_delay);
+ while (*flag == 0) {
+ uv_cond_wait(&c->cond, &c->mutex);
+ }
+ ASSERT(*flag == 1);
+ uv_mutex_unlock(&c->mutex);
+}
+
+
TEST_IMPL(condvar_1) {
uv_thread_t thread;
worker_config wc;
memset(&wc, 0, sizeof(wc));
+ wc.wait_delay = 100;
+ wc.signal_cond = condvar_signal;
+ wc.wait_cond = condvar_wait;
ASSERT(0 == uv_cond_init(&wc.cond));
ASSERT(0 == uv_mutex_init(&wc.mutex));
ASSERT(0 == uv_thread_create(&thread, worker, &wc));
- uv_mutex_lock(&wc.mutex);
- uv_sleep(100);
- uv_cond_wait(&wc.cond, &wc.mutex);
- ASSERT(wc.posted == 1);
- uv_mutex_unlock(&wc.mutex);
+ wc.wait_cond(&wc, &wc.posted_1);
+ wc.signal_cond(&wc, &wc.posted_2);
ASSERT(0 == uv_thread_join(&thread));
uv_mutex_destroy(&wc.mutex);
@@ -80,15 +101,16 @@ TEST_IMPL(condvar_2) {
worker_config wc;
memset(&wc, 0, sizeof(wc));
- wc.delay = 100;
+ wc.signal_delay = 100;
+ wc.signal_cond = condvar_signal;
+ wc.wait_cond = condvar_wait;
ASSERT(0 == uv_cond_init(&wc.cond));
ASSERT(0 == uv_mutex_init(&wc.mutex));
ASSERT(0 == uv_thread_create(&thread, worker, &wc));
- uv_mutex_lock(&wc.mutex);
- uv_cond_wait(&wc.cond, &wc.mutex);
- uv_mutex_unlock(&wc.mutex);
+ wc.wait_cond(&wc, &wc.posted_1);
+ wc.signal_cond(&wc, &wc.posted_2);
ASSERT(0 == uv_thread_join(&thread));
uv_mutex_destroy(&wc.mutex);
@@ -98,22 +120,35 @@ TEST_IMPL(condvar_2) {
}
+static void condvar_timedwait(worker_config* c, const volatile int* flag) {
+ int r;
+
+ uv_mutex_lock(&c->mutex);
+ if (c->wait_delay)
+ uv_sleep(c->wait_delay);
+ while (*flag == 0) {
+ r = uv_cond_timedwait(&c->cond, &c->mutex, (uint64_t)(150 * 1e6));
+ ASSERT(r == 0);
+ }
+ uv_mutex_unlock(&c->mutex);
+}
+
+
TEST_IMPL(condvar_3) {
uv_thread_t thread;
worker_config wc;
- int r;
memset(&wc, 0, sizeof(wc));
- wc.delay = 100;
+ wc.signal_delay = 100;
+ wc.signal_cond = condvar_signal;
+ wc.wait_cond = condvar_timedwait;
ASSERT(0 == uv_cond_init(&wc.cond));
ASSERT(0 == uv_mutex_init(&wc.mutex));
ASSERT(0 == uv_thread_create(&thread, worker, &wc));
- uv_mutex_lock(&wc.mutex);
- r = uv_cond_timedwait(&wc.cond, &wc.mutex, (uint64_t)(50 * 1e6));
- ASSERT(r == UV_ETIMEDOUT);
- uv_mutex_unlock(&wc.mutex);
+ wc.wait_cond(&wc, &wc.posted_1);
+ wc.signal_cond(&wc, &wc.posted_2);
ASSERT(0 == uv_thread_join(&thread));
uv_mutex_destroy(&wc.mutex);
@@ -126,19 +161,18 @@ TEST_IMPL(condvar_3) {
TEST_IMPL(condvar_4) {
uv_thread_t thread;
worker_config wc;
- int r;
memset(&wc, 0, sizeof(wc));
- wc.delay = 100;
+ wc.signal_delay = 100;
+ wc.signal_cond = condvar_signal;
+ wc.wait_cond = condvar_timedwait;
ASSERT(0 == uv_cond_init(&wc.cond));
ASSERT(0 == uv_mutex_init(&wc.mutex));
ASSERT(0 == uv_thread_create(&thread, worker, &wc));
- uv_mutex_lock(&wc.mutex);
- r = uv_cond_timedwait(&wc.cond, &wc.mutex, (uint64_t)(150 * 1e6));
- ASSERT(r == 0);
- uv_mutex_unlock(&wc.mutex);
+ wc.wait_cond(&wc, &wc.posted_1);
+ wc.signal_cond(&wc, &wc.posted_2);
ASSERT(0 == uv_thread_join(&thread));
uv_mutex_destroy(&wc.mutex);
@@ -154,16 +188,16 @@ TEST_IMPL(condvar_5) {
memset(&wc, 0, sizeof(wc));
wc.use_broadcast = 1;
+ wc.signal_delay = 100;
+ wc.signal_cond = condvar_signal;
+ wc.wait_cond = condvar_wait;
ASSERT(0 == uv_cond_init(&wc.cond));
ASSERT(0 == uv_mutex_init(&wc.mutex));
ASSERT(0 == uv_thread_create(&thread, worker, &wc));
- uv_mutex_lock(&wc.mutex);
- uv_sleep(100);
- uv_cond_wait(&wc.cond, &wc.mutex);
- ASSERT(wc.posted == 1);
- uv_mutex_unlock(&wc.mutex);
+ wc.wait_cond(&wc, &wc.posted_1);
+ wc.signal_cond(&wc, &wc.posted_2);
ASSERT(0 == uv_thread_join(&thread));
uv_mutex_destroy(&wc.mutex);
diff --git a/deps/uv/test/test-eintr-handling.c b/deps/uv/test/test-eintr-handling.c
new file mode 100644
index 0000000000..1aaf623b78
--- /dev/null
+++ b/deps/uv/test/test-eintr-handling.c
@@ -0,0 +1,94 @@
+/* Copyright libuv project contributors. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include "uv.h"
+#include "task.h"
+
+#ifdef _WIN32
+
+TEST_IMPL(eintr_handling) {
+ RETURN_SKIP("Test not implemented on Windows.");
+}
+
+#else /* !_WIN32 */
+
+#include <string.h>
+#include <unistd.h>
+
+static uv_loop_t* loop;
+static uv_fs_t read_req;
+static uv_buf_t iov;
+
+static char buf[32];
+static char test_buf[] = "test-buffer\n";
+int pipe_fds[2];
+
+struct thread_ctx {
+ uv_barrier_t barrier;
+ int fd;
+};
+
+static void thread_main(void* arg) {
+ int nwritten;
+ ASSERT(0 == kill(getpid(), SIGUSR1));
+
+ do
+ nwritten = write(pipe_fds[1], test_buf, sizeof(test_buf));
+ while (nwritten == -1 && errno == EINTR);
+
+ ASSERT(nwritten == sizeof(test_buf));
+}
+
+static void sig_func(uv_signal_t* handle, int signum) {
+ uv_signal_stop(handle);
+}
+
+TEST_IMPL(eintr_handling) {
+ struct thread_ctx ctx;
+ uv_thread_t thread;
+ uv_signal_t signal;
+ int nread;
+
+ iov = uv_buf_init(buf, sizeof(buf));
+ loop = uv_default_loop();
+
+ ASSERT(0 == uv_signal_init(loop, &signal));
+ ASSERT(0 == uv_signal_start(&signal, sig_func, SIGUSR1));
+
+ ASSERT(0 == pipe(pipe_fds));
+ ASSERT(0 == uv_thread_create(&thread, thread_main, &ctx));
+
+ nread = uv_fs_read(loop, &read_req, pipe_fds[0], &iov, 1, -1, NULL);
+
+ ASSERT(nread == sizeof(test_buf));
+ ASSERT(0 == strcmp(buf, test_buf));
+
+ ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
+
+ ASSERT(0 == close(pipe_fds[0]));
+ ASSERT(0 == close(pipe_fds[1]));
+ uv_close((uv_handle_t*) &signal, NULL);
+
+ MAKE_VALGRIND_HAPPY();
+ return 0;
+}
+
+#endif /* !_WIN32 */
diff --git a/deps/uv/test/test-fs-event.c b/deps/uv/test/test-fs-event.c
index e02ff2fda5..35583529e5 100644
--- a/deps/uv/test/test-fs-event.c
+++ b/deps/uv/test/test-fs-event.c
@@ -531,6 +531,33 @@ TEST_IMPL(fs_event_watch_file_current_dir) {
return 0;
}
+#ifdef _WIN32
+TEST_IMPL(fs_event_watch_file_root_dir) {
+ uv_loop_t* loop;
+ int r;
+
+ const char* sys_drive = getenv("SystemDrive");
+ char path[] = "\\\\?\\X:\\bootsect.bak";
+
+ ASSERT(sys_drive != NULL);
+ strncpy(path + sizeof("\\\\?\\") - 1, sys_drive, 1);
+
+ loop = uv_default_loop();
+
+ r = uv_fs_event_init(loop, &fs_event);
+ ASSERT(r == 0);
+ r = uv_fs_event_start(&fs_event, fail_cb, path, 0);
+ if (r == UV_ENOENT)
+ RETURN_SKIP("bootsect.bak doesn't exist in system root.\n");
+ ASSERT(r == 0);
+
+ uv_close((uv_handle_t*) &fs_event, NULL);
+
+ MAKE_VALGRIND_HAPPY();
+ return 0;
+}
+#endif
+
TEST_IMPL(fs_event_no_callback_after_close) {
uv_loop_t* loop = uv_default_loop();
int r;
@@ -792,6 +819,7 @@ TEST_IMPL(fs_event_getpath) {
r = uv_fs_event_getpath(&fs_event, buf, &len);
ASSERT(r == 0);
ASSERT(buf[len - 1] != 0);
+ ASSERT(buf[len] == '\0');
ASSERT(memcmp(buf, "watch_dir", len) == 0);
r = uv_fs_event_stop(&fs_event);
ASSERT(r == 0);
diff --git a/deps/uv/test/test-fs-poll.c b/deps/uv/test/test-fs-poll.c
index dbc1515b0b..737d50dfd2 100644
--- a/deps/uv/test/test-fs-poll.c
+++ b/deps/uv/test/test-fs-poll.c
@@ -173,6 +173,7 @@ TEST_IMPL(fs_poll_getpath) {
len = sizeof buf;
ASSERT(0 == uv_fs_poll_getpath(&poll_handle, buf, &len));
ASSERT(buf[len - 1] != 0);
+ ASSERT(buf[len] == '\0');
ASSERT(0 == memcmp(buf, FIXTURE, len));
uv_close((uv_handle_t*) &poll_handle, close_cb);
diff --git a/deps/uv/test/test-get-passwd.c b/deps/uv/test/test-get-passwd.c
new file mode 100644
index 0000000000..58d9c73c69
--- /dev/null
+++ b/deps/uv/test/test-get-passwd.c
@@ -0,0 +1,80 @@
+/* Copyright libuv contributors. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include "uv.h"
+#include "task.h"
+#include <string.h>
+
+TEST_IMPL(get_passwd) {
+ uv_passwd_t pwd;
+ size_t len;
+ int r;
+
+ /* Test the normal case */
+ r = uv_os_get_passwd(&pwd);
+ ASSERT(r == 0);
+ len = strlen(pwd.username);
+ ASSERT(len > 0);
+
+#ifdef _WIN32
+ ASSERT(pwd.shell == NULL);
+#else
+ len = strlen(pwd.shell);
+ ASSERT(len > 0);
+#endif
+
+ len = strlen(pwd.homedir);
+ ASSERT(len > 0);
+
+#ifdef _WIN32
+ ASSERT(pwd.homedir[len - 1] != '\\');
+#else
+ ASSERT(pwd.homedir[len - 1] != '/');
+#endif
+
+#ifdef _WIN32
+ ASSERT(pwd.uid == -1);
+ ASSERT(pwd.gid == -1);
+#else
+ ASSERT(pwd.uid >= 0);
+ ASSERT(pwd.gid >= 0);
+#endif
+
+ /* Test uv_os_free_passwd() */
+ uv_os_free_passwd(&pwd);
+
+ ASSERT(pwd.username == NULL);
+ ASSERT(pwd.shell == NULL);
+ ASSERT(pwd.homedir == NULL);
+
+ /* Test a double free */
+ uv_os_free_passwd(&pwd);
+
+ ASSERT(pwd.username == NULL);
+ ASSERT(pwd.shell == NULL);
+ ASSERT(pwd.homedir == NULL);
+
+ /* Test invalid input */
+ r = uv_os_get_passwd(NULL);
+ ASSERT(r == UV_EINVAL);
+
+ return 0;
+}
diff --git a/deps/uv/test/test-homedir.c b/deps/uv/test/test-homedir.c
index cbc47566c5..5027d44c1e 100644
--- a/deps/uv/test/test-homedir.c
+++ b/deps/uv/test/test-homedir.c
@@ -1,3 +1,24 @@
+/* Copyright libuv project contributors. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
#include "uv.h"
#include "task.h"
#include <string.h>
diff --git a/deps/uv/test/test-list.h b/deps/uv/test/test-list.h
index 858a20af49..8b10f1a5f6 100644
--- a/deps/uv/test/test-list.h
+++ b/deps/uv/test/test-list.h
@@ -44,6 +44,7 @@ TEST_DECLARE (semaphore_2)
TEST_DECLARE (semaphore_3)
TEST_DECLARE (tty)
TEST_DECLARE (tty_file)
+TEST_DECLARE (tty_pty)
TEST_DECLARE (stdio_over_pipes)
TEST_DECLARE (ip6_pton)
TEST_DECLARE (ipc_listen_before_write)
@@ -154,6 +155,7 @@ TEST_DECLARE (timer_huge_repeat)
TEST_DECLARE (timer_run_once)
TEST_DECLARE (timer_from_check)
TEST_DECLARE (timer_null_callback)
+TEST_DECLARE (timer_early_check)
TEST_DECLARE (idle_starvation)
TEST_DECLARE (loop_handles)
TEST_DECLARE (get_loadavg)
@@ -191,12 +193,15 @@ TEST_DECLARE (active)
TEST_DECLARE (embed)
TEST_DECLARE (async)
TEST_DECLARE (async_null_cb)
+TEST_DECLARE (eintr_handling)
TEST_DECLARE (get_currentexe)
TEST_DECLARE (process_title)
TEST_DECLARE (cwd_and_chdir)
TEST_DECLARE (get_memory)
+TEST_DECLARE (get_passwd)
TEST_DECLARE (handle_fileno)
TEST_DECLARE (homedir)
+TEST_DECLARE (tmpdir)
TEST_DECLARE (hrtime)
TEST_DECLARE (getaddrinfo_fail)
TEST_DECLARE (getaddrinfo_fail_sync)
@@ -267,6 +272,9 @@ TEST_DECLARE (fs_event_watch_dir_recursive)
TEST_DECLARE (fs_event_watch_file)
TEST_DECLARE (fs_event_watch_file_twice)
TEST_DECLARE (fs_event_watch_file_current_dir)
+#ifdef _WIN32
+TEST_DECLARE (fs_event_watch_file_root_dir)
+#endif
TEST_DECLARE (fs_event_no_callback_after_close)
TEST_DECLARE (fs_event_no_callback_on_close)
TEST_DECLARE (fs_event_immediate_close)
@@ -292,6 +300,7 @@ TEST_DECLARE (threadpool_cancel_work)
TEST_DECLARE (threadpool_cancel_fs)
TEST_DECLARE (threadpool_cancel_single)
TEST_DECLARE (thread_local_storage)
+TEST_DECLARE (thread_stack_size)
TEST_DECLARE (thread_mutex)
TEST_DECLARE (thread_rwlock)
TEST_DECLARE (thread_rwlock_trylock)
@@ -301,6 +310,7 @@ TEST_DECLARE (dlerror)
TEST_DECLARE (poll_duplex)
TEST_DECLARE (poll_unidirectional)
TEST_DECLARE (poll_close)
+TEST_DECLARE (poll_bad_fdtype)
TEST_DECLARE (ip4_addr)
TEST_DECLARE (ip6_addr_link_local)
@@ -378,6 +388,7 @@ TASK_LIST_START
TEST_ENTRY (pipe_set_non_blocking)
TEST_ENTRY (tty)
TEST_ENTRY (tty_file)
+ TEST_ENTRY (tty_pty)
TEST_ENTRY (stdio_over_pipes)
TEST_ENTRY (ip6_pton)
TEST_ENTRY (ipc_listen_before_write)
@@ -522,6 +533,7 @@ TASK_LIST_START
TEST_ENTRY (timer_run_once)
TEST_ENTRY (timer_from_check)
TEST_ENTRY (timer_null_callback)
+ TEST_ENTRY (timer_early_check)
TEST_ENTRY (idle_starvation)
@@ -566,6 +578,7 @@ TASK_LIST_START
TEST_ENTRY (async)
TEST_ENTRY (async_null_cb)
+ TEST_ENTRY (eintr_handling)
TEST_ENTRY (get_currentexe)
@@ -575,12 +588,16 @@ TASK_LIST_START
TEST_ENTRY (get_memory)
+ TEST_ENTRY (get_passwd)
+
TEST_ENTRY (get_loadavg)
TEST_ENTRY (handle_fileno)
TEST_ENTRY (homedir)
+ TEST_ENTRY (tmpdir)
+
TEST_ENTRY (hrtime)
TEST_ENTRY_CUSTOM (getaddrinfo_fail, 0, 0, 10000)
@@ -600,6 +617,7 @@ TASK_LIST_START
TEST_ENTRY (poll_duplex)
TEST_ENTRY (poll_unidirectional)
TEST_ENTRY (poll_close)
+ TEST_ENTRY (poll_bad_fdtype)
TEST_ENTRY (socket_buffer_size)
@@ -688,6 +706,9 @@ TASK_LIST_START
TEST_ENTRY (fs_event_watch_file)
TEST_ENTRY (fs_event_watch_file_twice)
TEST_ENTRY (fs_event_watch_file_current_dir)
+#ifdef _WIN32
+ TEST_ENTRY (fs_event_watch_file_root_dir)
+#endif
TEST_ENTRY (fs_event_no_callback_after_close)
TEST_ENTRY (fs_event_no_callback_on_close)
TEST_ENTRY (fs_event_immediate_close)
@@ -706,13 +727,21 @@ TASK_LIST_START
TEST_ENTRY (fs_read_write_null_arguments)
TEST_ENTRY (threadpool_queue_work_simple)
TEST_ENTRY (threadpool_queue_work_einval)
+#if defined(__PPC__) || defined(__PPC64__) /* For linux PPC and AIX */
+ /* pthread_join takes a while, especially on AIX.
+ * Therefore being gratuitous with timeout.
+ */
+ TEST_ENTRY_CUSTOM (threadpool_multiple_event_loops, 0, 0, 120000)
+#else
TEST_ENTRY (threadpool_multiple_event_loops)
+#endif
TEST_ENTRY (threadpool_cancel_getaddrinfo)
TEST_ENTRY (threadpool_cancel_getnameinfo)
TEST_ENTRY (threadpool_cancel_work)
TEST_ENTRY (threadpool_cancel_fs)
TEST_ENTRY (threadpool_cancel_single)
TEST_ENTRY (thread_local_storage)
+ TEST_ENTRY (thread_stack_size)
TEST_ENTRY (thread_mutex)
TEST_ENTRY (thread_rwlock)
TEST_ENTRY (thread_rwlock_trylock)
diff --git a/deps/uv/test/test-pipe-close-stdout-read-stdin.c b/deps/uv/test/test-pipe-close-stdout-read-stdin.c
index ee8bb2a9a8..4ab14789a3 100644
--- a/deps/uv/test/test-pipe-close-stdout-read-stdin.c
+++ b/deps/uv/test/test-pipe-close-stdout-read-stdin.c
@@ -53,6 +53,7 @@ TEST_IMPL(pipe_close_stdout_read_stdin) {
int pid;
int fd[2];
int status;
+ char buf;
uv_pipe_t stdin_pipe;
r = pipe(fd);
@@ -64,6 +65,8 @@ TEST_IMPL(pipe_close_stdout_read_stdin) {
* The write side will be closed by the parent process.
*/
close(fd[1]);
+ /* block until write end of pipe is closed */
+ read(fd[0], &buf, 1);
close(0);
r = dup(fd[0]);
ASSERT(r != -1);
diff --git a/deps/uv/test/test-pipe-getsockname.c b/deps/uv/test/test-pipe-getsockname.c
index 5e036f9d52..58041c0266 100644
--- a/deps/uv/test/test-pipe-getsockname.c
+++ b/deps/uv/test/test-pipe-getsockname.c
@@ -114,6 +114,7 @@ TEST_IMPL(pipe_getsockname) {
ASSERT(r == 0);
ASSERT(buf[len - 1] != 0);
+ ASSERT(buf[len] == '\0');
ASSERT(memcmp(buf, TEST_PIPENAME, len) == 0);
len = sizeof buf;
diff --git a/deps/uv/test/test-platform-output.c b/deps/uv/test/test-platform-output.c
index 76495e14fd..2c4740550a 100644
--- a/deps/uv/test/test-platform-output.c
+++ b/deps/uv/test/test-platform-output.c
@@ -32,6 +32,7 @@ TEST_IMPL(platform_output) {
uv_rusage_t rusage;
uv_cpu_info_t* cpus;
uv_interface_address_t* interfaces;
+ uv_passwd_t pwd;
int count;
int i;
int err;
@@ -122,5 +123,15 @@ TEST_IMPL(platform_output) {
}
uv_free_interface_addresses(interfaces, count);
+ err = uv_os_get_passwd(&pwd);
+ ASSERT(err == 0);
+
+ printf("uv_os_get_passwd:\n");
+ printf(" euid: %ld\n", pwd.uid);
+ printf(" gid: %ld\n", pwd.gid);
+ printf(" username: %s\n", pwd.username);
+ printf(" shell: %s\n", pwd.shell);
+ printf(" home directory: %s\n", pwd.homedir);
+
return 0;
}
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;
+}
diff --git a/deps/uv/test/test-tcp-close-while-connecting.c b/deps/uv/test/test-tcp-close-while-connecting.c
index 2c39b652b6..60df7a5744 100644
--- a/deps/uv/test/test-tcp-close-while-connecting.c
+++ b/deps/uv/test/test-tcp-close-while-connecting.c
@@ -72,7 +72,7 @@ TEST_IMPL(tcp_close_while_connecting) {
RETURN_SKIP("Network unreachable.");
ASSERT(r == 0);
ASSERT(0 == uv_timer_init(loop, &timer1_handle));
- ASSERT(0 == uv_timer_start(&timer1_handle, timer1_cb, 50, 0));
+ ASSERT(0 == uv_timer_start(&timer1_handle, timer1_cb, 1, 0));
ASSERT(0 == uv_timer_init(loop, &timer2_handle));
ASSERT(0 == uv_timer_start(&timer2_handle, timer2_cb, 86400 * 1000, 0));
ASSERT(0 == uv_run(loop, UV_RUN_DEFAULT));
diff --git a/deps/uv/test/test-thread.c b/deps/uv/test/test-thread.c
index 7f3321aa06..10bec3fe6c 100644
--- a/deps/uv/test/test-thread.c
+++ b/deps/uv/test/test-thread.c
@@ -209,3 +209,24 @@ TEST_IMPL(thread_local_storage) {
uv_key_delete(&tls_key);
return 0;
}
+
+
+#if defined(__APPLE__)
+static void thread_check_stack(void* arg) {
+ /* 512KB is the default stack size of threads other than the main thread
+ * on OSX. */
+ ASSERT(pthread_get_stacksize_np(pthread_self()) > 512*1024);
+}
+#endif
+
+
+TEST_IMPL(thread_stack_size) {
+#if defined(__APPLE__)
+ uv_thread_t thread;
+ ASSERT(0 == uv_thread_create(&thread, thread_check_stack, NULL));
+ ASSERT(0 == uv_thread_join(&thread));
+ return 0;
+#else
+ RETURN_SKIP("OSX only test");
+#endif
+}
diff --git a/deps/uv/test/test-timer.c b/deps/uv/test/test-timer.c
index aba050fd64..080a73005e 100644
--- a/deps/uv/test/test-timer.c
+++ b/deps/uv/test/test-timer.c
@@ -301,3 +301,30 @@ TEST_IMPL(timer_null_callback) {
MAKE_VALGRIND_HAPPY();
return 0;
}
+
+
+static uint64_t timer_early_check_expected_time;
+
+
+static void timer_early_check_cb(uv_timer_t* handle) {
+ uint64_t hrtime = uv_hrtime() / 1000000;
+ ASSERT(hrtime >= timer_early_check_expected_time);
+}
+
+
+TEST_IMPL(timer_early_check) {
+ uv_timer_t timer_handle;
+ const uint64_t timeout_ms = 10;
+
+ timer_early_check_expected_time = uv_now(uv_default_loop()) + timeout_ms;
+
+ ASSERT(0 == uv_timer_init(uv_default_loop(), &timer_handle));
+ ASSERT(0 == uv_timer_start(&timer_handle, timer_early_check_cb, timeout_ms, 0));
+ ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
+
+ uv_close((uv_handle_t*) &timer_handle, NULL);
+ ASSERT(0 == uv_run(uv_default_loop(), UV_RUN_DEFAULT));
+
+ MAKE_VALGRIND_HAPPY();
+ return 0;
+}
diff --git a/deps/uv/test/test-tmpdir.c b/deps/uv/test/test-tmpdir.c
new file mode 100644
index 0000000000..29e8055f1d
--- /dev/null
+++ b/deps/uv/test/test-tmpdir.c
@@ -0,0 +1,71 @@
+/* Copyright libuv project contributors. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+#include "uv.h"
+#include "task.h"
+#include <string.h>
+
+#define PATHMAX 1024
+#define SMALLPATH 1
+
+TEST_IMPL(tmpdir) {
+ char tmpdir[PATHMAX];
+ size_t len;
+ char last;
+ int r;
+
+ /* Test the normal case */
+ len = sizeof tmpdir;
+ tmpdir[0] = '\0';
+
+ ASSERT(strlen(tmpdir) == 0);
+ r = uv_os_tmpdir(tmpdir, &len);
+ ASSERT(r == 0);
+ ASSERT(strlen(tmpdir) == len);
+ ASSERT(len > 0);
+ ASSERT(tmpdir[len] == '\0');
+
+ if (len > 1) {
+ last = tmpdir[len - 1];
+#ifdef _WIN32
+ ASSERT(last != '\\');
+#else
+ ASSERT(last != '/');
+#endif
+ }
+
+ /* Test the case where the buffer is too small */
+ len = SMALLPATH;
+ r = uv_os_tmpdir(tmpdir, &len);
+ ASSERT(r == UV_ENOBUFS);
+ ASSERT(len > SMALLPATH);
+
+ /* Test invalid inputs */
+ r = uv_os_tmpdir(NULL, &len);
+ ASSERT(r == UV_EINVAL);
+ r = uv_os_tmpdir(tmpdir, NULL);
+ ASSERT(r == UV_EINVAL);
+ len = 0;
+ r = uv_os_tmpdir(tmpdir, &len);
+ ASSERT(r == UV_EINVAL);
+
+ return 0;
+}
diff --git a/deps/uv/test/test-tty.c b/deps/uv/test/test-tty.c
index b844959d52..461d194135 100644
--- a/deps/uv/test/test-tty.c
+++ b/deps/uv/test/test-tty.c
@@ -28,6 +28,13 @@
#else /* Unix */
# include <fcntl.h>
# include <unistd.h>
+# if defined(__linux__)
+# include <pty.h>
+# elif defined(__OpenBSD__) || defined(__NetBSD__) || defined(__APPLE__)
+# include <util.h>
+# elif defined(__FreeBSD__) || defined(__DragonFly__)
+# include <libutil.h>
+# endif
#endif
#include <string.h>
@@ -182,3 +189,35 @@ TEST_IMPL(tty_file) {
#endif
return 0;
}
+
+TEST_IMPL(tty_pty) {
+# if defined(__linux__) || defined(__OpenBSD__) || defined(__NetBSD__) || \
+ defined(__APPLE__) || defined(__FreeBSD__) || defined(__DragonFly__)
+ int master_fd, slave_fd;
+ struct winsize w;
+ uv_loop_t loop;
+ uv_tty_t master_tty, slave_tty;
+
+ ASSERT(0 == uv_loop_init(&loop));
+
+ ASSERT(0 == openpty(&master_fd, &slave_fd, NULL, NULL, &w));
+ ASSERT(0 == uv_tty_init(&loop, &slave_tty, slave_fd, 0));
+ ASSERT(0 == uv_tty_init(&loop, &master_tty, master_fd, 0));
+ /* Check if the file descriptor was reopened. If it is,
+ * UV_STREAM_BLOCKING (value 0x80) isn't set on flags.
+ */
+ ASSERT(0 == (slave_tty.flags & 0x80));
+ /* The master_fd of a pty should never be reopened.
+ */
+ ASSERT(master_tty.flags & 0x80);
+ ASSERT(0 == close(slave_fd));
+ uv_close((uv_handle_t*) &slave_tty, NULL);
+ ASSERT(0 == close(master_fd));
+ uv_close((uv_handle_t*) &master_tty, NULL);
+
+ ASSERT(0 == uv_run(&loop, UV_RUN_DEFAULT));
+
+ MAKE_VALGRIND_HAPPY();
+#endif
+ return 0;
+}