test-tcp-bind-error.c
Go to the documentation of this file.
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 #include <stdio.h>
25 #include <stdlib.h>
26 
27 
28 static int close_cb_called = 0;
29 
30 
31 static void close_cb(uv_handle_t* handle) {
32  ASSERT(handle != NULL);
34 }
35 
36 
37 TEST_IMPL(tcp_bind_error_addrinuse) {
38  struct sockaddr_in addr;
39  uv_tcp_t server1, server2;
40  int r;
41 
42  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
43  r = uv_tcp_init(uv_default_loop(), &server1);
44  ASSERT(r == 0);
45  r = uv_tcp_bind(&server1, (const struct sockaddr*) &addr, 0);
46  ASSERT(r == 0);
47 
48  r = uv_tcp_init(uv_default_loop(), &server2);
49  ASSERT(r == 0);
50  r = uv_tcp_bind(&server2, (const struct sockaddr*) &addr, 0);
51  ASSERT(r == 0);
52 
53  r = uv_listen((uv_stream_t*)&server1, 128, NULL);
54  ASSERT(r == 0);
55  r = uv_listen((uv_stream_t*)&server2, 128, NULL);
56  ASSERT(r == UV_EADDRINUSE);
57 
58  uv_close((uv_handle_t*)&server1, close_cb);
59  uv_close((uv_handle_t*)&server2, close_cb);
60 
62 
63  ASSERT(close_cb_called == 2);
64 
66  return 0;
67 }
68 
69 
70 TEST_IMPL(tcp_bind_error_addrnotavail_1) {
71  struct sockaddr_in addr;
73  int r;
74 
75  ASSERT(0 == uv_ip4_addr("127.255.255.255", TEST_PORT, &addr));
76 
78  ASSERT(r == 0);
79 
80  /* It seems that Linux is broken here - bind succeeds. */
81  r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0);
82  ASSERT(r == 0 || r == UV_EADDRNOTAVAIL);
83 
85 
87 
88  ASSERT(close_cb_called == 1);
89 
91  return 0;
92 }
93 
94 
95 TEST_IMPL(tcp_bind_error_addrnotavail_2) {
96  struct sockaddr_in addr;
98  int r;
99 
100  ASSERT(0 == uv_ip4_addr("4.4.4.4", TEST_PORT, &addr));
101 
103  ASSERT(r == 0);
104  r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0);
105  ASSERT(r == UV_EADDRNOTAVAIL);
106 
108 
110 
111  ASSERT(close_cb_called == 1);
112 
114  return 0;
115 }
116 
117 
118 TEST_IMPL(tcp_bind_error_fault) {
119  char garbage[] =
120  "blah blah blah blah blah blah blah blah blah blah blah blah";
121  struct sockaddr_in* garbage_addr;
123  int r;
124 
125  garbage_addr = (struct sockaddr_in*) &garbage;
126 
128  ASSERT(r == 0);
129  r = uv_tcp_bind(&server, (const struct sockaddr*) garbage_addr, 0);
130  ASSERT(r == UV_EINVAL);
131 
133 
135 
136  ASSERT(close_cb_called == 1);
137 
139  return 0;
140 }
141 
142 /* Notes: On Linux uv_bind(server, NULL) will segfault the program. */
143 
144 TEST_IMPL(tcp_bind_error_inval) {
145  struct sockaddr_in addr1;
146  struct sockaddr_in addr2;
148  int r;
149 
150  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr1));
151  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT_2, &addr2));
152 
154  ASSERT(r == 0);
155  r = uv_tcp_bind(&server, (const struct sockaddr*) &addr1, 0);
156  ASSERT(r == 0);
157  r = uv_tcp_bind(&server, (const struct sockaddr*) &addr2, 0);
158  ASSERT(r == UV_EINVAL);
159 
161 
163 
164  ASSERT(close_cb_called == 1);
165 
167  return 0;
168 }
169 
170 
171 TEST_IMPL(tcp_bind_localhost_ok) {
172  struct sockaddr_in addr;
174  int r;
175 
176  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
177 
179  ASSERT(r == 0);
180  r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0);
181  ASSERT(r == 0);
182 
184  return 0;
185 }
186 
187 
188 TEST_IMPL(tcp_bind_invalid_flags) {
189  struct sockaddr_in addr;
191  int r;
192 
193  ASSERT(0 == uv_ip4_addr("127.0.0.1", TEST_PORT, &addr));
194 
196  ASSERT(r == 0);
197  r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, UV_TCP_IPV6ONLY);
198  ASSERT(r == UV_EINVAL);
199 
201  return 0;
202 }
203 
204 
205 TEST_IMPL(tcp_listen_without_bind) {
206  int r;
208 
210  ASSERT(r == 0);
211  r = uv_listen((uv_stream_t*)&server, 128, NULL);
212  ASSERT(r == 0);
213 
215  return 0;
216 }
217 
218 
219 TEST_IMPL(tcp_bind_writable_flags) {
220  struct sockaddr_in addr;
222  uv_buf_t buf;
225  int r;
226 
227  ASSERT(0 == uv_ip4_addr("0.0.0.0", TEST_PORT, &addr));
229  ASSERT(r == 0);
230  r = uv_tcp_bind(&server, (const struct sockaddr*) &addr, 0);
231  ASSERT(r == 0);
232  r = uv_listen((uv_stream_t*)&server, 128, NULL);
233  ASSERT(r == 0);
234 
237 
238  buf = uv_buf_init("PING", 4);
239  r = uv_write(&write_req, (uv_stream_t*) &server, &buf, 1, NULL);
240  ASSERT(r == UV_EPIPE);
242  ASSERT(r == UV_ENOTCONN);
243  r = uv_read_start((uv_stream_t*) &server, NULL, NULL);
244  ASSERT(r == UV_ENOTCONN);
245 
247 
249 
250  ASSERT(close_cb_called == 1);
251 
253  return 0;
254 }
close_cb
static void close_cb(uv_handle_t *handle)
Definition: test-tcp-bind-error.c:31
task.h
uv_shutdown_s
Definition: uv.h:417
buf
voidpf void * buf
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136
uv_listen
UV_EXTERN int uv_listen(uv_stream_t *stream, int backlog, uv_connection_cb cb)
Definition: unix/stream.c:656
ASSERT
#define ASSERT(expr)
Definition: task.h:102
write_req
Definition: benchmark-tcp-write-batch.c:31
uv_run
UV_EXTERN int uv_run(uv_loop_t *, uv_run_mode mode)
Definition: unix/core.c:361
shutdown_req
static uv_shutdown_t shutdown_req
Definition: benchmark-tcp-write-batch.c:40
uv_tcp_bind
UV_EXTERN int uv_tcp_bind(uv_tcp_t *handle, const struct sockaddr *addr, unsigned int flags)
Definition: uv-common.c:277
TEST_PORT
#define TEST_PORT
Definition: task.h:53
uv_close
UV_EXTERN void uv_close(uv_handle_t *handle, uv_close_cb close_cb)
Definition: unix/core.c:112
uv_stream_s
Definition: uv.h:491
uv_ip4_addr
UV_EXTERN int uv_ip4_addr(const char *ip, int port, struct sockaddr_in *addr)
Definition: uv-common.c:221
server
std::unique_ptr< Server > server
Definition: channelz_service_test.cc:330
uv_default_loop
UV_EXTERN uv_loop_t * uv_default_loop(void)
Definition: uv-common.c:733
uv_write
UV_EXTERN int uv_write(uv_write_t *req, uv_stream_t *handle, const uv_buf_t bufs[], unsigned int nbufs, uv_write_cb cb)
Definition: unix/stream.c:1492
uv_is_readable
UV_EXTERN int uv_is_readable(const uv_stream_t *handle)
Definition: unix/stream.c:1606
UV_RUN_DEFAULT
@ UV_RUN_DEFAULT
Definition: uv.h:254
uv_shutdown
UV_PRIVATE_REQ_TYPES UV_EXTERN int uv_shutdown(uv_shutdown_t *req, uv_stream_t *handle, uv_shutdown_cb cb)
Definition: unix/stream.c:1259
uv_read_start
UV_EXTERN int uv_read_start(uv_stream_t *, uv_alloc_cb alloc_cb, uv_read_cb read_cb)
Definition: unix/stream.c:1555
uv_tcp_init
UV_EXTERN int uv_tcp_init(uv_loop_t *, uv_tcp_t *handle)
Definition: unix/tcp.c:143
UV_TCP_IPV6ONLY
@ UV_TCP_IPV6ONLY
Definition: uv.h:561
uv_tcp_s
Definition: uv.h:544
uv.h
MAKE_VALGRIND_HAPPY
#define MAKE_VALGRIND_HAPPY()
Definition: task.h:229
uv_buf_t
Definition: unix.h:121
server
Definition: examples/python/async_streaming/server.py:1
fix_build_deps.r
r
Definition: fix_build_deps.py:491
uv_buf_init
UV_EXTERN uv_buf_t uv_buf_init(char *base, unsigned int len)
Definition: uv-common.c:157
uv_write_s
Definition: uv.h:522
TEST_PORT_2
#define TEST_PORT_2
Definition: task.h:54
handle
static csh handle
Definition: test_arm_regression.c:16
uv_handle_s
Definition: uv.h:441
write_req
uv_write_t write_req
Definition: libuv/docs/code/tty-gravity/main.c:9
uv_is_writable
UV_EXTERN int uv_is_writable(const uv_stream_t *handle)
Definition: unix/stream.c:1611
TEST_IMPL
TEST_IMPL(tcp_bind_error_addrinuse)
Definition: test-tcp-bind-error.c:37
close_cb_called
static int close_cb_called
Definition: test-tcp-bind-error.c:28
addr
struct sockaddr_in addr
Definition: libuv/docs/code/tcp-echo-server/main.c:10


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:30