From ad20b96a8f258db79f67d7465a7373737e253802 Mon Sep 17 00:00:00 2001 From: Julien Gilli Date: Mon, 22 Aug 2016 10:08:45 -0700 Subject: [PATCH] test: refactor fs_event_close_in_callback MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This change refactors the `fs_event_close_in_callback` test so that: 1. It creates directory entries instead of modifying them. This allows the test to work on operating systems that use event ports to handle fs events (e.g SmartOS and Solaris). When using event ports, watching only a directory does not allow to receive events for files modified within that directory, but events will be received for files _created_ within that directory. 2. it generates fs events _after_ the process entered the libuv event loop. This is also needed to make the test work on operating systems that use event ports to handle fs events (e.g SmartOS and Solaris), because events are polled as part of running the event loop. That also makes the test work on systems based on Kqueue and on AIX. Fixes: https://github.com/libuv/libuv/pull/808 PR-URL: https://github.com/libuv/libuv/pull/1011 Reviewed-By: Saúl Ibarra Corretgé --- test/test-fs-event.c | 45 +++++++++++--------------------------------- 1 file changed, 11 insertions(+), 34 deletions(-) diff --git a/test/test-fs-event.c b/test/test-fs-event.c index fc6e8ad9..5b7774b6 100644 --- a/test/test-fs-event.c +++ b/test/test-fs-event.c @@ -788,20 +788,6 @@ TEST_IMPL(fs_event_close_with_pending_event) { return 0; } -#if defined(HAVE_KQUEUE) || defined(_AIX) - -/* kqueue doesn't register fs events if you don't have an active watcher. - * The file descriptor needs to be part of the kqueue set of interest and - * that's not the case until we actually enter the event loop. - * This is also observed on AIX with ahafs. - */ -TEST_IMPL(fs_event_close_in_callback) { - fprintf(stderr, "Skipping test, doesn't work with kqueue and AIX.\n"); - return 0; -} - -#else /* !HAVE_KQUEUE || !_AIX */ - static void fs_event_cb_close(uv_fs_event_t* handle, const char* filename, int events, int status) { ASSERT(status == 0); @@ -814,7 +800,6 @@ static void fs_event_cb_close(uv_fs_event_t* handle, const char* filename, } } - TEST_IMPL(fs_event_close_in_callback) { #if defined(__MVS__) RETURN_SKIP("Filesystem watching not supported on this platform."); @@ -824,44 +809,36 @@ TEST_IMPL(fs_event_close_in_callback) { loop = uv_default_loop(); + fs_event_unlink_files(NULL); create_dir("watch_dir"); - create_file("watch_dir/file1"); - create_file("watch_dir/file2"); - create_file("watch_dir/file3"); - create_file("watch_dir/file4"); - create_file("watch_dir/file5"); r = uv_fs_event_init(loop, &fs_event); ASSERT(r == 0); r = uv_fs_event_start(&fs_event, fs_event_cb_close, "watch_dir", 0); ASSERT(r == 0); - /* Generate a couple of fs events. */ - touch_file("watch_dir/file1"); - touch_file("watch_dir/file2"); - touch_file("watch_dir/file3"); - touch_file("watch_dir/file4"); - touch_file("watch_dir/file5"); + r = uv_timer_init(loop, &timer); + ASSERT(r == 0); + r = uv_timer_start(&timer, fs_event_create_files, 100, 0); + ASSERT(r == 0); uv_run(loop, UV_RUN_DEFAULT); - ASSERT(close_cb_called == 1); + uv_close((uv_handle_t*)&timer, close_cb); + + uv_run(loop, UV_RUN_ONCE); + + ASSERT(close_cb_called == 2); ASSERT(fs_event_cb_called == 3); /* Clean up */ - remove("watch_dir/file1"); - remove("watch_dir/file2"); - remove("watch_dir/file3"); - remove("watch_dir/file4"); - remove("watch_dir/file5"); + fs_event_unlink_files(NULL); remove("watch_dir/"); MAKE_VALGRIND_HAPPY(); return 0; } -#endif /* HAVE_KQUEUE || _AIX */ - TEST_IMPL(fs_event_start_and_close) { #if defined(__MVS__) RETURN_SKIP("Filesystem watching not supported on this platform.");