libuv-svace-build
215 строк · 5.9 Кб
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 <stdlib.h>
25
26#define CONCURRENT_COUNT 10
27
28static const char* name = "localhost";
29
30static int getaddrinfo_cbs = 0;
31
32/* data used for running multiple calls concurrently */
33static uv_getaddrinfo_t* getaddrinfo_handle;
34static uv_getaddrinfo_t getaddrinfo_handles[CONCURRENT_COUNT];
35static int callback_counts[CONCURRENT_COUNT];
36static int fail_cb_called;
37
38
39static void getaddrinfo_fail_cb(uv_getaddrinfo_t* req,
40int status,
41struct addrinfo* res) {
42
43ASSERT_OK(fail_cb_called);
44ASSERT_LT(status, 0);
45ASSERT_NULL(res);
46uv_freeaddrinfo(res); /* Should not crash. */
47fail_cb_called++;
48}
49
50
51static void getaddrinfo_basic_cb(uv_getaddrinfo_t* handle,
52int status,
53struct addrinfo* res) {
54ASSERT_PTR_EQ(handle, getaddrinfo_handle);
55getaddrinfo_cbs++;
56free(handle);
57uv_freeaddrinfo(res);
58}
59
60
61static void getaddrinfo_cuncurrent_cb(uv_getaddrinfo_t* handle,
62int status,
63struct addrinfo* res) {
64int i;
65int* data = (int*)handle->data;
66
67for (i = 0; i < CONCURRENT_COUNT; i++) {
68if (&getaddrinfo_handles[i] == handle) {
69ASSERT_EQ(i, *data);
70
71callback_counts[i]++;
72break;
73}
74}
75ASSERT (i < CONCURRENT_COUNT);
76
77free(data);
78uv_freeaddrinfo(res);
79
80getaddrinfo_cbs++;
81}
82
83
84TEST_IMPL(getaddrinfo_fail) {
85/* TODO(gengjiawen): Fix test on QEMU. */
86#if defined(__QEMU__)
87RETURN_SKIP("Test does not currently work in QEMU");
88#endif
89
90uv_getaddrinfo_t req;
91
92ASSERT_EQ(UV_EINVAL, uv_getaddrinfo(uv_default_loop(),
93&req,
94(uv_getaddrinfo_cb) abort,
95NULL,
96NULL,
97NULL));
98
99/* Use a FQDN by ending in a period */
100ASSERT_OK(uv_getaddrinfo(uv_default_loop(),
101&req,
102getaddrinfo_fail_cb,
103"example.invalid.",
104NULL,
105NULL));
106ASSERT_OK(uv_run(uv_default_loop(), UV_RUN_DEFAULT));
107ASSERT_EQ(1, fail_cb_called);
108
109MAKE_VALGRIND_HAPPY(uv_default_loop());
110return 0;
111}
112
113
114TEST_IMPL(getaddrinfo_fail_sync) {
115/* TODO(gengjiawen): Fix test on QEMU. */
116#if defined(__QEMU__)
117RETURN_SKIP("Test does not currently work in QEMU");
118#endif
119uv_getaddrinfo_t req;
120
121/* Use a FQDN by ending in a period */
122ASSERT_GT(0, uv_getaddrinfo(uv_default_loop(),
123&req,
124NULL,
125"example.invalid.",
126NULL,
127NULL));
128uv_freeaddrinfo(req.addrinfo);
129
130MAKE_VALGRIND_HAPPY(uv_default_loop());
131return 0;
132}
133
134
135TEST_IMPL(getaddrinfo_basic) {
136/* TODO(gengjiawen): Fix test on QEMU. */
137#if defined(__QEMU__)
138RETURN_SKIP("Test does not currently work in QEMU");
139#endif
140
141int r;
142getaddrinfo_handle = (uv_getaddrinfo_t*)malloc(sizeof(uv_getaddrinfo_t));
143
144r = uv_getaddrinfo(uv_default_loop(),
145getaddrinfo_handle,
146&getaddrinfo_basic_cb,
147name,
148NULL,
149NULL);
150ASSERT_OK(r);
151
152uv_run(uv_default_loop(), UV_RUN_DEFAULT);
153
154ASSERT_EQ(1, getaddrinfo_cbs);
155
156MAKE_VALGRIND_HAPPY(uv_default_loop());
157return 0;
158}
159
160
161TEST_IMPL(getaddrinfo_basic_sync) {
162/* TODO(gengjiawen): Fix test on QEMU. */
163#if defined(__QEMU__)
164RETURN_SKIP("Test does not currently work in QEMU");
165#endif
166uv_getaddrinfo_t req;
167
168ASSERT_OK(uv_getaddrinfo(uv_default_loop(),
169&req,
170NULL,
171name,
172NULL,
173NULL));
174uv_freeaddrinfo(req.addrinfo);
175
176MAKE_VALGRIND_HAPPY(uv_default_loop());
177return 0;
178}
179
180
181TEST_IMPL(getaddrinfo_concurrent) {
182/* TODO(gengjiawen): Fix test on QEMU. */
183#if defined(__QEMU__)
184RETURN_SKIP("Test does not currently work in QEMU");
185#endif
186
187int i, r;
188int* data;
189
190for (i = 0; i < CONCURRENT_COUNT; i++) {
191callback_counts[i] = 0;
192
193data = (int*)malloc(sizeof(int));
194ASSERT_NOT_NULL(data);
195*data = i;
196getaddrinfo_handles[i].data = data;
197
198r = uv_getaddrinfo(uv_default_loop(),
199&getaddrinfo_handles[i],
200&getaddrinfo_cuncurrent_cb,
201name,
202NULL,
203NULL);
204ASSERT_OK(r);
205}
206
207uv_run(uv_default_loop(), UV_RUN_DEFAULT);
208
209for (i = 0; i < CONCURRENT_COUNT; i++) {
210ASSERT_EQ(1, callback_counts[i]);
211}
212
213MAKE_VALGRIND_HAPPY(uv_default_loop());
214return 0;
215}
216