source: src/router/proftpd/tests/api/netaddr.c @ 17876

Last change on this file since 17876 was 17876, checked in by BrainSlayer, 19 months ago

update proftp

File size: 14.3 KB
Line 
1/*
2 * ProFTPD - FTP server testsuite
3 * Copyright (c) 2008-2011 The ProFTPD Project team
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA.
18 *
19 * As a special exemption, The ProFTPD Project team and other respective
20 * copyright holders give permission to link this program with OpenSSL, and
21 * distribute the resulting executable, without including the source code for
22 * OpenSSL in the source distribution.
23 */
24
25/* NetAddr API tests
26 * $Id: netaddr.c,v 1.3 2011/05/23 20:50:31 castaglia Exp $
27 */
28
29#include "tests.h"
30
31static pool *p = NULL;
32
33/* Fixtures */
34
35static void set_up(void) {
36  if (p == NULL) {
37    p = permanent_pool = make_sub_pool(NULL);
38  }
39
40  init_netaddr();
41}
42
43static void tear_down(void) {
44  if (p) {
45    destroy_pool(p);
46    p = NULL;
47    permanent_pool = NULL;
48  }
49}
50
51/* Tests */
52
53START_TEST (netaddr_alloc_test) {
54  pr_netaddr_t *res;
55
56  res = pr_netaddr_alloc(NULL);
57  fail_unless(res == NULL, "Failed to handle null arguments");
58  fail_unless(errno == EINVAL, "Failed to set errno to EINVAL");
59
60  res = pr_netaddr_alloc(p);
61  fail_unless(res != NULL, "Failed to allocate netaddr: %s", strerror(errno));
62  fail_unless(res->na_family == 0, "Allocated netaddr is not zeroed");
63}
64END_TEST
65
66START_TEST (netaddr_dup_test) {
67  pr_netaddr_t *res, *addr;
68
69  res = pr_netaddr_dup(NULL, NULL);
70  fail_unless(res == NULL, "Failed to handle null arguments");
71  fail_unless(errno == EINVAL, "Failed to set errno to EINVAL");
72
73  res = pr_netaddr_dup(p, NULL);
74  fail_unless(res == NULL, "Failed to handle null addr");
75  fail_unless(errno == EINVAL, "Failed to set errno to EINVAL");
76
77  addr = pr_netaddr_alloc(p);
78 
79  res = pr_netaddr_dup(NULL, addr);
80  fail_unless(res == NULL, "Failed to handle null pool");
81  fail_unless(errno == EINVAL, "Failed to set errno to EINVAL");
82
83  res = pr_netaddr_dup(p, addr);
84  fail_unless(res != NULL, "Failed to dup netaddr: %s", strerror(errno));
85  fail_unless(res->na_family == addr->na_family, "Expected family %d, got %d",
86    addr->na_family, res->na_family);
87}
88END_TEST
89
90START_TEST (netaddr_clear_test) {
91  pr_netaddr_t *addr;
92
93  mark_point();
94  pr_netaddr_clear(NULL);
95
96  addr = pr_netaddr_alloc(p);
97  addr->na_family = 1;
98
99  pr_netaddr_clear(addr);
100  fail_unless(addr->na_family == 0, "Failed to clear addr");
101}
102END_TEST
103
104START_TEST (netaddr_get_addr_test) {
105  pr_netaddr_t *res;
106  const char *name;
107  array_header *addrs = NULL;
108
109  res = pr_netaddr_get_addr(NULL, NULL, NULL);
110  fail_unless(res == NULL, "Failed to handle null arguments");
111  fail_unless(errno == EINVAL, "Failed to set errno to EINVAL");
112
113  res = pr_netaddr_get_addr(p, NULL, NULL);
114  fail_unless(res == NULL, "Failed to handle null name");
115  fail_unless(errno == EINVAL, "Failed to set errno to EINVAL");
116
117  name = "127.0.0.1";
118
119  res = pr_netaddr_get_addr(NULL, name, NULL);
120  fail_unless(res == NULL, "Failed to handle null pool");
121  fail_unless(errno == EINVAL, "Failed to set errno to EINVAL");
122
123  res = pr_netaddr_get_addr(p, name, NULL);
124  fail_unless(res != NULL, "Failed to get addr for '%s': %s", name,
125    strerror(errno));
126  fail_unless(res->na_family == AF_INET, "Expected family %d, got %d",
127    AF_INET, res->na_family);
128
129  name = "localhost";
130
131  res = pr_netaddr_get_addr(p, name, NULL);
132  fail_unless(res != NULL, "Failed to get addr for '%s': %s", name,
133    strerror(errno));
134  fail_unless(res->na_family == AF_INET, "Expected family %d, got %d",
135    AF_INET, res->na_family);
136
137  res = pr_netaddr_get_addr(p, name, &addrs);
138  fail_unless(res != NULL, "Failed to get addr for '%s': %s", name,
139    strerror(errno));
140  fail_unless(res->na_family == AF_INET, "Expected family %d, got %d",
141    AF_INET, res->na_family);
142}
143END_TEST
144
145START_TEST (netaddr_get_family_test) {
146  pr_netaddr_t *addr;
147  int res;
148
149  res = pr_netaddr_get_family(NULL);
150  fail_unless(res == -1, "Failed to handle null argument");
151  fail_unless(errno == EINVAL, "Failed to set errno to EINVAL");
152
153  addr = pr_netaddr_get_addr(p, "localhost", NULL);
154  fail_unless(addr != NULL, "Failed to get addr for 'localhost': %s",
155    strerror(errno));
156
157  res = pr_netaddr_get_family(addr);
158  fail_unless(res == AF_INET, "Expected family %d, got %d", AF_INET,
159    res);
160}
161END_TEST
162
163START_TEST (netaddr_set_family_test) {
164  pr_netaddr_t *addr;
165  int res;
166
167  res = pr_netaddr_set_family(NULL, 0);
168  fail_unless(res == -1, "Failed to handle null arguments");
169  fail_unless(errno == EINVAL, "Failed to set errno to EINVAL");
170
171  addr = pr_netaddr_get_addr(p, "127.0.0.1", NULL);
172  fail_unless(addr != NULL, "Failed to get addr for '127.0.0.1': %s",
173    strerror(errno));
174
175  res = pr_netaddr_set_family(addr, -1);
176  fail_unless(res == -1, "Failed to handle bad family");
177#ifdef EAFNOSUPPORT
178  fail_unless(errno == EAFNOSUPPORT, "Failed to set errno to EAFNOSUPPORT");
179#else
180  fail_unless(errno == EINVAL, "Failed to set errno to EINVAL");
181#endif
182
183  res = pr_netaddr_set_family(addr, AF_INET);
184  fail_unless(res == 0, "Failed to set family to AF_INET: %s", strerror(errno));
185}
186END_TEST
187
188START_TEST (netaddr_cmp_test) {
189}
190END_TEST
191
192START_TEST (netaddr_ncmp_test) {
193}
194END_TEST
195
196START_TEST (netaddr_fnmatch_test) {
197}
198END_TEST
199
200START_TEST (netaddr_get_sockaddr_test) {
201}
202END_TEST
203
204START_TEST (netaddr_get_sockaddr_len_test) {
205}
206END_TEST
207
208START_TEST (netaddr_set_sockaddr_test) {
209}
210END_TEST
211
212START_TEST (netaddr_set_sockaddr_any_test) {
213}
214END_TEST
215
216START_TEST (netaddr_get_inaddr_test) {
217}
218END_TEST
219
220START_TEST (netaddr_get_inaddr_len_test) {
221}
222END_TEST
223
224START_TEST (netaddr_get_port_test) {
225  pr_netaddr_t *addr;
226  unsigned int res;
227
228  res = pr_netaddr_get_port(NULL);
229  fail_unless(res == 0, "Failed to handle null addr");
230  fail_unless(errno == EINVAL, "Failed to set errno to EINVAL");
231
232  addr = pr_netaddr_get_addr(p, "127.0.0.1", NULL);
233  fail_unless(addr != NULL, "Failed to get addr for '127.0.0.1': %s",
234    strerror(errno));
235
236  res = pr_netaddr_get_port(addr);
237  fail_unless(res == 0, "Expected port %u, got %u", 0, res);
238
239  addr->na_family = -1;
240  res = pr_netaddr_get_port(addr);
241  fail_unless(res == 0, "Expected port %u, got %u", 0, res);
242  fail_unless(errno == EPERM, "Failed to set errno to EPERM");
243}
244END_TEST
245
246START_TEST (netaddr_set_port_test) {
247  pr_netaddr_t *addr;
248  unsigned int port;
249  int res;
250
251  res = pr_netaddr_set_port(NULL, 0);
252  fail_unless(res == -1, "Failed to handle null addr");
253  fail_unless(errno == EINVAL, "Failed to set errno to EINVAL");
254
255  addr = pr_netaddr_get_addr(p, "127.0.0.1", NULL);
256  fail_unless(addr != NULL, "Failed to get addr for '127.0.0.1': %s",
257    strerror(errno));
258
259  addr->na_family = -1;
260  res = pr_netaddr_set_port(addr, 1);
261  fail_unless(res == -1, "Failed to handle bad family");
262  fail_unless(errno == EPERM, "Failed to set errno to EPERM");
263
264  addr->na_family = AF_INET;
265  res = pr_netaddr_set_port(addr, 1);
266  fail_unless(res == 0, "Failed to set port: %s", strerror(errno));
267
268  port = pr_netaddr_get_port(addr);
269  fail_unless(port == 1, "Expected port %u, got %u", 1, port);
270}
271END_TEST
272
273START_TEST (netaddr_set_reverse_dns_test) {
274  int res;
275
276  res = pr_netaddr_set_reverse_dns(FALSE);
277  fail_unless(res == 1, "Expected reverse %d, got %d", 1, res);
278
279  res = pr_netaddr_set_reverse_dns(TRUE);
280  fail_unless(res == 0, "Expected reverse %d, got %d", 0, res);
281}
282END_TEST
283
284START_TEST (netaddr_get_dnsstr_test) {
285  pr_netaddr_t *addr;
286  const char *res;
287
288  res = pr_netaddr_get_dnsstr(NULL);
289  fail_unless(res == NULL, "Failed to handle null argument");
290  fail_unless(errno == EINVAL, "Failed to set errno to EINVAL");
291
292  addr = pr_netaddr_get_addr(p, "127.0.0.1", NULL);
293  fail_unless(addr != NULL, "Failed to get addr for '127.0.0.1': %s",
294    strerror(errno));
295
296  pr_netaddr_set_reverse_dns(FALSE);
297
298  res = pr_netaddr_get_dnsstr(addr);
299  fail_unless(res != NULL, "Failed to get DNS str for addr: %s",
300    strerror(errno));
301  fail_unless(strcmp(res, "127.0.0.1") == 0, "Expected '%s', got '%s'",
302    "127.0.0.1", res);
303
304  pr_netaddr_set_reverse_dns(TRUE);
305
306  /* Even though we should expect a DNS name, not an IP address, the
307   * previous call to pr_netaddr_get_dnsstr() cached the IP address.
308   */
309  res = pr_netaddr_get_dnsstr(addr);
310  fail_unless(res != NULL, "Failed to get DNS str for addr: %s",
311    strerror(errno));
312  fail_unless(strcmp(res, "127.0.0.1") == 0, "Expected '%s', got '%s'",
313    "127.0.0.1", res);
314
315  pr_netaddr_clear(addr);
316
317  /* Clear the address doesn't work, since that removes even the address
318   * info, in addition to the cached strings.
319   */
320  res = pr_netaddr_get_dnsstr(addr);
321  fail_unless(res != NULL, "Failed to get DNS str for addr: %s",
322    strerror(errno));
323  fail_unless(strcmp(res, "") == 0, "Expected '%s', got '%s'", "", res);
324
325  /* We need to clear the netaddr internal cache as well. */
326  pr_netaddr_clear_cache();
327  addr = pr_netaddr_get_addr(p, "127.0.0.1", NULL);
328  fail_unless(addr != NULL, "Failed to get addr for '127.0.0.1': %s",
329    strerror(errno));
330
331  fail_unless(addr->na_have_dnsstr == 0, "addr already has cached DNS str");
332
333  res = pr_netaddr_get_dnsstr(addr);
334  fail_unless(res != NULL, "Failed to get DNS str for addr: %s",
335    strerror(errno));
336
337  /* Depending on the contents of /etc/hosts, resolving 127.0.0.1 could
338   * return either "localhost" or "localhost.localdomain".  Perhaps even
339   * other variations, although these should be the most common.
340   */
341  fail_unless(strcmp(res, "localhost") == 0 ||
342              strcmp(res, "localhost.localdomain") == 0,
343    "Expected '%s', got '%s'", "localhost or localhost.localdomain", res);
344}
345END_TEST
346
347START_TEST (netaddr_get_ipstr_test) {
348  pr_netaddr_t *addr;
349  const char *res;
350
351  res = pr_netaddr_get_ipstr(NULL);
352  fail_unless(res == NULL, "Failed to handle null argument");
353  fail_unless(errno == EINVAL, "Failed to set errno to EINVAL");
354
355  addr = pr_netaddr_get_addr(p, "localhost", NULL);
356  fail_unless(addr != NULL, "Failed to get addr for 'localhost': %s",
357    strerror(errno));
358
359  res = pr_netaddr_get_ipstr(addr);
360  fail_unless(res != NULL, "Failed to get IP str for addr: %s",
361    strerror(errno));
362  fail_unless(strcmp(res, "127.0.0.1") == 0, "Expected '%s', got '%s'",
363    "127.0.0.1", res);
364  fail_unless(addr->na_have_ipstr == 1, "addr should have cached IP str");
365
366  pr_netaddr_clear(addr);
367  res = pr_netaddr_get_ipstr(addr);
368  fail_unless(res == NULL, "Expected null, got '%s'", res);
369
370}
371END_TEST
372
373START_TEST (netaddr_validate_dns_str_test) {
374  char *res, *str;
375
376  res = pr_netaddr_validate_dns_str(NULL);
377  fail_unless(res == NULL, "Failed to handle null argument");
378  fail_unless(errno == EINVAL, "Failed to set errno to EINVAL");
379
380  str = pstrdup(p, "foo");
381  res = pr_netaddr_validate_dns_str(str);
382  fail_unless(strcmp(res, str) == 0, "Expected '%s', got '%s'", str, res);
383
384  str = pstrdup(p, "[foo]");
385  res = pr_netaddr_validate_dns_str(str);
386  fail_unless(strcmp(res, "_foo_") == 0, "Expected '%s', got '%s'",
387    "_foo_", res);
388
389  str = pstrdup(p, "foo.");
390  res = pr_netaddr_validate_dns_str(str);
391  fail_unless(strcmp(res, str) == 0, "Expected '%s', got '%s'",
392    str, res);
393
394  str = pstrdup(p, "foo:");
395  res = pr_netaddr_validate_dns_str(str);
396#ifdef PR_USE_IPV6
397  fail_unless(strcmp(res, str) == 0, "Expected '%s', got '%s'",
398    str, res);
399#else
400  fail_unless(strcmp(res, "foo_") == 0, "Expected '%s', got '%s'",
401    "foo_", res);
402#endif
403}
404END_TEST
405
406START_TEST (netaddr_get_localaddr_str_test) {
407  const char *res;
408
409  res = pr_netaddr_get_localaddr_str(NULL);
410  fail_unless(res == NULL, "Failed to handle null argument");
411  fail_unless(errno == EINVAL, "Failed to set errno to EINVAL");
412
413  res = pr_netaddr_get_localaddr_str(p);
414  fail_unless(res != NULL, "Failed to get local addr: %s", strerror(errno));
415}
416END_TEST
417
418START_TEST (netaddr_is_v4mappedv6_test) {
419}
420END_TEST
421
422START_TEST (netaddr_disable_ipv6_test) {
423  unsigned char use_ipv6;
424
425  use_ipv6 = pr_netaddr_use_ipv6();
426
427#ifdef PR_USE_IPV6
428  fail_unless(use_ipv6 == TRUE, "Expected %d, got %d", TRUE, use_ipv6);
429#else
430  fail_unless(use_ipv6 == FALSE, "Expected %d, got %d", FALSE, use_ipv6);
431#endif
432
433  pr_netaddr_disable_ipv6();
434
435  use_ipv6 = pr_netaddr_use_ipv6();
436  fail_unless(use_ipv6 == FALSE, "Expected %d, got %d", FALSE, use_ipv6);
437}
438END_TEST
439
440START_TEST (netaddr_enable_ipv6_test) {
441  unsigned char use_ipv6;
442
443  pr_netaddr_enable_ipv6();
444
445  use_ipv6 = pr_netaddr_use_ipv6();
446#ifdef PR_USE_IPV6
447  fail_unless(use_ipv6 == TRUE, "Expected %d, got %d", TRUE, use_ipv6);
448#else
449  fail_unless(use_ipv6 == FALSE, "Expected %d, got %d", FALSE, use_ipv6);
450#endif
451}
452END_TEST
453
454Suite *tests_get_netaddr_suite(void) {
455  Suite *suite;
456  TCase *testcase;
457
458  suite = suite_create("netaddr");
459
460  testcase = tcase_create("base");
461
462  tcase_add_checked_fixture(testcase, set_up, tear_down);
463
464  tcase_add_test(testcase, netaddr_alloc_test);
465  tcase_add_test(testcase, netaddr_dup_test);
466  tcase_add_test(testcase, netaddr_clear_test);
467  tcase_add_test(testcase, netaddr_get_addr_test);
468  tcase_add_test(testcase, netaddr_get_family_test);
469  tcase_add_test(testcase, netaddr_set_family_test);
470  tcase_add_test(testcase, netaddr_cmp_test);
471  tcase_add_test(testcase, netaddr_ncmp_test);
472  tcase_add_test(testcase, netaddr_fnmatch_test);
473  tcase_add_test(testcase, netaddr_get_sockaddr_test);
474  tcase_add_test(testcase, netaddr_get_sockaddr_len_test);
475  tcase_add_test(testcase, netaddr_set_sockaddr_test);
476  tcase_add_test(testcase, netaddr_set_sockaddr_any_test);
477  tcase_add_test(testcase, netaddr_get_inaddr_test);
478  tcase_add_test(testcase, netaddr_get_inaddr_len_test);
479  tcase_add_test(testcase, netaddr_get_port_test);
480  tcase_add_test(testcase, netaddr_set_port_test);
481  tcase_add_test(testcase, netaddr_set_reverse_dns_test);
482  tcase_add_test(testcase, netaddr_get_dnsstr_test);
483  tcase_add_test(testcase, netaddr_get_ipstr_test);
484  tcase_add_test(testcase, netaddr_validate_dns_str_test);
485  tcase_add_test(testcase, netaddr_get_localaddr_str_test);
486  tcase_add_test(testcase, netaddr_is_v4mappedv6_test);
487  tcase_add_test(testcase, netaddr_disable_ipv6_test);
488  tcase_add_test(testcase, netaddr_enable_ipv6_test);
489
490  suite_add_tcase(suite, testcase);
491
492  return suite;
493}
Note: See TracBrowser for help on using the repository browser.