00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00029 #include "event-test.h"
00030
00031 #include <netinet/in.h>
00032 #include <stdio.h>
00033 #include <stdlib.h>
00034 #include <string.h>
00035 #include <sys/socket.h>
00036 #include <sys/types.h>
00037 #include <sys/un.h>
00038
00039 RCSTAG("@(#)$Id: t_sockaddr_fcns.c,v 1.1 2005/12/23 04:07:10 klmitch Exp $");
00040
00041 TEST_PROG(t_sockaddr_fcns, "Test operation of socket address "
00042 "manipulation functions")
00043 TEST_ARG(t_sockaddr_fcns, "<t_sockaddr_fcns.addrs>")
00044 TEST_DEP(t_sockaddr_fcns, t_event_log)
00045
00055 unsigned int
00056 value(const char *str)
00057 {
00058 int i;
00059 struct {
00060 const char *name;
00061 unsigned int value;
00062 } map[] = {
00063 { "SUCCESS", 0 },
00064 { "EINVAL", EINVAL },
00065 { "ADDRTOOLONG", EV_ERR_ADDRTOOLONG },
00066 { "ADDRINCOMPLETE", EV_ERR_ADDRINCOMPLETE },
00067 { "INVALIDCHAR", EV_ERR_INVALIDCHAR },
00068 { "COLONEXPECTED", EV_ERR_COLONEXPECTED },
00069 { "BADADDR", EV_ERR_BADADDR },
00070 { "NONE", AT_NONE },
00071 { "LOCAL", AT_LOCAL },
00072 { "IP4", AT_IPv4 },
00073 { "IP6", AT_IPv6 },
00074 { 0, 0 }
00075 };
00076
00077 for (i = 0; map[i].name; i++)
00078 if (!strcmp(map[i].name, str))
00079 return map[i].value;
00080
00081 return 0;
00082 }
00083
00090 int
00091 main(int argc, char **argv)
00092 {
00093 const char *ta = "/this/is/an/improbable/address";
00094 char *prog;
00095 ev_err_t err;
00096 ev_sockaddr_t addr;
00097 int len;
00098
00099 ev_test_init(t_sockaddr_fcns);
00100 ev_prog_name(prog, argv);
00101
00102
00103 memset(&addr, 0, sizeof(addr));
00104
00105
00106
00107
00108
00109
00110 TEST(t_sockaddr_fcns, sa_none, "Test that AT_NONE addresses are rejected "
00111 "by all sa_* functions except sa_type_set()",
00112 (!(err = sa_type_set(&addr, AT_NONE)) && sa_type(&addr) == AT_NONE &&
00113 sa_ipaddrbuf_set(&addr, ta) == EINVAL &&
00114 sa_ipaddrport_set(&addr, 1234) == EINVAL &&
00115 sa_localaddr_set(&addr, ta) == EINVAL), 0,
00116 ("sa_type_set() properly set AT_NONE address type and other sa_* "
00117 "functions rejected it"),
00118 ("sa_type_set() failed to properly set AT_NONE address type or another "
00119 "sa_* function failed to reject it; error code %u, address type %u",
00120 err, sa_type(&addr)));
00121
00122
00123 TEST(t_sockaddr_fcns, sa_ipv4, "Test that sa_* functions handle IPv4 "
00124 "addresses properly",
00125 (!(err = sa_type_set(&addr, AT_IPv4)) && sa_type(&addr) == AT_IPv4 &&
00126 !(err = sa_ipaddrbuf_set(&addr, ta)) &&
00127 !(err = sa_ipaddrport_set(&addr, 1234)) &&
00128 !memcmp(sa_ipaddrbuf(&addr), ta, SOCK_ADDRBUFV4_LEN) &&
00129 sa_ipaddrbuf(&addr)[SOCK_ADDRBUFV4_LEN] == '\0' &&
00130 sa_ipaddrport(&addr) == 1234 &&
00131 sa_localaddr_set(&addr, ta) == EINVAL), 0,
00132 ("sa_* functions handle IPv4 addresses properly"),
00133 ("sa_* functions fail to handle IPv4 addresses properly; error "
00134 "code %u, address type %u", err, sa_type(&addr)));
00135
00136
00137 TEST(t_sockaddr_fcns, sa_ipv6, "Test that sa_* functions handle IPv6 "
00138 "addresses properly",
00139 (!(err = sa_type_set(&addr, AT_IPv6)) && sa_type(&addr) == AT_IPv6 &&
00140 !(err = sa_ipaddrbuf_set(&addr, ta)) &&
00141 !(err = sa_ipaddrport_set(&addr, 0)) &&
00142 !memcmp(sa_ipaddrbuf(&addr), ta, SOCK_ADDRBUFV6_LEN) &&
00143
00144
00145
00146
00147 sa_ipaddrbuf(&addr)[SOCK_ADDRBUFV6_LEN] == '\0' &&
00148 sa_ipaddrport(&addr) == 0 &&
00149 sa_localaddr_set(&addr, ta) == EINVAL), 0,
00150 ("sa_* functions handle IPv6 addresses properly"),
00151 ("sa_* functions fail to handle IPv6 addresses properly; error "
00152 "code %u, address type %u", err, sa_type(&addr)));
00153
00154
00155 TEST(t_sockaddr_fcns, sa_local, "Test that sa_* functions handle local "
00156 "addresses properly",
00157 (!(err = sa_type_set(&addr, AT_LOCAL)) && sa_type(&addr) == AT_LOCAL &&
00158 sa_ipaddrbuf_set(&addr, ta) == EINVAL &&
00159 sa_ipaddrport_set(&addr, 1234) == EINVAL &&
00160 !(err = sa_localaddr_set(&addr, ta)) &&
00161 !strcmp(sa_localaddr(&addr), ta)), 0,
00162 ("sa_* functions handle local addresses properly"),
00163 ("sa_* functions fail to handle local addresses properly; error "
00164 "code %u, address type %u", err, sa_type(&addr)));
00165
00166
00167
00168
00169
00170 TEST_DECL(t_sockaddr_fcns, sockaddr_import,
00171 "Test that sockaddr_import() can import socket address structures")
00172 TEST_DECL(t_sockaddr_fcns, sockaddr_export,
00173 "Test that sockaddr_export() can export socket address structures")
00174 do {
00175 struct sockaddr_un sun_in, sun_out;
00176 struct sockaddr_in sin_in, sin_out;
00177 #ifdef HAVE_SOCKADDR_IN6
00178 struct sockaddr_in6 sin6_in, sin6_out;
00179 #endif
00180
00181
00182 memset(&sun_in, 0, sizeof(sun_in));
00183 memset(&sun_out, 0, sizeof(sun_out));
00184 memset(&sin_in, 0, sizeof(sin_in));
00185 memset(&sin_out, 0, sizeof(sin_out));
00186 #ifdef HAVE_SOCKADDR_IN6
00187 memset(&sin6_in, 0, sizeof(sin6_in));
00188 memset(&sin6_out, 0, sizeof(sin6_out));
00189 #endif
00190
00191
00192 sun_in.sun_family = AF_LOCAL;
00193 strcpy(sun_in.sun_path, ta);
00194
00195
00196 if ((err = sockaddr_import(&addr, (struct sockaddr *)&sun_in)) ||
00197 sa_type(&addr) != AT_LOCAL || strcmp(ta, sa_localaddr(&addr))) {
00198 FAIL(TEST_NAME(sockaddr_import), 0,
00199 "sockaddr_import() failed to import an AT_LOCAL address; "
00200 "error code %u, address type %u", err, sa_type(&addr));
00201 break;
00202 }
00203
00204
00205 len = sizeof(sun_out);
00206 if ((err = sockaddr_export(&addr, (struct sockaddr *)&sun_out, &len)) ||
00207 len != (sizeof(sun_out) - SOCK_LOCALADDR_LEN + strlen(ta)) ||
00208 memcmp(&sun_in, &sun_out, sizeof(sun_out))) {
00209 FAIL(TEST_NAME(sockaddr_export), 0,
00210 "sockaddr_export() failed to export an AT_LOCAL address; "
00211 "error code %u", err);
00212 break;
00213 }
00214
00215
00216 sin_in.sin_family = AF_INET;
00217 memcpy(&sin_in.sin_addr, ta, SOCK_ADDRBUFV4_LEN);
00218 sin_in.sin_port = htons(1234);
00219
00220
00221 if ((err = sockaddr_import(&addr, (struct sockaddr *)&sin_in)) ||
00222 sa_type(&addr) != AT_IPv4 ||
00223 memcmp(ta, sa_ipaddrbuf(&addr), SOCK_ADDRBUFV4_LEN) ||
00224 sa_ipaddrport(&addr) != 1234) {
00225 FAIL(TEST_NAME(sockaddr_import), 0,
00226 "sockaddr_import() failed to import an AT_IPv4 address; "
00227 "error code %u, address type %u", err, sa_type(&addr));
00228 break;
00229 }
00230
00231
00232 len = sizeof(sin_out);
00233 if ((err = sockaddr_export(&addr, (struct sockaddr *)&sin_out, &len)) ||
00234 len != sizeof(sin_out) || memcmp(&sin_in, &sin_out, len)) {
00235 FAIL(TEST_NAME(sockaddr_export), 0,
00236 "sockaddr_export() failed to export an AT_IPv4 address; "
00237 "error code %u", err);
00238 break;
00239 }
00240
00241 #ifdef HAVE_SOCKADDR_IN6
00242
00243 sin6_in.sin6_family = AF_INET6;
00244 memcpy(&sin6_in.sin6_addr, ta, SOCK_ADDRBUFV6_LEN);
00245 sin6_in.sin6_port = htons(1234);
00246
00247
00248 if ((err = sockaddr_import(&addr, (struct sockaddr *)&sin6_in)) ||
00249 sa_type(&addr) != AT_IPv6 ||
00250 memcmp(ta, sa_ipaddrbuf(&addr), SOCK_ADDRBUFV6_LEN) ||
00251 sa_ipaddrport(&addr) != 1234) {
00252 FAIL(TEST_NAME(sockaddr_import), 0,
00253 "sockaddr_import() failed to import an AT_IPv6 address; "
00254 "error code %u, address type %u", err, sa_type(&addr));
00255 break;
00256 }
00257
00258
00259 len = sizeof(sin6_out);
00260 if ((err = sockaddr_export(&addr, (struct sockaddr *)&sin6_out, &len)) ||
00261 len != sizeof(sin6_out) || memcmp(&sin6_in, &sin6_out, len)) {
00262 FAIL(TEST_NAME(sockaddr_export), 0,
00263 "sockaddr_export() failed to export an AT_IPv6 address; "
00264 "error code %u", err);
00265 break;
00266 }
00267 #endif
00268
00269
00270 PASS(TEST_NAME(sockaddr_import),
00271 "sockaddr_import() successfully imported socket addresses");
00272 PASS(TEST_NAME(sockaddr_export),
00273 "sockaddr_export() successfully exported socket addresses");
00274 } while (0);
00275
00276
00277
00278
00279
00280 TEST_DECL(t_sockaddr_fcns, sockaddr_ptoa,
00281 "Test that sockaddr_ptoa() can process socket addresses")
00282 TEST_DECL(t_sockaddr_fcns, sockaddr_atop,
00283 "Test that sockaddr_atop() can display socket addresses")
00284 {
00285 char buf[512], presbuf[512], *t;
00286 unsigned char addrbuf[SOCK_LOCALADDR_LEN];
00287 ev_err_t exp;
00288 ev_satype_t type;
00289 int len, port;
00290 FILE *df;
00291
00292
00293 if (argc < 2 || !(df = fopen(argv[1], "r")))
00294 return 0;
00295
00296
00297 while ((t = fgets(buf, sizeof(buf), df))) {
00298 if ((t = strchr(buf, '\r')) || (t = strchr(buf, '\n')))
00299 *t = '\0';
00300
00301 if (buf[0] == '#' || !(t = strtok(buf, " \t")))
00302 continue;
00303
00304 exp = value(t);
00305
00306 if (!(t = strtok(0, " \t"))) {
00307 fprintf(stderr, "%s: Expected IP address reading datafile %s\n",
00308 prog, argv[1]);
00309 continue;
00310 }
00311
00312
00313 if ((err = sockaddr_ptoa(&addr, t, -1)) != exp)
00314 FAIL(TEST_NAME(sockaddr_ptoa), FATAL(0),
00315 "sockaddr_ptoa() failed with unexpected error %u (expected %u)",
00316 err, exp);
00317
00318 if (exp ||
00319 !(t = strtok(0, " \t")))
00320 continue;
00321
00322 if (sa_type(&addr) != (type = value(t)))
00323 FAIL(TEST_NAME(sockaddr_ptoa), FATAL(0),
00324 "sockaddr_ptoa() parsed address type %u (expected %u)",
00325 sa_type(&addr), type);
00326
00327 if (!(t = strtok(0, " \t")))
00328 continue;
00329
00330 if (type == AT_LOCAL) {
00331 if (strcmp(sa_localaddr(&addr), t))
00332 FAIL(TEST_NAME(sockaddr_ptoa), FATAL(0),
00333 "sockaddr_ptoa() parsed incorrect address: \"%s\" "
00334 "(expected \"%s\")", sa_localaddr(&addr), t);
00335 } else {
00336 port = -1;
00337 memset(addrbuf, 0, sizeof(addrbuf));
00338
00339
00340 for (len = 0; *t && *t; t++, len++)
00341 if (*t >= '0' && *t <= '9')
00342 addrbuf[len >> 1] |= (*t - '0') << (!(len & 0x01) << 2);
00343 else if (*t >= 'a' && *t <= 'f')
00344 addrbuf[len >> 1] |= (*t - 'a' + 0x0a) << (!(len & 0x01) << 2);
00345 else
00346 break;
00347
00348 if (*t == ':')
00349 port = atoi(t + 1);
00350 else if (*t) {
00351 fprintf(stderr, "%s: Invalid character in address string: %c\n",
00352 prog, *t);
00353 continue;
00354 }
00355
00356 if (memcmp(sa_ipaddrbuf(&addr), addrbuf, len >> 1) ||
00357 (port > 0 && sa_ipaddrport(&addr) != port))
00358 FAIL(TEST_NAME(sockaddr_ptoa), FATAL(0),
00359 "sockaddr_ptoa() parsed incorrect address or port");
00360 }
00361
00362 if (!(t = strtok(0, " \t")))
00363 continue;
00364
00365
00366 presbuf[0] = '\0';
00367 if ((err = sockaddr_atop(&addr, presbuf, sizeof(presbuf), 0)) ||
00368 strcmp(presbuf, t))
00369 FAIL(TEST_NAME(sockaddr_atop), FATAL(0),
00370 "sockaddr_atop() failed or incorrectly formatted address; "
00371 "error code %u; expected: \"%s\"; got: \"%s\"", err, t,
00372 presbuf);
00373
00374
00375 fprintf(stderr, "%s: INFO: Address formats to: \"%s\"\n", prog,
00376 presbuf);
00377 }
00378
00379
00380 PASS(TEST_NAME(sockaddr_ptoa),
00381 "sockaddr_ptoa() correctly parsed addresses");
00382 PASS(TEST_NAME(sockaddr_atop),
00383 "sockaddr_atop() correctly formatted addresses");
00384
00385 fclose(df);
00386 }
00387
00388 return 0;
00389 }