Date: Tue, 4 Jul 2006 17:40:43 GMT From: Michael Bushkov <bushman@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 100566 for review Message-ID: <200607041740.k64Hehrh070497@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=100566 Change 100566 by bushman@bushman_nss_ldap_cached on 2006/07/04 17:39:57 gethostby***() regression test finished - some issues with host aliases left, though. The test can be possibly extended by adding support for snapshot file for hostents received via gethostbyaddr(). Affected files ... .. //depot/projects/soc2006/nss_ldap_cached/src/tools/regression/lib/libc/nss/Makefile#5 edit .. //depot/projects/soc2006/nss_ldap_cached/src/tools/regression/lib/libc/nss/test-gethostby.c#2 edit .. //depot/projects/soc2006/nss_ldap_cached/src/tools/regression/lib/libc/nss/test-gethostby.t#2 edit Differences ... ==== //depot/projects/soc2006/nss_ldap_cached/src/tools/regression/lib/libc/nss/Makefile#5 (text+ko) ==== ==== //depot/projects/soc2006/nss_ldap_cached/src/tools/regression/lib/libc/nss/test-gethostby.c#2 (text+ko) ==== @@ -30,6 +30,8 @@ #include <arpa/inet.h> #include <sys/socket.h> +#include <sys/types.h> +#include <netinet/in.h> #include <assert.h> #include <errno.h> #include <netdb.h> @@ -40,11 +42,14 @@ #include <unistd.h> #include "testutil.h" +#ifndef min +#define min(a,b) (((a)<(b))?(a):(b)) +#endif + enum test_methods { TEST_GETHOSTBYNAME2, TEST_GETHOSTBYADDR, TEST_GETHOSTBYNAME2_GETADDRINFO, - TEST_GETHOSTBYADDR_GETNAMEINFO, TEST_BUILD_SNAPSHOT }; @@ -183,28 +188,34 @@ c1 = ht1->h_aliases; c2 = ht2->h_aliases; - if ((ht1->h_aliases == NULL) || (ht2->h_aliases == NULL)) + if (((ht1->h_aliases == NULL) || (ht2->h_aliases == NULL)) && + (ht1->h_aliases != ht2->h_aliases)) goto errfin; - for (;*c1 && *c2; ++c1, ++c2) - if (strcmp(*c1, *c2) != 0) - goto errfin; + if ((c1 != NULL) && (c2 != NULL)) { + for (;*c1 && *c2; ++c1, ++c2) + if (strcmp(*c1, *c2) != 0) + goto errfin; if ((*c1 != NULL) || (*c2 != NULL)) goto errfin; + } c1 = ht1->h_addr_list; c2 = ht2->h_addr_list; - if ((ht1->h_addr_list == NULL) || (ht2->h_addr_list== NULL)) + if (((ht1->h_addr_list == NULL) || (ht2->h_addr_list== NULL)) && + (ht1->h_addr_list != ht2->h_addr_list)) goto errfin; - for (;*c1 && *c2; ++c1, ++c2) - if (memcmp(*c1, *c2, ht1->h_length) != 0) + if ((c1 != NULL) && (c2 != NULL)) { + for (;*c1 && *c2; ++c1, ++c2) + if (memcmp(*c1, *c2, ht1->h_length) != 0) + goto errfin; + + if ((*c1 != NULL) || (*c2 != NULL)) goto errfin; - - if ((*c1 != NULL) || (*c2 != NULL)) - goto errfin; + } return 0; @@ -218,6 +229,64 @@ return (-1); } +static int +check_addrinfo_for_name(struct addrinfo *ai, char const *name) +{ + struct addrinfo *ai2; + + for (ai2 = ai; ai2 != NULL; ai2 = ai2->ai_next) { + if (strcmp(ai2->ai_canonname, name) == 0) + return (0); + } + + return (-1); +} + +static int +check_addrinfo_for_addr(struct addrinfo *ai, char const *addr, + socklen_t addrlen, int af) +{ + struct addrinfo *ai2; + +/* char buffer[100]; + memset(buffer, 0, sizeof(buffer)); + + char *res = inet_ntop(af, addr, buffer, + sizeof(buffer)); + if (res != NULL) + printf("===he %s %s\n", buffer, ai->ai_canonname); + +*/ + for (ai2 = ai; ai2 != NULL; ai2 = ai2->ai_next) { + if (af != ai2->ai_family) + continue; + +/* res = inet_ntop(ai2->ai_family, (void *)&((struct sockaddr_in *)ai2->ai_addr)->sin_addr, buffer, + sizeof(buffer)); + if (res != NULL) + printf("===ai %s\n", buffer);*/ + + switch (af) { + case AF_INET: + if (memcmp(addr, + (void *)&((struct sockaddr_in *)ai2->ai_addr)->sin_addr, + min(addrlen, ai2->ai_addrlen)) == 0) + return (0); + break; + case AF_INET6: + if (memcmp(addr, + (void *)&((struct sockaddr_in6 *)ai2->ai_addr)->sin6_addr, + min(addrlen, ai2->ai_addrlen)) == 0) + return (0); + break; + default: + break; + } + } + + return (-1); +} + static int is_hostent_equal(struct hostent *he, struct addrinfo *ai) { @@ -225,10 +294,42 @@ char **cp; int rv; + if (debug) + printf("checking equality of he and ai\n"); + + rv = check_addrinfo_for_name(ai, he->h_name); + if (rv != 0) { + if (debug) + printf("not equal - he->h_name couldn't be found\n"); + + return (rv); + } + + /* getaddrinfo doesn't provide the aliases information */ /* for (cp = he->h_aliases; *cp; ++cp) { - for (ai2 = ai; ai2 != NULL; ai2 = ai2->ai_next) - if (strcmp( + rv = check_addrinfo_for_name(ai, *cp); + if (rv != 0) { + if (debug) + printf("not equal - one of he->h_aliases couldn't be found\n"); + + return (rv); + } }*/ + + for (cp = he->h_addr_list; *cp; ++cp) { + rv = check_addrinfo_for_addr(ai, *cp, he->h_length, + he->h_addrtype); + if (rv != 0) { + if (debug) + printf("not equal - one of he->h_addr_list couldn't be found\n"); + + return (rv); + } + } + + if (debug) + printf("equal\n"); + return (0); } @@ -323,7 +424,7 @@ if (result != NULL) { if (debug) printf("found\n"); - + rv = hostent_test_correctness(result, NULL); if (rv != 0) return (rv); @@ -553,6 +654,12 @@ result = gethostbyaddr(cp, he->h_length, he->h_addrtype); + if (result == NULL) { + if (debug) + printf("warning: reverse lookup failed\n"); + + continue; + } rv = hostent_test_correctness(result, NULL); if (rv != 0) return (rv); @@ -573,7 +680,8 @@ ai = NULL; memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_flags = af_type; + hints.ai_family = af_type; + hints.ai_flags = AI_CANONNAME; if (debug) printf("using getaddrinfo() to resolve %s\n", he->h_name); @@ -595,15 +703,152 @@ return (-1); } -// rv = + rv = is_hostent_equal(he, ai); + if (rv != 0) { + if (debug) + printf("not ok - addrinfo and hostent are not equal\n"); + return (-1); + } + } return (0); } +static void +usage(void) +{ + (void)fprintf(stderr, + "Usage: %s [-dna2] [-s <file>] -f <file>\n", + getprogname()); + exit(1); +} + int main(int argc, char **argv) { + struct hostent_test_data td, td_snap; + char *snapshot_file, *hostlist_file; + int rv; + int c; + + if (argc < 2) + usage(); + + snapshot_file = NULL; + hostlist_file = NULL; + while ((c = getopt(argc, argv, "na2ds:f:")) != -1) + switch (c) { + case 'd': + debug++; + break; + case 'n': + method = TEST_GETHOSTBYNAME2; + break; + case 'a': + method = TEST_GETHOSTBYADDR; + break; + case '2': + method = TEST_GETHOSTBYNAME2_GETADDRINFO; + break; + case 's': + snapshot_file = strdup(optarg); + break; + case 'f': + hostlist_file = strdup(optarg); + break; + default: + usage(); + } + + TEST_DATA_INIT(hostent, &td, clone_hostent, free_hostent); + TEST_DATA_INIT(hostent, &td_snap, clone_hostent, free_hostent); + + if (hostlist_file == NULL) + usage(); + + if (access(hostlist_file, R_OK) != 0) { + if (debug) + printf("can't access the hostlist file %s\n", + hostlist_file); + + usage(); + } + + if (debug) + printf("building host lists from %s\n", hostlist_file); + rv = TEST_SNAPSHOT_FILE_READ(hostent, hostlist_file, &td, + hostent_read_hostlist_func); + if (rv != 0) + goto fin; + + if (snapshot_file != NULL) { + if (access(snapshot_file, W_OK | R_OK) != 0) { + if (errno == ENOENT) + method = TEST_BUILD_SNAPSHOT; + else { + if (debug) + printf("can't access the snapshot file %s\n", + snapshot_file); + + rv = -1; + goto fin; + } + } else { + if (method == TEST_BUILD_SNAPSHOT) { + rv = 0; + goto fin; + } + + TEST_SNAPSHOT_FILE_READ(hostent, snapshot_file, + &td_snap, hostent_read_snapshot_func); + } + } + + switch (method) { + case TEST_GETHOSTBYNAME2: + if (snapshot_file != NULL) + rv = DO_2PASS_TEST(hostent, &td, &td_snap, + compare_hostent, NULL); + break; + case TEST_GETHOSTBYADDR: + if (snapshot_file == NULL) + rv = DO_1PASS_TEST(hostent, &td, + hostent_test_gethostbyaddr, (void *)&td); + else + rv = DO_1PASS_TEST(hostent, &td_snap, + hostent_test_gethostbyaddr, (void *)&td_snap); + break; + case TEST_GETHOSTBYNAME2_GETADDRINFO: + if (snapshot_file == NULL) + rv = DO_1PASS_TEST(hostent, &td, + hostent_test_getaddrinfo_eq, (void *)&td); + else + rv = DO_1PASS_TEST(hostent, &td_snap, + hostent_test_getaddrinfo_eq, (void *)&td); + break; + case TEST_BUILD_SNAPSHOT: + if (snapshot_file != NULL) + rv = TEST_SNAPSHOT_FILE_WRITE(hostent, snapshot_file, &td, + sdump_hostent); + break; + default: + rv = 0; + break; + }; + +fin: + TEST_DATA_DESTROY(hostent, &td_snap); + TEST_DATA_DESTROY(hostent, &td); + free(hostlist_file); + free(snapshot_file); + return (rv); +} + + +/*int +main(int argc, char **argv) +{ struct hostent_test_data td; debug = 1; @@ -611,7 +856,7 @@ hostent_fill_gethostbyname2_data("../resolv/mach", &td); TEST_DATA_DESTROY(hostent, &td); return (0); -} +}*/ /*int main(int argc, char **argv) ==== //depot/projects/soc2006/nss_ldap_cached/src/tools/regression/lib/libc/nss/test-gethostby.t#2 (text+ko) ==== @@ -1,0 +1,29 @@ +#!/bin/sh +# $FreeBSD$ + +do_test() { + number=$1 + comment=$2 + opt=$3 + if ./$executable $opt; then + echo "ok $number - $comment" + else + echo "not ok $number - $comment" + fi +} + +cd `dirname $0` + +executable=`basename $0 .t` + +make $executable 2>&1 > /dev/null + +echo 1..8 +do_test 1 'gethostbyname2()' '-n -f ../resolv/mach' +do_test 2 'gethostbyaddr()' '-a -f ../resolv/mach' +do_test 3 'gethostbyname()-getaddrinfo()' '-2 -f ../resolv/mach' +do_test 5 'building snapshot, if needed' '-s snapshot_ht -f ../resolv/mach' +do_test 6 'gethostbyname2() snapshot' '-n -s snapshot_serv -f ../resolv/mach' +do_test 7 'gethostbyaddr() snapshot' '-a -s snapshot_serv -f ../resolv/mach' +do_test 8 'gethostbyname2()-getaddrinfo snapshot'\ + '-2 -s snapshot_serv -f ../resolv/mach'
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200607041740.k64Hehrh070497>