libuv-svace-build
292 строки · 7.7 Кб
1/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
2*
3* Permission is hereby granted, free of charge, to any person obtaining a copy
4* of this software and associated documentation files (the "Software"), to
5* deal in the Software without restriction, including without limitation the
6* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7* sell copies of the Software, and to permit persons to whom the Software is
8* furnished to do so, subject to the following conditions:
9*
10* The above copyright notice and this permission notice shall be included in
11* all copies or substantial portions of the Software.
12*
13* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19* IN THE SOFTWARE.
20*/
21
22#include "uv.h"23#include "task.h"24
25#include <string.h>26
27#define FIXTURE "testfile"28
29static void timer_cb(uv_timer_t* handle);30static void close_cb(uv_handle_t* handle);31static void poll_cb(uv_fs_poll_t* handle,32int status,33const uv_stat_t* prev,34const uv_stat_t* curr);35
36static void poll_cb_fail(uv_fs_poll_t* handle,37int status,38const uv_stat_t* prev,39const uv_stat_t* curr);40static void poll_cb_noop(uv_fs_poll_t* handle,41int status,42const uv_stat_t* prev,43const uv_stat_t* curr);44
45static uv_fs_poll_t poll_handle;46static uv_timer_t timer_handle;47static uv_loop_t* loop;48
49static int poll_cb_called;50static int timer_cb_called;51static int close_cb_called;52
53
54static void touch_file(const char* path) {55static int count;56FILE* fp;57int i;58
59ASSERT((fp = fopen(FIXTURE, "w+")));60
61/* Need to change the file size because the poller may not pick up62* sub-second mtime changes.
63*/
64i = ++count;65
66while (i--)67fputc('*', fp);68
69fclose(fp);70}
71
72
73static void close_cb(uv_handle_t* handle) {74close_cb_called++;75}
76
77
78static void timer_cb(uv_timer_t* handle) {79touch_file(FIXTURE);80timer_cb_called++;81}
82
83
84static void poll_cb_fail(uv_fs_poll_t* handle,85int status,86const uv_stat_t* prev,87const uv_stat_t* curr) {88ASSERT(0 && "fail_cb called");89}
90
91static void poll_cb_noop(uv_fs_poll_t* handle,92int status,93const uv_stat_t* prev,94const uv_stat_t* curr) {95}
96
97
98static void poll_cb(uv_fs_poll_t* handle,99int status,100const uv_stat_t* prev,101const uv_stat_t* curr) {102uv_stat_t zero_statbuf;103
104memset(&zero_statbuf, 0, sizeof(zero_statbuf));105
106ASSERT_PTR_EQ(handle, &poll_handle);107ASSERT_EQ(1, uv_is_active((uv_handle_t*) handle));108ASSERT_NOT_NULL(prev);109ASSERT_NOT_NULL(curr);110
111switch (poll_cb_called++) {112case 0:113ASSERT_EQ(status, UV_ENOENT);114ASSERT_OK(memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));115ASSERT_OK(memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));116touch_file(FIXTURE);117break;118
119case 1:120ASSERT_OK(status);121ASSERT_OK(memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));122ASSERT_NE(0, memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));123ASSERT_OK(uv_timer_start(&timer_handle, timer_cb, 20, 0));124break;125
126case 2:127ASSERT_OK(status);128ASSERT_NE(0, memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));129ASSERT_NE(0, memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));130ASSERT_OK(uv_timer_start(&timer_handle, timer_cb, 200, 0));131break;132
133case 3:134ASSERT_OK(status);135ASSERT_NE(0, memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));136ASSERT_NE(0, memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));137remove(FIXTURE);138break;139
140case 4:141ASSERT_EQ(status, UV_ENOENT);142ASSERT_NE(0, memcmp(prev, &zero_statbuf, sizeof(zero_statbuf)));143ASSERT_OK(memcmp(curr, &zero_statbuf, sizeof(zero_statbuf)));144uv_close((uv_handle_t*)handle, close_cb);145break;146
147default:148ASSERT(0);149}150}
151
152
153TEST_IMPL(fs_poll) {154loop = uv_default_loop();155
156remove(FIXTURE);157
158ASSERT_OK(uv_timer_init(loop, &timer_handle));159ASSERT_OK(uv_fs_poll_init(loop, &poll_handle));160ASSERT_OK(uv_fs_poll_start(&poll_handle, poll_cb, FIXTURE, 100));161ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));162
163ASSERT_EQ(5, poll_cb_called);164ASSERT_EQ(2, timer_cb_called);165ASSERT_EQ(1, close_cb_called);166
167MAKE_VALGRIND_HAPPY(loop);168return 0;169}
170
171
172TEST_IMPL(fs_poll_getpath) {173char buf[1024];174size_t len;175loop = uv_default_loop();176
177remove(FIXTURE);178
179ASSERT_OK(uv_fs_poll_init(loop, &poll_handle));180len = sizeof buf;181ASSERT_EQ(UV_EINVAL, uv_fs_poll_getpath(&poll_handle, buf, &len));182ASSERT_OK(uv_fs_poll_start(&poll_handle, poll_cb_fail, FIXTURE, 100));183len = sizeof buf;184ASSERT_OK(uv_fs_poll_getpath(&poll_handle, buf, &len));185ASSERT_NE(0, buf[len - 1]);186ASSERT_EQ(buf[len], '\0');187ASSERT_OK(memcmp(buf, FIXTURE, len));188
189uv_close((uv_handle_t*) &poll_handle, close_cb);190
191ASSERT_OK(uv_run(loop, UV_RUN_DEFAULT));192
193ASSERT_EQ(1, close_cb_called);194
195MAKE_VALGRIND_HAPPY(loop);196return 0;197}
198
199
200TEST_IMPL(fs_poll_close_request) {201uv_loop_t loop;202uv_fs_poll_t poll_handle;203
204remove(FIXTURE);205
206ASSERT_OK(uv_loop_init(&loop));207
208ASSERT_OK(uv_fs_poll_init(&loop, &poll_handle));209ASSERT_OK(uv_fs_poll_start(&poll_handle, poll_cb_fail, FIXTURE, 100));210uv_close((uv_handle_t*) &poll_handle, close_cb);211while (close_cb_called == 0)212uv_run(&loop, UV_RUN_ONCE);213ASSERT_EQ(1, close_cb_called);214
215MAKE_VALGRIND_HAPPY(&loop);216return 0;217}
218
219TEST_IMPL(fs_poll_close_request_multi_start_stop) {220uv_loop_t loop;221uv_fs_poll_t poll_handle;222int i;223
224remove(FIXTURE);225
226ASSERT_OK(uv_loop_init(&loop));227
228ASSERT_OK(uv_fs_poll_init(&loop, &poll_handle));229
230for (i = 0; i < 10; ++i) {231ASSERT_OK(uv_fs_poll_start(&poll_handle, poll_cb_fail, FIXTURE, 100));232ASSERT_OK(uv_fs_poll_stop(&poll_handle));233}234uv_close((uv_handle_t*) &poll_handle, close_cb);235while (close_cb_called == 0)236uv_run(&loop, UV_RUN_ONCE);237ASSERT_EQ(1, close_cb_called);238
239MAKE_VALGRIND_HAPPY(&loop);240return 0;241}
242
243TEST_IMPL(fs_poll_close_request_multi_stop_start) {244uv_loop_t loop;245uv_fs_poll_t poll_handle;246int i;247
248remove(FIXTURE);249
250ASSERT_OK(uv_loop_init(&loop));251
252ASSERT_OK(uv_fs_poll_init(&loop, &poll_handle));253
254for (i = 0; i < 10; ++i) {255ASSERT_OK(uv_fs_poll_stop(&poll_handle));256ASSERT_OK(uv_fs_poll_start(&poll_handle, poll_cb_fail, FIXTURE, 100));257}258uv_close((uv_handle_t*) &poll_handle, close_cb);259while (close_cb_called == 0)260uv_run(&loop, UV_RUN_ONCE);261ASSERT_EQ(1, close_cb_called);262
263MAKE_VALGRIND_HAPPY(&loop);264return 0;265}
266
267TEST_IMPL(fs_poll_close_request_stop_when_active) {268/* Regression test for https://github.com/libuv/libuv/issues/2287. */269uv_loop_t loop;270uv_fs_poll_t poll_handle;271
272remove(FIXTURE);273
274ASSERT_OK(uv_loop_init(&loop));275
276/* Set up all handles. */277ASSERT_OK(uv_fs_poll_init(&loop, &poll_handle));278ASSERT_OK(uv_fs_poll_start(&poll_handle, poll_cb_noop, FIXTURE, 100));279uv_run(&loop, UV_RUN_ONCE);280
281/* Close the timer handle, and do not crash. */282ASSERT_OK(uv_fs_poll_stop(&poll_handle));283uv_run(&loop, UV_RUN_ONCE);284
285/* Clean up after the test. */286uv_close((uv_handle_t*) &poll_handle, close_cb);287uv_run(&loop, UV_RUN_ONCE);288ASSERT_EQ(1, close_cb_called);289
290MAKE_VALGRIND_HAPPY(&loop);291return 0;292}
293