| @@ -0,0 +1,54 @@ | ||
| /* Copyright Joyent, Inc. and other Node 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" | ||
|
|
||
| static uv_timer_t timer_handle; | ||
|
|
||
| static void timer_cb(uv_timer_t* handle, int status) { | ||
| ASSERT(handle); | ||
| ASSERT(status == 0); | ||
| uv_stop(handle->loop); | ||
| } | ||
|
|
||
|
|
||
| TEST_IMPL(loop_close) { | ||
| int r; | ||
| uv_loop_t loop; | ||
|
|
||
| ASSERT(0 == uv_loop_init(&loop)); | ||
|
|
||
| uv_timer_init(&loop, &timer_handle); | ||
| uv_timer_start(&timer_handle, timer_cb, 100, 100); | ||
|
|
||
| ASSERT(UV_EBUSY == uv_loop_close(&loop)); | ||
|
|
||
| uv_run(&loop, UV_RUN_DEFAULT); | ||
|
|
||
| uv_close((uv_handle_t*) &timer_handle, NULL); | ||
| r = uv_run(&loop, UV_RUN_DEFAULT); | ||
| ASSERT(r == 0); | ||
|
|
||
| ASSERT(0 == uv_loop_close(&loop)); | ||
|
|
||
| return 0; | ||
| } |
| @@ -0,0 +1,122 @@ | ||
| /* Copyright Joyent, Inc. and other Node 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 <stdio.h> | ||
| #include <stdlib.h> | ||
| #include <string.h> | ||
|
|
||
| #if defined(__linux__) | ||
| #include <sys/socket.h> | ||
| #include <sys/un.h> | ||
| #endif | ||
|
|
||
| #ifndef _WIN32 | ||
| # include <unistd.h> /* close */ | ||
| #endif | ||
|
|
||
|
|
||
| static int close_cb_called = 0; | ||
|
|
||
|
|
||
| static void close_cb(uv_handle_t* handle) { | ||
| ASSERT(handle != NULL); | ||
| close_cb_called++; | ||
| } | ||
|
|
||
|
|
||
| TEST_IMPL(pipe_getsockname) { | ||
| uv_pipe_t server; | ||
| char buf[1024]; | ||
| size_t len; | ||
| int r; | ||
|
|
||
| r = uv_pipe_init(uv_default_loop(), &server, 0); | ||
| ASSERT(r == 0); | ||
| r = uv_pipe_bind(&server, TEST_PIPENAME); | ||
| ASSERT(r == 0); | ||
|
|
||
| len = sizeof buf; | ||
| r = uv_pipe_getsockname(&server, buf, &len); | ||
| ASSERT(r == 0); | ||
|
|
||
| ASSERT(memcmp(buf, TEST_PIPENAME, len) == 0); | ||
|
|
||
| uv_close((uv_handle_t*)&server, close_cb); | ||
|
|
||
| uv_run(uv_default_loop(), UV_RUN_DEFAULT); | ||
|
|
||
| ASSERT(close_cb_called == 1); | ||
|
|
||
| MAKE_VALGRIND_HAPPY(); | ||
| return 0; | ||
| } | ||
|
|
||
|
|
||
| TEST_IMPL(pipe_getsockname_abstract) { | ||
| #if defined(__linux__) | ||
| uv_pipe_t server; | ||
| char buf[1024]; | ||
| size_t len; | ||
| int r; | ||
| int sock; | ||
| struct sockaddr_un sun; | ||
| socklen_t sun_len; | ||
| char abstract_pipe[] = "\0test-pipe"; | ||
|
|
||
| sock = socket(AF_LOCAL, SOCK_STREAM, 0); | ||
| ASSERT(sock != -1); | ||
|
|
||
| sun_len = sizeof sun; | ||
| memset(&sun, 0, sun_len); | ||
| sun.sun_family = AF_UNIX; | ||
| memcpy(sun.sun_path, abstract_pipe, sizeof abstract_pipe); | ||
|
|
||
| r = bind(sock, (struct sockaddr*)&sun, sun_len); | ||
| ASSERT(r == 0); | ||
|
|
||
| r = uv_pipe_init(uv_default_loop(), &server, 0); | ||
| ASSERT(r == 0); | ||
| r = uv_pipe_open(&server, sock); | ||
| ASSERT(r == 0); | ||
|
|
||
| len = sizeof buf; | ||
| r = uv_pipe_getsockname(&server, buf, &len); | ||
| ASSERT(r == 0); | ||
|
|
||
| ASSERT(memcmp(buf, abstract_pipe, sizeof abstract_pipe) == 0); | ||
|
|
||
| uv_close((uv_handle_t*)&server, close_cb); | ||
|
|
||
| uv_run(uv_default_loop(), UV_RUN_DEFAULT); | ||
|
|
||
| close(sock); | ||
|
|
||
| ASSERT(close_cb_called == 1); | ||
| MAKE_VALGRIND_HAPPY(); | ||
| return 0; | ||
| #else | ||
| MAKE_VALGRIND_HAPPY(); | ||
| return 0; | ||
| #endif | ||
| } | ||
|
|
| @@ -0,0 +1,84 @@ | ||
| /* Copyright Joyent, Inc. and other Node 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. | ||
| */ | ||
|
|
||
| /* | ||
| * This is a regression test for issue #1113 (calling uv_shutdown twice will | ||
| * leave a ghost request in the system) | ||
| */ | ||
|
|
||
| #include "uv.h" | ||
| #include "task.h" | ||
|
|
||
| static uv_shutdown_t req1; | ||
| static uv_shutdown_t req2; | ||
|
|
||
| static int shutdown_cb_called = 0; | ||
|
|
||
| static void close_cb(uv_handle_t* handle) { | ||
|
|
||
| } | ||
|
|
||
| static void shutdown_cb(uv_shutdown_t* req, int status) { | ||
| ASSERT(req == &req1); | ||
| ASSERT(status == 0); | ||
| shutdown_cb_called++; | ||
| uv_close((uv_handle_t*) req->handle, close_cb); | ||
| } | ||
|
|
||
| static void connect_cb(uv_connect_t* req, int status) { | ||
| int r; | ||
|
|
||
| ASSERT(status == 0); | ||
|
|
||
| r = uv_shutdown(&req1, req->handle, shutdown_cb); | ||
| ASSERT(r == 0); | ||
| r = uv_shutdown(&req2, req->handle, shutdown_cb); | ||
| ASSERT(r != 0); | ||
|
|
||
| } | ||
|
|
||
| TEST_IMPL(shutdown_twice) { | ||
| struct sockaddr_in addr; | ||
| uv_loop_t* loop; | ||
| int r; | ||
| uv_tcp_t h; | ||
|
|
||
| uv_connect_t connect_req; | ||
|
|
||
| ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr)); | ||
| loop = uv_default_loop(); | ||
|
|
||
| r = uv_tcp_init(loop, &h); | ||
|
|
||
| r = uv_tcp_connect(&connect_req, | ||
| &h, | ||
| (const struct sockaddr*) &addr, | ||
| connect_cb); | ||
| ASSERT(r == 0); | ||
|
|
||
| r = uv_run(uv_default_loop(), UV_RUN_DEFAULT); | ||
| ASSERT(r == 0); | ||
|
|
||
| ASSERT(shutdown_cb_called == 1); | ||
|
|
||
| MAKE_VALGRIND_HAPPY(); | ||
| return 0; | ||
| } |
| @@ -0,0 +1,96 @@ | ||
| /* Copyright Joyent, Inc. and other Node 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 <stdio.h> | ||
| #include <stdlib.h> | ||
| #include <string.h> | ||
|
|
||
| #define CHECK_HANDLE(handle) \ | ||
| ASSERT((uv_udp_t*)(handle) == &server || (uv_udp_t*)(handle) == &client) | ||
|
|
||
| static uv_udp_t server; | ||
| static uv_udp_t client; | ||
|
|
||
| static int sv_send_cb_called; | ||
| static int close_cb_called; | ||
|
|
||
|
|
||
| static void close_cb(uv_handle_t* handle) { | ||
| CHECK_HANDLE(handle); | ||
| close_cb_called++; | ||
| } | ||
|
|
||
|
|
||
| static void sv_send_cb(uv_udp_send_t* req, int status) { | ||
| ASSERT(req != NULL); | ||
| ASSERT(status == 0); | ||
| CHECK_HANDLE(req->handle); | ||
|
|
||
| sv_send_cb_called++; | ||
|
|
||
| uv_close((uv_handle_t*) req->handle, close_cb); | ||
| } | ||
|
|
||
|
|
||
| TEST_IMPL(udp_multicast_interface) { | ||
| int r; | ||
| uv_udp_send_t req; | ||
| uv_buf_t buf; | ||
| struct sockaddr_in addr; | ||
| struct sockaddr_in baddr; | ||
|
|
||
| ASSERT(0 == uv_ip4_addr("239.255.0.1", TEST_PORT, &addr)); | ||
|
|
||
| r = uv_udp_init(uv_default_loop(), &server); | ||
| ASSERT(r == 0); | ||
|
|
||
| ASSERT(0 == uv_ip4_addr("0.0.0.0", 0, &baddr)); | ||
| r = uv_udp_bind(&server, (const struct sockaddr*)&baddr, 0); | ||
| ASSERT(r == 0); | ||
|
|
||
| r = uv_udp_set_multicast_interface(&server, "0.0.0.0"); | ||
| ASSERT(r == 0); | ||
|
|
||
| /* server sends "PING" */ | ||
| buf = uv_buf_init("PING", 4); | ||
| r = uv_udp_send(&req, | ||
| &server, | ||
| &buf, | ||
| 1, | ||
| (const struct sockaddr*)&addr, | ||
| sv_send_cb); | ||
| ASSERT(r == 0); | ||
|
|
||
| ASSERT(close_cb_called == 0); | ||
| ASSERT(sv_send_cb_called == 0); | ||
|
|
||
| /* run the loop till all events are processed */ | ||
| uv_run(uv_default_loop(), UV_RUN_DEFAULT); | ||
|
|
||
| ASSERT(sv_send_cb_called == 1); | ||
| ASSERT(close_cb_called == 1); | ||
|
|
||
| MAKE_VALGRIND_HAPPY(); | ||
| return 0; | ||
| } |