diff options
author | ngie <ngie@FreeBSD.org> | 2015-12-17 06:55:25 +0000 |
---|---|---|
committer | ngie <ngie@FreeBSD.org> | 2015-12-17 06:55:25 +0000 |
commit | 490921132f201193a73d81699cb455aa2ae87357 (patch) | |
tree | 447ebf673b9e1d362dbcf1b55fd34fa0de86d693 /tools/regression | |
parent | 3fed53d02350ae9cbd7b2786b72b83d2e292b8d1 (diff) | |
parent | a7e4d91c2357d6f2c732cccc35fd4ddda5f2d58e (diff) | |
download | FreeBSD-src-490921132f201193a73d81699cb455aa2ae87357.zip FreeBSD-src-490921132f201193a73d81699cb455aa2ae87357.tar.gz |
MFhead @ r292396
Diffstat (limited to 'tools/regression')
52 files changed, 3 insertions, 9472 deletions
diff --git a/tools/regression/lib/libc/nss/Makefile b/tools/regression/lib/libc/nss/Makefile deleted file mode 100644 index 8c8a514..0000000 --- a/tools/regression/lib/libc/nss/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -# $FreeBSD$ - -TESTS= test-getaddr test-getgr test-gethostby test-getpw test-getproto\ - test-getrpc test-getserv test-getusershell -CFLAGS+= -g -Wall - -.PHONY: tests -tests: ${TESTS} - -.PHONY: clean -clean: - -rm -f ${TESTS} diff --git a/tools/regression/lib/libc/nss/README b/tools/regression/lib/libc/nss/README deleted file mode 100644 index bf32913..0000000 --- a/tools/regression/lib/libc/nss/README +++ /dev/null @@ -1,203 +0,0 @@ -$FreeBSD$ - -A brief how-to --------------- - -Each nsswitch regression test does 2 kinds of actions: -1. It runs a series of queries and tests the correctness of results. - There are 2 basic criteria which are used for that: - - numbers must be in the correct range - - certain pointers should not be NULL - -2. It makes a snapshot of the results of all queries that were made. - The idea of snapshots is to test that nsswitch-related function - calls behave equally (i.e. return same results for the same queries) - between system upgrades. When the test is executed and the snapshot is - already created, the test will compare the result of each query with - the appropriate result from the snapshot and will signal if they - differ. - -In order for nsswitch tests to be as useful as possible you should use -them in the following way: - -Step 1 (before upgrading your system). -Build the tests with "make" command and execute them with "prove -v" -command. If there are errors during the execution, then appropriate -nsswitch functions should be checked. Note, that errors on this state -can happen only if the particular function return incorrect data. - -After the stage 1 a number of "snapshot_[test name]" files will appear -in your test folder. - -Step 2 (after upgrading you system). -Rebuild the tests with "make clean; make" command and execute them -again with "prove -v" (check that "snapshot_[test name]" files -are in the same folder with tests). On this stage regression tests -will catch not only the correctness errors, but will also determine -the changes in nsswitch functions behaviour. - -In case of the test failure you will get the following message: - -To get more details about the error you should do the following: -Step 1. Run the test alone with debug output enabled. -Step 2. Mail the snapshot file and the debug test output to the -freebsd-current@ mailing list. - -Example testing session for getpwXXX() family of functions ----------------------------------------------------------- -1. make - -2. prove -v ./test-getpw.t - - test-getpw....1..8 - ok 1 - getpwnam() - ok 2 - getpwuid() - ok 3 - getpwent() - ok 4 - getpwent() 2-pass - ok 5 - building snapshot, if needed - ok 6 - getpwnam() snapshot - ok 7 - getpwuid() snapshot - ok 8 - getpwent() snapshot - ok - All tests successful. - Files=1, Tests=8, 1 wallclock secs ( 0.00 cusr + 0.20 csys = 0.20 CPU) - - -3. Upgrading the system. - -4. make clean; make - -5. prove -v ./test-getpw.t (suppose that something has gone wrong) - - test-getpw....1..8 - ok 1 - getpwnam() - ok 2 - getpwuid() - ok 3 - getpwent() - ok 4 - getpwent() 2-pass - ok 5 - building snapshot, if needed - not ok 6 - getpwnam() snapshot - ok 7 - getpwuid() snapshot - not ok 8 - getpwent() snapshot - FAILED tests 6, 8 - Failed 2/8 tests, 75.00% okay - Failed 1/1 test scripts, 0.00% okay. 2/8 subtests failed, 75.00% okay. - -6. We see that test number 6 failed. According to get-getpw.t, this test - is executed like this: - do_test 6 'getpwnam() snapshot' '-n -s snapshot_pwd' - - To determine why the test has failed, we need to run it in debug mode - - it means adding "-d" to the options list. - -7. ./test-getpw -dn -s snapshot_pwd - ... - testing getpwnam() with the following data: - toor:*:0:0:0::ne-again Superuser:/root::0:4831 - testing correctness with the following data: - toor:*:0:0:0::Bourne-again Superuser:/root::0:4831 - correct - not ok - -8. Here we can see that the data from snapshot (first "toor" line) and - the data received from the getpwnam() call (second "toor" line) are - different. It is the reason why the test has failed. If you can't - (or don't want) to investigate the problem by yourself, mail - the test debug output and the snapshot file to the developers list. - -Notes on using standalone nsswitch tests ----------------------------------------- - -All nsswitch tests have [-d] optional command line argument which enables -debug output. The debug output can be extremely helpful to determine the -cause of test failure. - -In all nsswitch tests -s <file> command line argument specifies the -snapshot file. If this file doesn't exist, it would be built during -test execution. If it already exists then it will be used to check -the results of particular function calls. This argument is mostly -optional, but some tests (test-getaddr and test-getusershell) force -it to be specified. - -test-gethostby and test-getaddr require the list of hostnames, that should -be queried during the test. This list must be specified via -f <file> -command line argument. Each hostname should occupy exactly one line -in the file. - -Detailed tests description --------------------------- - -./test-getaddr - tests the getaddrinfo() function. - Usage: test-getaddr [-d] [-46] [-s <file>] -f <file> - -d - enable debug output - -4 - force IPv4 usage - -6 - force IPv6 usage - -s - build/use specified snapshot file - -f - use specified hostnames list for testing - -./test-getgr - Usage: test-getgr -nge2 [-d] [-s <file>] - -d - enable debug output - -n - test getgrnam(3) - -g - test getgrgid(3) - -e - test getgrent(3) - -2 - test getgrent(3) in 2-pass mode - -s - build/use specified snapshot file - -./test-gethostby - Usage: test-gethostby -na2i [-o] [-d] [-m46] [-s <file>] -f <file> - -n - test gethostbyname2(3) - -a - test gethostbyaddr(3) - -2 - test gethostbyname2(3) results to be equal with getaddrinfo(3) - results for the similar query - -i - test gethostbyaddr(3) results to be equal with getnameinfo(3) - results for the similar query - -o - use getipnodebyname(3)/getipnodebyaddr(3) for testing instead of - gethostbyname2(3)/gethostbyaddr(3) - -d - enable debug output - -m - force IPv4-to-IPv6 mapping - -4 - force IPv4 usage - -6 - force IPv6 usage - -s - build/use specified snapshot file - -f - use specified hostnames list for testing - -./test-getproto - Usage: test-getproto -nve2 [-d] [-s <file>] - -d - enable debug output - -n - test getprotobyname(3) - -v - test getprotobynumber(3) - -e - test getprotoent(3) - -2 - test getprotoent(3) in 2-pass mode - -s - build/use specified snapshot file - -./test-getpw - Usage: test-getpw -nue2 [-d] [-s <file>] - -d - enable debug output - -n - test getpwnam(3) - -u - test getpwuid(3) - -e - test getpwent(3) - -2 - test getpwent(3) in 2-pass mode - -s - build/use snapshot file - -./test-getrpc - Usage: test-getrpc -nve2 [-d] [-s <file>] - -d - enable debug output - -n - test getrpcbyname(3) - -v - test getrpcbynumber(3) - -e - test getrpcent(3) - -2 - test getrpcent(3) in 2-pass mode - -s - build/use specified snapshot file - -./test-getserv - Usage: test-getserv -npe2 [-d] [-s <file>] - -d - enable debug output - -n - test getservbyname(3) - -p - test getservbyport(3) - -e - test getservent(3) - -2 - test getservent(3) in 2-pass mode - -s - build/use specified snapshot file - -./test-getusershell - Usage: test-getusershell [-d] -s <file> - -d - enable debug output - -s - build/use specified snapshot file - diff --git a/tools/regression/lib/libc/nss/mach b/tools/regression/lib/libc/nss/mach deleted file mode 100644 index ab7ce24..0000000 --- a/tools/regression/lib/libc/nss/mach +++ /dev/null @@ -1,93 +0,0 @@ -# $FreeBSD$ -localhost -above.warped.net -anoncvs.cirr.com -anoncvs.isc.netbsd.org -anoncvs.leo.org -anoncvs.netbsd.lt -anoncvs.netbsd.ro -anoncvs.netbsd.se -antioche.antioche.eu.org -boulder.tele.dk -centaurus.4web.cz -chur.math.ntnu.no -console.netbsd.org -cvs.fi.netbsd.org -cvs.mikrolahti.fi -cvs.netbsd.org -cvsup-netbsd.leo.org -cvsup.netbsd.se -cvsup.pasta.cs.uit.no -ftp.bitcon.no -ftp.chg.ru -ftp.duth.gr -ftp.estpak.ee -ftp.fsn.hu -ftp.funet.fi -ftp.grondar.za -ftp.leo.org -ftp.netbsd.lt -ftp.netbsd.org -ftp.nluug.nl -ftp.plig.org -ftp.uni-erlangen.de -ftp.xgate.co.kr -gd.tuwien.ac.at -gort.ludd.luth.se -grappa.unix-ag.uni-kl.de -info.wins.uva.nl -irc.warped.net -knug.youn.co.kr -lala.iri.co.jp -mail.jp.netbsd.org -mail.kr.netbsd.org -mail.netbsd.org -melanoma.cs.rmit.edu.au -mirror.aarnet.edu.au -mirror.netbsd.com.br -mirror03.inet.tele.dk -moon.vub.ac.be -nbwww.sergei.cc -net.bsd.cz -netbsd.3miasto.net -netbsd.4ka.mipt.ru -netbsd.apk.od.ua -netbsd.csie.nctu.edu.tw -netbsd.enderunix.org -netbsd.ftp.fu-berlin.de -netbsd.netlead.com.au -netbsd.nsysu.edu.tw -netbsd.pair.com -netbsd.stevens-tech.edu -netbsd.triada.bg -netbsd.unix.net.nz -netbsd.unixtech.be -netbsd.vejas.lt -netbsd.wagener-consulting.lu -netbsd.zarco.org -netbsdiso.interoute.net.uk -netbsdwww.bitcon.no -netbsdwww.cordef.com.pl -netbsdwww.cs.rmit.edu.au -netbsdwww.interoute.net.uk -news.gw.com -ns.netbsd.org -pigu.iri.co.jp -pluto.cdpa.nsysu.edu.tw -projects.slowass.net -server6.pasta.cs.uit.no -skeleton.phys.spbu.ru -snoopy.allbsd.org -spike.allbsd.org -sundry.netbsd.org -tanya.sergei.cc -web-a.fi.gw.com -web-a.us.gw.com -web.netbsd.mirror.arhea.net -www.en.netbsd.de -www.netbsd.cl -www.netbsd.nl -www.netbsd.org -www.netbsd.ro -zathras.netbsd.org -zeppo.rediris.es diff --git a/tools/regression/lib/libc/nss/test-getaddr.c b/tools/regression/lib/libc/nss/test-getaddr.c deleted file mode 100644 index f0729ec..0000000 --- a/tools/regression/lib/libc/nss/test-getaddr.c +++ /dev/null @@ -1,539 +0,0 @@ -/*- - * Copyright (c) 2006 Michael Bushkov <bushman@freebsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#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> -#include <resolv.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stringlist.h> -#include <unistd.h> -#include "testutil.h" - -enum test_methods { - TEST_GETADDRINFO, - TEST_BUILD_SNAPSHOT -}; - -static int debug = 0; -static struct addrinfo hints; -static enum test_methods method = TEST_GETADDRINFO; - -DECLARE_TEST_DATA(addrinfo) -DECLARE_TEST_FILE_SNAPSHOT(addrinfo) -DECLARE_2PASS_TEST(addrinfo) - -static void clone_addrinfo(struct addrinfo *, struct addrinfo const *); -static int compare_addrinfo(struct addrinfo *, struct addrinfo *, void *); -static void dump_addrinfo(struct addrinfo *); -static void free_addrinfo(struct addrinfo *); - -static void sdump_addrinfo(struct addrinfo *, char *, size_t); - -IMPLEMENT_TEST_DATA(addrinfo) -IMPLEMENT_TEST_FILE_SNAPSHOT(addrinfo) -IMPLEMENT_2PASS_TEST(addrinfo) - -static void -clone_addrinfo(struct addrinfo *dest, struct addrinfo const *src) -{ - assert(dest != NULL); - assert(src != NULL); - - memcpy(dest, src, sizeof(struct addrinfo)); - if (src->ai_canonname != NULL) - dest->ai_canonname = strdup(src->ai_canonname); - - if (src->ai_addr != NULL) { - dest->ai_addr = (struct sockaddr *)malloc(src->ai_addrlen); - assert(dest->ai_addr != NULL); - memcpy(dest->ai_addr, src->ai_addr, src->ai_addrlen); - } - - if (src->ai_next != NULL) { - dest->ai_next = (struct addrinfo *)malloc( - sizeof(struct addrinfo)); - assert(dest->ai_next != NULL); - clone_addrinfo(dest->ai_next, src->ai_next); - } -} - -static int -compare_addrinfo_(struct addrinfo *ai1, struct addrinfo *ai2) -{ - if ((ai1 == NULL) || (ai2 == NULL)) - return (-1); - - if ((ai1->ai_flags != ai2->ai_flags) || - (ai1->ai_family != ai2->ai_family) || - (ai1->ai_socktype != ai2->ai_socktype) || - (ai1->ai_protocol != ai2->ai_protocol) || - (ai1->ai_addrlen != ai2->ai_addrlen) || - (((ai1->ai_addr == NULL) || (ai2->ai_addr == NULL)) && - (ai1->ai_addr != ai2->ai_addr)) || - (((ai1->ai_canonname == NULL) || (ai2->ai_canonname == NULL)) && - (ai1->ai_canonname != ai2->ai_canonname))) - return (-1); - - if ((ai1->ai_canonname != NULL) && - (strcmp(ai1->ai_canonname, ai2->ai_canonname) != 0)) - return (-1); - - if ((ai1->ai_addr != NULL) && - (memcmp(ai1->ai_addr, ai2->ai_addr, ai1->ai_addrlen) != 0)) - return (-1); - - if ((ai1->ai_next == NULL) && (ai2->ai_next == NULL)) - return (0); - else - return (compare_addrinfo_(ai1->ai_next, ai2->ai_next)); -} - -static int -compare_addrinfo(struct addrinfo *ai1, struct addrinfo *ai2, void *mdata) -{ - int rv; - - if (debug) { - printf("testing equality of 2 addrinfo structures\n"); - } - - rv = compare_addrinfo_(ai1, ai2); - - if (debug) { - if (rv == 0) - printf("equal\n"); - else { - dump_addrinfo(ai1); - dump_addrinfo(ai2); - printf("not equal\n"); - } - } - - return (rv); -} - -void -free_addrinfo(struct addrinfo *ai) -{ - if (ai == NULL) - return; - - free(ai->ai_addr); - free(ai->ai_canonname); - free_addrinfo(ai->ai_next); -} - -void -sdump_addrinfo(struct addrinfo *ai, char *buffer, size_t buflen) -{ - int written, i; - - written = snprintf(buffer, buflen, "%d %d %d %d %d ", - ai->ai_flags, ai->ai_family, ai->ai_socktype, ai->ai_protocol, - ai->ai_addrlen); - buffer += written; - if (written > buflen) - return; - buflen -= written; - - written = snprintf(buffer, buflen, "%s ", - ai->ai_canonname == NULL ? "(null)" : ai->ai_canonname); - buffer += written; - if (written > buflen) - return; - buflen -= written; - - if (ai->ai_addr == NULL) { - written = snprintf(buffer, buflen, "(null)"); - buffer += written; - if (written > buflen) - return; - buflen -= written; - } else { - for (i = 0; i < ai->ai_addrlen; ++i ) { - written = snprintf(buffer, buflen, - i + 1 != ai->ai_addrlen ? "%d." : "%d", - ((unsigned char *)ai->ai_addr)[i]); - buffer += written; - if (written > buflen) - return; - buflen -= written; - - if (buflen == 0) - return; - } - } - - if (ai->ai_next != NULL) { - written = snprintf(buffer, buflen, ":"); - buffer += written; - if (written > buflen) - return; - buflen -= written; - - sdump_addrinfo(ai->ai_next, buffer, buflen); - } -} - -void -dump_addrinfo(struct addrinfo *result) -{ - if (result != NULL) { - char buffer[2048]; - sdump_addrinfo(result, buffer, sizeof(buffer)); - printf("%s\n", buffer); - } else - printf("(null)\n"); -} - -static int -addrinfo_read_snapshot_addr(char *addr, unsigned char *result, size_t len) -{ - char *s, *ps, *ts; - - ps = addr; - while ( (s = strsep(&ps, ".")) != NULL) { - if (len == 0) - return (-1); - - *result = (unsigned char)strtol(s, &ts, 10); - ++result; - if (*ts != '\0') - return (-1); - - --len; - } - if (len != 0) - return (-1); - else - return (0); -} - -static int -addrinfo_read_snapshot_ai(struct addrinfo *ai, char *line) -{ - char *s, *ps, *ts; - int i, rv, *pi; - - rv = 0; - i = 0; - ps = line; - memset(ai, 0, sizeof(struct addrinfo)); - while ( (s = strsep(&ps, " ")) != NULL) { - switch (i) { - case 0: - case 1: - case 2: - case 3: - pi = &ai->ai_flags + i; - *pi = (int)strtol(s, &ts, 10); - if (*ts != '\0') - goto fin; - break; - case 4: - ai->ai_addrlen = (socklen_t)strtol(s, &ts, 10); - if (*ts != '\0') - goto fin; - break; - case 5: - if (strcmp(s, "(null)") != 0) { - ai->ai_canonname = strdup(s); - assert(ai->ai_canonname != NULL); - } - break; - case 6: - if (strcmp(s, "(null)") != 0) { - ai->ai_addr = (struct sockaddr *)malloc( - ai->ai_addrlen); - assert(ai->ai_addr != NULL); - memset(ai->ai_addr, 0, ai->ai_addrlen); - rv = addrinfo_read_snapshot_addr(s, - (unsigned char *)ai->ai_addr, - ai->ai_addrlen); - - if (rv != 0) - goto fin; - } - break; - default: - /* NOTE: should not be reachable */ - rv = -1; - goto fin; - }; - - ++i; - } - -fin: - if ((i != 7) || (rv != 0)) { - free_addrinfo(ai); - memset(ai, 0, sizeof(struct addrinfo)); - return (-1); - } - - return (0); -} - -static int -addrinfo_read_snapshot_func(struct addrinfo *ai, char *line) -{ - struct addrinfo *ai2; - char *s, *ps; - int i, rv; - - if (debug) - printf("1 line read from snapshot:\n%s\n", line); - - rv = 0; - i = 0; - ps = line; - - s = strsep(&ps, ":"); - if (s == NULL) - return (-1); - - rv = addrinfo_read_snapshot_ai(ai, s); - if (rv != 0) - return (-1); - - ai2 = ai; - while ( (s = strsep(&ps, ":")) != NULL) { - ai2->ai_next = (struct addrinfo *)malloc( - sizeof(struct addrinfo)); - assert(ai2->ai_next != NULL); - memset(ai2->ai_next, 0, sizeof(struct addrinfo)); - - rv = addrinfo_read_snapshot_ai(ai2->ai_next, s); - if (rv != 0) { - free_addrinfo(ai); - return (-1); - } - - ai2 = ai2->ai_next; - } - - return (0); -} - -static int -addrinfo_test_correctness(struct addrinfo *ai, void *mdata) -{ - if (debug) { - printf("testing correctness with the following data:\n"); - dump_addrinfo(ai); - } - - if (ai == NULL) - goto errfin; - - if (!((ai->ai_family >= 0) && (ai->ai_family < AF_MAX))) - goto errfin; - - if ((ai->ai_socktype != 0) && (ai->ai_socktype != SOCK_STREAM) && - (ai->ai_socktype != SOCK_DGRAM) && (ai->ai_socktype != SOCK_RAW)) - goto errfin; - - if ((ai->ai_protocol != 0) && (ai->ai_protocol != IPPROTO_UDP) && - (ai->ai_protocol != IPPROTO_TCP)) - goto errfin; - - if ((ai->ai_flags & ~(AI_CANONNAME | AI_NUMERICHOST | AI_PASSIVE)) != 0) - goto errfin; - - if ((ai->ai_addrlen != ai->ai_addr->sa_len) || - (ai->ai_family != ai->ai_addr->sa_family)) - goto errfin; - - if (debug) - printf("correct\n"); - - return (0); -errfin: - if (debug) - printf("incorrect\n"); - - return (-1); -} - -static int -addrinfo_read_hostlist_func(struct addrinfo *ai, char *line) -{ - struct addrinfo *result; - int rv; - - if (debug) - printf("resolving %s: ", line); - rv = getaddrinfo(line, NULL, &hints, &result); - if (rv == 0) { - if (debug) - printf("found\n"); - - rv = addrinfo_test_correctness(result, NULL); - if (rv != 0) { - freeaddrinfo(result); - return (rv); - } - - clone_addrinfo(ai, result); - freeaddrinfo(result); - } else { - if (debug) - printf("not found\n"); - - memset(ai, 0, sizeof(struct addrinfo)); - } - return (0); -} - -static void -usage(void) -{ - (void)fprintf(stderr, - "Usage: %s [-d] [-46] [-s <file]> -f <file>\n", - getprogname()); - exit(1); -} - -int -main(int argc, char **argv) -{ - struct addrinfo_test_data td, td_snap; - char *snapshot_file, *hostlist_file; - int rv; - int c; - - if (argc < 2) - usage(); - - snapshot_file = NULL; - hostlist_file = NULL; - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = PF_UNSPEC; - hints.ai_flags = AI_CANONNAME; - while ((c = getopt(argc, argv, "46dns:f:")) != -1) - switch (c) { - case '4': - hints.ai_family = PF_INET; - break; - case '6': - hints.ai_family = PF_INET6; - break; - case 'd': - debug = 1; - break; - case 's': - snapshot_file = strdup(optarg); - method = TEST_BUILD_SNAPSHOT; - break; - case 'f': - hostlist_file = strdup(optarg); - break; - default: - usage(); - } - - TEST_DATA_INIT(addrinfo, &td, clone_addrinfo, free_addrinfo); - TEST_DATA_INIT(addrinfo, &td_snap, clone_addrinfo, free_addrinfo); - - 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(addrinfo, hostlist_file, &td, - addrinfo_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 { - rv = TEST_SNAPSHOT_FILE_READ(addrinfo, snapshot_file, - &td_snap, addrinfo_read_snapshot_func); - if (rv != 0) { - if (debug) - printf("error reading snapshot file\n"); - goto fin; - } - } - } - - switch (method) { - case TEST_GETADDRINFO: - if (snapshot_file != NULL) - rv = DO_2PASS_TEST(addrinfo, &td, &td_snap, - compare_addrinfo, NULL); - break; - case TEST_BUILD_SNAPSHOT: - if (snapshot_file != NULL) { - rv = TEST_SNAPSHOT_FILE_WRITE(addrinfo, snapshot_file, &td, - sdump_addrinfo); - } - break; - default: - rv = 0; - break; - }; - -fin: - TEST_DATA_DESTROY(addrinfo, &td_snap); - TEST_DATA_DESTROY(addrinfo, &td); - free(hostlist_file); - free(snapshot_file); - return (rv); - -} - diff --git a/tools/regression/lib/libc/nss/test-getaddr.t b/tools/regression/lib/libc/nss/test-getaddr.t deleted file mode 100644 index b3020f0..0000000 --- a/tools/regression/lib/libc/nss/test-getaddr.t +++ /dev/null @@ -1,33 +0,0 @@ -#!/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..6 -#Tests with hints.ai_family is set to PF_UNSPEC -do_test 1 'getaddrinfo() (PF_UNSPEC)' '-f mach' -do_test 2 'getaddrinfo() snapshot (PF_UNSPEC)' '-f mach -s snapshot_ai' - -#Tests with hints.ai_family is set to PF_INET -do_test 3 'getaddrinfo() (PF_INET)' '-f mach' -do_test 4 'getaddrinfo() snapshot (PF_INET)' '-4 -f mach -s snapshot_ai4' - -#Tests with hints.ai_family is set to PF_INET6 -do_test 5 'getaddrinfo() (PF_INET6)' '-f mach' -do_test 6 'getaddrinfo() snapshot (PF_INET6)' '-6 -f mach -s snapshot_ai6' - diff --git a/tools/regression/lib/libc/nss/test-getgr.c b/tools/regression/lib/libc/nss/test-getgr.c deleted file mode 100644 index 0ccebae..0000000 --- a/tools/regression/lib/libc/nss/test-getgr.c +++ /dev/null @@ -1,534 +0,0 @@ -/*- - * Copyright (c) 2006 Michael Bushkov <bushman@freebsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <arpa/inet.h> -#include <assert.h> -#include <errno.h> -#include <grp.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stringlist.h> -#include <unistd.h> -#include "testutil.h" - -enum test_methods { - TEST_GETGRENT, - TEST_GETGRNAM, - TEST_GETGRGID, - TEST_GETGRENT_2PASS, - TEST_BUILD_SNAPSHOT -}; - -static int debug = 0; -static enum test_methods method = TEST_BUILD_SNAPSHOT; - -DECLARE_TEST_DATA(group) -DECLARE_TEST_FILE_SNAPSHOT(group) -DECLARE_1PASS_TEST(group) -DECLARE_2PASS_TEST(group) - -static void clone_group(struct group *, struct group const *); -static int compare_group(struct group *, struct group *, void *); -static void dump_group(struct group *); -static void free_group(struct group *); - -static void sdump_group(struct group *, char *, size_t); -static int group_read_snapshot_func(struct group *, char *); - -static int group_check_ambiguity(struct group_test_data *, - struct group *); -static int group_fill_test_data(struct group_test_data *); -static int group_test_correctness(struct group *, void *); -static int group_test_getgrnam(struct group *, void *); -static int group_test_getgrgid(struct group *, void *); -static int group_test_getgrent(struct group *, void *); - -static void usage(void) __attribute__((__noreturn__)); - -IMPLEMENT_TEST_DATA(group) -IMPLEMENT_TEST_FILE_SNAPSHOT(group) -IMPLEMENT_1PASS_TEST(group) -IMPLEMENT_2PASS_TEST(group) - -static void -clone_group(struct group *dest, struct group const *src) -{ - assert(dest != NULL); - assert(src != NULL); - - char **cp; - int members_num; - - memset(dest, 0, sizeof(struct group)); - - if (src->gr_name != NULL) { - dest->gr_name = strdup(src->gr_name); - assert(dest->gr_name != NULL); - } - - if (src->gr_passwd != NULL) { - dest->gr_passwd = strdup(src->gr_passwd); - assert(dest->gr_passwd != NULL); - } - dest->gr_gid = src->gr_gid; - - if (src->gr_mem != NULL) { - members_num = 0; - for (cp = src->gr_mem; *cp; ++cp) - ++members_num; - - dest->gr_mem = (char **)malloc( - (members_num + 1) * (sizeof(char *))); - assert(dest->gr_mem != NULL); - memset(dest->gr_mem, 0, (members_num+1) * (sizeof(char *))); - - for (cp = src->gr_mem; *cp; ++cp) { - dest->gr_mem[cp - src->gr_mem] = strdup(*cp); - assert(dest->gr_mem[cp - src->gr_mem] != NULL); - } - } -} - -static void -free_group(struct group *grp) -{ - char **cp; - - assert(grp != NULL); - - free(grp->gr_name); - free(grp->gr_passwd); - - for (cp = grp->gr_mem; *cp; ++cp) - free(*cp); - free(grp->gr_mem); -} - -static int -compare_group(struct group *grp1, struct group *grp2, void *mdata) -{ - char **c1, **c2; - - if (grp1 == grp2) - return (0); - - if ((grp1 == NULL) || (grp2 == NULL)) - goto errfin; - - if ((strcmp(grp1->gr_name, grp2->gr_name) != 0) || - (strcmp(grp1->gr_passwd, grp2->gr_passwd) != 0) || - (grp1->gr_gid != grp2->gr_gid)) - goto errfin; - - c1 = grp1->gr_mem; - c2 = grp2->gr_mem; - - if ((grp1->gr_mem == NULL) || (grp2->gr_mem == NULL)) - goto errfin; - - for (;*c1 && *c2; ++c1, ++c2) - if (strcmp(*c1, *c2) != 0) - goto errfin; - - if ((*c1 != '\0') || (*c2 != '\0')) - goto errfin; - - return 0; - -errfin: - if ((debug) && (mdata == NULL)) { - printf("following structures are not equal:\n"); - dump_group(grp1); - dump_group(grp2); - } - - return (-1); -} - -static void -sdump_group(struct group *grp, char *buffer, size_t buflen) -{ - char **cp; - int written; - - written = snprintf(buffer, buflen, "%s %s %d", - grp->gr_name, grp->gr_passwd, grp->gr_gid); - buffer += written; - if (written > buflen) - return; - buflen -= written; - - if (grp->gr_mem != NULL) { - if (*(grp->gr_mem) != '\0') { - for (cp = grp->gr_mem; *cp; ++cp) { - written = snprintf(buffer, buflen, " %s",*cp); - buffer += written; - if (written > buflen) - return; - buflen -= written; - - if (buflen == 0) - return; - } - } else - snprintf(buffer, buflen, " nomem"); - } else - snprintf(buffer, buflen, " (null)"); -} - -static int -group_read_snapshot_func(struct group *grp, char *line) -{ - StringList *sl; - char *s, *ps, *ts; - int i; - - if (debug) - printf("1 line read from snapshot:\n%s\n", line); - - i = 0; - sl = NULL; - ps = line; - memset(grp, 0, sizeof(struct group)); - while ( (s = strsep(&ps, " ")) != NULL) { - switch (i) { - case 0: - grp->gr_name = strdup(s); - assert(grp->gr_name != NULL); - break; - - case 1: - grp->gr_passwd = strdup(s); - assert(grp->gr_passwd != NULL); - break; - - case 2: - grp->gr_gid = (gid_t)strtol(s, &ts, 10); - if (*ts != '\0') { - free(grp->gr_name); - free(grp->gr_passwd); - return (-1); - } - break; - - default: - if (sl == NULL) { - if (strcmp(s, "(null)") == 0) - return (0); - - sl = sl_init(); - assert(sl != NULL); - - if (strcmp(s, "nomem") != 0) { - ts = strdup(s); - assert(ts != NULL); - sl_add(sl, ts); - } - } else { - ts = strdup(s); - assert(ts != NULL); - sl_add(sl, ts); - } - break; - }; - ++i; - } - - if (i < 3) { - free(grp->gr_name); - free(grp->gr_passwd); - memset(grp, 0, sizeof(struct group)); - return (-1); - } - - sl_add(sl, NULL); - grp->gr_mem = sl->sl_str; - - /* NOTE: is it a dirty hack or not? */ - free(sl); - return (0); -} - -static void -dump_group(struct group *result) -{ - if (result != NULL) { - char buffer[1024]; - sdump_group(result, buffer, sizeof(buffer)); - printf("%s\n", buffer); - } else - printf("(null)\n"); -} - -static int -group_fill_test_data(struct group_test_data *td) -{ - struct group *grp; - - setgroupent(1); - while ((grp = getgrent()) != NULL) { - if (group_test_correctness(grp, NULL) == 0) - TEST_DATA_APPEND(group, td, grp); - else - return (-1); - } - endgrent(); - - return (0); -} - -static int -group_test_correctness(struct group *grp, void *mdata) -{ - if (debug) { - printf("testing correctness with the following data:\n"); - dump_group(grp); - } - - if (grp == NULL) - goto errfin; - - if (grp->gr_name == NULL) - goto errfin; - - if (grp->gr_passwd == NULL) - goto errfin; - - if (grp->gr_mem == NULL) - goto errfin; - - if (debug) - printf("correct\n"); - - return (0); -errfin: - if (debug) - printf("incorrect\n"); - - return (-1); -} - -/* group_check_ambiguity() is needed here because when doing the getgrent() - * calls sequence, records from different nsswitch sources can be different, - * though having the same pw_name/pw_uid */ -static int -group_check_ambiguity(struct group_test_data *td, struct group *pwd) -{ - - return (TEST_DATA_FIND(group, td, pwd, compare_group, - NULL) != NULL ? 0 : -1); -} - -static int -group_test_getgrnam(struct group *grp_model, void *mdata) -{ - struct group *grp; - - if (debug) { - printf("testing getgrnam() with the following data:\n"); - dump_group(grp_model); - } - - grp = getgrnam(grp_model->gr_name); - if (group_test_correctness(grp, NULL) != 0) - goto errfin; - - if ((compare_group(grp, grp_model, NULL) != 0) && - (group_check_ambiguity((struct group_test_data *)mdata, grp) - !=0)) - goto errfin; - - if (debug) - printf("ok\n"); - return (0); - -errfin: - if (debug) - printf("not ok\n"); - - return (-1); -} - -static int -group_test_getgrgid(struct group *grp_model, void *mdata) -{ - struct group *grp; - - if (debug) { - printf("testing getgrgid() with the following data...\n"); - dump_group(grp_model); - } - - grp = getgrgid(grp_model->gr_gid); - if ((group_test_correctness(grp, NULL) != 0) || - ((compare_group(grp, grp_model, NULL) != 0) && - (group_check_ambiguity((struct group_test_data *)mdata, grp) - != 0))) { - if (debug) - printf("not ok\n"); - return (-1); - } else { - if (debug) - printf("ok\n"); - return (0); - } -} - -static int -group_test_getgrent(struct group *grp, void *mdata) -{ - /* Only correctness can be checked when doing 1-pass test for - * getgrent(). */ - return (group_test_correctness(grp, NULL)); -} - -static void -usage(void) -{ - (void)fprintf(stderr, - "Usage: %s -nge2 [-d] [-s <file>]\n", - getprogname()); - exit(1); -} - -int -main(int argc, char **argv) -{ - struct group_test_data td, td_snap, td_2pass; - char *snapshot_file; - int rv; - int c; - - if (argc < 2) - usage(); - - snapshot_file = NULL; - while ((c = getopt(argc, argv, "nge2ds:")) != -1) - switch (c) { - case 'd': - debug++; - break; - case 'n': - method = TEST_GETGRNAM; - break; - case 'g': - method = TEST_GETGRGID; - break; - case 'e': - method = TEST_GETGRENT; - break; - case '2': - method = TEST_GETGRENT_2PASS; - break; - case 's': - snapshot_file = strdup(optarg); - break; - default: - usage(); - } - - TEST_DATA_INIT(group, &td, clone_group, free_group); - TEST_DATA_INIT(group, &td_snap, clone_group, free_group); - 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 file %s\n", - snapshot_file); - - rv = -1; - goto fin; - } - } else { - if (method == TEST_BUILD_SNAPSHOT) { - rv = 0; - goto fin; - } - - TEST_SNAPSHOT_FILE_READ(group, snapshot_file, - &td_snap, group_read_snapshot_func); - } - } - - rv = group_fill_test_data(&td); - if (rv == -1) - return (-1); - switch (method) { - case TEST_GETGRNAM: - if (snapshot_file == NULL) - rv = DO_1PASS_TEST(group, &td, - group_test_getgrnam, (void *)&td); - else - rv = DO_1PASS_TEST(group, &td_snap, - group_test_getgrnam, (void *)&td_snap); - break; - case TEST_GETGRGID: - if (snapshot_file == NULL) - rv = DO_1PASS_TEST(group, &td, - group_test_getgrgid, (void *)&td); - else - rv = DO_1PASS_TEST(group, &td_snap, - group_test_getgrgid, (void *)&td_snap); - break; - case TEST_GETGRENT: - if (snapshot_file == NULL) - rv = DO_1PASS_TEST(group, &td, group_test_getgrent, - (void *)&td); - else - rv = DO_2PASS_TEST(group, &td, &td_snap, - compare_group, NULL); - break; - case TEST_GETGRENT_2PASS: - TEST_DATA_INIT(group, &td_2pass, clone_group, free_group); - rv = group_fill_test_data(&td_2pass); - if (rv != -1) - rv = DO_2PASS_TEST(group, &td, &td_2pass, - compare_group, NULL); - TEST_DATA_DESTROY(group, &td_2pass); - break; - case TEST_BUILD_SNAPSHOT: - if (snapshot_file != NULL) - rv = TEST_SNAPSHOT_FILE_WRITE(group, snapshot_file, &td, - sdump_group); - break; - default: - rv = 0; - break; - }; - -fin: - TEST_DATA_DESTROY(group, &td_snap); - TEST_DATA_DESTROY(group, &td); - free(snapshot_file); - return (rv); -} diff --git a/tools/regression/lib/libc/nss/test-getgr.t b/tools/regression/lib/libc/nss/test-getgr.t deleted file mode 100644 index e2cf8e5..0000000 --- a/tools/regression/lib/libc/nss/test-getgr.t +++ /dev/null @@ -1,29 +0,0 @@ -#!/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 'getgrnam()' '-n' -do_test 2 'getgrgid()' '-g' -do_test 3 'getgrent()' '-e' -do_test 4 'getgrent() 2-pass' '-2' -do_test 5 'building snapshot, if needed' '-s snapshot_grp' -do_test 6 'getgrnam() snapshot' '-n -s snapshot_grp' -do_test 7 'getgrgid() snapshot' '-g -s snapshot_grp' -do_test 8 'getgrent() snapshot' '-e -s snapshot_grp' diff --git a/tools/regression/lib/libc/nss/test-gethostby.c b/tools/regression/lib/libc/nss/test-gethostby.c deleted file mode 100644 index 9e7bdf5..0000000 --- a/tools/regression/lib/libc/nss/test-gethostby.c +++ /dev/null @@ -1,1105 +0,0 @@ -/*- - * Copyright (c) 2006 Michael Bushkov <bushman@freebsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#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> -#include <resolv.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stringlist.h> -#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, - TEST_BUILD_ADDR_SNAPSHOT -}; - -static int use_ipnode_functions = 0; -static int use_ipv6_mapping = 0; -static int ipnode_flags = 0; -static int debug = 0; -static int af_type = AF_INET; -static enum test_methods method = TEST_BUILD_SNAPSHOT; - -DECLARE_TEST_DATA(hostent) -DECLARE_TEST_FILE_SNAPSHOT(hostent) -DECLARE_1PASS_TEST(hostent) -DECLARE_2PASS_TEST(hostent) - -/* These stubs will use gethostby***() or getipnodeby***() functions, - * depending on the use_ipnode_functions global variable value */ -static struct hostent *__gethostbyname2(const char *, int); -static struct hostent *__gethostbyaddr(const void *, socklen_t, int); -static void __freehostent(struct hostent *); - -static void clone_hostent(struct hostent *, struct hostent const *); -static int compare_hostent(struct hostent *, struct hostent *, void *); -static void dump_hostent(struct hostent *); -static void free_hostent(struct hostent *); - -static int is_hostent_equal(struct hostent *, struct addrinfo *); - -static void sdump_hostent(struct hostent *, char *, size_t); -static int hostent_read_hostlist_func(struct hostent *, char *); -static int hostent_read_snapshot_addr(char *, unsigned char *, size_t); -static int hostent_read_snapshot_func(struct hostent *, char *); - -static int hostent_test_correctness(struct hostent *, void *); -static int hostent_test_gethostbyaddr(struct hostent *, void *); -static int hostent_test_getaddrinfo_eq(struct hostent *, void *); -static int hostent_test_getnameinfo_eq(struct hostent *, void *); - -static void usage(void) __attribute__((__noreturn__)); - -IMPLEMENT_TEST_DATA(hostent) -IMPLEMENT_TEST_FILE_SNAPSHOT(hostent) -IMPLEMENT_1PASS_TEST(hostent) -IMPLEMENT_2PASS_TEST(hostent) - -static struct hostent * -__gethostbyname2(const char *name, int af) -{ - struct hostent *he; - int error; - - if (use_ipnode_functions == 0) - he = gethostbyname2(name, af); - else { - error = 0; - he = getipnodebyname(name, af, ipnode_flags, &error); - if (he == NULL) - errno = error; - } - - return (he); -} - -static struct hostent * -__gethostbyaddr(const void *addr, socklen_t len, int af) -{ - struct hostent *he; - int error; - - if (use_ipnode_functions == 0) - he = gethostbyaddr(addr, len, af); - else { - error = 0; - he = getipnodebyaddr(addr, len, af, &error); - if (he == NULL) - errno = error; - } - - return (he); -} - -static void -__freehostent(struct hostent *he) -{ - /* NOTE: checking for he != NULL - just in case */ - if ((use_ipnode_functions != 0) && (he != NULL)) - freehostent(he); -} - -static void -clone_hostent(struct hostent *dest, struct hostent const *src) -{ - assert(dest != NULL); - assert(src != NULL); - - char **cp; - int aliases_num; - int addrs_num; - size_t offset; - - memset(dest, 0, sizeof(struct hostent)); - - if (src->h_name != NULL) { - dest->h_name = strdup(src->h_name); - assert(dest->h_name != NULL); - } - - dest->h_addrtype = src->h_addrtype; - dest->h_length = src->h_length; - - if (src->h_aliases != NULL) { - aliases_num = 0; - for (cp = src->h_aliases; *cp; ++cp) - ++aliases_num; - - dest->h_aliases = (char **)malloc((aliases_num + 1) * - (sizeof(char *))); - assert(dest->h_aliases != NULL); - memset(dest->h_aliases, 0, (aliases_num + 1) * - (sizeof(char *))); - - for (cp = src->h_aliases; *cp; ++cp) { - dest->h_aliases[cp - src->h_aliases] = strdup(*cp); - assert(dest->h_aliases[cp - src->h_aliases] != NULL); - } - } - - if (src->h_addr_list != NULL) { - addrs_num = 0; - for (cp = src->h_addr_list; *cp; ++cp) - ++addrs_num; - - dest->h_addr_list = (char **)malloc((addrs_num + 1) * - (sizeof(char *))); - assert(dest->h_addr_list != NULL); - memset(dest->h_addr_list, 0, (addrs_num + 1) * - (sizeof(char *))); - - for (cp = src->h_addr_list; *cp; ++cp) { - offset = cp - src->h_addr_list; - dest->h_addr_list[offset] = - (char *)malloc(src->h_length); - assert(dest->h_addr_list[offset] != NULL); - memcpy(dest->h_addr_list[offset], - src->h_addr_list[offset], src->h_length); - } - } -} - -static void -free_hostent(struct hostent *ht) -{ - char **cp; - - assert(ht != NULL); - - free(ht->h_name); - - if (ht->h_aliases != NULL) { - for (cp = ht->h_aliases; *cp; ++cp) - free(*cp); - free(ht->h_aliases); - } - - if (ht->h_addr_list != NULL) { - for (cp = ht->h_addr_list; *cp; ++cp) - free(*cp); - free(ht->h_addr_list); - } -} - -static int -compare_hostent(struct hostent *ht1, struct hostent *ht2, void *mdata) -{ - char **c1, **c2, **ct, **cb; - int b; - - if (ht1 == ht2) - return 0; - - if ((ht1 == NULL) || (ht2 == NULL)) - goto errfin; - - if ((ht1->h_name == NULL) || (ht2->h_name == NULL)) - goto errfin; - - if ((ht1->h_addrtype != ht2->h_addrtype) || - (ht1->h_length != ht2->h_length) || - (strcmp(ht1->h_name, ht2->h_name) != 0)) - goto errfin; - - c1 = ht1->h_aliases; - c2 = ht2->h_aliases; - - if (((ht1->h_aliases == NULL) || (ht2->h_aliases == NULL)) && - (ht1->h_aliases != ht2->h_aliases)) - goto errfin; - - if ((c1 != NULL) && (c2 != NULL)) { - cb = c1; - for (;*c1; ++c1) { - b = 0; - for (ct = c2; *ct; ++ct) { - if (strcmp(*c1, *ct) == 0) { - b = 1; - break; - } - } - if (b == 0) { - if (debug) - printf("h1 aliases item can't be "\ - "found in h2 aliases\n"); - goto errfin; - } - } - - c1 = cb; - for (;*c2; ++c2) { - b = 0; - for (ct = c1; *ct; ++ct) { - if (strcmp(*c2, *ct) == 0) { - b = 1; - break; - } - } - if (b == 0) { - if (debug) - printf("h2 aliases item can't be "\ - " found in h1 aliases\n"); - goto errfin; - } - } - } - - c1 = ht1->h_addr_list; - c2 = ht2->h_addr_list; - - if (((ht1->h_addr_list == NULL) || (ht2->h_addr_list== NULL)) && - (ht1->h_addr_list != ht2->h_addr_list)) - goto errfin; - - if ((c1 != NULL) && (c2 != NULL)) { - cb = c1; - for (;*c1; ++c1) { - b = 0; - for (ct = c2; *ct; ++ct) { - if (memcmp(*c1, *ct, ht1->h_length) == 0) { - b = 1; - break; - } - } - if (b == 0) { - if (debug) - printf("h1 addresses item can't be "\ - "found in h2 addresses\n"); - goto errfin; - } - } - - c1 = cb; - for (;*c2; ++c2) { - b = 0; - for (ct = c1; *ct; ++ct) { - if (memcmp(*c2, *ct, ht1->h_length) == 0) { - b = 1; - break; - } - } - if (b == 0) { - if (debug) - printf("h2 addresses item can't be "\ - "found in h1 addresses\n"); - goto errfin; - } - } - } - - return 0; - -errfin: - if ((debug) && (mdata == NULL)) { - printf("following structures are not equal:\n"); - dump_hostent(ht1); - dump_hostent(ht2); - } - - 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; - - for (ai2 = ai; ai2 != NULL; ai2 = ai2->ai_next) { - if (af != ai2->ai_family) - continue; - - 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) -{ - 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); - } - - 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); -} - -static void -sdump_hostent(struct hostent *ht, char *buffer, size_t buflen) -{ - char **cp; - size_t i; - int written; - - written = snprintf(buffer, buflen, "%s %d %d", - ht->h_name, ht->h_addrtype, ht->h_length); - buffer += written; - if (written > buflen) - return; - buflen -= written; - - if (ht->h_aliases != NULL) { - if (*(ht->h_aliases) != NULL) { - for (cp = ht->h_aliases; *cp; ++cp) { - written = snprintf(buffer, buflen, " %s",*cp); - buffer += written; - if (written > buflen) - return; - buflen -= written; - - if (buflen == 0) - return; - } - } else { - written = snprintf(buffer, buflen, " noaliases"); - buffer += written; - if (written > buflen) - return; - buflen -= written; - } - } else { - written = snprintf(buffer, buflen, " (null)"); - buffer += written; - if (written > buflen) - return; - buflen -= written; - } - - written = snprintf(buffer, buflen, " : "); - buffer += written; - if (written > buflen) - return; - buflen -= written; - - if (ht->h_addr_list != NULL) { - if (*(ht->h_addr_list) != NULL) { - for (cp = ht->h_addr_list; *cp; ++cp) { - for (i = 0; i < ht->h_length; ++i ) { - written = snprintf(buffer, buflen, - i + 1 != ht->h_length ? "%d." : "%d", - (unsigned char)(*cp)[i]); - buffer += written; - if (written > buflen) - return; - buflen -= written; - - if (buflen == 0) - return; - } - - if (*(cp + 1) ) { - written = snprintf(buffer, buflen, " "); - buffer += written; - if (written > buflen) - return; - buflen -= written; - } - } - } else { - written = snprintf(buffer, buflen, " noaddrs"); - buffer += written; - if (written > buflen) - return; - buflen -= written; - } - } else { - written = snprintf(buffer, buflen, " (null)"); - buffer += written; - if (written > buflen) - return; - buflen -= written; - } -} - -static int -hostent_read_hostlist_func(struct hostent *he, char *line) -{ - struct hostent *result; - int rv; - - if (debug) - printf("resolving %s: ", line); - result = __gethostbyname2(line, af_type); - if (result != NULL) { - if (debug) - printf("found\n"); - - rv = hostent_test_correctness(result, NULL); - if (rv != 0) { - __freehostent(result); - return (rv); - } - - clone_hostent(he, result); - __freehostent(result); - } else { - if (debug) - printf("not found\n"); - - memset(he, 0, sizeof(struct hostent)); - he->h_name = strdup(line); - assert(he->h_name != NULL); - } - return (0); -} - -static int -hostent_read_snapshot_addr(char *addr, unsigned char *result, size_t len) -{ - char *s, *ps, *ts; - - ps = addr; - while ( (s = strsep(&ps, ".")) != NULL) { - if (len == 0) - return (-1); - - *result = (unsigned char)strtol(s, &ts, 10); - ++result; - if (*ts != '\0') - return (-1); - - --len; - } - if (len != 0) - return (-1); - else - return (0); -} - -static int -hostent_read_snapshot_func(struct hostent *ht, char *line) -{ - StringList *sl1, *sl2; - char *s, *ps, *ts; - int i, rv; - - if (debug) - printf("1 line read from snapshot:\n%s\n", line); - - rv = 0; - i = 0; - sl1 = sl2 = NULL; - ps = line; - memset(ht, 0, sizeof(struct hostent)); - while ( (s = strsep(&ps, " ")) != NULL) { - switch (i) { - case 0: - ht->h_name = strdup(s); - assert(ht->h_name != NULL); - break; - - case 1: - ht->h_addrtype = (int)strtol(s, &ts, 10); - if (*ts != '\0') - goto fin; - break; - - case 2: - ht->h_length = (int)strtol(s, &ts, 10); - if (*ts != '\0') - goto fin; - break; - - case 3: - if (sl1 == NULL) { - if (strcmp(s, "(null)") == 0) - return (0); - - sl1 = sl_init(); - assert(sl1 != NULL); - - if (strcmp(s, "noaliases") != 0) { - ts = strdup(s); - assert(ts != NULL); - sl_add(sl1, ts); - } - } else { - if (strcmp(s, ":") == 0) - ++i; - else { - ts = strdup(s); - assert(ts != NULL); - sl_add(sl1, ts); - } - } - break; - - case 4: - if (sl2 == NULL) { - if (strcmp(s, "(null)") == 0) - return (0); - - sl2 = sl_init(); - assert(sl2 != NULL); - - if (strcmp(s, "noaddrs") != 0) { - ts = (char *)malloc(ht->h_length); - assert(ts != NULL); - memset(ts, 0, ht->h_length); - rv = hostent_read_snapshot_addr(s,\ - (unsigned char *)ts, ht->h_length); - sl_add(sl2, ts); - if (rv != 0) - goto fin; - } - } else { - ts = (char *)malloc(ht->h_length); - assert(ts != NULL); - memset(ts, 0, ht->h_length); - rv = hostent_read_snapshot_addr(s,\ - (unsigned char *)ts, ht->h_length); - sl_add(sl2, ts); - if (rv != 0) - goto fin; - } - break; - default: - break; - }; - - if ((i != 3) && (i != 4)) - ++i; - } - -fin: - if (sl1 != NULL) { - sl_add(sl1, NULL); - ht->h_aliases = sl1->sl_str; - } - if (sl2 != NULL) { - sl_add(sl2, NULL); - ht->h_addr_list = sl2->sl_str; - } - - if ((i != 4) || (rv != 0)) { - free_hostent(ht); - memset(ht, 0, sizeof(struct hostent)); - return (-1); - } - - /* NOTE: is it a dirty hack or not? */ - free(sl1); - free(sl2); - return (0); -} - -static void -dump_hostent(struct hostent *result) -{ - if (result != NULL) { - char buffer[1024]; - sdump_hostent(result, buffer, sizeof(buffer)); - printf("%s\n", buffer); - } else - printf("(null)\n"); -} - -static int -hostent_test_correctness(struct hostent *ht, void *mdata) -{ - if (debug) { - printf("testing correctness with the following data:\n"); - dump_hostent(ht); - } - - if (ht == NULL) - goto errfin; - - if (ht->h_name == NULL) - goto errfin; - - if (!((ht->h_addrtype >= 0) && (ht->h_addrtype < AF_MAX))) - goto errfin; - - if ((ht->h_length != sizeof(struct in_addr)) && - (ht->h_length != sizeof(struct in6_addr))) - goto errfin; - - if (ht->h_aliases == NULL) - goto errfin; - - if (ht->h_addr_list == NULL) - goto errfin; - - if (debug) - printf("correct\n"); - - return (0); -errfin: - if (debug) - printf("incorrect\n"); - - return (-1); -} - -static int -hostent_test_gethostbyaddr(struct hostent *he, void *mdata) -{ - struct hostent *result; - struct hostent_test_data *addr_test_data; - int rv; - - addr_test_data = (struct hostent_test_data *)mdata; - - /* We should omit unresolved hostents */ - if (he->h_addr_list != NULL) { - char **cp; - for (cp = he->h_addr_list; *cp; ++cp) { - if (debug) - printf("doing reverse lookup for %s\n", he->h_name); - - 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) { - __freehostent(result); - return (rv); - } - - if (addr_test_data != NULL) - TEST_DATA_APPEND(hostent, addr_test_data, result); - - __freehostent(result); - } - } - - return (0); -} - -static int -hostent_test_getaddrinfo_eq(struct hostent *he, void *mdata) -{ - struct addrinfo *ai, hints; - int rv; - - ai = NULL; - memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family = af_type; - hints.ai_flags = AI_CANONNAME; - - if (debug) - printf("using getaddrinfo() to resolve %s\n", he->h_name); - - /* struct hostent *he was not resolved */ - if (he->h_addr_list == NULL) { - /* We can be sure that he->h_name is not NULL */ - rv = getaddrinfo(he->h_name, NULL, &hints, &ai); - if (rv == 0) { - if (debug) - printf("not ok - shouldn't have been resolved\n"); - return (-1); - } - } else { - rv = getaddrinfo(he->h_name, NULL, &hints, &ai); - if (rv != 0) { - if (debug) - printf("not ok - should have beed resolved\n"); - return (-1); - } - - 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 int -hostent_test_getnameinfo_eq(struct hostent *he, void *mdata) -{ - char buffer[NI_MAXHOST]; - struct sockaddr_in sin; - struct sockaddr_in6 sin6; - struct sockaddr *saddr; - struct hostent *result; - int rv; - - if (he->h_addr_list != NULL) { - char **cp; - for (cp = he->h_addr_list; *cp; ++cp) { - if (debug) - printf("doing reverse lookup for %s\n", he->h_name); - - result = __gethostbyaddr(*cp, he->h_length, - he->h_addrtype); - if (result != NULL) { - rv = hostent_test_correctness(result, NULL); - if (rv != 0) { - __freehostent(result); - return (rv); - } - } else { - if (debug) - printf("reverse lookup failed\n"); - } - - switch (he->h_addrtype) { - case AF_INET: - memset(&sin, 0, sizeof(struct sockaddr_in)); - sin.sin_len = sizeof(struct sockaddr_in); - sin.sin_family = AF_INET; - memcpy(&sin.sin_addr, *cp, he->h_length); - - saddr = (struct sockaddr *)&sin; - break; - case AF_INET6: - memset(&sin6, 0, sizeof(struct sockaddr_in6)); - sin6.sin6_len = sizeof(struct sockaddr_in6); - sin6.sin6_family = AF_INET6; - memcpy(&sin6.sin6_addr, *cp, he->h_length); - - saddr = (struct sockaddr *)&sin6; - break; - default: - if (debug) - printf("warning: %d family is unsupported\n", - he->h_addrtype); - continue; - } - - assert(saddr != NULL); - rv = getnameinfo(saddr, saddr->sa_len, buffer, - sizeof(buffer), NULL, 0, NI_NAMEREQD); - - if ((rv != 0) && (result != NULL)) { - if (debug) - printf("not ok - getnameinfo() didn't make the reverse lookup, when it should have (%s)\n", - gai_strerror(rv)); - return (rv); - } - - if ((rv == 0) && (result == NULL)) { - if (debug) - printf("not ok - getnameinfo() made the reverse lookup, when it shouldn't have\n"); - return (rv); - } - - if ((rv != 0) && (result == NULL)) { - if (debug) - printf("ok - both getnameinfo() and ***byaddr() failed\n"); - - continue; - } - - if (debug) - printf("comparing %s with %s\n", result->h_name, - buffer); - - rv = strcmp(result->h_name, buffer); - __freehostent(result); - - if (rv != 0) { - if (debug) - printf("not ok - getnameinfo() and ***byaddr() results are not equal\n"); - return (rv); - } else { - if (debug) - printf("ok - getnameinfo() and ***byaddr() results are equal\n"); - } - } - } - - return (0); -} - -static void -usage(void) -{ - (void)fprintf(stderr, - "Usage: %s -na2i [-o] [-d] [-46] [-mAcM] [-C] [-s <file>] -f <file>\n", - getprogname()); - exit(1); -} - -int -main(int argc, char **argv) -{ - struct hostent_test_data td, td_addr, td_snap; - char *snapshot_file, *hostlist_file; - res_state statp; - int rv; - int c; - - if (argc < 2) - usage(); - - snapshot_file = NULL; - hostlist_file = NULL; - while ((c = getopt(argc, argv, "nad2iod46mAcMs:f:")) != -1) - switch (c) { - case '4': - af_type = AF_INET; - break; - case '6': - af_type = AF_INET6; - break; - case 'M': - af_type = AF_INET6; - use_ipv6_mapping = 1; - ipnode_flags |= AI_V4MAPPED_CFG; - break; - case 'm': - af_type = AF_INET6; - use_ipv6_mapping = 1; - ipnode_flags |= AI_V4MAPPED; - break; - case 'c': - ipnode_flags |= AI_ADDRCONFIG; - break; - case 'A': - ipnode_flags |= AI_ALL; - break; - case 'o': - use_ipnode_functions = 1; - break; - case 'd': - debug = 1; - break; - case 'n': - method = TEST_GETHOSTBYNAME2; - break; - case 'a': - method = TEST_GETHOSTBYADDR; - break; - case '2': - method = TEST_GETHOSTBYNAME2_GETADDRINFO; - break; - case 'i': - method = TEST_GETHOSTBYADDR_GETNAMEINFO; - break; - case 's': - snapshot_file = strdup(optarg); - break; - case 'f': - hostlist_file = strdup(optarg); - break; - default: - usage(); - } - - if (use_ipnode_functions == 0) { - statp = __res_state(); - if ((statp == NULL) || ((statp->options & RES_INIT) == 0 && - res_ninit(statp) == -1)) { - if (debug) - printf("error: can't init res_state\n"); - - free(snapshot_file); - free(hostlist_file); - return (-1); - } - - if (use_ipv6_mapping == 0) - statp->options &= ~RES_USE_INET6; - else - statp->options |= RES_USE_INET6; - } - - TEST_DATA_INIT(hostent, &td, clone_hostent, free_hostent); - TEST_DATA_INIT(hostent, &td_addr, 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) { - if (method != TEST_GETHOSTBYADDR) - method = TEST_BUILD_SNAPSHOT; - else - method = TEST_BUILD_ADDR_SNAPSHOT; - } else { - if (debug) - printf("can't access the snapshot file %s\n", - snapshot_file); - - rv = -1; - goto fin; - } - } else { - rv = TEST_SNAPSHOT_FILE_READ(hostent, snapshot_file, - &td_snap, hostent_read_snapshot_func); - if (rv != 0) { - if (debug) - printf("error reading snapshot file\n"); - goto fin; - } - } - } - - switch (method) { - case TEST_GETHOSTBYNAME2: - if (snapshot_file != NULL) - rv = DO_2PASS_TEST(hostent, &td, &td_snap, - compare_hostent, NULL); - break; - case TEST_GETHOSTBYADDR: - rv = DO_1PASS_TEST(hostent, &td, - hostent_test_gethostbyaddr, (void *)&td_addr); - - if (snapshot_file != NULL) - rv = DO_2PASS_TEST(hostent, &td_addr, &td_snap, - compare_hostent, NULL); - break; - case TEST_GETHOSTBYNAME2_GETADDRINFO: - rv = DO_1PASS_TEST(hostent, &td, - hostent_test_getaddrinfo_eq, NULL); - break; - case TEST_GETHOSTBYADDR_GETNAMEINFO: - rv = DO_1PASS_TEST(hostent, &td, - hostent_test_getnameinfo_eq, NULL); - break; - case TEST_BUILD_SNAPSHOT: - if (snapshot_file != NULL) { - rv = TEST_SNAPSHOT_FILE_WRITE(hostent, snapshot_file, &td, - sdump_hostent); - } - break; - case TEST_BUILD_ADDR_SNAPSHOT: - if (snapshot_file != NULL) { - rv = DO_1PASS_TEST(hostent, &td, - hostent_test_gethostbyaddr, (void *)&td_addr); - - rv = TEST_SNAPSHOT_FILE_WRITE(hostent, snapshot_file, - &td_addr, sdump_hostent); - } - break; - default: - rv = 0; - break; - }; - -fin: - TEST_DATA_DESTROY(hostent, &td_snap); - TEST_DATA_DESTROY(hostent, &td_addr); - TEST_DATA_DESTROY(hostent, &td); - free(hostlist_file); - free(snapshot_file); - - return (rv); -} - diff --git a/tools/regression/lib/libc/nss/test-gethostby.t b/tools/regression/lib/libc/nss/test-gethostby.t deleted file mode 100644 index 42bed00..0000000 --- a/tools/regression/lib/libc/nss/test-gethostby.t +++ /dev/null @@ -1,113 +0,0 @@ -#!/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..46 -#Tests for gethostby***() functions -#IPv4-driven testing -do_test 1 'gethostbyname2() (IPv4)' '-4 -n -f mach' -do_test 2 'gethostbyaddr() (IPv4)' '-4 -a -f mach' -do_test 3 'gethostbyname2()-getaddrinfo() (IPv4)' '-4 -2 -f mach' -do_test 4 'gethostbyaddr()-getnameinfo() (IPv4)' '-4 -i -f mach' -do_test 5 'gethostbyname2() snapshot (IPv4)'\ - '-4 -n -s snapshot_htname4 -f mach' -do_test 6 'gethostbyaddr() snapshot (IPv4)'\ - '-4 -a -s snapshot_htaddr4 -f mach' - -#IPv6-driven testing -do_test 7 'gethostbyname2() (IPv6)' '-6 -n -f mach' -do_test 8 'gethostbyaddr() (IPv6)' '-6 -a -f mach' -do_test 9 'gethostbyname2()-getaddrinfo() (IPv6)' '-6 -2 -f mach' -do_test 10 'gethostbyaddr()-getnameinfo() (IPv6)' '-6 -i -f mach' -do_test 11 'gethostbyname2() snapshot (IPv6)'\ - '-6 -n -s snapshot_htname6 -f mach' -do_test 12 'gethostbyaddr() snapshot (IPv6)'\ - '-6 -a -s snapshot_htaddr6 -f mach' - -#Mapped IPv6-driven testing (getaddrinfo() equality test is useless here) -do_test 13 'gethostbyname2() (IPv6 mapped)' '-m -n -f mach' -do_test 14 'gethostbyaddr() (IPv6 mapped)' '-m -a -f mach' -do_test 15 'gethostbyname2() snapshot (IPv6 mapped)'\ - '-m -n -s snapshot_htname6map -f mach' -do_test 16 'gethostbyaddr() snapshot (IPv6 mapped)'\ - '-m -a -s snapshot_htaddr6map -f mach' - -#Tests for getipnodeby***() functions -#IPv4-driven testing, flags are 0 -do_test 17 'getipnodebyname() (IPv4)' '-o -4 -n -f mach' -do_test 18 'getipnodebyaddr() (IPv4)' '-o -4 -a -f mach' -do_test 19 'getipnodebyname()-getaddrinfo() (IPv4)' '-o -4 -2 -f mach' -do_test 20 'getipnodebyaddr()-getnameinfo() (IPv4)' '-o -4 -i -f mach' -do_test 21 'getipnodebyname() snapshot (IPv4)'\ - '-o -4 -n -s snapshot_ipnodename4 -f mach' -do_test 22 'getipnodebyname() snapshot (IPv4)'\ - '-o -4 -a -s snapshot_ipnodeaddr4 -f mach' - -#IPv6-driven testing, flags are 0 -do_test 23 'getipnodebyname() (IPv6)' '-o -6 -n -f mach' -do_test 24 'getipnodebyaddr() (IPv6)' '-o -6 -a -f mach' -do_test 25 'getipnodebyname()-getaddrinfo() (IPv6)' '-o -6 -2 -f mach' -do_test 26 'getipnodebyaddr()-getnameinfo() (IPv6)' '-o -6 -i -f mach' -do_test 27 'getipnodebyname() snapshot (IPv6)'\ - '-o -6 -n -s snapshot_ipnodename6 -f mach' -do_test 28 'getipnodebyaddr() snapshot (IPv6)'\ - '-o -6 -a -s snapshot_ipnodeaddr6 -f mach' - -#Mapped IPv6-driven testing, flags are AI_V4MAPPED -do_test 29 'getipnodebyname() (IPv6, AI_V4MAPPED)' '-o -m -n -f mach' -do_test 30 'getipnodebyaddr() (IPv6, AI_V4MAPPED)' '-o -m -a -f mach' -do_test 31 'getipnodebyname() snapshot (IPv6, AI_V4MAPPED)'\ - '-o -m -n -s snapshot_ipnodename6_AI_V4MAPPED -f mach' -do_test 32 'getipnodebyaddr() snapshot (IPv6, AI_V4MAPPED)'\ - '-o -m -a -s snapshot_ipnodeaddr6_AI_V4MAPPED -f mach' - -#Mapped IPv6-driven testing, flags are AI_V4MAPPED_CFG -do_test 33 'getipnodebyname() (IPv6, AI_V4MAPPED_CFG)' '-o -M -n -f mach' -do_test 34 'getipnodebyaddr() (IPv6, AI_V4MAPPED_CFG)' '-o -M -a -f mach' -do_test 35 'getipnodebyname() snapshot (IPv6, AI_V4MAPPED_CFG)'\ - '-o -M -n -s snapshot_ipnodename6_AI_V4MAPPED_CFG -f mach' -do_test 36 'getipnodebyaddr() snapshot (IPv6, AI_V4MAPPED_CFG)'\ - '-o -M -a -s snapshot_ipnodeaddr6_AI_V4MAPPED_CFG -f mach' - -#Mapped IPv6-driven testing, flags are AI_V4MAPPED_CFG | AI_ALL -do_test 37 'getipnodebyname() (IPv6, AI_V4MAPPED_CFG | AI_ALL)'\ - '-o -MA -n -f mach' -do_test 38 'getipnodebyaddr() (IPv6, AI_V4MAPPED_CFG | AI_ALL)'\ - '-o -MA -a -f mach' -do_test 39 'getipnodebyname() snapshot (IPv6, AI_V4MAPPED_CFG | AI_ALL)'\ - '-o -MA -n -s snapshot_ipnodename6_AI_V4MAPPED_CFG_AI_ALL -f mach' -do_test 40 'getipnodebyaddr() snapshot (IPv6, AI_V4MAPPED_CFG | AI_ALL)'\ - '-o -MA -a -s snapshot_ipnodeaddr6_AI_V4MAPPED_CFG_AI_ALL -f mach' - -#Mapped IPv6-driven testing, flags are AI_V4MAPPED_CFG | AI_ADDRCONFIG -do_test 41 'getipnodebyname() (IPv6, AI_V4MAPPED_CFG | AI_ADDRCONFIG)'\ - '-o -Mc -n -f mach' -do_test 42 'getipnodebyname() snapshot (IPv6, AI_V4MAPPED_CFG | AI_ADDRCONFIG)'\ - '-o -Mc -n -s snapshot_ipnodename6_AI_V4MAPPED_CFG_AI_ADDRCONFIG -f mach' - -#IPv4-driven testing, flags are AI_ADDRCONFIG -do_test 43 'getipnodebyname() (IPv4, AI_ADDRCONFIG)' '-o -4c -n -f mach' -do_test 44 'getipnodebyname() snapshot (IPv4, AI_ADDRCONFIG)'\ - '-o -4c -n -s snapshot_ipnodename4_AI_ADDRCONFIG -f mach' - -#IPv6-driven testing, flags are AI_ADDRCONFIG -do_test 45 'getipnodebyname() (IPv6, AI_ADDRCONFIG)' '-o -6c -n -f mach' -do_test 46 'getipnodebyname() snapshot (IPv6, AI_ADDRCONFIG)'\ - '-o -6c -n -s snapshot_ipnodename6_AI_ADDRCONFIG -f mach' - diff --git a/tools/regression/lib/libc/nss/test-getproto.c b/tools/regression/lib/libc/nss/test-getproto.c deleted file mode 100644 index a3ba271..0000000 --- a/tools/regression/lib/libc/nss/test-getproto.c +++ /dev/null @@ -1,536 +0,0 @@ -/*- - * Copyright (c) 2006 Michael Bushkov <bushman@freebsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <arpa/inet.h> -#include <assert.h> -#include <errno.h> -#include <netdb.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stringlist.h> -#include <unistd.h> -#include "testutil.h" - -enum test_methods { - TEST_GETPROTOENT, - TEST_GETPROTOBYNAME, - TEST_GETPROTOBYNUMBER, - TEST_GETPROTOENT_2PASS, - TEST_BUILD_SNAPSHOT -}; - -static int debug = 0; -static enum test_methods method = TEST_BUILD_SNAPSHOT; - -DECLARE_TEST_DATA(protoent) -DECLARE_TEST_FILE_SNAPSHOT(protoent) -DECLARE_1PASS_TEST(protoent) -DECLARE_2PASS_TEST(protoent) - -static void clone_protoent(struct protoent *, struct protoent const *); -static int compare_protoent(struct protoent *, struct protoent *, void *); -static void dump_protoent(struct protoent *); -static void free_protoent(struct protoent *); - -static void sdump_protoent(struct protoent *, char *, size_t); -static int protoent_read_snapshot_func(struct protoent *, char *); - -static int protoent_check_ambiguity(struct protoent_test_data *, - struct protoent *); -static int protoent_fill_test_data(struct protoent_test_data *); -static int protoent_test_correctness(struct protoent *, void *); -static int protoent_test_getprotobyname(struct protoent *, void *); -static int protoent_test_getprotobynumber(struct protoent *, void *); -static int protoent_test_getprotoent(struct protoent *, void *); - -static void usage(void) __attribute__((__noreturn__)); - -IMPLEMENT_TEST_DATA(protoent) -IMPLEMENT_TEST_FILE_SNAPSHOT(protoent) -IMPLEMENT_1PASS_TEST(protoent) -IMPLEMENT_2PASS_TEST(protoent) - -static void -clone_protoent(struct protoent *dest, struct protoent const *src) -{ - assert(dest != NULL); - assert(src != NULL); - - char **cp; - int aliases_num; - - memset(dest, 0, sizeof(struct protoent)); - - if (src->p_name != NULL) { - dest->p_name = strdup(src->p_name); - assert(dest->p_name != NULL); - } - - dest->p_proto = src->p_proto; - - if (src->p_aliases != NULL) { - aliases_num = 0; - for (cp = src->p_aliases; *cp; ++cp) - ++aliases_num; - - dest->p_aliases = (char **)malloc((aliases_num+1) * (sizeof(char *))); - assert(dest->p_aliases != NULL); - memset(dest->p_aliases, 0, (aliases_num+1) * (sizeof(char *))); - - for (cp = src->p_aliases; *cp; ++cp) { - dest->p_aliases[cp - src->p_aliases] = strdup(*cp); - assert(dest->p_aliases[cp - src->p_aliases] != NULL); - } - } -} - -static void -free_protoent(struct protoent *pe) -{ - char **cp; - - assert(pe != NULL); - - free(pe->p_name); - - for (cp = pe->p_aliases; *cp; ++cp) - free(*cp); - free(pe->p_aliases); -} - -static int -compare_protoent(struct protoent *pe1, struct protoent *pe2, void *mdata) -{ - char **c1, **c2; - - if (pe1 == pe2) - return 0; - - if ((pe1 == NULL) || (pe2 == NULL)) - goto errfin; - - if ((strcmp(pe1->p_name, pe2->p_name) != 0) || - (pe1->p_proto != pe2->p_proto)) - goto errfin; - - c1 = pe1->p_aliases; - c2 = pe2->p_aliases; - - if ((pe1->p_aliases == NULL) || (pe2->p_aliases == NULL)) - goto errfin; - - for (;*c1 && *c2; ++c1, ++c2) - if (strcmp(*c1, *c2) != 0) - goto errfin; - - if ((*c1 != '\0') || (*c2 != '\0')) - goto errfin; - - return 0; - -errfin: - if ((debug) && (mdata == NULL)) { - printf("following structures are not equal:\n"); - dump_protoent(pe1); - dump_protoent(pe2); - } - - return (-1); -} - -static void -sdump_protoent(struct protoent *pe, char *buffer, size_t buflen) -{ - char **cp; - int written; - - written = snprintf(buffer, buflen, "%s %d", - pe->p_name, pe->p_proto); - buffer += written; - if (written > buflen) - return; - buflen -= written; - - if (pe->p_aliases != NULL) { - if (*(pe->p_aliases) != '\0') { - for (cp = pe->p_aliases; *cp; ++cp) { - written = snprintf(buffer, buflen, " %s",*cp); - buffer += written; - if (written > buflen) - return; - buflen -= written; - - if (buflen == 0) - return; - } - } else - snprintf(buffer, buflen, " noaliases"); - } else - snprintf(buffer, buflen, " (null)"); -} - -static int -protoent_read_snapshot_func(struct protoent *pe, char *line) -{ - StringList *sl; - char *s, *ps, *ts; - int i; - - if (debug) - printf("1 line read from snapshot:\n%s\n", line); - - i = 0; - sl = NULL; - ps = line; - memset(pe, 0, sizeof(struct protoent)); - while ( (s = strsep(&ps, " ")) != NULL) { - switch (i) { - case 0: - pe->p_name = strdup(s); - assert(pe->p_name != NULL); - break; - - case 1: - pe->p_proto = (int)strtol(s, &ts, 10); - if (*ts != '\0') { - free(pe->p_name); - return (-1); - } - break; - - default: - if (sl == NULL) { - if (strcmp(s, "(null)") == 0) - return (0); - - sl = sl_init(); - assert(sl != NULL); - - if (strcmp(s, "noaliases") != 0) { - ts = strdup(s); - assert(ts != NULL); - sl_add(sl, ts); - } - } else { - ts = strdup(s); - assert(ts != NULL); - sl_add(sl, ts); - } - break; - }; - ++i; - } - - if (i < 3) { - free(pe->p_name); - memset(pe, 0, sizeof(struct protoent)); - return (-1); - } - - sl_add(sl, NULL); - pe->p_aliases = sl->sl_str; - - /* NOTE: is it a dirty hack or not? */ - free(sl); - return (0); -} - -static void -dump_protoent(struct protoent *result) -{ - if (result != NULL) { - char buffer[1024]; - sdump_protoent(result, buffer, sizeof(buffer)); - printf("%s\n", buffer); - } else - printf("(null)\n"); -} - -static int -protoent_fill_test_data(struct protoent_test_data *td) -{ - struct protoent *pe; - - setprotoent(1); - while ((pe = getprotoent()) != NULL) { - if (protoent_test_correctness(pe, NULL) == 0) - TEST_DATA_APPEND(protoent, td, pe); - else - return (-1); - } - endprotoent(); - - return (0); -} - -static int -protoent_test_correctness(struct protoent *pe, void *mdata) -{ - if (debug) { - printf("testing correctness with the following data:\n"); - dump_protoent(pe); - } - - if (pe == NULL) - goto errfin; - - if (pe->p_name == NULL) - goto errfin; - - if (pe->p_proto < 0) - goto errfin; - - if (pe->p_aliases == NULL) - goto errfin; - - if (debug) - printf("correct\n"); - - return (0); -errfin: - if (debug) - printf("incorrect\n"); - - return (-1); -} - -/* protoent_check_ambiguity() is needed when one port+proto is associated with - * more than one peice (these cases are usually marked as PROBLEM in - * /etc/peices. This functions is needed also when one peice+proto is - * associated with several ports. We have to check all the protoent structures - * to make sure that pe really exists and correct */ -static int -protoent_check_ambiguity(struct protoent_test_data *td, struct protoent *pe) -{ - - return (TEST_DATA_FIND(protoent, td, pe, compare_protoent, - NULL) != NULL ? 0 : -1); -} - -static int -protoent_test_getprotobyname(struct protoent *pe_model, void *mdata) -{ - char **alias; - struct protoent *pe; - - if (debug) { - printf("testing getprotobyname() with the following data:\n"); - dump_protoent(pe_model); - } - - pe = getprotobyname(pe_model->p_name); - if (protoent_test_correctness(pe, NULL) != 0) - goto errfin; - - if ((compare_protoent(pe, pe_model, NULL) != 0) && - (protoent_check_ambiguity((struct protoent_test_data *)mdata, pe) - !=0)) - goto errfin; - - for (alias = pe_model->p_aliases; *alias; ++alias) { - pe = getprotobyname(*alias); - - if (protoent_test_correctness(pe, NULL) != 0) - goto errfin; - - if ((compare_protoent(pe, pe_model, NULL) != 0) && - (protoent_check_ambiguity( - (struct protoent_test_data *)mdata, pe) != 0)) - goto errfin; - } - - if (debug) - printf("ok\n"); - return (0); - -errfin: - if (debug) - printf("not ok\n"); - - return (-1); -} - -static int -protoent_test_getprotobynumber(struct protoent *pe_model, void *mdata) -{ - struct protoent *pe; - - if (debug) { - printf("testing getprotobyport() with the following data...\n"); - dump_protoent(pe_model); - } - - pe = getprotobynumber(pe_model->p_proto); - if ((protoent_test_correctness(pe, NULL) != 0) || - ((compare_protoent(pe, pe_model, NULL) != 0) && - (protoent_check_ambiguity((struct protoent_test_data *)mdata, pe) - != 0))) { - if (debug) - printf("not ok\n"); - return (-1); - } else { - if (debug) - printf("ok\n"); - return (0); - } -} - -static int -protoent_test_getprotoent(struct protoent *pe, void *mdata) -{ - /* Only correctness can be checked when doing 1-pass test for - * getprotoent(). */ - return (protoent_test_correctness(pe, NULL)); -} - -static void -usage(void) -{ - (void)fprintf(stderr, - "Usage: %s -nve2 [-d] [-s <file>]\n", - getprogname()); - exit(1); -} - -int -main(int argc, char **argv) -{ - struct protoent_test_data td, td_snap, td_2pass; - char *snapshot_file; - int rv; - int c; - - if (argc < 2) - usage(); - - snapshot_file = NULL; - while ((c = getopt(argc, argv, "nve2ds:")) != -1) - switch (c) { - case 'd': - debug++; - break; - case 'n': - method = TEST_GETPROTOBYNAME; - break; - case 'v': - method = TEST_GETPROTOBYNUMBER; - break; - case 'e': - method = TEST_GETPROTOENT; - break; - case '2': - method = TEST_GETPROTOENT_2PASS; - break; - case 's': - snapshot_file = strdup(optarg); - break; - default: - usage(); - } - - TEST_DATA_INIT(protoent, &td, clone_protoent, free_protoent); - TEST_DATA_INIT(protoent, &td_snap, clone_protoent, free_protoent); - 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 file %s\n", - snapshot_file); - - rv = -1; - goto fin; - } - } else { - if (method == TEST_BUILD_SNAPSHOT) { - rv = 0; - goto fin; - } - - TEST_SNAPSHOT_FILE_READ(protoent, snapshot_file, - &td_snap, protoent_read_snapshot_func); - } - } - - rv = protoent_fill_test_data(&td); - if (rv == -1) - return (-1); - switch (method) { - case TEST_GETPROTOBYNAME: - if (snapshot_file == NULL) - rv = DO_1PASS_TEST(protoent, &td, - protoent_test_getprotobyname, (void *)&td); - else - rv = DO_1PASS_TEST(protoent, &td_snap, - protoent_test_getprotobyname, (void *)&td_snap); - break; - case TEST_GETPROTOBYNUMBER: - if (snapshot_file == NULL) - rv = DO_1PASS_TEST(protoent, &td, - protoent_test_getprotobynumber, (void *)&td); - else - rv = DO_1PASS_TEST(protoent, &td_snap, - protoent_test_getprotobynumber, (void *)&td_snap); - break; - case TEST_GETPROTOENT: - if (snapshot_file == NULL) - rv = DO_1PASS_TEST(protoent, &td, - protoent_test_getprotoent, (void *)&td); - else - rv = DO_2PASS_TEST(protoent, &td, &td_snap, - compare_protoent, NULL); - break; - case TEST_GETPROTOENT_2PASS: - TEST_DATA_INIT(protoent, &td_2pass, clone_protoent, - free_protoent); - rv = protoent_fill_test_data(&td_2pass); - if (rv != -1) - rv = DO_2PASS_TEST(protoent, &td, &td_2pass, - compare_protoent, NULL); - TEST_DATA_DESTROY(protoent, &td_2pass); - break; - case TEST_BUILD_SNAPSHOT: - if (snapshot_file != NULL) - rv = TEST_SNAPSHOT_FILE_WRITE(protoent, snapshot_file, &td, - sdump_protoent); - break; - default: - rv = 0; - break; - }; - -fin: - TEST_DATA_DESTROY(protoent, &td_snap); - TEST_DATA_DESTROY(protoent, &td); - free(snapshot_file); - return (rv); -} diff --git a/tools/regression/lib/libc/nss/test-getproto.t b/tools/regression/lib/libc/nss/test-getproto.t deleted file mode 100644 index f582d31..0000000 --- a/tools/regression/lib/libc/nss/test-getproto.t +++ /dev/null @@ -1,29 +0,0 @@ -#!/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 'getprotobyname()' '-n' -do_test 2 'getprotobynumber()' '-v' -do_test 3 'getprotoent()' '-e' -do_test 4 'getprotoent() 2-pass' '-2' -do_test 5 'building snapshot, if needed' '-s snapshot_proto' -do_test 6 'getprotobyname() snapshot' '-n -s snapshot_proto' -do_test 7 'getprotobynumber() snapshot' '-v -s snapshot_proto' -do_test 8 'getprotoent() snapshot' '-e -s snapshot_proto' diff --git a/tools/regression/lib/libc/nss/test-getpw.c b/tools/regression/lib/libc/nss/test-getpw.c deleted file mode 100644 index a0b348d..0000000 --- a/tools/regression/lib/libc/nss/test-getpw.c +++ /dev/null @@ -1,489 +0,0 @@ -/*- - * Copyright (c) 2006 Michael Bushkov <bushman@freebsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <assert.h> -#include <errno.h> -#include <pwd.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include "testutil.h" - -enum test_methods { - TEST_GETPWENT, - TEST_GETPWNAM, - TEST_GETPWUID, - TEST_GETPWENT_2PASS, - TEST_BUILD_SNAPSHOT -}; - -static int debug = 0; -static enum test_methods method = TEST_BUILD_SNAPSHOT; - -DECLARE_TEST_DATA(passwd) -DECLARE_TEST_FILE_SNAPSHOT(passwd) -DECLARE_1PASS_TEST(passwd) -DECLARE_2PASS_TEST(passwd) - -static void clone_passwd(struct passwd *, struct passwd const *); -static int compare_passwd(struct passwd *, struct passwd *, void *); -static void free_passwd(struct passwd *); - -static void sdump_passwd(struct passwd *, char *, size_t); -static void dump_passwd(struct passwd *); - -static int passwd_read_snapshot_func(struct passwd *, char *); - -static int passwd_check_ambiguity(struct passwd_test_data *, struct passwd *); -static int passwd_fill_test_data(struct passwd_test_data *); -static int passwd_test_correctness(struct passwd *, void *); -static int passwd_test_getpwnam(struct passwd *, void *); -static int passwd_test_getpwuid(struct passwd *, void *); -static int passwd_test_getpwent(struct passwd *, void *); - -static void usage(void) __attribute__((__noreturn__)); - -IMPLEMENT_TEST_DATA(passwd) -IMPLEMENT_TEST_FILE_SNAPSHOT(passwd) -IMPLEMENT_1PASS_TEST(passwd) -IMPLEMENT_2PASS_TEST(passwd) - -static void -clone_passwd(struct passwd *dest, struct passwd const *src) -{ - assert(dest != NULL); - assert(src != NULL); - - memcpy(dest, src, sizeof(struct passwd)); - if (src->pw_name != NULL) - dest->pw_name = strdup(src->pw_name); - if (src->pw_passwd != NULL) - dest->pw_passwd = strdup(src->pw_passwd); - if (src->pw_class != NULL) - dest->pw_class = strdup(src->pw_class); - if (src->pw_gecos != NULL) - dest->pw_gecos = strdup(src->pw_gecos); - if (src->pw_dir != NULL) - dest->pw_dir = strdup(src->pw_dir); - if (src->pw_shell != NULL) - dest->pw_shell = strdup(dest->pw_shell); -} - -static int -compare_passwd(struct passwd *pwd1, struct passwd *pwd2, void *mdata) -{ - assert(pwd1 != NULL); - assert(pwd2 != NULL); - - if (pwd1 == pwd2) - return (0); - - if ((pwd1->pw_uid != pwd2->pw_uid) || - (pwd1->pw_gid != pwd2->pw_gid) || - (pwd1->pw_change != pwd2->pw_change) || - (pwd1->pw_expire != pwd2->pw_expire) || - (pwd1->pw_fields != pwd2->pw_fields) || - (strcmp(pwd1->pw_name, pwd2->pw_name) != 0) || - (strcmp(pwd1->pw_passwd, pwd2->pw_passwd) != 0) || - (strcmp(pwd1->pw_class, pwd2->pw_class) != 0) || - (strcmp(pwd1->pw_gecos, pwd2->pw_gecos) != 0) || - (strcmp(pwd1->pw_dir, pwd2->pw_dir) != 0) || - (strcmp(pwd1->pw_shell, pwd2->pw_shell) != 0) - ) - return (-1); - else - return (0); -} - -static void -free_passwd(struct passwd *pwd) -{ - free(pwd->pw_name); - free(pwd->pw_passwd); - free(pwd->pw_class); - free(pwd->pw_gecos); - free(pwd->pw_dir); - free(pwd->pw_shell); -} - -static void -sdump_passwd(struct passwd *pwd, char *buffer, size_t buflen) -{ - snprintf(buffer, buflen, "%s:%s:%d:%d:%d:%s:%s:%s:%s:%d:%d", - pwd->pw_name, pwd->pw_passwd, pwd->pw_uid, pwd->pw_gid, - pwd->pw_change, pwd->pw_class, pwd->pw_gecos, pwd->pw_dir, - pwd->pw_shell, pwd->pw_expire, pwd->pw_fields); -} - -static void -dump_passwd(struct passwd *pwd) -{ - if (pwd != NULL) { - char buffer[2048]; - sdump_passwd(pwd, buffer, sizeof(buffer)); - printf("%s\n", buffer); - } else - printf("(null)\n"); -} - -static int -passwd_read_snapshot_func(struct passwd *pwd, char *line) -{ - char *s, *ps, *ts; - int i; - - if (debug) - printf("1 line read from snapshot:\n%s\n", line); - - i = 0; - ps = line; - memset(pwd, 0, sizeof(struct passwd)); - while ( (s = strsep(&ps, ":")) != NULL) { - switch (i) { - case 0: - pwd->pw_name = strdup(s); - assert(pwd->pw_name != NULL); - break; - case 1: - pwd->pw_passwd = strdup(s); - assert(pwd->pw_passwd != NULL); - break; - case 2: - pwd->pw_uid = (uid_t)strtol(s, &ts, 10); - if (*ts != '\0') - goto fin; - break; - case 3: - pwd->pw_gid = (gid_t)strtol(s, &ts, 10); - if (*ts != '\0') - goto fin; - break; - case 4: - pwd->pw_change = (time_t)strtol(s, &ts, 10); - if (*ts != '\0') - goto fin; - break; - case 5: - pwd->pw_class = strdup(s); - assert(pwd->pw_class != NULL); - break; - case 6: - pwd->pw_gecos = strdup(s); - assert(pwd->pw_gecos != NULL); - break; - case 7: - pwd->pw_dir = strdup(s); - assert(pwd->pw_dir != NULL); - break; - case 8: - pwd->pw_shell = strdup(s); - assert(pwd->pw_shell != NULL); - break; - case 9: - pwd->pw_expire = (time_t)strtol(s, &ts, 10); - if (*ts != '\0') - goto fin; - break; - case 10: - pwd->pw_fields = (int)strtol(s, &ts, 10); - if (*ts != '\0') - goto fin; - break; - default: - break; - }; - ++i; - } - -fin: - if (i != 11) { - free_passwd(pwd); - memset(pwd, 0, sizeof(struct passwd)); - return (-1); - } - - return (0); -} - -static int -passwd_fill_test_data(struct passwd_test_data *td) -{ - struct passwd *pwd; - - setpassent(1); - while ((pwd = getpwent()) != NULL) { - if (passwd_test_correctness(pwd, NULL) == 0) - TEST_DATA_APPEND(passwd, td, pwd); - else - return (-1); - } - endpwent(); - - return (0); -} - -static int -passwd_test_correctness(struct passwd *pwd, void *mdata) -{ - if (debug) { - printf("testing correctness with the following data:\n"); - dump_passwd(pwd); - } - - if (pwd == NULL) - return (-1); - - if (pwd->pw_name == NULL) - goto errfin; - - if (pwd->pw_passwd == NULL) - goto errfin; - - if (pwd->pw_class == NULL) - goto errfin; - - if (pwd->pw_gecos == NULL) - goto errfin; - - if (pwd->pw_dir == NULL) - goto errfin; - - if (pwd->pw_shell == NULL) - goto errfin; - - if (debug) - printf("correct\n"); - - return (0); -errfin: - if (debug) - printf("incorrect\n"); - - return (-1); -} - -/* passwd_check_ambiguity() is needed here because when doing the getpwent() - * calls sequence, records from different nsswitch sources can be different, - * though having the same pw_name/pw_uid */ -static int -passwd_check_ambiguity(struct passwd_test_data *td, struct passwd *pwd) -{ - - return (TEST_DATA_FIND(passwd, td, pwd, compare_passwd, - NULL) != NULL ? 0 : -1); -} - -static int -passwd_test_getpwnam(struct passwd *pwd_model, void *mdata) -{ - struct passwd *pwd; - - if (debug) { - printf("testing getpwnam() with the following data:\n"); - dump_passwd(pwd_model); - } - - pwd = getpwnam(pwd_model->pw_name); - if (passwd_test_correctness(pwd, NULL) != 0) - goto errfin; - - if ((compare_passwd(pwd, pwd_model, NULL) != 0) && - (passwd_check_ambiguity((struct passwd_test_data *)mdata, pwd) - !=0)) - goto errfin; - - if (debug) - printf("ok\n"); - return (0); - -errfin: - if (debug) - printf("not ok\n"); - - return (-1); -} - -static int -passwd_test_getpwuid(struct passwd *pwd_model, void *mdata) -{ - struct passwd *pwd; - - if (debug) { - printf("testing getpwuid() with the following data...\n"); - dump_passwd(pwd_model); - } - - pwd = getpwuid(pwd_model->pw_uid); - if ((passwd_test_correctness(pwd, NULL) != 0) || - ((compare_passwd(pwd, pwd_model, NULL) != 0) && - (passwd_check_ambiguity((struct passwd_test_data *)mdata, pwd) - != 0))) { - if (debug) - printf("not ok\n"); - return (-1); - } else { - if (debug) - printf("ok\n"); - return (0); - } -} - -static int -passwd_test_getpwent(struct passwd *pwd, void *mdata) -{ - /* Only correctness can be checked when doing 1-pass test for - * getpwent(). */ - return (passwd_test_correctness(pwd, NULL)); -} - -static void -usage(void) -{ - (void)fprintf(stderr, - "Usage: %s -nue2 [-d] [-s <file>]\n", - getprogname()); - exit(1); -} - -int -main(int argc, char **argv) -{ - struct passwd_test_data td, td_snap, td_2pass; - char *snapshot_file; - int rv; - int c; - - if (argc < 2) - usage(); - - snapshot_file = NULL; - while ((c = getopt(argc, argv, "nue2ds:")) != -1) - switch (c) { - case 'd': - debug++; - break; - case 'n': - method = TEST_GETPWNAM; - break; - case 'u': - method = TEST_GETPWUID; - break; - case 'e': - method = TEST_GETPWENT; - break; - case '2': - method = TEST_GETPWENT_2PASS; - break; - case 's': - snapshot_file = strdup(optarg); - break; - default: - usage(); - } - - TEST_DATA_INIT(passwd, &td, clone_passwd, free_passwd); - TEST_DATA_INIT(passwd, &td_snap, clone_passwd, free_passwd); - 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 file %s\n", - snapshot_file); - - rv = -1; - goto fin; - } - } else { - if (method == TEST_BUILD_SNAPSHOT) { - rv = 0; - goto fin; - } - - TEST_SNAPSHOT_FILE_READ(passwd, snapshot_file, - &td_snap, passwd_read_snapshot_func); - } - } - - rv = passwd_fill_test_data(&td); - if (rv == -1) - return (-1); - - switch (method) { - case TEST_GETPWNAM: - if (snapshot_file == NULL) - rv = DO_1PASS_TEST(passwd, &td, - passwd_test_getpwnam, (void *)&td); - else - rv = DO_1PASS_TEST(passwd, &td_snap, - passwd_test_getpwnam, (void *)&td_snap); - break; - case TEST_GETPWUID: - if (snapshot_file == NULL) - rv = DO_1PASS_TEST(passwd, &td, - passwd_test_getpwuid, (void *)&td); - else - rv = DO_1PASS_TEST(passwd, &td_snap, - passwd_test_getpwuid, (void *)&td_snap); - break; - case TEST_GETPWENT: - if (snapshot_file == NULL) - rv = DO_1PASS_TEST(passwd, &td, passwd_test_getpwent, - (void *)&td); - else - rv = DO_2PASS_TEST(passwd, &td, &td_snap, - compare_passwd, NULL); - break; - case TEST_GETPWENT_2PASS: - TEST_DATA_INIT(passwd, &td_2pass, clone_passwd, free_passwd); - rv = passwd_fill_test_data(&td_2pass); - if (rv != -1) - rv = DO_2PASS_TEST(passwd, &td, &td_2pass, - compare_passwd, NULL); - TEST_DATA_DESTROY(passwd, &td_2pass); - break; - case TEST_BUILD_SNAPSHOT: - if (snapshot_file != NULL) - rv = TEST_SNAPSHOT_FILE_WRITE(passwd, snapshot_file, &td, - sdump_passwd); - break; - default: - rv = 0; - break; - }; - -fin: - TEST_DATA_DESTROY(passwd, &td_snap); - TEST_DATA_DESTROY(passwd, &td); - free(snapshot_file); - return (rv); -} diff --git a/tools/regression/lib/libc/nss/test-getpw.t b/tools/regression/lib/libc/nss/test-getpw.t deleted file mode 100644 index 5172177..0000000 --- a/tools/regression/lib/libc/nss/test-getpw.t +++ /dev/null @@ -1,29 +0,0 @@ -#!/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 'getpwnam()' '-n' -do_test 2 'getpwuid()' '-u' -do_test 3 'getpwent()' '-e' -do_test 4 'getpwent() 2-pass' '-2' -do_test 5 'building snapshot, if needed' '-s snapshot_pwd' -do_test 6 'getpwnam() snapshot' '-n -s snapshot_pwd' -do_test 7 'getpwuid() snapshot' '-u -s snapshot_pwd' -do_test 8 'getpwent() snapshot' '-e -s snapshot_pwd' diff --git a/tools/regression/lib/libc/nss/test-getrpc.c b/tools/regression/lib/libc/nss/test-getrpc.c deleted file mode 100644 index 707186e..0000000 --- a/tools/regression/lib/libc/nss/test-getrpc.c +++ /dev/null @@ -1,535 +0,0 @@ -/*- - * Copyright (c) 2006 Michael Bushkov <bushman@freebsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <arpa/inet.h> -#include <rpc/rpc.h> -#include <assert.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stringlist.h> -#include <unistd.h> -#include "testutil.h" - -enum test_methods { - TEST_GETRPCENT, - TEST_GETRPCBYNAME, - TEST_GETRPCBYNUMBER, - TEST_GETRPCENT_2PASS, - TEST_BUILD_SNAPSHOT -}; - -static int debug = 0; -static enum test_methods method = TEST_BUILD_SNAPSHOT; - -DECLARE_TEST_DATA(rpcent) -DECLARE_TEST_FILE_SNAPSHOT(rpcent) -DECLARE_1PASS_TEST(rpcent) -DECLARE_2PASS_TEST(rpcent) - -static void clone_rpcent(struct rpcent *, struct rpcent const *); -static int compare_rpcent(struct rpcent *, struct rpcent *, void *); -static void dump_rpcent(struct rpcent *); -static void free_rpcent(struct rpcent *); - -static void sdump_rpcent(struct rpcent *, char *, size_t); -static int rpcent_read_snapshot_func(struct rpcent *, char *); - -static int rpcent_check_ambiguity(struct rpcent_test_data *, - struct rpcent *); -static int rpcent_fill_test_data(struct rpcent_test_data *); -static int rpcent_test_correctness(struct rpcent *, void *); -static int rpcent_test_getrpcbyname(struct rpcent *, void *); -static int rpcent_test_getrpcbynumber(struct rpcent *, void *); -static int rpcent_test_getrpcent(struct rpcent *, void *); - -static void usage(void) __attribute__((__noreturn__)); - -IMPLEMENT_TEST_DATA(rpcent) -IMPLEMENT_TEST_FILE_SNAPSHOT(rpcent) -IMPLEMENT_1PASS_TEST(rpcent) -IMPLEMENT_2PASS_TEST(rpcent) - -static void -clone_rpcent(struct rpcent *dest, struct rpcent const *src) -{ - assert(dest != NULL); - assert(src != NULL); - - char **cp; - int aliases_num; - - memset(dest, 0, sizeof(struct rpcent)); - - if (src->r_name != NULL) { - dest->r_name = strdup(src->r_name); - assert(dest->r_name != NULL); - } - - dest->r_number = src->r_number; - - if (src->r_aliases != NULL) { - aliases_num = 0; - for (cp = src->r_aliases; *cp; ++cp) - ++aliases_num; - - dest->r_aliases = (char **)malloc((aliases_num+1) * (sizeof(char *))); - assert(dest->r_aliases != NULL); - memset(dest->r_aliases, 0, (aliases_num+1) * (sizeof(char *))); - - for (cp = src->r_aliases; *cp; ++cp) { - dest->r_aliases[cp - src->r_aliases] = strdup(*cp); - assert(dest->r_aliases[cp - src->r_aliases] != NULL); - } - } -} - -static void -free_rpcent(struct rpcent *rpc) -{ - char **cp; - - assert(rpc != NULL); - - free(rpc->r_name); - - for (cp = rpc->r_aliases; *cp; ++cp) - free(*cp); - free(rpc->r_aliases); -} - -static int -compare_rpcent(struct rpcent *rpc1, struct rpcent *rpc2, void *mdata) -{ - char **c1, **c2; - - if (rpc1 == rpc2) - return 0; - - if ((rpc1 == NULL) || (rpc2 == NULL)) - goto errfin; - - if ((strcmp(rpc1->r_name, rpc2->r_name) != 0) || - (rpc1->r_number != rpc2->r_number)) - goto errfin; - - c1 = rpc1->r_aliases; - c2 = rpc2->r_aliases; - - if ((rpc1->r_aliases == NULL) || (rpc2->r_aliases == NULL)) - goto errfin; - - for (;*c1 && *c2; ++c1, ++c2) - if (strcmp(*c1, *c2) != 0) - goto errfin; - - if ((*c1 != '\0') || (*c2 != '\0')) - goto errfin; - - return 0; - -errfin: - if ((debug) && (mdata == NULL)) { - printf("following structures are not equal:\n"); - dump_rpcent(rpc1); - dump_rpcent(rpc2); - } - - return (-1); -} - -static void -sdump_rpcent(struct rpcent *rpc, char *buffer, size_t buflen) -{ - char **cp; - int written; - - written = snprintf(buffer, buflen, "%s %d", - rpc->r_name, rpc->r_number); - buffer += written; - if (written > buflen) - return; - buflen -= written; - - if (rpc->r_aliases != NULL) { - if (*(rpc->r_aliases) != '\0') { - for (cp = rpc->r_aliases; *cp; ++cp) { - written = snprintf(buffer, buflen, " %s",*cp); - buffer += written; - if (written > buflen) - return; - buflen -= written; - - if (buflen == 0) - return; - } - } else - snprintf(buffer, buflen, " noaliases"); - } else - snprintf(buffer, buflen, " (null)"); -} - -static int -rpcent_read_snapshot_func(struct rpcent *rpc, char *line) -{ - StringList *sl; - char *s, *ps, *ts; - int i; - - if (debug) - printf("1 line read from snapshot:\n%s\n", line); - - i = 0; - sl = NULL; - ps = line; - memset(rpc, 0, sizeof(struct rpcent)); - while ( (s = strsep(&ps, " ")) != NULL) { - switch (i) { - case 0: - rpc->r_name = strdup(s); - assert(rpc->r_name != NULL); - break; - - case 1: - rpc->r_number = (int)strtol(s, &ts, 10); - if (*ts != '\0') { - free(rpc->r_name); - return (-1); - } - break; - - default: - if (sl == NULL) { - if (strcmp(s, "(null)") == 0) - return (0); - - sl = sl_init(); - assert(sl != NULL); - - if (strcmp(s, "noaliases") != 0) { - ts = strdup(s); - assert(ts != NULL); - sl_add(sl, ts); - } - } else { - ts = strdup(s); - assert(ts != NULL); - sl_add(sl, ts); - } - break; - }; - ++i; - } - - if (i < 3) { - free(rpc->r_name); - memset(rpc, 0, sizeof(struct rpcent)); - return (-1); - } - - sl_add(sl, NULL); - rpc->r_aliases = sl->sl_str; - - /* NOTE: is it a dirty hack or not? */ - free(sl); - return (0); -} - -static void -dump_rpcent(struct rpcent *result) -{ - if (result != NULL) { - char buffer[1024]; - sdump_rpcent(result, buffer, sizeof(buffer)); - printf("%s\n", buffer); - } else - printf("(null)\n"); -} - -static int -rpcent_fill_test_data(struct rpcent_test_data *td) -{ - struct rpcent *rpc; - - setrpcent(1); - while ((rpc = getrpcent()) != NULL) { - if (rpcent_test_correctness(rpc, NULL) == 0) - TEST_DATA_APPEND(rpcent, td, rpc); - else - return (-1); - } - endrpcent(); - - return (0); -} - -static int -rpcent_test_correctness(struct rpcent *rpc, void *mdata) -{ - if (debug) { - printf("testing correctness with the following data:\n"); - dump_rpcent(rpc); - } - - if (rpc == NULL) - goto errfin; - - if (rpc->r_name == NULL) - goto errfin; - - if (rpc->r_number < 0) - goto errfin; - - if (rpc->r_aliases == NULL) - goto errfin; - - if (debug) - printf("correct\n"); - - return (0); -errfin: - if (debug) - printf("incorrect\n"); - - return (-1); -} - -/* rpcent_check_ambiguity() is needed when one port+rpc is associated with - * more than one peice (these cases are usually marked as PROBLEM in - * /etc/peices. This functions is needed also when one peice+rpc is - * associated with several ports. We have to check all the rpcent structures - * to make sure that rpc really exists and correct */ -static int -rpcent_check_ambiguity(struct rpcent_test_data *td, struct rpcent *rpc) -{ - - return (TEST_DATA_FIND(rpcent, td, rpc, compare_rpcent, - NULL) != NULL ? 0 : -1); -} - -static int -rpcent_test_getrpcbyname(struct rpcent *rpc_model, void *mdata) -{ - char **alias; - struct rpcent *rpc; - - if (debug) { - printf("testing getrpcbyname() with the following data:\n"); - dump_rpcent(rpc_model); - } - - rpc = getrpcbyname(rpc_model->r_name); - if (rpcent_test_correctness(rpc, NULL) != 0) - goto errfin; - - if ((compare_rpcent(rpc, rpc_model, NULL) != 0) && - (rpcent_check_ambiguity((struct rpcent_test_data *)mdata, rpc) - !=0)) - goto errfin; - - for (alias = rpc_model->r_aliases; *alias; ++alias) { - rpc = getrpcbyname(*alias); - - if (rpcent_test_correctness(rpc, NULL) != 0) - goto errfin; - - if ((compare_rpcent(rpc, rpc_model, NULL) != 0) && - (rpcent_check_ambiguity( - (struct rpcent_test_data *)mdata, rpc) != 0)) - goto errfin; - } - - if (debug) - printf("ok\n"); - return (0); - -errfin: - if (debug) - printf("not ok\n"); - - return (-1); -} - -static int -rpcent_test_getrpcbynumber(struct rpcent *rpc_model, void *mdata) -{ - struct rpcent *rpc; - - if (debug) { - printf("testing getrpcbyport() with the following data...\n"); - dump_rpcent(rpc_model); - } - - rpc = getrpcbynumber(rpc_model->r_number); - if ((rpcent_test_correctness(rpc, NULL) != 0) || - ((compare_rpcent(rpc, rpc_model, NULL) != 0) && - (rpcent_check_ambiguity((struct rpcent_test_data *)mdata, rpc) - != 0))) { - if (debug) - printf("not ok\n"); - return (-1); - } else { - if (debug) - printf("ok\n"); - return (0); - } -} - -static int -rpcent_test_getrpcent(struct rpcent *rpc, void *mdata) -{ - /* Only correctness can be checked when doing 1-pass test for - * getrpcent(). */ - return (rpcent_test_correctness(rpc, NULL)); -} - -static void -usage(void) -{ - (void)fprintf(stderr, - "Usage: %s -nve2 [-d] [-s <file>]\n", - getprogname()); - exit(1); -} - -int -main(int argc, char **argv) -{ - struct rpcent_test_data td, td_snap, td_2pass; - char *snapshot_file; - int rv; - int c; - - if (argc < 2) - usage(); - - snapshot_file = NULL; - while ((c = getopt(argc, argv, "nve2ds:")) != -1) - switch (c) { - case 'd': - debug++; - break; - case 'n': - method = TEST_GETRPCBYNAME; - break; - case 'v': - method = TEST_GETRPCBYNUMBER; - break; - case 'e': - method = TEST_GETRPCENT; - break; - case '2': - method = TEST_GETRPCENT_2PASS; - break; - case 's': - snapshot_file = strdup(optarg); - break; - default: - usage(); - } - - TEST_DATA_INIT(rpcent, &td, clone_rpcent, free_rpcent); - TEST_DATA_INIT(rpcent, &td_snap, clone_rpcent, free_rpcent); - 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 file %s\n", - snapshot_file); - - rv = -1; - goto fin; - } - } else { - if (method == TEST_BUILD_SNAPSHOT) { - rv = 0; - goto fin; - } - - TEST_SNAPSHOT_FILE_READ(rpcent, snapshot_file, - &td_snap, rpcent_read_snapshot_func); - } - } - - rv = rpcent_fill_test_data(&td); - if (rv == -1) - return (-1); - switch (method) { - case TEST_GETRPCBYNAME: - if (snapshot_file == NULL) - rv = DO_1PASS_TEST(rpcent, &td, - rpcent_test_getrpcbyname, (void *)&td); - else - rv = DO_1PASS_TEST(rpcent, &td_snap, - rpcent_test_getrpcbyname, (void *)&td_snap); - break; - case TEST_GETRPCBYNUMBER: - if (snapshot_file == NULL) - rv = DO_1PASS_TEST(rpcent, &td, - rpcent_test_getrpcbynumber, (void *)&td); - else - rv = DO_1PASS_TEST(rpcent, &td_snap, - rpcent_test_getrpcbynumber, (void *)&td_snap); - break; - case TEST_GETRPCENT: - if (snapshot_file == NULL) - rv = DO_1PASS_TEST(rpcent, &td, rpcent_test_getrpcent, - (void *)&td); - else - rv = DO_2PASS_TEST(rpcent, &td, &td_snap, - compare_rpcent, NULL); - break; - case TEST_GETRPCENT_2PASS: - TEST_DATA_INIT(rpcent, &td_2pass, clone_rpcent, free_rpcent); - rv = rpcent_fill_test_data(&td_2pass); - if (rv != -1) - rv = DO_2PASS_TEST(rpcent, &td, &td_2pass, - compare_rpcent, NULL); - TEST_DATA_DESTROY(rpcent, &td_2pass); - break; - case TEST_BUILD_SNAPSHOT: - if (snapshot_file != NULL) - rv = TEST_SNAPSHOT_FILE_WRITE(rpcent, snapshot_file, &td, - sdump_rpcent); - break; - default: - rv = 0; - break; - }; - -fin: - TEST_DATA_DESTROY(rpcent, &td_snap); - TEST_DATA_DESTROY(rpcent, &td); - free(snapshot_file); - return (rv); -} diff --git a/tools/regression/lib/libc/nss/test-getrpc.t b/tools/regression/lib/libc/nss/test-getrpc.t deleted file mode 100644 index 831a086..0000000 --- a/tools/regression/lib/libc/nss/test-getrpc.t +++ /dev/null @@ -1,29 +0,0 @@ -#!/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 'getrpcbyname()' '-n' -do_test 2 'getrpcbynumber()' '-v' -do_test 3 'getrpcent()' '-e' -do_test 4 'getrpcent() 2-pass' '-2' -do_test 5 'building snapshot, if needed' '-s snapshot_rpc' -do_test 6 'getrpcbyname() snapshot' '-n -s snapshot_rpc' -do_test 7 'getrpcbynumber() snapshot' '-v -s snapshot_rpc' -do_test 8 'getrpcent() snapshot' '-e -s snapshot_rpc' diff --git a/tools/regression/lib/libc/nss/test-getserv.c b/tools/regression/lib/libc/nss/test-getserv.c deleted file mode 100644 index 31e4700..0000000 --- a/tools/regression/lib/libc/nss/test-getserv.c +++ /dev/null @@ -1,551 +0,0 @@ -/*- - * Copyright (c) 2006 Michael Bushkov <bushman@freebsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <arpa/inet.h> -#include <assert.h> -#include <errno.h> -#include <netdb.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <stringlist.h> -#include <unistd.h> -#include "testutil.h" - -enum test_methods { - TEST_GETSERVENT, - TEST_GETSERVBYNAME, - TEST_GETSERVBYPORT, - TEST_GETSERVENT_2PASS, - TEST_BUILD_SNAPSHOT -}; - -static int debug = 0; -static enum test_methods method = TEST_BUILD_SNAPSHOT; - -DECLARE_TEST_DATA(servent) -DECLARE_TEST_FILE_SNAPSHOT(servent) -DECLARE_1PASS_TEST(servent) -DECLARE_2PASS_TEST(servent) - -static void clone_servent(struct servent *, struct servent const *); -static int compare_servent(struct servent *, struct servent *, void *); -static void dump_servent(struct servent *); -static void free_servent(struct servent *); - -static void sdump_servent(struct servent *, char *, size_t); -static int servent_read_snapshot_func(struct servent *, char *); - -static int servent_check_ambiguity(struct servent_test_data *, - struct servent *); -static int servent_fill_test_data(struct servent_test_data *); -static int servent_test_correctness(struct servent *, void *); -static int servent_test_getservbyname(struct servent *, void *); -static int servent_test_getservbyport(struct servent *, void *); -static int servent_test_getservent(struct servent *, void *); - -static void usage(void) __attribute__((__noreturn__)); - -IMPLEMENT_TEST_DATA(servent) -IMPLEMENT_TEST_FILE_SNAPSHOT(servent) -IMPLEMENT_1PASS_TEST(servent) -IMPLEMENT_2PASS_TEST(servent) - -static void -clone_servent(struct servent *dest, struct servent const *src) -{ - assert(dest != NULL); - assert(src != NULL); - - char **cp; - int aliases_num; - - memset(dest, 0, sizeof(struct servent)); - - if (src->s_name != NULL) { - dest->s_name = strdup(src->s_name); - assert(dest->s_name != NULL); - } - - if (src->s_proto != NULL) { - dest->s_proto = strdup(src->s_proto); - assert(dest->s_proto != NULL); - } - dest->s_port = src->s_port; - - if (src->s_aliases != NULL) { - aliases_num = 0; - for (cp = src->s_aliases; *cp; ++cp) - ++aliases_num; - - dest->s_aliases = (char **)malloc((aliases_num+1) * (sizeof(char *))); - assert(dest->s_aliases != NULL); - memset(dest->s_aliases, 0, (aliases_num+1) * (sizeof(char *))); - - for (cp = src->s_aliases; *cp; ++cp) { - dest->s_aliases[cp - src->s_aliases] = strdup(*cp); - assert(dest->s_aliases[cp - src->s_aliases] != NULL); - } - } -} - -static void -free_servent(struct servent *serv) -{ - char **cp; - - assert(serv != NULL); - - free(serv->s_name); - free(serv->s_proto); - - for (cp = serv->s_aliases; *cp; ++cp) - free(*cp); - free(serv->s_aliases); -} - -static int -compare_servent(struct servent *serv1, struct servent *serv2, void *mdata) -{ - char **c1, **c2; - - if (serv1 == serv2) - return 0; - - if ((serv1 == NULL) || (serv2 == NULL)) - goto errfin; - - if ((strcmp(serv1->s_name, serv2->s_name) != 0) || - (strcmp(serv1->s_proto, serv2->s_proto) != 0) || - (serv1->s_port != serv2->s_port)) - goto errfin; - - c1 = serv1->s_aliases; - c2 = serv2->s_aliases; - - if ((serv1->s_aliases == NULL) || (serv2->s_aliases == NULL)) - goto errfin; - - for (;*c1 && *c2; ++c1, ++c2) - if (strcmp(*c1, *c2) != 0) - goto errfin; - - if ((*c1 != '\0') || (*c2 != '\0')) - goto errfin; - - return 0; - -errfin: - if ((debug) && (mdata == NULL)) { - printf("following structures are not equal:\n"); - dump_servent(serv1); - dump_servent(serv2); - } - - return (-1); -} - -static void -sdump_servent(struct servent *serv, char *buffer, size_t buflen) -{ - char **cp; - int written; - - written = snprintf(buffer, buflen, "%s %d %s", - serv->s_name, ntohs(serv->s_port), serv->s_proto); - buffer += written; - if (written > buflen) - return; - buflen -= written; - - if (serv->s_aliases != NULL) { - if (*(serv->s_aliases) != '\0') { - for (cp = serv->s_aliases; *cp; ++cp) { - written = snprintf(buffer, buflen, " %s",*cp); - buffer += written; - if (written > buflen) - return; - buflen -= written; - - if (buflen == 0) - return; - } - } else - snprintf(buffer, buflen, " noaliases"); - } else - snprintf(buffer, buflen, " (null)"); -} - -static int -servent_read_snapshot_func(struct servent *serv, char *line) -{ - StringList *sl; - char *s, *ps, *ts; - int i; - - if (debug) - printf("1 line read from snapshot:\n%s\n", line); - - i = 0; - sl = NULL; - ps = line; - memset(serv, 0, sizeof(struct servent)); - while ( (s = strsep(&ps, " ")) != NULL) { - switch (i) { - case 0: - serv->s_name = strdup(s); - assert(serv->s_name != NULL); - break; - - case 1: - serv->s_port = htons( - (int)strtol(s, &ts, 10)); - if (*ts != '\0') { - free(serv->s_name); - return (-1); - } - break; - - case 2: - serv->s_proto = strdup(s); - assert(serv->s_proto != NULL); - break; - - default: - if (sl == NULL) { - if (strcmp(s, "(null)") == 0) - return (0); - - sl = sl_init(); - assert(sl != NULL); - - if (strcmp(s, "noaliases") != 0) { - ts = strdup(s); - assert(ts != NULL); - sl_add(sl, ts); - } - } else { - ts = strdup(s); - assert(ts != NULL); - sl_add(sl, ts); - } - break; - }; - ++i; - } - - if (i < 3) { - free(serv->s_name); - free(serv->s_proto); - memset(serv, 0, sizeof(struct servent)); - return (-1); - } - - sl_add(sl, NULL); - serv->s_aliases = sl->sl_str; - - /* NOTE: is it a dirty hack or not? */ - free(sl); - return (0); -} - -static void -dump_servent(struct servent *result) -{ - if (result != NULL) { - char buffer[1024]; - sdump_servent(result, buffer, sizeof(buffer)); - printf("%s\n", buffer); - } else - printf("(null)\n"); -} - -static int -servent_fill_test_data(struct servent_test_data *td) -{ - struct servent *serv; - - setservent(1); - while ((serv = getservent()) != NULL) { - if (servent_test_correctness(serv, NULL) == 0) - TEST_DATA_APPEND(servent, td, serv); - else - return (-1); - } - endservent(); - - return (0); -} - -static int -servent_test_correctness(struct servent *serv, void *mdata) -{ - if (debug) { - printf("testing correctness with the following data:\n"); - dump_servent(serv); - } - - if (serv == NULL) - goto errfin; - - if (serv->s_name == NULL) - goto errfin; - - if (serv->s_proto == NULL) - goto errfin; - - if (ntohs(serv->s_port < 0)) - goto errfin; - - if (serv->s_aliases == NULL) - goto errfin; - - if (debug) - printf("correct\n"); - - return (0); -errfin: - if (debug) - printf("incorrect\n"); - - return (-1); -} - -/* servent_check_ambiguity() is needed when one port+proto is associated with - * more than one service (these cases are usually marked as PROBLEM in - * /etc/services. This functions is needed also when one service+proto is - * associated with several ports. We have to check all the servent structures - * to make sure that serv really exists and correct */ -static int -servent_check_ambiguity(struct servent_test_data *td, struct servent *serv) -{ - - return (TEST_DATA_FIND(servent, td, serv, compare_servent, - NULL) != NULL ? 0 : -1); -} - -static int -servent_test_getservbyname(struct servent *serv_model, void *mdata) -{ - char **alias; - struct servent *serv; - - if (debug) { - printf("testing getservbyname() with the following data:\n"); - dump_servent(serv_model); - } - - serv = getservbyname(serv_model->s_name, serv_model->s_proto); - if (servent_test_correctness(serv, NULL) != 0) - goto errfin; - - if ((compare_servent(serv, serv_model, NULL) != 0) && - (servent_check_ambiguity((struct servent_test_data *)mdata, serv) - !=0)) - goto errfin; - - for (alias = serv_model->s_aliases; *alias; ++alias) { - serv = getservbyname(*alias, serv_model->s_proto); - - if (servent_test_correctness(serv, NULL) != 0) - goto errfin; - - if ((compare_servent(serv, serv_model, NULL) != 0) && - (servent_check_ambiguity( - (struct servent_test_data *)mdata, serv) != 0)) - goto errfin; - } - - if (debug) - printf("ok\n"); - return (0); - -errfin: - if (debug) - printf("not ok\n"); - - return (-1); -} - -static int -servent_test_getservbyport(struct servent *serv_model, void *mdata) -{ - struct servent *serv; - - if (debug) { - printf("testing getservbyport() with the following data...\n"); - dump_servent(serv_model); - } - - serv = getservbyport(serv_model->s_port, serv_model->s_proto); - if ((servent_test_correctness(serv, NULL) != 0) || - ((compare_servent(serv, serv_model, NULL) != 0) && - (servent_check_ambiguity((struct servent_test_data *)mdata, serv) - != 0))) { - if (debug) - printf("not ok\n"); - return (-1); - } else { - if (debug) - printf("ok\n"); - return (0); - } -} - -static int -servent_test_getservent(struct servent *serv, void *mdata) -{ - /* Only correctness can be checked when doing 1-pass test for - * getservent(). */ - return (servent_test_correctness(serv, NULL)); -} - -static void -usage(void) -{ - (void)fprintf(stderr, - "Usage: %s -npe2 [-d] [-s <file>]\n", - getprogname()); - exit(1); -} - -int -main(int argc, char **argv) -{ - struct servent_test_data td, td_snap, td_2pass; - char *snapshot_file; - int rv; - int c; - - if (argc < 2) - usage(); - - snapshot_file = NULL; - while ((c = getopt(argc, argv, "npe2ds:")) != -1) - switch (c) { - case 'd': - debug++; - break; - case 'n': - method = TEST_GETSERVBYNAME; - break; - case 'p': - method = TEST_GETSERVBYPORT; - break; - case 'e': - method = TEST_GETSERVENT; - break; - case '2': - method = TEST_GETSERVENT_2PASS; - break; - case 's': - snapshot_file = strdup(optarg); - break; - default: - usage(); - } - - TEST_DATA_INIT(servent, &td, clone_servent, free_servent); - TEST_DATA_INIT(servent, &td_snap, clone_servent, free_servent); - 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 file %s\n", - snapshot_file); - - rv = -1; - goto fin; - } - } else { - if (method == TEST_BUILD_SNAPSHOT) { - rv = 0; - goto fin; - } - - TEST_SNAPSHOT_FILE_READ(servent, snapshot_file, - &td_snap, servent_read_snapshot_func); - } - } - - rv = servent_fill_test_data(&td); - if (rv == -1) - return (-1); - switch (method) { - case TEST_GETSERVBYNAME: - if (snapshot_file == NULL) - rv = DO_1PASS_TEST(servent, &td, - servent_test_getservbyname, (void *)&td); - else - rv = DO_1PASS_TEST(servent, &td_snap, - servent_test_getservbyname, (void *)&td_snap); - break; - case TEST_GETSERVBYPORT: - if (snapshot_file == NULL) - rv = DO_1PASS_TEST(servent, &td, - servent_test_getservbyport, (void *)&td); - else - rv = DO_1PASS_TEST(servent, &td_snap, - servent_test_getservbyport, (void *)&td_snap); - break; - case TEST_GETSERVENT: - if (snapshot_file == NULL) - rv = DO_1PASS_TEST(servent, &td, servent_test_getservent, - (void *)&td); - else - rv = DO_2PASS_TEST(servent, &td, &td_snap, - compare_servent, NULL); - break; - case TEST_GETSERVENT_2PASS: - TEST_DATA_INIT(servent, &td_2pass, clone_servent, free_servent); - rv = servent_fill_test_data(&td_2pass); - if (rv != -1) - rv = DO_2PASS_TEST(servent, &td, &td_2pass, - compare_servent, NULL); - TEST_DATA_DESTROY(servent, &td_2pass); - break; - case TEST_BUILD_SNAPSHOT: - if (snapshot_file != NULL) - rv = TEST_SNAPSHOT_FILE_WRITE(servent, snapshot_file, &td, - sdump_servent); - break; - default: - rv = 0; - break; - }; - -fin: - TEST_DATA_DESTROY(servent, &td_snap); - TEST_DATA_DESTROY(servent, &td); - free(snapshot_file); - return (rv); -} diff --git a/tools/regression/lib/libc/nss/test-getserv.t b/tools/regression/lib/libc/nss/test-getserv.t deleted file mode 100644 index 60a6c50..0000000 --- a/tools/regression/lib/libc/nss/test-getserv.t +++ /dev/null @@ -1,29 +0,0 @@ -#!/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 'getservbyname()' '-n' -do_test 2 'getservbyport()' '-p' -do_test 3 'getservent()' '-e' -do_test 4 'getservent() 2-pass' '-2' -do_test 5 'building snapshot, if needed' '-s snapshot_serv' -do_test 6 'getservbyname() snapshot' '-n -s snapshot_serv' -do_test 7 'getservbyport() snapshot' '-p -s snapshot_serv' -do_test 8 'getservent() snapshot' '-e -s snapshot_serv' diff --git a/tools/regression/lib/libc/nss/test-getusershell.c b/tools/regression/lib/libc/nss/test-getusershell.c deleted file mode 100644 index b7b835f..0000000 --- a/tools/regression/lib/libc/nss/test-getusershell.c +++ /dev/null @@ -1,235 +0,0 @@ -/*- - * Copyright (c) 2006 Michael Bushkov <bushman@freebsd.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <assert.h> -#include <errno.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <unistd.h> -#include "testutil.h" - -enum test_methods { - TEST_GETUSERSHELL, - TEST_BUILD_SNAPSHOT -}; - -struct usershell { - char *path; -}; - -static int debug = 0; -static enum test_methods method = TEST_GETUSERSHELL; - -DECLARE_TEST_DATA(usershell) -DECLARE_TEST_FILE_SNAPSHOT(usershell) -DECLARE_2PASS_TEST(usershell) - -static void clone_usershell(struct usershell *, struct usershell const *); -static int compare_usershell(struct usershell *, struct usershell *, void *); -static void free_usershell(struct usershell *); - -static void sdump_usershell(struct usershell *, char *, size_t); -static void dump_usershell(struct usershell *); - -static int usershell_read_snapshot_func(struct usershell *, char *); - -static void usage(void) __attribute__((__noreturn__)); - -IMPLEMENT_TEST_DATA(usershell) -IMPLEMENT_TEST_FILE_SNAPSHOT(usershell) -IMPLEMENT_2PASS_TEST(usershell) - -static void -clone_usershell(struct usershell *dest, struct usershell const *src) -{ - assert(dest != NULL); - assert(src != NULL); - - if (src->path != NULL) { - dest->path = strdup(src->path); - assert(dest->path != NULL); - } -} - -static int -compare_usershell(struct usershell *us1, struct usershell *us2, void *mdata) -{ - int rv; - - assert(us1 != NULL); - assert(us2 != NULL); - - dump_usershell(us1); - dump_usershell(us2); - - if (us1 == us2) - return (0); - - rv = strcmp(us1->path, us2->path); - if (rv != 0) { - printf("following structures are not equal:\n"); - dump_usershell(us1); - dump_usershell(us2); - } - - return (rv); -} - -static void -free_usershell(struct usershell *us) -{ - free(us->path); -} - -static void -sdump_usershell(struct usershell *us, char *buffer, size_t buflen) -{ - snprintf(buffer, buflen, "%s", us->path); -} - -static void -dump_usershell(struct usershell *us) -{ - if (us != NULL) { - char buffer[2048]; - sdump_usershell(us, buffer, sizeof(buffer)); - printf("%s\n", buffer); - } else - printf("(null)\n"); -} - -static int -usershell_read_snapshot_func(struct usershell *us, char *line) -{ - us->path = strdup(line); - assert(us->path != NULL); - - return (0); -} - -static void -usage(void) -{ - (void)fprintf(stderr, - "Usage: %s [-d] -s <file>\n", - getprogname()); - exit(1); -} - -int -main(int argc, char **argv) -{ - struct usershell_test_data td, td_snap; - struct usershell ushell; - char *snapshot_file; - int rv; - int c; - - if (argc < 2) - usage(); - - rv = 0; - snapshot_file = NULL; - while ((c = getopt(argc, argv, "ds:")) != -1) { - switch (c) { - case 'd': - debug = 1; - break; - case 's': - snapshot_file = strdup(optarg); - break; - default: - usage(); - } - } - - TEST_DATA_INIT(usershell, &td, clone_usershell, free_usershell); - TEST_DATA_INIT(usershell, &td_snap, clone_usershell, free_usershell); - - setusershell(); - while ((ushell.path = getusershell()) != NULL) { - if (debug) { - printf("usershell found:\n"); - dump_usershell(&ushell); - } - TEST_DATA_APPEND(usershell, &td, &ushell); - } - endusershell(); - - - 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 { - rv = TEST_SNAPSHOT_FILE_READ(usershell, snapshot_file, - &td_snap, usershell_read_snapshot_func); - if (rv != 0) { - if (debug) - printf("error reading snapshot file\n"); - goto fin; - } - } - } - - switch (method) { - case TEST_GETUSERSHELL: - if (snapshot_file != NULL) { - rv = DO_2PASS_TEST(usershell, &td, &td_snap, - compare_usershell, NULL); - } - break; - case TEST_BUILD_SNAPSHOT: - if (snapshot_file != NULL) { - rv = TEST_SNAPSHOT_FILE_WRITE(usershell, snapshot_file, &td, - sdump_usershell); - } - break; - default: - rv = 0; - break; - }; - -fin: - TEST_DATA_DESTROY(usershell, &td_snap); - TEST_DATA_DESTROY(usershell, &td); - free(snapshot_file); - return (rv); - -} diff --git a/tools/regression/lib/libc/nss/test-getusershell.t b/tools/regression/lib/libc/nss/test-getusershell.t deleted file mode 100644 index 16a392a..0000000 --- a/tools/regression/lib/libc/nss/test-getusershell.t +++ /dev/null @@ -1,22 +0,0 @@ -#!/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..1 -do_test 1 'getusershell() snapshot' '-s snapshot_usershell' diff --git a/tools/regression/lib/libc/nss/testutil.h b/tools/regression/lib/libc/nss/testutil.h deleted file mode 100644 index 711c49f..0000000 --- a/tools/regression/lib/libc/nss/testutil.h +++ /dev/null @@ -1,332 +0,0 @@ -/*- - * Copyright (c) 2006 Michael Bushkov <bushman@freebsd.org> - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include <sys/queue.h> - -#define DECLARE_TEST_DATA(ent) \ -struct ent##_entry { \ - struct ent data; \ - STAILQ_ENTRY(ent##_entry) entries; \ -}; \ - \ -struct ent##_test_data { \ - void (*clone_func)(struct ent *, struct ent const *); \ - void (*free_func)(struct ent *); \ - \ - STAILQ_HEAD(ent_head, ent##_entry) snapshot_data; \ -}; \ - \ -void __##ent##_test_data_init(struct ent##_test_data *, \ - void (*)(struct ent *, struct ent const *), \ - void (*freef)(struct ent *)); \ -void __##ent##_test_data_destroy(struct ent##_test_data *); \ - \ -void __##ent##_test_data_append(struct ent##_test_data *, struct ent *data);\ -int __##ent##_test_data_foreach(struct ent##_test_data *, \ - int (*)(struct ent *, void *), void *); \ -int __##ent##_test_data_compare(struct ent##_test_data *, \ - struct ent##_test_data *, int (*)(struct ent *, struct ent *, \ - void *), void *); \ -struct ent *__##ent##_test_data_find(struct ent##_test_data *, struct ent *,\ - int (*)(struct ent *, struct ent *, void *), void *); \ -void __##ent##_test_data_clear(struct ent##_test_data *); - -#define TEST_DATA_INIT(ent, td, clonef, freef)\ - __##ent##_test_data_init(td, clonef, freef) -#define TEST_DATA_DESTROY(ent, td) __##ent##_test_data_destroy(td) -#define TEST_DATA_APPEND(ent, td, d) __##ent##_test_data_append(td, d) -#define TEST_DATA_FOREACH(ent, td, f, mdata)\ - __##ent##_test_data_foreach(td, f, mdata) -#define TEST_DATA_COMPARE(ent, td1, td2, fcmp, mdata)\ - __##ent##_test_data_compare(td1, td2, fcmp, mdata); -#define TEST_DATA_FIND(ent, td, d, fcmp, mdata)\ - __##ent##_test_data_find(td, d, fcmp, mdata) -#define TEST_DATA_CLEAR(ent, td) __##ent##_test_data_clear(td) - -#define IMPLEMENT_TEST_DATA(ent) \ -void \ -__##ent##_test_data_init(struct ent##_test_data *td, \ - void (*clonef)(struct ent *, struct ent const *), \ - void (*freef)(struct ent *)) \ -{ \ - assert(td != NULL); \ - assert(clonef != NULL); \ - assert(freef != NULL); \ - \ - memset(td, 0, sizeof(*td)); \ - td->clone_func = clonef; \ - td->free_func = freef; \ - STAILQ_INIT(&td->snapshot_data); \ -} \ - \ -void \ -__##ent##_test_data_destroy(struct ent##_test_data *td) \ -{ \ - __##ent##_test_data_clear(td); \ -} \ - \ -void \ -__##ent##_test_data_append(struct ent##_test_data *td, struct ent *app_data)\ -{ \ - struct ent##_entry *e; \ - \ - assert(td != NULL); \ - assert(app_data != NULL); \ - \ - e = (struct ent##_entry *)malloc(sizeof(struct ent##_entry)); \ - assert(e != NULL); \ - memset(e, 0, sizeof(struct ent##_entry)); \ - \ - td->clone_func(&e->data, app_data); \ - STAILQ_INSERT_TAIL(&td->snapshot_data, e, entries); \ -} \ - \ -int \ -__##ent##_test_data_foreach(struct ent##_test_data *td, \ - int (*forf)(struct ent *, void *), void *mdata) \ -{ \ - struct ent##_entry *e; \ - int rv; \ - \ - assert(td != NULL); \ - assert(forf != NULL); \ - \ - rv = 0; \ - STAILQ_FOREACH(e, &td->snapshot_data, entries) { \ - rv = forf(&e->data, mdata); \ - if (rv != 0) \ - break; \ - } \ - \ - return (rv); \ -} \ - \ -int \ -__##ent##_test_data_compare(struct ent##_test_data *td1, struct ent##_test_data *td2,\ - int (*cmp_func)(struct ent *, struct ent *, void *), void *mdata)\ -{ \ - struct ent##_entry *e1, *e2; \ - int rv; \ - \ - assert(td1 != NULL); \ - assert(td2 != NULL); \ - assert(cmp_func != NULL); \ - \ - e1 = STAILQ_FIRST(&td1->snapshot_data); \ - e2 = STAILQ_FIRST(&td2->snapshot_data); \ - \ - rv = 0; \ - do { \ - if ((e1 == NULL) || (e2 == NULL)) { \ - if (e1 == e2) \ - return (0); \ - else \ - return (-1); \ - } \ - \ - rv = cmp_func(&e1->data, &e2->data, mdata); \ - e1 = STAILQ_NEXT(e1, entries); \ - e2 = STAILQ_NEXT(e2, entries); \ - } while (rv == 0); \ - \ - return (rv); \ -} \ - \ -struct ent * \ -__##ent##_test_data_find(struct ent##_test_data *td, struct ent *data, \ - int (*cmp)(struct ent *, struct ent *, void *), void *mdata) \ -{ \ - struct ent##_entry *e; \ - struct ent *result; \ - \ - assert(td != NULL); \ - assert(cmp != NULL); \ - \ - result = NULL; \ - STAILQ_FOREACH(e, &td->snapshot_data, entries) { \ - if (cmp(&e->data, data, mdata) == 0) { \ - result = &e->data; \ - break; \ - } \ - } \ - \ - return (result); \ -} \ - \ - \ -void \ -__##ent##_test_data_clear(struct ent##_test_data *td) \ -{ \ - struct ent##_entry *e; \ - assert(td != NULL); \ - \ - while (!STAILQ_EMPTY(&td->snapshot_data)) { \ - e = STAILQ_FIRST(&td->snapshot_data); \ - STAILQ_REMOVE_HEAD(&td->snapshot_data, entries); \ - \ - td->free_func(&e->data); \ - free(e); \ - } \ -} - -#define DECLARE_TEST_FILE_SNAPSHOT(ent) \ -struct ent##_snp_param { \ - FILE *fp; \ - void (*sdump_func)(struct ent *, char *, size_t); \ -}; \ - \ -int __##ent##_snapshot_write_func(struct ent *, void *); \ -int __##ent##_snapshot_write(char const *, struct ent##_test_data *, \ - void (*)(struct ent *, char *, size_t)); \ -int __##ent##_snapshot_read(char const *, struct ent##_test_data *, \ - int (*)(struct ent *, char *)); - -#define TEST_SNAPSHOT_FILE_WRITE(ent, fname, td, f) \ - __##ent##_snapshot_write(fname, td, f) -#define TEST_SNAPSHOT_FILE_READ(ent, fname, td, f) \ - __##ent##_snapshot_read(fname, td, f) - -#define IMPLEMENT_TEST_FILE_SNAPSHOT(ent) \ -int \ -__##ent##_snapshot_write_func(struct ent *data, void *mdata) \ -{ \ - char buffer[1024]; \ - struct ent##_snp_param *param; \ - \ - assert(data != NULL); \ - \ - param = (struct ent##_snp_param *)mdata; \ - param->sdump_func(data, buffer, sizeof(buffer)); \ - fputs(buffer, param->fp); \ - fputc('\n', param->fp); \ - \ - return (0); \ -} \ - \ -int \ -__##ent##_snapshot_write(char const *fname, struct ent##_test_data *td, \ - void (*sdump_func)(struct ent *, char *, size_t)) \ -{ \ - struct ent##_snp_param param; \ - \ - assert(fname != NULL); \ - assert(td != NULL); \ - \ - param.fp = fopen(fname, "w"); \ - if (param.fp == NULL) \ - return (-1); \ - \ - param.sdump_func = sdump_func; \ - __##ent##_test_data_foreach(td, __##ent##_snapshot_write_func, ¶m);\ - fclose(param.fp); \ - \ - return (0); \ -} \ - \ -int \ -__##ent##_snapshot_read(char const *fname, struct ent##_test_data *td, \ - int (*read_func)(struct ent *, char *)) \ -{ \ - char buffer[1024]; \ - struct ent data; \ - char *s; \ - FILE *fi; \ - size_t len; \ - int rv; \ - \ - assert(fname != NULL); \ - assert(td != NULL); \ - \ - fi = fopen(fname, "r"); \ - if (fi == NULL) \ - return (-1); \ - \ - rv = 0; \ - memset(buffer, 0, sizeof(buffer)); \ - while (!feof(fi)) { \ - s = fgets(buffer, sizeof(buffer), fi); \ - if (s != NULL && s[0] != '#') { \ - len = strlen(s); \ - if (len == 0) \ - continue; \ - if (buffer[len - 1] == '\n') \ - buffer[len -1] = '\0'; \ - \ - rv = read_func(&data, s); \ - if (rv == 0) { \ - __##ent##_test_data_append(td, &data); \ - td->free_func(&data); \ - } else \ - goto fin; \ - } \ - } \ - \ -fin: \ - fclose(fi); \ - return (rv); \ -} - -#define DECLARE_1PASS_TEST(ent) \ -int __##ent##_1pass_test(struct ent##_test_data *, \ - int (*)(struct ent *, void *), \ - void *); - -#define DO_1PASS_TEST(ent, td, f, mdata) \ - __##ent##_1pass_test(td, f, mdata) - -#define IMPLEMENT_1PASS_TEST(ent) \ -int \ -__##ent##_1pass_test(struct ent##_test_data *td, \ - int (*tf)(struct ent *, void *), \ - void *mdata) \ -{ \ - int rv; \ - rv = __##ent##_test_data_foreach(td, tf, mdata); \ - \ - return (rv); \ -} - -#define DECLARE_2PASS_TEST(ent) \ -int __##ent##_2pass_test(struct ent##_test_data *, \ - struct ent##_test_data *, \ - int (*)(struct ent *, struct ent *, void *), void *); - -#define DO_2PASS_TEST(ent, td1, td2, f, mdata) \ - __##ent##_2pass_test(td1, td2, f, mdata) - -#define IMPLEMENT_2PASS_TEST(ent) \ -int \ -__##ent##_2pass_test(struct ent##_test_data *td1, \ - struct ent##_test_data *td2, \ - int (*cmp_func)(struct ent *, struct ent *, void *), \ - void *cmp_mdata) \ -{ \ - int rv; \ - \ - rv = __##ent##_test_data_compare(td1, td2, cmp_func, cmp_mdata); \ - return (rv); \ -} diff --git a/tools/regression/lib/libc/resolv/Makefile b/tools/regression/lib/libc/resolv/Makefile deleted file mode 100644 index 18a71bc..0000000 --- a/tools/regression/lib/libc/resolv/Makefile +++ /dev/null @@ -1,14 +0,0 @@ -# $NetBSD: Makefile,v 1.1 2004/05/13 19:17:12 christos Exp $ -# $FreeBSD$ - -PROG= resolv -MAN= - -# Note: this test relies on being dynamically linked. You will get a -# spurious PASS for a statically linked test. -LIBADD+= pthread - -regress: ${PROG} - ./${PROG} -r ${.CURDIR}/mach - -.include <bsd.prog.mk> diff --git a/tools/regression/lib/libc/resolv/mach b/tools/regression/lib/libc/resolv/mach deleted file mode 100644 index ab7ce24..0000000 --- a/tools/regression/lib/libc/resolv/mach +++ /dev/null @@ -1,93 +0,0 @@ -# $FreeBSD$ -localhost -above.warped.net -anoncvs.cirr.com -anoncvs.isc.netbsd.org -anoncvs.leo.org -anoncvs.netbsd.lt -anoncvs.netbsd.ro -anoncvs.netbsd.se -antioche.antioche.eu.org -boulder.tele.dk -centaurus.4web.cz -chur.math.ntnu.no -console.netbsd.org -cvs.fi.netbsd.org -cvs.mikrolahti.fi -cvs.netbsd.org -cvsup-netbsd.leo.org -cvsup.netbsd.se -cvsup.pasta.cs.uit.no -ftp.bitcon.no -ftp.chg.ru -ftp.duth.gr -ftp.estpak.ee -ftp.fsn.hu -ftp.funet.fi -ftp.grondar.za -ftp.leo.org -ftp.netbsd.lt -ftp.netbsd.org -ftp.nluug.nl -ftp.plig.org -ftp.uni-erlangen.de -ftp.xgate.co.kr -gd.tuwien.ac.at -gort.ludd.luth.se -grappa.unix-ag.uni-kl.de -info.wins.uva.nl -irc.warped.net -knug.youn.co.kr -lala.iri.co.jp -mail.jp.netbsd.org -mail.kr.netbsd.org -mail.netbsd.org -melanoma.cs.rmit.edu.au -mirror.aarnet.edu.au -mirror.netbsd.com.br -mirror03.inet.tele.dk -moon.vub.ac.be -nbwww.sergei.cc -net.bsd.cz -netbsd.3miasto.net -netbsd.4ka.mipt.ru -netbsd.apk.od.ua -netbsd.csie.nctu.edu.tw -netbsd.enderunix.org -netbsd.ftp.fu-berlin.de -netbsd.netlead.com.au -netbsd.nsysu.edu.tw -netbsd.pair.com -netbsd.stevens-tech.edu -netbsd.triada.bg -netbsd.unix.net.nz -netbsd.unixtech.be -netbsd.vejas.lt -netbsd.wagener-consulting.lu -netbsd.zarco.org -netbsdiso.interoute.net.uk -netbsdwww.bitcon.no -netbsdwww.cordef.com.pl -netbsdwww.cs.rmit.edu.au -netbsdwww.interoute.net.uk -news.gw.com -ns.netbsd.org -pigu.iri.co.jp -pluto.cdpa.nsysu.edu.tw -projects.slowass.net -server6.pasta.cs.uit.no -skeleton.phys.spbu.ru -snoopy.allbsd.org -spike.allbsd.org -sundry.netbsd.org -tanya.sergei.cc -web-a.fi.gw.com -web-a.us.gw.com -web.netbsd.mirror.arhea.net -www.en.netbsd.de -www.netbsd.cl -www.netbsd.nl -www.netbsd.org -www.netbsd.ro -zathras.netbsd.org -zeppo.rediris.es diff --git a/tools/regression/lib/libc/resolv/resolv.c b/tools/regression/lib/libc/resolv/resolv.c deleted file mode 100644 index 2ec3eeb..0000000 --- a/tools/regression/lib/libc/resolv/resolv.c +++ /dev/null @@ -1,326 +0,0 @@ -/* $NetBSD: resolv.c,v 1.6 2004/05/23 16:59:11 christos Exp $ */ - -/*- - * Copyright (c) 2004 The NetBSD Foundation, Inc. - * All rights reserved. - * - * This code is derived from software contributed to The NetBSD Foundation - * by Christos Zoulas. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS - * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS - * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - */ -/* $FreeBSD$ */ -#include <sys/cdefs.h> -__RCSID("$NetBSD: resolv.c,v 1.6 2004/05/23 16:59:11 christos Exp $"); - -#include <sys/types.h> -#include <sys/socket.h> -#include <pthread.h> -#include <stdio.h> -#include <netdb.h> -#include <stdlib.h> -#include <unistd.h> -#include <err.h> -#include <string.h> -#include <stringlist.h> - -#define NTHREADS 10 -#define NHOSTS 100 -#define WS " \t\n\r" - -enum method { - METHOD_GETADDRINFO, - METHOD_GETHOSTBY, - METHOD_GETIPNODEBY -}; - -static StringList *hosts = NULL; -static int debug = 0; -static enum method method = METHOD_GETADDRINFO; -static int reverse = 0; -static int *ask = NULL; -static int *got = NULL; - -static void usage(void) __attribute__((__noreturn__)); -static void load(const char *); -static void resolvone(int); -static void *resolvloop(void *); -static void run(int *); - -static pthread_mutex_t stats = PTHREAD_MUTEX_INITIALIZER; - -static void -usage(void) -{ - (void)fprintf(stderr, - "Usage: %s [-AdHIr] [-h <nhosts>] [-n <nthreads>] <file> ...\n", - getprogname()); - exit(1); -} - -static void -load(const char *fname) -{ - FILE *fp; - size_t len; - char *line; - - if ((fp = fopen(fname, "r")) == NULL) - err(1, "Cannot open `%s'", fname); - while ((line = fgetln(fp, &len)) != NULL) { - char c = line[len]; - char *ptr; - line[len] = '\0'; - for (ptr = strtok(line, WS); ptr; ptr = strtok(NULL, WS)) { - if (ptr == '\0' || ptr[0] == '#') - continue; - sl_add(hosts, strdup(ptr)); - } - line[len] = c; - } - - (void)fclose(fp); -} - -static int -resolv_getaddrinfo(pthread_t self, char *host, int port) -{ - char portstr[6], buf[1024], hbuf[NI_MAXHOST], pbuf[NI_MAXSERV]; - struct addrinfo hints, *res; - int error, len; - - snprintf(portstr, sizeof(portstr), "%d", port); - memset(&hints, 0, sizeof(hints)); - hints.ai_family = AF_UNSPEC; - hints.ai_flags = AI_PASSIVE; - hints.ai_socktype = SOCK_STREAM; - error = getaddrinfo(host, portstr, &hints, &res); - if (debug) { - len = snprintf(buf, sizeof(buf), "%p: host %s %s\n", - self, host, error ? "not found" : "ok"); - (void)write(STDOUT_FILENO, buf, len); - } - if (error == 0 && reverse) { - memset(hbuf, 0, sizeof(hbuf)); - memset(pbuf, 0, sizeof(pbuf)); - getnameinfo(res->ai_addr, res->ai_addrlen, hbuf, sizeof(hbuf), - pbuf, sizeof(pbuf), 0); - if (debug) { - len = snprintf(buf, sizeof(buf), - "%p: reverse %s %s\n", self, hbuf, pbuf); - (void)write(STDOUT_FILENO, buf, len); - } - } - if (error == 0) - freeaddrinfo(res); - return error; -} - -static int -resolv_gethostby(pthread_t self, char *host) -{ - char buf[1024]; - struct hostent *hp, *hp2; - int len; - - hp = gethostbyname(host); - if (debug) { - len = snprintf(buf, sizeof(buf), "%p: host %s %s\n", - self, host, (hp == NULL) ? "not found" : "ok"); - (void)write(STDOUT_FILENO, buf, len); - } - if (hp && reverse) { - memcpy(buf, hp->h_addr, hp->h_length); - hp2 = gethostbyaddr(buf, hp->h_length, hp->h_addrtype); - if (hp2 && debug) { - len = snprintf(buf, sizeof(buf), - "%p: reverse %s\n", self, hp2->h_name); - (void)write(STDOUT_FILENO, buf, len); - } - } - return hp ? 0 : -1; -} - -static int -resolv_getipnodeby(pthread_t self, char *host) -{ - char buf[1024]; - struct hostent *hp, *hp2; - int len, h_error; - - hp = getipnodebyname(host, AF_INET, 0, &h_error); - if (debug) { - len = snprintf(buf, sizeof(buf), "%p: host %s %s\n", - self, host, (hp == NULL) ? "not found" : "ok"); - (void)write(STDOUT_FILENO, buf, len); - } - if (hp && reverse) { - memcpy(buf, hp->h_addr, hp->h_length); - hp2 = getipnodebyaddr(buf, hp->h_length, hp->h_addrtype, - &h_error); - if (hp2 && debug) { - len = snprintf(buf, sizeof(buf), - "%p: reverse %s\n", self, hp2->h_name); - (void)write(STDOUT_FILENO, buf, len); - } - if (hp2) - freehostent(hp2); - } - if (hp) - freehostent(hp); - return hp ? 0 : -1; -} - -static void -resolvone(int n) -{ - char buf[1024]; - pthread_t self = pthread_self(); - size_t i = (random() & 0x0fffffff) % hosts->sl_cur; - char *host = hosts->sl_str[i]; - struct addrinfo hints, *res; - int error, len; - - if (debug) { - len = snprintf(buf, sizeof(buf), "%p: %d resolving %s %d\n", - self, n, host, (int)i); - (void)write(STDOUT_FILENO, buf, len); - } - switch (method) { - case METHOD_GETADDRINFO: - error = resolv_getaddrinfo(self, host, i); - break; - case METHOD_GETHOSTBY: - error = resolv_gethostby(self, host); - break; - case METHOD_GETIPNODEBY: - error = resolv_getipnodeby(self, host); - break; - default: - break; - } - pthread_mutex_lock(&stats); - ask[i]++; - got[i] += error == 0; - pthread_mutex_unlock(&stats); -} - -static void * -resolvloop(void *p) -{ - int *nhosts = (int *)p; - if (*nhosts == 0) - return NULL; - do - resolvone(*nhosts); - while (--(*nhosts)); - return NULL; -} - -static void -run(int *nhosts) -{ - pthread_t self = pthread_self(); - if (pthread_create(&self, NULL, resolvloop, nhosts) != 0) - err(1, "pthread_create"); -} - -int -main(int argc, char *argv[]) -{ - int nthreads = NTHREADS; - int nhosts = NHOSTS; - int i, c, done, *nleft; - hosts = sl_init(); - - srandom(1234); - - while ((c = getopt(argc, argv, "Adh:HIn:r")) != -1) - switch (c) { - case 'A': - method = METHOD_GETADDRINFO; - break; - case 'd': - debug++; - break; - case 'h': - nhosts = atoi(optarg); - break; - case 'H': - method = METHOD_GETHOSTBY; - break; - case 'I': - method = METHOD_GETIPNODEBY; - break; - case 'n': - nthreads = atoi(optarg); - break; - case 'r': - reverse++; - break; - default: - usage(); - } - - for (i = optind; i < argc; i++) - load(argv[i]); - - if (hosts->sl_cur == 0) - usage(); - - if ((nleft = malloc(nthreads * sizeof(int))) == NULL) - err(1, "malloc"); - if ((ask = calloc(hosts->sl_cur, sizeof(int))) == NULL) - err(1, "calloc"); - if ((got = calloc(hosts->sl_cur, sizeof(int))) == NULL) - err(1, "calloc"); - - - for (i = 0; i < nthreads; i++) { - nleft[i] = nhosts; - run(&nleft[i]); - } - - for (done = 0; !done;) { - done = 1; - for (i = 0; i < nthreads; i++) { - if (nleft[i] != 0) { - done = 0; - break; - } - } - sleep(1); - } - c = 0; - for (i = 0; i < hosts->sl_cur; i++) { - if (ask[i] != got[i] && got[i] != 0) { - warnx("Error: host %s ask %d got %d\n", - hosts->sl_str[i], ask[i], got[i]); - c++; - } - } - free(nleft); - free(ask); - free(got); - sl_free(hosts, 1); - return c; -} diff --git a/tools/regression/lib/libc/resolv/resolv.t b/tools/regression/lib/libc/resolv/resolv.t deleted file mode 100644 index 278ba06..0000000 --- a/tools/regression/lib/libc/resolv/resolv.t +++ /dev/null @@ -1,24 +0,0 @@ -#!/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..3 -do_test 1 'getaddrinfo()' '-r mach' -do_test 2 'gethostbyname()' '-rH mach' -do_test 3 'getipnodebyname()' '-rI mach' diff --git a/tools/regression/lib/msun/Makefile b/tools/regression/lib/msun/Makefile index dbf582f..8b301cb 100644 --- a/tools/regression/lib/msun/Makefile +++ b/tools/regression/lib/msun/Makefile @@ -1,10 +1,8 @@ # $FreeBSD$ -TESTS= test-cexp test-conj test-csqrt test-ctrig \ - test-exponential test-fenv test-fma \ - test-fmaxmin test-ilogb test-invtrig test-invctrig \ - test-logarithm test-lrint \ - test-lround test-nan test-nearbyint test-next test-rem test-trig +TESTS= test-ctrig \ + test-exponential test-fma \ + test-lround test-nearbyint test-next test-rem test-trig CFLAGS+= -O0 -lm -Wno-unknown-pragmas .PHONY: tests diff --git a/tools/regression/lib/msun/test-cexp.c b/tools/regression/lib/msun/test-cexp.c deleted file mode 100644 index 6be71ad..0000000 --- a/tools/regression/lib/msun/test-cexp.c +++ /dev/null @@ -1,322 +0,0 @@ -/*- - * Copyright (c) 2008-2011 David Schultz <das@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Tests for corner cases in cexp*(). - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> - -#include <assert.h> -#include <complex.h> -#include <fenv.h> -#include <float.h> -#include <math.h> -#include <stdio.h> - -#include "test-utils.h" - -#pragma STDC FENV_ACCESS ON -#pragma STDC CX_LIMITED_RANGE OFF - -/* - * Test that a function returns the correct value and sets the - * exception flags correctly. The exceptmask specifies which - * exceptions we should check. We need to be lenient for several - * reasons, but mainly because on some architectures it's impossible - * to raise FE_OVERFLOW without raising FE_INEXACT. In some cases, - * whether cexp() raises an invalid exception is unspecified. - * - * These are macros instead of functions so that assert provides more - * meaningful error messages. - * - * XXX The volatile here is to avoid gcc's bogus constant folding and work - * around the lack of support for the FENV_ACCESS pragma. - */ -#define test(func, z, result, exceptmask, excepts, checksign) do { \ - volatile long double complex _d = z; \ - assert(feclearexcept(FE_ALL_EXCEPT) == 0); \ - assert(cfpequal_cs((func)(_d), (result), (checksign))); \ - assert(((void)(func), fetestexcept(exceptmask) == (excepts))); \ -} while (0) - -/* Test within a given tolerance. */ -#define test_tol(func, z, result, tol) do { \ - volatile long double complex _d = z; \ - assert(cfpequal_tol((func)(_d), (result), (tol), \ - FPE_ABS_ZERO | CS_BOTH)); \ -} while (0) - -/* Test all the functions that compute cexp(x). */ -#define testall(x, result, exceptmask, excepts, checksign) do { \ - test(cexp, x, result, exceptmask, excepts, checksign); \ - test(cexpf, x, result, exceptmask, excepts, checksign); \ -} while (0) - -/* - * Test all the functions that compute cexp(x), within a given tolerance. - * The tolerance is specified in ulps. - */ -#define testall_tol(x, result, tol) do { \ - test_tol(cexp, x, result, tol * DBL_ULP()); \ - test_tol(cexpf, x, result, tol * FLT_ULP()); \ -} while (0) - -/* Various finite non-zero numbers to test. */ -static const float finites[] = -{ -42.0e20, -1.0, -1.0e-10, -0.0, 0.0, 1.0e-10, 1.0, 42.0e20 }; - - -/* Tests for 0 */ -void -test_zero(void) -{ - - /* cexp(0) = 1, no exceptions raised */ - testall(0.0, 1.0, ALL_STD_EXCEPT, 0, 1); - testall(-0.0, 1.0, ALL_STD_EXCEPT, 0, 1); - testall(CMPLXL(0.0, -0.0), CMPLXL(1.0, -0.0), ALL_STD_EXCEPT, 0, 1); - testall(CMPLXL(-0.0, -0.0), CMPLXL(1.0, -0.0), ALL_STD_EXCEPT, 0, 1); -} - -/* - * Tests for NaN. The signs of the results are indeterminate unless the - * imaginary part is 0. - */ -void -test_nan() -{ - int i; - - /* cexp(x + NaNi) = NaN + NaNi and optionally raises invalid */ - /* cexp(NaN + yi) = NaN + NaNi and optionally raises invalid (|y|>0) */ - for (i = 0; i < nitems(finites); i++) { - printf("# Run %d..\n", i); - testall(CMPLXL(finites[i], NAN), CMPLXL(NAN, NAN), - ALL_STD_EXCEPT & ~FE_INVALID, 0, 0); - if (finites[i] == 0.0) - continue; - /* XXX FE_INEXACT shouldn't be raised here */ - testall(CMPLXL(NAN, finites[i]), CMPLXL(NAN, NAN), - ALL_STD_EXCEPT & ~(FE_INVALID | FE_INEXACT), 0, 0); - } - - /* cexp(NaN +- 0i) = NaN +- 0i */ - testall(CMPLXL(NAN, 0.0), CMPLXL(NAN, 0.0), ALL_STD_EXCEPT, 0, 1); - testall(CMPLXL(NAN, -0.0), CMPLXL(NAN, -0.0), ALL_STD_EXCEPT, 0, 1); - - /* cexp(inf + NaN i) = inf + nan i */ - testall(CMPLXL(INFINITY, NAN), CMPLXL(INFINITY, NAN), - ALL_STD_EXCEPT, 0, 0); - /* cexp(-inf + NaN i) = 0 */ - testall(CMPLXL(-INFINITY, NAN), CMPLXL(0.0, 0.0), - ALL_STD_EXCEPT, 0, 0); - /* cexp(NaN + NaN i) = NaN + NaN i */ - testall(CMPLXL(NAN, NAN), CMPLXL(NAN, NAN), - ALL_STD_EXCEPT, 0, 0); -} - -void -test_inf(void) -{ - int i; - - /* cexp(x + inf i) = NaN + NaNi and raises invalid */ - for (i = 0; i < nitems(finites); i++) { - printf("# Run %d..\n", i); - testall(CMPLXL(finites[i], INFINITY), CMPLXL(NAN, NAN), - ALL_STD_EXCEPT, FE_INVALID, 1); - } - /* cexp(-inf + yi) = 0 * (cos(y) + sin(y)i) */ - /* XXX shouldn't raise an inexact exception */ - testall(CMPLXL(-INFINITY, M_PI_4), CMPLXL(0.0, 0.0), - ALL_STD_EXCEPT & ~FE_INEXACT, 0, 1); - testall(CMPLXL(-INFINITY, 3 * M_PI_4), CMPLXL(-0.0, 0.0), - ALL_STD_EXCEPT & ~FE_INEXACT, 0, 1); - testall(CMPLXL(-INFINITY, 5 * M_PI_4), CMPLXL(-0.0, -0.0), - ALL_STD_EXCEPT & ~FE_INEXACT, 0, 1); - testall(CMPLXL(-INFINITY, 7 * M_PI_4), CMPLXL(0.0, -0.0), - ALL_STD_EXCEPT & ~FE_INEXACT, 0, 1); - testall(CMPLXL(-INFINITY, 0.0), CMPLXL(0.0, 0.0), - ALL_STD_EXCEPT, 0, 1); - testall(CMPLXL(-INFINITY, -0.0), CMPLXL(0.0, -0.0), - ALL_STD_EXCEPT, 0, 1); - /* cexp(inf + yi) = inf * (cos(y) + sin(y)i) (except y=0) */ - /* XXX shouldn't raise an inexact exception */ - testall(CMPLXL(INFINITY, M_PI_4), CMPLXL(INFINITY, INFINITY), - ALL_STD_EXCEPT & ~FE_INEXACT, 0, 1); - testall(CMPLXL(INFINITY, 3 * M_PI_4), CMPLXL(-INFINITY, INFINITY), - ALL_STD_EXCEPT & ~FE_INEXACT, 0, 1); - testall(CMPLXL(INFINITY, 5 * M_PI_4), CMPLXL(-INFINITY, -INFINITY), - ALL_STD_EXCEPT & ~FE_INEXACT, 0, 1); - testall(CMPLXL(INFINITY, 7 * M_PI_4), CMPLXL(INFINITY, -INFINITY), - ALL_STD_EXCEPT & ~FE_INEXACT, 0, 1); - /* cexp(inf + 0i) = inf + 0i */ - testall(CMPLXL(INFINITY, 0.0), CMPLXL(INFINITY, 0.0), - ALL_STD_EXCEPT, 0, 1); - testall(CMPLXL(INFINITY, -0.0), CMPLXL(INFINITY, -0.0), - ALL_STD_EXCEPT, 0, 1); -} - -void -test_reals(void) -{ - int i; - - for (i = 0; i < nitems(finites); i++) { - /* XXX could check exceptions more meticulously */ - printf("# Run %d..\n", i); - test(cexp, CMPLXL(finites[i], 0.0), - CMPLXL(exp(finites[i]), 0.0), - FE_INVALID | FE_DIVBYZERO, 0, 1); - test(cexp, CMPLXL(finites[i], -0.0), - CMPLXL(exp(finites[i]), -0.0), - FE_INVALID | FE_DIVBYZERO, 0, 1); - test(cexpf, CMPLXL(finites[i], 0.0), - CMPLXL(expf(finites[i]), 0.0), - FE_INVALID | FE_DIVBYZERO, 0, 1); - test(cexpf, CMPLXL(finites[i], -0.0), - CMPLXL(expf(finites[i]), -0.0), - FE_INVALID | FE_DIVBYZERO, 0, 1); - } -} - -void -test_imaginaries(void) -{ - int i; - - for (i = 0; i < nitems(finites); i++) { - printf("# Run %d..\n", i); - test(cexp, CMPLXL(0.0, finites[i]), - CMPLXL(cos(finites[i]), sin(finites[i])), - ALL_STD_EXCEPT & ~FE_INEXACT, 0, 1); - test(cexp, CMPLXL(-0.0, finites[i]), - CMPLXL(cos(finites[i]), sin(finites[i])), - ALL_STD_EXCEPT & ~FE_INEXACT, 0, 1); - test(cexpf, CMPLXL(0.0, finites[i]), - CMPLXL(cosf(finites[i]), sinf(finites[i])), - ALL_STD_EXCEPT & ~FE_INEXACT, 0, 1); - test(cexpf, CMPLXL(-0.0, finites[i]), - CMPLXL(cosf(finites[i]), sinf(finites[i])), - ALL_STD_EXCEPT & ~FE_INEXACT, 0, 1); - } -} - -void -test_small(void) -{ - static const double tests[] = { - /* csqrt(a + bI) = x + yI */ - /* a b x y */ - 1.0, M_PI_4, M_SQRT2 * 0.5 * M_E, M_SQRT2 * 0.5 * M_E, - -1.0, M_PI_4, M_SQRT2 * 0.5 / M_E, M_SQRT2 * 0.5 / M_E, - 2.0, M_PI_2, 0.0, M_E * M_E, - M_LN2, M_PI, -2.0, 0.0, - }; - double a, b; - double x, y; - int i; - - for (i = 0; i < nitems(tests); i += 4) { - printf("# Run %d..\n", i); - a = tests[i]; - b = tests[i + 1]; - x = tests[i + 2]; - y = tests[i + 3]; - test_tol(cexp, CMPLXL(a, b), CMPLXL(x, y), 3 * DBL_ULP()); - - /* float doesn't have enough precision to pass these tests */ - if (x == 0 || y == 0) - continue; - test_tol(cexpf, CMPLXL(a, b), CMPLXL(x, y), 1 * FLT_ULP()); - } -} - -/* Test inputs with a real part r that would overflow exp(r). */ -void -test_large(void) -{ - - test_tol(cexp, CMPLXL(709.79, 0x1p-1074), - CMPLXL(INFINITY, 8.94674309915433533273e-16), DBL_ULP()); - test_tol(cexp, CMPLXL(1000, 0x1p-1074), - CMPLXL(INFINITY, 9.73344457300016401328e+110), DBL_ULP()); - test_tol(cexp, CMPLXL(1400, 0x1p-1074), - CMPLXL(INFINITY, 5.08228858149196559681e+284), DBL_ULP()); - test_tol(cexp, CMPLXL(900, 0x1.23456789abcdep-1020), - CMPLXL(INFINITY, 7.42156649354218408074e+83), DBL_ULP()); - test_tol(cexp, CMPLXL(1300, 0x1.23456789abcdep-1020), - CMPLXL(INFINITY, 3.87514844965996756704e+257), DBL_ULP()); - - test_tol(cexpf, CMPLXL(88.73, 0x1p-149), - CMPLXL(INFINITY, 4.80265603e-07), 2 * FLT_ULP()); - test_tol(cexpf, CMPLXL(90, 0x1p-149), - CMPLXL(INFINITY, 1.7101492622e-06f), 2 * FLT_ULP()); - test_tol(cexpf, CMPLXL(192, 0x1p-149), - CMPLXL(INFINITY, 3.396809344e+38f), 2 * FLT_ULP()); - test_tol(cexpf, CMPLXL(120, 0x1.234568p-120), - CMPLXL(INFINITY, 1.1163382522e+16f), 2 * FLT_ULP()); - test_tol(cexpf, CMPLXL(170, 0x1.234568p-120), - CMPLXL(INFINITY, 5.7878851079e+37f), 2 * FLT_ULP()); -} - -int -main(int argc, char *argv[]) -{ - - printf("1..7\n"); - - test_zero(); - printf("ok 1 - cexp zero\n"); - - test_nan(); - printf("ok 2 - cexp nan\n"); - - test_inf(); - printf("ok 3 - cexp inf\n"); - -#if defined(__i386__) - printf("not ok 4 - cexp reals # TODO: PR # 191676 fails assertion on i386\n"); -#else - test_reals(); - printf("ok 4 - cexp reals\n"); -#endif - - test_imaginaries(); - printf("ok 5 - cexp imaginaries\n"); - - test_small(); - printf("ok 6 - cexp small\n"); - - test_large(); - printf("ok 7 - cexp large\n"); - - return (0); -} diff --git a/tools/regression/lib/msun/test-cexp.t b/tools/regression/lib/msun/test-cexp.t deleted file mode 100644 index 8bdfd03..0000000 --- a/tools/regression/lib/msun/test-cexp.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -cd `dirname $0` - -executable=`basename $0 .t` - -make $executable 2>&1 > /dev/null - -exec ./$executable diff --git a/tools/regression/lib/msun/test-conj.c b/tools/regression/lib/msun/test-conj.c deleted file mode 100644 index 7426f9e..0000000 --- a/tools/regression/lib/msun/test-conj.c +++ /dev/null @@ -1,139 +0,0 @@ -/*- - * Copyright (c) 2008 David Schultz <das@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Tests for conj{,f,l}() - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <assert.h> -#include <complex.h> -#include <fenv.h> -#include <math.h> -#include <stdio.h> - -#include "test-utils.h" - -#pragma STDC CX_LIMITED_RANGE OFF - -/* Make sure gcc doesn't use builtin versions of these or honor __pure2. */ -static float complex (*libconjf)(float complex) = conjf; -static double complex (*libconj)(double complex) = conj; -static long double complex (*libconjl)(long double complex) = conjl; -static float (*libcrealf)(float complex) = crealf; -static double (*libcreal)(double complex) = creal; -static long double (*libcreall)(long double complex) = creall; -static float (*libcimagf)(float complex) = cimagf; -static double (*libcimag)(double complex) = cimag; -static long double (*libcimagl)(long double complex) = cimagl; - -static const double tests[] = { - /* a + bI */ - 0.0, 0.0, - 0.0, 1.0, - 1.0, 0.0, - -1.0, 0.0, - 1.0, -0.0, - 0.0, -1.0, - 2.0, 4.0, - 0.0, INFINITY, - 0.0, -INFINITY, - INFINITY, 0.0, - NAN, 1.0, - 1.0, NAN, - NAN, NAN, - -INFINITY, INFINITY, -}; - -int -main(int argc, char *argv[]) -{ - static const int ntests = sizeof(tests) / sizeof(tests[0]) / 2; - complex float in; - complex long double expected; - int i; - - printf("1..%d\n", ntests * 3); - - for (i = 0; i < ntests; i++) { - __real__ expected = __real__ in = tests[2 * i]; - __imag__ in = tests[2 * i + 1]; - __imag__ expected = -cimag(in); - - assert(fpequal(libcrealf(in), __real__ in)); - assert(fpequal(libcreal(in), __real__ in)); - assert(fpequal(libcreall(in), __real__ in)); - assert(fpequal(libcimagf(in), __imag__ in)); - assert(fpequal(libcimag(in), __imag__ in)); - assert(fpequal(libcimagl(in), __imag__ in)); - - feclearexcept(FE_ALL_EXCEPT); - if (!cfpequal(libconjf(in), expected)) { - printf("not ok %d\t# conjf(%#.2g + %#.2gI): " - "wrong value\n", - 3 * i + 1, creal(in), cimag(in)); - } else if (fetestexcept(FE_ALL_EXCEPT)) { - printf("not ok %d\t# conjf(%#.2g + %#.2gI): " - "threw an exception\n", - 3 * i + 1, creal(in), cimag(in)); - } else { - printf("ok %d\t\t# conjf(%#.2g + %#.2gI)\n", - 3 * i + 1, creal(in), cimag(in)); - } - - feclearexcept(FE_ALL_EXCEPT); - if (!cfpequal(libconj(in), expected)) { - printf("not ok %d\t# conj(%#.2g + %#.2gI): " - "wrong value\n", - 3 * i + 2, creal(in), cimag(in)); - } else if (fetestexcept(FE_ALL_EXCEPT)) { - printf("not ok %d\t# conj(%#.2g + %#.2gI): " - "threw an exception\n", - 3 * i + 2, creal(in), cimag(in)); - } else { - printf("ok %d\t\t# conj(%#.2g + %#.2gI)\n", - 3 * i + 2, creal(in), cimag(in)); - } - - feclearexcept(FE_ALL_EXCEPT); - if (!cfpequal(libconjl(in), expected)) { - printf("not ok %d\t# conjl(%#.2g + %#.2gI): " - "wrong value\n", - 3 * i + 3, creal(in), cimag(in)); - } else if (fetestexcept(FE_ALL_EXCEPT)) { - printf("not ok %d\t# conjl(%#.2g + %#.2gI): " - "threw an exception\n", - 3 * i + 3, creal(in), cimag(in)); - } else { - printf("ok %d\t\t# conjl(%#.2g + %#.2gI)\n", - 3 * i + 3, creal(in), cimag(in)); - } - } - - return (0); -} diff --git a/tools/regression/lib/msun/test-conj.t b/tools/regression/lib/msun/test-conj.t deleted file mode 100644 index 8bdfd03..0000000 --- a/tools/regression/lib/msun/test-conj.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -cd `dirname $0` - -executable=`basename $0 .t` - -make $executable 2>&1 > /dev/null - -exec ./$executable diff --git a/tools/regression/lib/msun/test-csqrt.c b/tools/regression/lib/msun/test-csqrt.c deleted file mode 100644 index aa119d1..0000000 --- a/tools/regression/lib/msun/test-csqrt.c +++ /dev/null @@ -1,295 +0,0 @@ -/*- - * Copyright (c) 2007 David Schultz <das@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Tests for csqrt{,f}() - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> - -#include <assert.h> -#include <complex.h> -#include <float.h> -#include <math.h> -#include <stdio.h> - -#include "test-utils.h" - -/* - * This is a test hook that can point to csqrtl(), _csqrt(), or to _csqrtf(). - * The latter two convert to float or double, respectively, and test csqrtf() - * and csqrt() with the same arguments. - */ -long double complex (*t_csqrt)(long double complex); - -static long double complex -_csqrtf(long double complex d) -{ - - return (csqrtf((float complex)d)); -} - -static long double complex -_csqrt(long double complex d) -{ - - return (csqrt((double complex)d)); -} - -#pragma STDC CX_LIMITED_RANGE OFF - -/* - * Compare d1 and d2 using special rules: NaN == NaN and +0 != -0. - * Fail an assertion if they differ. - */ -static void -assert_equal(long double complex d1, long double complex d2) -{ - - assert(cfpequal(d1, d2)); -} - -/* - * Test csqrt for some finite arguments where the answer is exact. - * (We do not test if it produces correctly rounded answers when the - * result is inexact, nor do we check whether it throws spurious - * exceptions.) - */ -static void -test_finite() -{ - static const double tests[] = { - /* csqrt(a + bI) = x + yI */ - /* a b x y */ - 0, 8, 2, 2, - 0, -8, 2, -2, - 4, 0, 2, 0, - -4, 0, 0, 2, - 3, 4, 2, 1, - 3, -4, 2, -1, - -3, 4, 1, 2, - -3, -4, 1, -2, - 5, 12, 3, 2, - 7, 24, 4, 3, - 9, 40, 5, 4, - 11, 60, 6, 5, - 13, 84, 7, 6, - 33, 56, 7, 4, - 39, 80, 8, 5, - 65, 72, 9, 4, - 987, 9916, 74, 67, - 5289, 6640, 83, 40, - 460766389075.0, 16762287900.0, 678910, 12345 - }; - /* - * We also test some multiples of the above arguments. This - * array defines which multiples we use. Note that these have - * to be small enough to not cause overflow for float precision - * with all of the constants in the above table. - */ - static const double mults[] = { - 1, - 2, - 3, - 13, - 16, - 0x1.p30, - 0x1.p-30, - }; - - double a, b; - double x, y; - int i, j; - - for (i = 0; i < nitems(tests); i += 4) { - for (j = 0; j < nitems(mults); j++) { - a = tests[i] * mults[j] * mults[j]; - b = tests[i + 1] * mults[j] * mults[j]; - x = tests[i + 2] * mults[j]; - y = tests[i + 3] * mults[j]; - assert(t_csqrt(CMPLXL(a, b)) == CMPLXL(x, y)); - } - } - -} - -/* - * Test the handling of +/- 0. - */ -static void -test_zeros() -{ - - assert_equal(t_csqrt(CMPLXL(0.0, 0.0)), CMPLXL(0.0, 0.0)); - assert_equal(t_csqrt(CMPLXL(-0.0, 0.0)), CMPLXL(0.0, 0.0)); - assert_equal(t_csqrt(CMPLXL(0.0, -0.0)), CMPLXL(0.0, -0.0)); - assert_equal(t_csqrt(CMPLXL(-0.0, -0.0)), CMPLXL(0.0, -0.0)); -} - -/* - * Test the handling of infinities when the other argument is not NaN. - */ -static void -test_infinities() -{ - static const double vals[] = { - 0.0, - -0.0, - 42.0, - -42.0, - INFINITY, - -INFINITY, - }; - - int i; - - for (i = 0; i < nitems(vals); i++) { - if (isfinite(vals[i])) { - assert_equal(t_csqrt(CMPLXL(-INFINITY, vals[i])), - CMPLXL(0.0, copysignl(INFINITY, vals[i]))); - assert_equal(t_csqrt(CMPLXL(INFINITY, vals[i])), - CMPLXL(INFINITY, copysignl(0.0, vals[i]))); - } - assert_equal(t_csqrt(CMPLXL(vals[i], INFINITY)), - CMPLXL(INFINITY, INFINITY)); - assert_equal(t_csqrt(CMPLXL(vals[i], -INFINITY)), - CMPLXL(INFINITY, -INFINITY)); - } -} - -/* - * Test the handling of NaNs. - */ -static void -test_nans() -{ - - assert(creall(t_csqrt(CMPLXL(INFINITY, NAN))) == INFINITY); - assert(isnan(cimagl(t_csqrt(CMPLXL(INFINITY, NAN))))); - - assert(isnan(creall(t_csqrt(CMPLXL(-INFINITY, NAN))))); - assert(isinf(cimagl(t_csqrt(CMPLXL(-INFINITY, NAN))))); - - assert_equal(t_csqrt(CMPLXL(NAN, INFINITY)), - CMPLXL(INFINITY, INFINITY)); - assert_equal(t_csqrt(CMPLXL(NAN, -INFINITY)), - CMPLXL(INFINITY, -INFINITY)); - - assert_equal(t_csqrt(CMPLXL(0.0, NAN)), CMPLXL(NAN, NAN)); - assert_equal(t_csqrt(CMPLXL(-0.0, NAN)), CMPLXL(NAN, NAN)); - assert_equal(t_csqrt(CMPLXL(42.0, NAN)), CMPLXL(NAN, NAN)); - assert_equal(t_csqrt(CMPLXL(-42.0, NAN)), CMPLXL(NAN, NAN)); - assert_equal(t_csqrt(CMPLXL(NAN, 0.0)), CMPLXL(NAN, NAN)); - assert_equal(t_csqrt(CMPLXL(NAN, -0.0)), CMPLXL(NAN, NAN)); - assert_equal(t_csqrt(CMPLXL(NAN, 42.0)), CMPLXL(NAN, NAN)); - assert_equal(t_csqrt(CMPLXL(NAN, -42.0)), CMPLXL(NAN, NAN)); - assert_equal(t_csqrt(CMPLXL(NAN, NAN)), CMPLXL(NAN, NAN)); -} - -/* - * Test whether csqrt(a + bi) works for inputs that are large enough to - * cause overflow in hypot(a, b) + a. In this case we are using - * csqrt(115 + 252*I) == 14 + 9*I - * scaled up to near MAX_EXP. - */ -static void -test_overflow(int maxexp) -{ - long double a, b; - long double complex result; - - a = ldexpl(115 * 0x1p-8, maxexp); - b = ldexpl(252 * 0x1p-8, maxexp); - result = t_csqrt(CMPLXL(a, b)); - assert(creall(result) == ldexpl(14 * 0x1p-4, maxexp / 2)); - assert(cimagl(result) == ldexpl(9 * 0x1p-4, maxexp / 2)); -} - -int -main(int argc, char *argv[]) -{ - - printf("1..15\n"); - - /* Test csqrt() */ - t_csqrt = _csqrt; - - test_finite(); - printf("ok 1 - csqrt\n"); - - test_zeros(); - printf("ok 2 - csqrt\n"); - - test_infinities(); - printf("ok 3 - csqrt\n"); - - test_nans(); - printf("ok 4 - csqrt\n"); - - test_overflow(DBL_MAX_EXP); - printf("ok 5 - csqrt\n"); - - /* Now test csqrtf() */ - t_csqrt = _csqrtf; - - test_finite(); - printf("ok 6 - csqrt\n"); - - test_zeros(); - printf("ok 7 - csqrt\n"); - - test_infinities(); - printf("ok 8 - csqrt\n"); - - test_nans(); - printf("ok 9 - csqrt\n"); - - test_overflow(FLT_MAX_EXP); - printf("ok 10 - csqrt\n"); - - /* Now test csqrtl() */ - t_csqrt = csqrtl; - - test_finite(); - printf("ok 11 - csqrt\n"); - - test_zeros(); - printf("ok 12 - csqrt\n"); - - test_infinities(); - printf("ok 13 - csqrt\n"); - - test_nans(); - printf("ok 14 - csqrt\n"); - - test_overflow(LDBL_MAX_EXP); - printf("ok 15 - csqrt\n"); - - return (0); -} diff --git a/tools/regression/lib/msun/test-csqrt.t b/tools/regression/lib/msun/test-csqrt.t deleted file mode 100644 index 8bdfd03..0000000 --- a/tools/regression/lib/msun/test-csqrt.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -cd `dirname $0` - -executable=`basename $0 .t` - -make $executable 2>&1 > /dev/null - -exec ./$executable diff --git a/tools/regression/lib/msun/test-fenv.c b/tools/regression/lib/msun/test-fenv.c deleted file mode 100644 index 0ea6e42..0000000 --- a/tools/regression/lib/msun/test-fenv.c +++ /dev/null @@ -1,576 +0,0 @@ -/*- - * Copyright (c) 2004 David Schultz <das@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Test the correctness and C99-compliance of various fenv.h features. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/types.h> -#include <sys/wait.h> -#include <assert.h> -#include <err.h> -#include <fenv.h> -#include <float.h> -#include <math.h> -#include <signal.h> -#include <stdio.h> -#include <string.h> -#include <unistd.h> - -/* - * Implementations are permitted to define additional exception flags - * not specified in the standard, so it is not necessarily true that - * FE_ALL_EXCEPT == ALL_STD_EXCEPT. - */ -#define ALL_STD_EXCEPT (FE_DIVBYZERO | FE_INEXACT | FE_INVALID | \ - FE_OVERFLOW | FE_UNDERFLOW) - -#define NEXCEPTS (sizeof(std_excepts) / sizeof(std_excepts[0])) - -static const int std_excepts[] = { - FE_INVALID, - FE_DIVBYZERO, - FE_OVERFLOW, - FE_UNDERFLOW, - FE_INEXACT, -}; - -/* init_exceptsets() initializes this to the power set of std_excepts[] */ -static int std_except_sets[1 << NEXCEPTS]; - -static void init_exceptsets(void); - -static void test_dfl_env(void); -static void test_fegsetenv(void); -static void test_fegsetexceptflag(void); -static void test_masking(void); -static void test_fegsetround(void); -static void test_feholdupdate(void); -static void test_feraiseexcept(void); -static void test_fetestclearexcept(void); - -static int getround(void); -static void raiseexcept(int excepts); -static void trap_handler(int sig); - -#pragma STDC FENV_ACCESS ON - -int -main(int argc, char *argv[]) -{ - - printf("1..8\n"); - init_exceptsets(); - test_dfl_env(); - printf("ok 1 - fenv\n"); - test_fetestclearexcept(); - printf("ok 2 - fenv\n"); - test_fegsetexceptflag(); - printf("ok 3 - fenv\n"); - test_feraiseexcept(); - printf("ok 4 - fenv\n"); - test_fegsetround(); - printf("ok 5 - fenv\n"); - test_fegsetenv(); - printf("ok 6 - fenv\n"); - test_masking(); - printf("ok 7 - fenv\n"); - test_feholdupdate(); - printf("ok 8 - fenv\n"); - - return (0); -} - -/* - * Initialize std_except_sets[] to the power set of std_excepts[] - */ -void -init_exceptsets(void) -{ - int i, j, sr; - - for (i = 0; i < 1 << NEXCEPTS; i++) { - for (sr = i, j = 0; sr != 0; sr >>= 1, j++) - std_except_sets[i] |= std_excepts[j] & ((~sr & 1) - 1); - } -} - -/* - * This tests checks the default FP environment, so it must be first. - * The memcmp() test below may be too much to ask for, since there - * could be multiple machine-specific default environments. - */ -static void -test_dfl_env(void) -{ -#ifndef NO_STRICT_DFL_ENV - fenv_t env; - - fegetenv(&env); - -#ifdef __amd64__ - /* - * Compare the fields that the AMD [1] and Intel [2] specs say will be - * set once fnstenv returns. - * - * Not all amd64 capable processors implement the fnstenv instruction - * by zero'ing out the env.__x87.__other field (example: AMD Opteron - * 6308). The AMD64/x64 specs aren't explicit on what the - * env.__x87.__other field will contain after fnstenv is executed, so - * the values in env.__x87.__other could be filled with arbitrary - * data depending on how the CPU implements fnstenv. - * - * 1. http://support.amd.com/TechDocs/26569_APM_v5.pdf - * 2. http://www.intel.com/Assets/en_US/PDF/manual/253666.pdf - */ - assert(memcmp(&env.__mxcsr, &FE_DFL_ENV->__mxcsr, - sizeof(env.__mxcsr)) == 0); - assert(memcmp(&env.__x87.__control, &FE_DFL_ENV->__x87.__control, - sizeof(env.__x87.__control)) == 0); - assert(memcmp(&env.__x87.__status, &FE_DFL_ENV->__x87.__status, - sizeof(env.__x87.__status)) == 0); - assert(memcmp(&env.__x87.__tag, &FE_DFL_ENV->__x87.__tag, - sizeof(env.__x87.__tag)) == 0); -#else - assert(memcmp(&env, FE_DFL_ENV, sizeof(env)) == 0); -#endif - -#endif - assert(fetestexcept(FE_ALL_EXCEPT) == 0); -} - -/* - * Test fetestexcept() and feclearexcept(). - */ -static void -test_fetestclearexcept(void) -{ - int excepts, i; - - for (i = 0; i < 1 << NEXCEPTS; i++) - assert(fetestexcept(std_except_sets[i]) == 0); - for (i = 0; i < 1 << NEXCEPTS; i++) { - excepts = std_except_sets[i]; - - /* FE_ALL_EXCEPT might be special-cased, as on i386. */ - raiseexcept(excepts); - assert(fetestexcept(excepts) == excepts); - assert(feclearexcept(FE_ALL_EXCEPT) == 0); - assert(fetestexcept(FE_ALL_EXCEPT) == 0); - - raiseexcept(excepts); - assert(fetestexcept(excepts) == excepts); - if ((excepts & (FE_UNDERFLOW | FE_OVERFLOW)) != 0) { - excepts |= FE_INEXACT; - assert((fetestexcept(ALL_STD_EXCEPT) | FE_INEXACT) == - excepts); - } else { - assert(fetestexcept(ALL_STD_EXCEPT) == excepts); - } - assert(feclearexcept(excepts) == 0); - assert(fetestexcept(ALL_STD_EXCEPT) == 0); - } -} - -/* - * Test fegetexceptflag() and fesetexceptflag(). - * - * Prerequisites: fetestexcept(), feclearexcept() - */ -static void -test_fegsetexceptflag(void) -{ - fexcept_t flag; - int excepts, i; - - assert(fetestexcept(FE_ALL_EXCEPT) == 0); - for (i = 0; i < 1 << NEXCEPTS; i++) { - excepts = std_except_sets[i]; - - assert(fegetexceptflag(&flag, excepts) == 0); - raiseexcept(ALL_STD_EXCEPT); - assert(fesetexceptflag(&flag, excepts) == 0); - assert(fetestexcept(ALL_STD_EXCEPT) == - (ALL_STD_EXCEPT ^ excepts)); - - assert(fegetexceptflag(&flag, FE_ALL_EXCEPT) == 0); - assert(feclearexcept(FE_ALL_EXCEPT) == 0); - assert(fesetexceptflag(&flag, excepts) == 0); - assert(fetestexcept(ALL_STD_EXCEPT) == 0); - assert(fesetexceptflag(&flag, ALL_STD_EXCEPT ^ excepts) == 0); - assert(fetestexcept(ALL_STD_EXCEPT) == - (ALL_STD_EXCEPT ^ excepts)); - - assert(feclearexcept(FE_ALL_EXCEPT) == 0); - } -} - -/* - * Test feraiseexcept(). - * - * Prerequisites: fetestexcept(), feclearexcept() - */ -static void -test_feraiseexcept(void) -{ - int excepts, i; - - for (i = 0; i < 1 << NEXCEPTS; i++) { - excepts = std_except_sets[i]; - - assert(fetestexcept(FE_ALL_EXCEPT) == 0); - assert(feraiseexcept(excepts) == 0); - if ((excepts & (FE_UNDERFLOW | FE_OVERFLOW)) != 0) { - excepts |= FE_INEXACT; - assert((fetestexcept(ALL_STD_EXCEPT) | FE_INEXACT) == - excepts); - } else { - assert(fetestexcept(ALL_STD_EXCEPT) == excepts); - } - assert(feclearexcept(FE_ALL_EXCEPT) == 0); - } - assert(feraiseexcept(FE_INVALID | FE_DIVBYZERO) == 0); - assert(fetestexcept(ALL_STD_EXCEPT) == (FE_INVALID | FE_DIVBYZERO)); - assert(feraiseexcept(FE_OVERFLOW | FE_UNDERFLOW | FE_INEXACT) == 0); - assert(fetestexcept(ALL_STD_EXCEPT) == ALL_STD_EXCEPT); - assert(feclearexcept(FE_ALL_EXCEPT) == 0); -} - -/* - * Test fegetround() and fesetround(). - */ -static void -test_fegsetround(void) -{ - - assert(fegetround() == FE_TONEAREST); - assert(getround() == FE_TONEAREST); - assert(FLT_ROUNDS == 1); - - assert(fesetround(FE_DOWNWARD) == 0); - assert(fegetround() == FE_DOWNWARD); - assert(getround() == FE_DOWNWARD); - assert(FLT_ROUNDS == 3); - - assert(fesetround(FE_UPWARD) == 0); - assert(getround() == FE_UPWARD); - assert(fegetround() == FE_UPWARD); - assert(FLT_ROUNDS == 2); - - assert(fesetround(FE_TOWARDZERO) == 0); - assert(getround() == FE_TOWARDZERO); - assert(fegetround() == FE_TOWARDZERO); - assert(FLT_ROUNDS == 0); - - assert(fesetround(FE_TONEAREST) == 0); - assert(getround() == FE_TONEAREST); - assert(FLT_ROUNDS == 1); - - assert(feclearexcept(FE_ALL_EXCEPT) == 0); -} - -/* - * Test fegetenv() and fesetenv(). - * - * Prerequisites: fetestexcept(), feclearexcept(), fegetround(), fesetround() - */ -static void -test_fegsetenv(void) -{ - fenv_t env1, env2; - int excepts, i; - - for (i = 0; i < 1 << NEXCEPTS; i++) { - excepts = std_except_sets[i]; - - assert(fetestexcept(FE_ALL_EXCEPT) == 0); - assert(fegetround() == FE_TONEAREST); - assert(fegetenv(&env1) == 0); - - /* - * fe[gs]etenv() should be able to save and restore - * exception flags without the spurious inexact - * exceptions that afflict raiseexcept(). - */ - raiseexcept(excepts); - if ((excepts & (FE_UNDERFLOW | FE_OVERFLOW)) != 0 && - (excepts & FE_INEXACT) == 0) - assert(feclearexcept(FE_INEXACT) == 0); - - fesetround(FE_DOWNWARD); - assert(fegetenv(&env2) == 0); - assert(fesetenv(&env1) == 0); - assert(fetestexcept(FE_ALL_EXCEPT) == 0); - assert(fegetround() == FE_TONEAREST); - - assert(fesetenv(&env2) == 0); - assert(fetestexcept(FE_ALL_EXCEPT) == excepts); - assert(fegetround() == FE_DOWNWARD); - assert(fesetenv(&env1) == 0); - assert(fetestexcept(FE_ALL_EXCEPT) == 0); - assert(fegetround() == FE_TONEAREST); - } -} - -/* - * Test fegetexcept(), fedisableexcept(), and feenableexcept(). - * - * Prerequisites: fetestexcept(), feraiseexcept() - */ -static void -test_masking(void) -{ - struct sigaction act; - int except, i, pass, raise, status; - - assert((fegetexcept() & ALL_STD_EXCEPT) == 0); - assert((feenableexcept(FE_INVALID|FE_OVERFLOW) & ALL_STD_EXCEPT) == 0); - assert((feenableexcept(FE_UNDERFLOW) & ALL_STD_EXCEPT) == - (FE_INVALID | FE_OVERFLOW)); - assert((fedisableexcept(FE_OVERFLOW) & ALL_STD_EXCEPT) == - (FE_INVALID | FE_OVERFLOW | FE_UNDERFLOW)); - assert((fegetexcept() & ALL_STD_EXCEPT) == (FE_INVALID | FE_UNDERFLOW)); - assert((fedisableexcept(FE_ALL_EXCEPT) & ALL_STD_EXCEPT) == - (FE_INVALID | FE_UNDERFLOW)); - assert((fegetexcept() & ALL_STD_EXCEPT) == 0); - - sigemptyset(&act.sa_mask); - act.sa_flags = 0; - act.sa_handler = trap_handler; - for (pass = 0; pass < 2; pass++) { - for (i = 0; i < NEXCEPTS; i++) { - except = std_excepts[i]; - /* over/underflow may also raise inexact */ - if (except == FE_INEXACT) - raise = FE_DIVBYZERO | FE_INVALID; - else - raise = ALL_STD_EXCEPT ^ except; - - /* - * We need to fork a child process because - * there isn't a portable way to recover from - * a floating-point exception. - */ - switch(fork()) { - case 0: /* child */ - assert((fegetexcept() & ALL_STD_EXCEPT) == 0); - assert((feenableexcept(except) - & ALL_STD_EXCEPT) == 0); - assert(fegetexcept() == except); - raiseexcept(raise); - assert(feraiseexcept(raise) == 0); - assert(fetestexcept(ALL_STD_EXCEPT) == raise); - - assert(sigaction(SIGFPE, &act, NULL) == 0); - switch (pass) { - case 0: - raiseexcept(except); - case 1: - feraiseexcept(except); - default: - assert(0); - } - assert(0); - default: /* parent */ - assert(wait(&status) > 0); - /* - * Avoid assert() here so that it's possible - * to examine a failed child's core dump. - */ - if (!WIFEXITED(status)) - errx(1, "child aborted\n"); - assert(WEXITSTATUS(status) == 0); - break; - case -1: /* error */ - assert(0); - } - } - } - assert(fetestexcept(FE_ALL_EXCEPT) == 0); -} - -/* - * Test feholdexcept() and feupdateenv(). - * - * Prerequisites: fetestexcept(), fegetround(), fesetround(), - * fedisableexcept(), feenableexcept() - */ -static void -test_feholdupdate(void) -{ - fenv_t env; - - struct sigaction act; - int except, i, pass, status, raise; - - sigemptyset(&act.sa_mask); - act.sa_flags = 0; - act.sa_handler = trap_handler; - for (pass = 0; pass < 2; pass++) { - for (i = 0; i < NEXCEPTS; i++) { - except = std_excepts[i]; - /* over/underflow may also raise inexact */ - if (except == FE_INEXACT) - raise = FE_DIVBYZERO | FE_INVALID; - else - raise = ALL_STD_EXCEPT ^ except; - - /* - * We need to fork a child process because - * there isn't a portable way to recover from - * a floating-point exception. - */ - switch(fork()) { - case 0: /* child */ - /* - * We don't want to cause a fatal exception in - * the child until the second pass, so we can - * check other properties of feupdateenv(). - */ - if (pass == 1) - assert((feenableexcept(except) & - ALL_STD_EXCEPT) == 0); - raiseexcept(raise); - assert(fesetround(FE_DOWNWARD) == 0); - assert(feholdexcept(&env) == 0); - assert(fetestexcept(FE_ALL_EXCEPT) == 0); - raiseexcept(except); - assert(fesetround(FE_UPWARD) == 0); - - if (pass == 1) - assert(sigaction(SIGFPE, &act, NULL) == - 0); - assert(feupdateenv(&env) == 0); - assert(fegetround() == FE_DOWNWARD); - assert(fetestexcept(ALL_STD_EXCEPT) == - (except | raise)); - - assert(pass == 0); - _exit(0); - default: /* parent */ - assert(wait(&status) > 0); - /* - * Avoid assert() here so that it's possible - * to examine a failed child's core dump. - */ - if (!WIFEXITED(status)) - errx(1, "child aborted\n"); - assert(WEXITSTATUS(status) == 0); - break; - case -1: /* error */ - assert(0); - } - } - } - assert(fetestexcept(FE_ALL_EXCEPT) == 0); -} - -/* - * Raise a floating-point exception without relying on the standard - * library routines, which we are trying to test. - * - * XXX We can't raise an {over,under}flow without also raising an - * inexact exception. - */ -static void -raiseexcept(int excepts) -{ - volatile double d; - - /* - * With a compiler that supports the FENV_ACCESS pragma - * properly, simple expressions like '0.0 / 0.0' should - * be sufficient to generate traps. Unfortunately, we - * need to bring a volatile variable into the equation - * to prevent incorrect optimizations. - */ - if (excepts & FE_INVALID) { - d = 0.0; - d = 0.0 / d; - } - if (excepts & FE_DIVBYZERO) { - d = 0.0; - d = 1.0 / d; - } - if (excepts & FE_OVERFLOW) { - d = DBL_MAX; - d *= 2.0; - } - if (excepts & FE_UNDERFLOW) { - d = DBL_MIN; - d /= DBL_MAX; - } - if (excepts & FE_INEXACT) { - d = DBL_MIN; - d += 1.0; - } - - /* - * On the x86 (and some other architectures?) the FPU and - * integer units are decoupled. We need to execute an FWAIT - * or a floating-point instruction to get synchronous exceptions. - */ - d = 1.0; - d += 1.0; -} - -/* - * Determine the current rounding mode without relying on the fenv - * routines. This function may raise an inexact exception. - */ -static int -getround(void) -{ - volatile double d; - - /* - * This test works just as well with 0.0 - 0.0, except on ia64 - * where 0.0 - 0.0 gives the wrong sign when rounding downwards. - */ - d = 1.0; - d -= 1.0; - if (copysign(1.0, d) < 0.0) - return (FE_DOWNWARD); - - d = 1.0; - if (d + (DBL_EPSILON * 3.0 / 4.0) == 1.0) - return (FE_TOWARDZERO); - if (d + (DBL_EPSILON * 1.0 / 4.0) > 1.0) - return (FE_UPWARD); - - return (FE_TONEAREST); -} - -static void -trap_handler(int sig) -{ - - assert(sig == SIGFPE); - _exit(0); -} diff --git a/tools/regression/lib/msun/test-fenv.t b/tools/regression/lib/msun/test-fenv.t deleted file mode 100644 index 8bdfd03..0000000 --- a/tools/regression/lib/msun/test-fenv.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -cd `dirname $0` - -executable=`basename $0 .t` - -make $executable 2>&1 > /dev/null - -exec ./$executable diff --git a/tools/regression/lib/msun/test-fmaxmin.c b/tools/regression/lib/msun/test-fmaxmin.c deleted file mode 100644 index 7ddcc87..0000000 --- a/tools/regression/lib/msun/test-fmaxmin.c +++ /dev/null @@ -1,136 +0,0 @@ -/*- - * Copyright (c) 2008 David Schultz <das@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Tests for fmax{,f,l}() and fmin{,f,l}. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <fenv.h> -#include <float.h> -#include <math.h> -#include <stdio.h> - -#include "test-utils.h" - -#pragma STDC FENV_ACCESS ON - -/* - * Test whether func(x, y) has the expected result, and make sure no - * exceptions are raised. - */ -#define TEST(func, type, x, y, expected) do { \ - type __x = (x); /* convert before we clear exceptions */ \ - type __y = (y); \ - feclearexcept(ALL_STD_EXCEPT); \ - long double __result = func((__x), (__y)); \ - if (fetestexcept(ALL_STD_EXCEPT)) { \ - fprintf(stderr, #func "(%.20Lg, %.20Lg) raised 0x%x\n", \ - (x), (y), fetestexcept(FE_ALL_EXCEPT)); \ - ok = 0; \ - } \ - if (!fpequal(__result, (expected))) { \ - fprintf(stderr, #func "(%.20Lg, %.20Lg) = %.20Lg, " \ - "expected %.20Lg\n", (x), (y), __result, (expected)); \ - ok = 0; \ - } \ -} while (0) - -int -testall_r(long double big, long double small) -{ - int ok; - - long double expected_max = isnan(big) ? small : big; - long double expected_min = isnan(small) ? big : small; - ok = 1; - - TEST(fmaxf, float, big, small, expected_max); - TEST(fmaxf, float, small, big, expected_max); - TEST(fmax, double, big, small, expected_max); - TEST(fmax, double, small, big, expected_max); - TEST(fmaxl, long double, big, small, expected_max); - TEST(fmaxl, long double, small, big, expected_max); - TEST(fminf, float, big, small, expected_min); - TEST(fminf, float, small, big, expected_min); - TEST(fmin, double, big, small, expected_min); - TEST(fmin, double, small, big, expected_min); - TEST(fminl, long double, big, small, expected_min); - TEST(fminl, long double, small, big, expected_min); - - return (ok); -} - -/* - * Test all the functions: fmaxf, fmax, fmaxl, fminf, fmin, and fminl, - * in all rounding modes and with the arguments in different orders. - * The input 'big' must be >= 'small'. - */ -void -testall(int testnum, long double big, long double small) -{ - static const int rmodes[] = { - FE_TONEAREST, FE_UPWARD, FE_DOWNWARD, FE_TOWARDZERO - }; - int i; - - for (i = 0; i < 4; i++) { - fesetround(rmodes[i]); - if (!testall_r(big, small)) { - fprintf(stderr, "FAILURE in rounding mode %d\n", - rmodes[i]); - break; - } - } - printf("%sok %d - big = %.20Lg, small = %.20Lg\n", - (i == 4) ? "" : "not ", testnum, big, small); -} - -int -main(int argc, char *argv[]) -{ - - printf("1..12\n"); - - testall(1, 1.0, 0.0); - testall(2, 42.0, nextafterf(42.0, -INFINITY)); - testall(3, nextafterf(42.0, INFINITY), 42.0); - testall(4, -5.0, -5.0); - testall(5, -3.0, -4.0); - testall(6, 1.0, NAN); - testall(7, INFINITY, NAN); - testall(8, INFINITY, 1.0); - testall(9, -3.0, -INFINITY); - testall(10, 3.0, -INFINITY); - testall(11, NAN, NAN); - - /* This test isn't strictly required to work by C99. */ - testall(12, 0.0, -0.0); - - return (0); -} diff --git a/tools/regression/lib/msun/test-fmaxmin.t b/tools/regression/lib/msun/test-fmaxmin.t deleted file mode 100644 index 8bdfd03..0000000 --- a/tools/regression/lib/msun/test-fmaxmin.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -cd `dirname $0` - -executable=`basename $0 .t` - -make $executable 2>&1 > /dev/null - -exec ./$executable diff --git a/tools/regression/lib/msun/test-ilogb.c b/tools/regression/lib/msun/test-ilogb.c deleted file mode 100644 index a1440c4..0000000 --- a/tools/regression/lib/msun/test-ilogb.c +++ /dev/null @@ -1,83 +0,0 @@ -/*- - * Copyright (c) 2004 Stefan Farfeleder - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - * - * $FreeBSD$ - */ - -#include <assert.h> -#include <float.h> -#include <limits.h> -#include <math.h> -#include <stdio.h> -#include <stdlib.h> - -int -main(void) -{ - char buf[128], *end; - double d; - float f; - long double ld; - int e, i; - - printf("1..3\n"); - assert(ilogb(0) == FP_ILOGB0); - assert(ilogb(NAN) == FP_ILOGBNAN); - assert(ilogb(INFINITY) == INT_MAX); - for (e = DBL_MIN_EXP - DBL_MANT_DIG; e < DBL_MAX_EXP; e++) { - snprintf(buf, sizeof(buf), "0x1.p%d", e); - d = strtod(buf, &end); - assert(*end == '\0'); - i = ilogb(d); - assert(i == e); - } - printf("ok 1 - ilogb\n"); - - assert(ilogbf(0) == FP_ILOGB0); - assert(ilogbf(NAN) == FP_ILOGBNAN); - assert(ilogbf(INFINITY) == INT_MAX); - for (e = FLT_MIN_EXP - FLT_MANT_DIG; e < FLT_MAX_EXP; e++) { - snprintf(buf, sizeof(buf), "0x1.p%d", e); - f = strtof(buf, &end); - assert(*end == '\0'); - i = ilogbf(f); - assert(i == e); - } - printf("ok 2 - ilogbf\n"); - - assert(ilogbl(0) == FP_ILOGB0); - assert(ilogbl(NAN) == FP_ILOGBNAN); - assert(ilogbl(INFINITY) == INT_MAX); - for (e = LDBL_MIN_EXP - LDBL_MANT_DIG; e < LDBL_MAX_EXP; e++) { - snprintf(buf, sizeof(buf), "0x1.p%d", e); - ld = strtold(buf, &end); - assert(*end == '\0'); - i = ilogbl(ld); - assert(i == e); - } - printf("ok 3 - ilogbl\n"); - - return (0); -} diff --git a/tools/regression/lib/msun/test-ilogb.t b/tools/regression/lib/msun/test-ilogb.t deleted file mode 100644 index 8bdfd03..0000000 --- a/tools/regression/lib/msun/test-ilogb.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -cd `dirname $0` - -executable=`basename $0 .t` - -make $executable 2>&1 > /dev/null - -exec ./$executable diff --git a/tools/regression/lib/msun/test-invctrig.c b/tools/regression/lib/msun/test-invctrig.c deleted file mode 100644 index 78b1119..0000000 --- a/tools/regression/lib/msun/test-invctrig.c +++ /dev/null @@ -1,367 +0,0 @@ -/*- - * Copyright (c) 2008-2013 David Schultz <das@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Tests for casin[h](), cacos[h](), and catan[h](). - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <assert.h> -#include <complex.h> -#include <fenv.h> -#include <float.h> -#include <math.h> -#include <stdio.h> - -#include "test-utils.h" - -#pragma STDC FENV_ACCESS ON -#pragma STDC CX_LIMITED_RANGE OFF - -/* - * Test that a function returns the correct value and sets the - * exception flags correctly. The exceptmask specifies which - * exceptions we should check. We need to be lenient for several - * reasons, but mainly because on some architectures it's impossible - * to raise FE_OVERFLOW without raising FE_INEXACT. - * - * These are macros instead of functions so that assert provides more - * meaningful error messages. - * - * XXX The volatile here is to avoid gcc's bogus constant folding and work - * around the lack of support for the FENV_ACCESS pragma. - */ -#define test_p(func, z, result, exceptmask, excepts, checksign) do { \ - volatile long double complex _d = z; \ - debug(" testing %s(%Lg + %Lg I) == %Lg + %Lg I\n", #func, \ - creall(_d), cimagl(_d), creall(result), cimagl(result)); \ - assert(feclearexcept(FE_ALL_EXCEPT) == 0); \ - assert(cfpequal_cs((func)(_d), (result), (checksign))); \ - assert(((void)(func), fetestexcept(exceptmask) == (excepts))); \ -} while (0) - -/* - * Test within a given tolerance. The tolerance indicates relative error - * in ulps. - */ -#define test_p_tol(func, z, result, tol) do { \ - volatile long double complex _d = z; \ - debug(" testing %s(%Lg + %Lg I) ~= %Lg + %Lg I\n", #func, \ - creall(_d), cimagl(_d), creall(result), cimagl(result)); \ - assert(cfpequal_tol((func)(_d), (result), (tol), CS_BOTH)); \ -} while (0) - -/* These wrappers apply the identities f(conj(z)) = conj(f(z)). */ -#define test(func, z, result, exceptmask, excepts, checksign) do { \ - test_p(func, z, result, exceptmask, excepts, checksign); \ - test_p(func, conjl(z), conjl(result), exceptmask, excepts, checksign); \ -} while (0) -#define test_tol(func, z, result, tol) do { \ - test_p_tol(func, z, result, tol); \ - test_p_tol(func, conjl(z), conjl(result), tol); \ -} while (0) - -/* Test the given function in all precisions. */ -#define testall(func, x, result, exceptmask, excepts, checksign) do { \ - test(func, x, result, exceptmask, excepts, checksign); \ - test(func##f, x, result, exceptmask, excepts, checksign); \ -} while (0) -#define testall_odd(func, x, result, exceptmask, excepts, checksign) do { \ - testall(func, x, result, exceptmask, excepts, checksign); \ - testall(func, -(x), -result, exceptmask, excepts, checksign); \ -} while (0) -#define testall_even(func, x, result, exceptmask, excepts, checksign) do { \ - testall(func, x, result, exceptmask, excepts, checksign); \ - testall(func, -(x), result, exceptmask, excepts, checksign); \ -} while (0) - -/* - * Test the given function in all precisions, within a given tolerance. - * The tolerance is specified in ulps. - */ -#define testall_tol(func, x, result, tol) do { \ - test_tol(func, x, result, (tol) * DBL_ULP()); \ - test_tol(func##f, x, result, (tol) * FLT_ULP()); \ -} while (0) -#define testall_odd_tol(func, x, result, tol) do { \ - testall_tol(func, x, result, tol); \ - testall_tol(func, -(x), -result, tol); \ -} while (0) -#define testall_even_tol(func, x, result, tol) do { \ - testall_tol(func, x, result, tol); \ - testall_tol(func, -(x), result, tol); \ -} while (0) - -static const long double -pi = 3.14159265358979323846264338327950280L, -c3pi = 9.42477796076937971538793014983850839L; - - -/* Tests for 0 */ -void -test_zero(void) -{ - long double complex zero = CMPLXL(0.0, 0.0); - - testall_tol(cacosh, zero, CMPLXL(0.0, pi / 2), 1); - testall_tol(cacosh, -zero, CMPLXL(0.0, -pi / 2), 1); - testall_tol(cacos, zero, CMPLXL(pi / 2, -0.0), 1); - testall_tol(cacos, -zero, CMPLXL(pi / 2, 0.0), 1); - - testall_odd(casinh, zero, zero, ALL_STD_EXCEPT, 0, CS_BOTH); - testall_odd(casin, zero, zero, ALL_STD_EXCEPT, 0, CS_BOTH); - - testall_odd(catanh, zero, zero, ALL_STD_EXCEPT, 0, CS_BOTH); - testall_odd(catan, zero, zero, ALL_STD_EXCEPT, 0, CS_BOTH); -} - -/* - * Tests for NaN inputs. - */ -void -test_nan() -{ - long double complex nan_nan = CMPLXL(NAN, NAN); - long double complex z; - - /* - * IN CACOSH CACOS CASINH CATANH - * NaN,NaN NaN,NaN NaN,NaN NaN,NaN NaN,NaN - * finite,NaN NaN,NaN* NaN,NaN* NaN,NaN* NaN,NaN* - * NaN,finite NaN,NaN* NaN,NaN* NaN,NaN* NaN,NaN* - * NaN,Inf Inf,NaN NaN,-Inf ?Inf,NaN ?0,pi/2 - * +-Inf,NaN Inf,NaN NaN,?Inf +-Inf,NaN +-0,NaN - * +-0,NaN NaN,NaN* pi/2,NaN NaN,NaN* +-0,NaN - * NaN,0 NaN,NaN* NaN,NaN* NaN,0 NaN,NaN* - * - * * = raise invalid - */ - z = nan_nan; - testall(cacosh, z, nan_nan, ALL_STD_EXCEPT, 0, 0); - testall(cacos, z, nan_nan, ALL_STD_EXCEPT, 0, 0); - testall(casinh, z, nan_nan, ALL_STD_EXCEPT, 0, 0); - testall(casin, z, nan_nan, ALL_STD_EXCEPT, 0, 0); - testall(catanh, z, nan_nan, ALL_STD_EXCEPT, 0, 0); - testall(catan, z, nan_nan, ALL_STD_EXCEPT, 0, 0); - - z = CMPLXL(0.5, NAN); - testall(cacosh, z, nan_nan, OPT_INVALID, 0, 0); - testall(cacos, z, nan_nan, OPT_INVALID, 0, 0); - testall(casinh, z, nan_nan, OPT_INVALID, 0, 0); - testall(casin, z, nan_nan, OPT_INVALID, 0, 0); - testall(catanh, z, nan_nan, OPT_INVALID, 0, 0); - testall(catan, z, nan_nan, OPT_INVALID, 0, 0); - - z = CMPLXL(NAN, 0.5); - testall(cacosh, z, nan_nan, OPT_INVALID, 0, 0); - testall(cacos, z, nan_nan, OPT_INVALID, 0, 0); - testall(casinh, z, nan_nan, OPT_INVALID, 0, 0); - testall(casin, z, nan_nan, OPT_INVALID, 0, 0); - testall(catanh, z, nan_nan, OPT_INVALID, 0, 0); - testall(catan, z, nan_nan, OPT_INVALID, 0, 0); - - z = CMPLXL(NAN, INFINITY); - testall(cacosh, z, CMPLXL(INFINITY, NAN), ALL_STD_EXCEPT, 0, CS_REAL); - testall(cacosh, -z, CMPLXL(INFINITY, NAN), ALL_STD_EXCEPT, 0, CS_REAL); - testall(cacos, z, CMPLXL(NAN, -INFINITY), ALL_STD_EXCEPT, 0, CS_IMAG); - testall(casinh, z, CMPLXL(INFINITY, NAN), ALL_STD_EXCEPT, 0, 0); - testall(casin, z, CMPLXL(NAN, INFINITY), ALL_STD_EXCEPT, 0, CS_IMAG); - testall_tol(catanh, z, CMPLXL(0.0, pi / 2), 1); - testall(catan, z, CMPLXL(NAN, 0.0), ALL_STD_EXCEPT, 0, CS_IMAG); - - z = CMPLXL(INFINITY, NAN); - testall_even(cacosh, z, CMPLXL(INFINITY, NAN), ALL_STD_EXCEPT, 0, - CS_REAL); - testall_even(cacos, z, CMPLXL(NAN, INFINITY), ALL_STD_EXCEPT, 0, 0); - testall_odd(casinh, z, CMPLXL(INFINITY, NAN), ALL_STD_EXCEPT, 0, - CS_REAL); - testall_odd(casin, z, CMPLXL(NAN, INFINITY), ALL_STD_EXCEPT, 0, 0); - testall_odd(catanh, z, CMPLXL(0.0, NAN), ALL_STD_EXCEPT, 0, CS_REAL); - testall_odd_tol(catan, z, CMPLXL(pi / 2, 0.0), 1); - - z = CMPLXL(0.0, NAN); - /* XXX We allow a spurious inexact exception here. */ - testall_even(cacosh, z, nan_nan, OPT_INVALID & ~FE_INEXACT, 0, 0); - testall_even_tol(cacos, z, CMPLXL(pi / 2, NAN), 1); - testall_odd(casinh, z, nan_nan, OPT_INVALID, 0, 0); - testall_odd(casin, z, CMPLXL(0.0, NAN), ALL_STD_EXCEPT, 0, CS_REAL); - testall_odd(catanh, z, CMPLXL(0.0, NAN), OPT_INVALID, 0, CS_REAL); - testall_odd(catan, z, nan_nan, OPT_INVALID, 0, 0); - - z = CMPLXL(NAN, 0.0); - testall(cacosh, z, nan_nan, OPT_INVALID, 0, 0); - testall(cacos, z, nan_nan, OPT_INVALID, 0, 0); - testall(casinh, z, CMPLXL(NAN, 0), ALL_STD_EXCEPT, 0, CS_IMAG); - testall(casin, z, nan_nan, OPT_INVALID, 0, 0); - testall(catanh, z, nan_nan, OPT_INVALID, 0, CS_IMAG); - testall(catan, z, CMPLXL(NAN, 0.0), ALL_STD_EXCEPT, 0, 0); -} - -void -test_inf(void) -{ - long double complex z; - - /* - * IN CACOSH CACOS CASINH CATANH - * Inf,Inf Inf,pi/4 pi/4,-Inf Inf,pi/4 0,pi/2 - * -Inf,Inf Inf,3pi/4 3pi/4,-Inf --- --- - * Inf,finite Inf,0 0,-Inf Inf,0 0,pi/2 - * -Inf,finite Inf,pi pi,-Inf --- --- - * finite,Inf Inf,pi/2 pi/2,-Inf Inf,pi/2 0,pi/2 - */ - z = CMPLXL(INFINITY, INFINITY); - testall_tol(cacosh, z, CMPLXL(INFINITY, pi / 4), 1); - testall_tol(cacosh, -z, CMPLXL(INFINITY, -c3pi / 4), 1); - testall_tol(cacos, z, CMPLXL(pi / 4, -INFINITY), 1); - testall_tol(cacos, -z, CMPLXL(c3pi / 4, INFINITY), 1); - testall_odd_tol(casinh, z, CMPLXL(INFINITY, pi / 4), 1); - testall_odd_tol(casin, z, CMPLXL(pi / 4, INFINITY), 1); - testall_odd_tol(catanh, z, CMPLXL(0, pi / 2), 1); - testall_odd_tol(catan, z, CMPLXL(pi / 2, 0), 1); - - z = CMPLXL(INFINITY, 0.5); - /* XXX We allow a spurious inexact exception here. */ - testall(cacosh, z, CMPLXL(INFINITY, 0), OPT_INEXACT, 0, CS_BOTH); - testall_tol(cacosh, -z, CMPLXL(INFINITY, -pi), 1); - testall(cacos, z, CMPLXL(0, -INFINITY), OPT_INEXACT, 0, CS_BOTH); - testall_tol(cacos, -z, CMPLXL(pi, INFINITY), 1); - testall_odd(casinh, z, CMPLXL(INFINITY, 0), OPT_INEXACT, 0, CS_BOTH); - testall_odd_tol(casin, z, CMPLXL(pi / 2, INFINITY), 1); - testall_odd_tol(catanh, z, CMPLXL(0, pi / 2), 1); - testall_odd_tol(catan, z, CMPLXL(pi / 2, 0), 1); - - z = CMPLXL(0.5, INFINITY); - testall_tol(cacosh, z, CMPLXL(INFINITY, pi / 2), 1); - testall_tol(cacosh, -z, CMPLXL(INFINITY, -pi / 2), 1); - testall_tol(cacos, z, CMPLXL(pi / 2, -INFINITY), 1); - testall_tol(cacos, -z, CMPLXL(pi / 2, INFINITY), 1); - testall_odd_tol(casinh, z, CMPLXL(INFINITY, pi / 2), 1); - /* XXX We allow a spurious inexact exception here. */ - testall_odd(casin, z, CMPLXL(0.0, INFINITY), OPT_INEXACT, 0, CS_BOTH); - testall_odd_tol(catanh, z, CMPLXL(0, pi / 2), 1); - testall_odd_tol(catan, z, CMPLXL(pi / 2, 0), 1); -} - -/* Tests along the real and imaginary axes. */ -void -test_axes(void) -{ - static const long double nums[] = { - -2, -1, -0.5, 0.5, 1, 2 - }; - long double complex z; - int i; - - for (i = 0; i < sizeof(nums) / sizeof(nums[0]); i++) { - /* Real axis */ - z = CMPLXL(nums[i], 0.0); - if (fabs(nums[i]) <= 1) { - testall_tol(cacosh, z, CMPLXL(0.0, acos(nums[i])), 1); - testall_tol(cacos, z, CMPLXL(acosl(nums[i]), -0.0), 1); - testall_tol(casin, z, CMPLXL(asinl(nums[i]), 0.0), 1); - testall_tol(catanh, z, CMPLXL(atanh(nums[i]), 0.0), 1); - } else { - testall_tol(cacosh, z, - CMPLXL(acosh(fabs(nums[i])), - (nums[i] < 0) ? pi : 0), 1); - testall_tol(cacos, z, - CMPLXL((nums[i] < 0) ? pi : 0, - -acosh(fabs(nums[i]))), 1); - testall_tol(casin, z, - CMPLXL(copysign(pi / 2, nums[i]), - acosh(fabs(nums[i]))), 1); - testall_tol(catanh, z, - CMPLXL(atanh(1 / nums[i]), pi / 2), 1); - } - testall_tol(casinh, z, CMPLXL(asinh(nums[i]), 0.0), 1); - testall_tol(catan, z, CMPLXL(atan(nums[i]), 0), 1); - - /* TODO: Test the imaginary axis. */ - } -} - -void -test_small(void) -{ - /* - * z = 0.75 + i 0.25 - * acos(z) = Pi/4 - i ln(2)/2 - * asin(z) = Pi/4 + i ln(2)/2 - * atan(z) = atan(4)/2 + i ln(17/9)/4 - */ - complex long double z; - complex long double acos_z; - complex long double asin_z; - complex long double atan_z; - - z = CMPLXL(0.75L, 0.25L); - acos_z = CMPLXL(pi / 4, -0.34657359027997265470861606072908828L); - asin_z = CMPLXL(pi / 4, 0.34657359027997265470861606072908828L); - atan_z = CMPLXL(0.66290883183401623252961960521423782L, - 0.15899719167999917436476103600701878L); - - testall_tol(cacos, z, acos_z, 2); - testall_odd_tol(casin, z, asin_z, 2); - testall_odd_tol(catan, z, atan_z, 2); -} - -/* Test inputs that might cause overflow in a sloppy implementation. */ -void -test_large(void) -{ - - /* TODO: Write these tests */ -} - -int -main(int argc, char *argv[]) -{ - - printf("1..6\n"); - - test_zero(); - printf("ok 1 - invctrig zero\n"); - - test_nan(); - printf("ok 2 - invctrig nan\n"); - - test_inf(); - printf("ok 3 - invctrig inf\n"); - - test_axes(); - printf("ok 4 - invctrig axes\n"); - - test_small(); - printf("ok 5 - invctrig small\n"); - - test_large(); - printf("ok 6 - invctrig large\n"); - - return (0); -} diff --git a/tools/regression/lib/msun/test-logarithm.c b/tools/regression/lib/msun/test-logarithm.c deleted file mode 100644 index 18b9ebe..0000000 --- a/tools/regression/lib/msun/test-logarithm.c +++ /dev/null @@ -1,286 +0,0 @@ -/*- - * Copyright (c) 2008-2010 David Schultz <das@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Tests for corner cases in log*(). - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <assert.h> -#include <fenv.h> -#include <float.h> -#include <math.h> -#include <stdio.h> - -#ifdef __i386__ -#include <ieeefp.h> -#endif - -#include "test-utils.h" - -#pragma STDC FENV_ACCESS ON - -/* - * Test that a function returns the correct value and sets the - * exception flags correctly. The exceptmask specifies which - * exceptions we should check. We need to be lenient for several - * reasoons, but mainly because on some architectures it's impossible - * to raise FE_OVERFLOW without raising FE_INEXACT. - * - * These are macros instead of functions so that assert provides more - * meaningful error messages. - * - * XXX The volatile here is to avoid gcc's bogus constant folding and work - * around the lack of support for the FENV_ACCESS pragma. - */ -#define test(func, x, result, exceptmask, excepts) do { \ - volatile long double _d = x; \ - assert(feclearexcept(FE_ALL_EXCEPT) == 0); \ - assert(fpequal((func)(_d), (result))); \ - assert(((void)(func), fetestexcept(exceptmask) == (excepts))); \ -} while (0) - -#define test(func, x, result, exceptmask, excepts) do { \ - volatile long double _d = x; \ - assert(feclearexcept(FE_ALL_EXCEPT) == 0); \ - assert(fpequal((func)(_d), (result))); \ - assert(((void)(func), fetestexcept(exceptmask) == (excepts))); \ -} while (0) - -#define test_tol(func, z, result, tol) do { \ - volatile long double _d = z; \ - debug(" testing %6s(%15La) ~= % .36Le\n", #func, _d, result); \ - assert(fpequal_tol((func)(_d), (result), (tol), CS_BOTH)); \ -} while (0) - -/* Test all the functions that compute log(x). */ -#define testall0(x, result, exceptmask, excepts) do { \ - test(log, x, result, exceptmask, excepts); \ - test(logf, x, result, exceptmask, excepts); \ - test(logl, x, result, exceptmask, excepts); \ - test(log2, x, result, exceptmask, excepts); \ - test(log2f, x, result, exceptmask, excepts); \ - test(log2l, x, result, exceptmask, excepts); \ - test(log10, x, result, exceptmask, excepts); \ - test(log10f, x, result, exceptmask, excepts); \ - test(log10l, x, result, exceptmask, excepts); \ -} while (0) - -/* Test all the functions that compute log(1+x). */ -#define testall1(x, result, exceptmask, excepts) do { \ - test(log1p, x, result, exceptmask, excepts); \ - test(log1pf, x, result, exceptmask, excepts); \ - test(log1pl, x, result, exceptmask, excepts); \ -} while (0) - -void -run_generic_tests(void) -{ - - /* log(1) == 0, no exceptions raised */ - testall0(1.0, 0.0, ALL_STD_EXCEPT, 0); - testall1(0.0, 0.0, ALL_STD_EXCEPT, 0); - testall1(-0.0, -0.0, ALL_STD_EXCEPT, 0); - - /* log(NaN) == NaN, no exceptions raised */ - testall0(NAN, NAN, ALL_STD_EXCEPT, 0); - testall1(NAN, NAN, ALL_STD_EXCEPT, 0); - - /* log(Inf) == Inf, no exceptions raised */ - testall0(INFINITY, INFINITY, ALL_STD_EXCEPT, 0); - testall1(INFINITY, INFINITY, ALL_STD_EXCEPT, 0); - - /* log(x) == NaN for x < 0, invalid exception raised */ - testall0(-INFINITY, NAN, ALL_STD_EXCEPT, FE_INVALID); - testall1(-INFINITY, NAN, ALL_STD_EXCEPT, FE_INVALID); - testall0(-1.0, NAN, ALL_STD_EXCEPT, FE_INVALID); - testall1(-1.5, NAN, ALL_STD_EXCEPT, FE_INVALID); - - /* log(0) == -Inf, divide-by-zero exception */ - testall0(0.0, -INFINITY, ALL_STD_EXCEPT & ~FE_INEXACT, FE_DIVBYZERO); - testall0(-0.0, -INFINITY, ALL_STD_EXCEPT & ~FE_INEXACT, FE_DIVBYZERO); - testall1(-1.0, -INFINITY, ALL_STD_EXCEPT & ~FE_INEXACT, FE_DIVBYZERO); -} - -void -run_log2_tests(void) -{ - int i; - - /* - * We should insist that log2() return exactly the correct - * result and not raise an inexact exception for powers of 2. - */ - feclearexcept(FE_ALL_EXCEPT); - for (i = FLT_MIN_EXP - FLT_MANT_DIG; i < FLT_MAX_EXP; i++) { - assert(log2f(ldexpf(1.0, i)) == i); - assert(fetestexcept(ALL_STD_EXCEPT) == 0); - } - for (i = DBL_MIN_EXP - DBL_MANT_DIG; i < DBL_MAX_EXP; i++) { - assert(log2(ldexp(1.0, i)) == i); - assert(fetestexcept(ALL_STD_EXCEPT) == 0); - } - for (i = LDBL_MIN_EXP - LDBL_MANT_DIG; i < LDBL_MAX_EXP; i++) { - assert(log2l(ldexpl(1.0, i)) == i); -#if 0 - /* XXX This test does not pass yet. */ - assert(fetestexcept(ALL_STD_EXCEPT) == 0); -#endif - } -} - -void -run_roundingmode_tests(void) -{ - - /* - * Corner cases in other rounding modes. - */ - fesetround(FE_DOWNWARD); - /* These are still positive per IEEE 754R */ -#if 0 - testall0(1.0, 0.0, ALL_STD_EXCEPT, 0); -#else - /* logl, log2l, and log10l don't pass yet. */ - test(log, 1.0, 0.0, ALL_STD_EXCEPT, 0); - test(logf, 1.0, 0.0, ALL_STD_EXCEPT, 0); - test(log2, 1.0, 0.0, ALL_STD_EXCEPT, 0); - test(log2f, 1.0, 0.0, ALL_STD_EXCEPT, 0); - test(log10, 1.0, 0.0, ALL_STD_EXCEPT, 0); - test(log10f, 1.0, 0.0, ALL_STD_EXCEPT, 0); -#endif - testall1(0.0, 0.0, ALL_STD_EXCEPT, 0); - fesetround(FE_TOWARDZERO); - testall0(1.0, 0.0, ALL_STD_EXCEPT, 0); - testall1(0.0, 0.0, ALL_STD_EXCEPT, 0); - - fesetround(FE_UPWARD); - testall0(1.0, 0.0, ALL_STD_EXCEPT, 0); - testall1(0.0, 0.0, ALL_STD_EXCEPT, 0); - /* log1p(-0.0) == -0.0 even when rounding upwards */ - testall1(-0.0, -0.0, ALL_STD_EXCEPT, 0); - - fesetround(FE_TONEAREST); -} - -void -run_accuracy_tests(void) -{ - static const struct { - float x; - long double log2x; - long double logex; - long double log10x; - } tests[] = { - { 0x1p-120 + 0x1p-140, - -1.19999998624139449158861798943319717e2L, - -8.31776607135195754708796206665656732e1L, - -3.61235990655024477716980559136055915e1L, - }, - { 1.0 - 0x1p-20, - -1.37586186296463416424364914705656460e-6L, - -9.53674771153890007250243736279163253e-7L, - -4.14175690642480911859354110516159131e-7L, }, - { 1.0 + 0x1p-20, - 1.37586055084113820105668028340371476e-6L, - 9.53673861659188233908415514963336144e-7L, - 4.14175295653950611453333571759200697e-7L }, - { 19.75, - 4.30378074817710292442728634194115348e0L, - 2.98315349134713087533848129856505779e0L, - 1.29556709996247903756734359702926363e0L }, - { 19.75 * 0x1p100, - 1.043037807481771029244272863419411534e2L, - 7.229787154734166181706169344438271459e1L, - 3.139856666636059855894123306947856631e1L }, - }; - int i; - - for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) { - test_tol(log2, tests[i].x, tests[i].log2x, DBL_ULP()); - test_tol(log2f, tests[i].x, tests[i].log2x, FLT_ULP()); - test_tol(log2l, tests[i].x, tests[i].log2x, LDBL_ULP()); - test_tol(log, tests[i].x, tests[i].logex, DBL_ULP()); - test_tol(logf, tests[i].x, tests[i].logex, FLT_ULP()); - test_tol(logl, tests[i].x, tests[i].logex, LDBL_ULP()); - test_tol(log10, tests[i].x, tests[i].log10x, DBL_ULP()); - test_tol(log10f, tests[i].x, tests[i].log10x, FLT_ULP()); - test_tol(log10l, tests[i].x, tests[i].log10x, LDBL_ULP()); - if (tests[i].x >= 0.5) { - test_tol(log1p, tests[i].x - 1, tests[i].logex, - DBL_ULP()); - test_tol(log1pf, tests[i].x - 1, tests[i].logex, - FLT_ULP()); - test_tol(log1pl, tests[i].x - 1, tests[i].logex, - LDBL_ULP()); - } - } -} - -void -run_log1p_accuracy_tests(void) -{ - - test_tol(log1pf, 0x0.333333p0F, - 1.82321546859847114303367992804596800640e-1L, FLT_ULP()); - test_tol(log1p, 0x0.3333333333333p0, - 1.82321556793954589204283870982629267635e-1L, DBL_ULP()); - test_tol(log1pl, 0x0.33333333333333332p0L, - 1.82321556793954626202683007050468762914e-1L, LDBL_ULP()); - - test_tol(log1pf, -0x0.333333p0F, - -2.23143536413048672940940199918017467652e-1L, FLT_ULP()); - test_tol(log1p, -0x0.3333333333333p0, - -2.23143551314209700255143859052009022937e-1L, DBL_ULP()); - test_tol(log1pl, -0x0.33333333333333332p0L, - -2.23143551314209755752742563153765697950e-1L, LDBL_ULP()); -} - -int -main(int argc, char *argv[]) -{ - - printf("1..5\n"); - - run_generic_tests(); - printf("ok 1 - logarithm\n"); - - run_log2_tests(); - printf("ok 2 - logarithm\n"); - - run_roundingmode_tests(); - printf("ok 3 - logarithm\n"); - - run_accuracy_tests(); - printf("ok 4 - logarithm\n"); - - run_log1p_accuracy_tests(); - printf("ok 5 - logarithm\n"); - - return (0); -} diff --git a/tools/regression/lib/msun/test-logarithm.t b/tools/regression/lib/msun/test-logarithm.t deleted file mode 100644 index 8bdfd03..0000000 --- a/tools/regression/lib/msun/test-logarithm.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -cd `dirname $0` - -executable=`basename $0 .t` - -make $executable 2>&1 > /dev/null - -exec ./$executable diff --git a/tools/regression/lib/msun/test-lrint.c b/tools/regression/lib/msun/test-lrint.c deleted file mode 100644 index ba099aa..0000000 --- a/tools/regression/lib/msun/test-lrint.c +++ /dev/null @@ -1,149 +0,0 @@ -/*- - * Copyright (c) 2005-2008 David Schultz <das@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Test for lrint(), lrintf(), llrint(), and llrintf(). - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <assert.h> -#include <fenv.h> -#include <limits.h> -#include <math.h> -#include <stdio.h> - -#ifdef __i386__ -#include <ieeefp.h> -#endif - -/* - * XXX The volatile here is to avoid gcc's bogus constant folding and work - * around the lack of support for the FENV_ACCESS pragma. - */ -#define test(func, x, result, excepts) do { \ - volatile double _d = x; \ - assert(feclearexcept(FE_ALL_EXCEPT) == 0); \ - assert((func)(_d) == (result) || fetestexcept(FE_INVALID)); \ - assert(fetestexcept(FE_ALL_EXCEPT) == (excepts)); \ -} while (0) - -#define testall(x, result, excepts) do { \ - test(lrint, x, result, excepts); \ - test(lrintf, x, result, excepts); \ - test(lrintl, x, result, excepts); \ - test(llrint, x, result, excepts); \ - test(llrintf, x, result, excepts); \ - test(llrintl, x, result, excepts); \ -} while (0) - -#define IGNORE 0 - -#pragma STDC FENV_ACCESS ON - -void -run_tests(void) -{ - - assert(fesetround(FE_DOWNWARD) == 0); - testall(0.75, 0, FE_INEXACT); - testall(-0.5, -1, FE_INEXACT); - - assert(fesetround(FE_TONEAREST) == 0); - testall(0.0, 0, 0); - testall(0.25, 0, FE_INEXACT); - testall(0.5, 0, FE_INEXACT); - testall(-2.5, -2, FE_INEXACT); - testall(1.0, 1, 0); - testall(0x12345000p0, 0x12345000, 0); - testall(0x1234.fp0, 0x1235, FE_INEXACT); - testall(INFINITY, IGNORE, FE_INVALID); - testall(NAN, IGNORE, FE_INVALID); - -#if (LONG_MAX == 0x7fffffffl) - assert(fesetround(FE_UPWARD) == 0); - test(lrint, 0x7fffffff.8p0, IGNORE, FE_INVALID); - test(lrint, -0x80000000.4p0, -0x80000000l, FE_INEXACT); - - assert(fesetround(FE_DOWNWARD) == 0); - test(lrint, -0x80000000.8p0, IGNORE, FE_INVALID); - test(lrint, 0x80000000.0p0, IGNORE, FE_INVALID); - test(lrint, 0x7fffffff.4p0, 0x7fffffffl, FE_INEXACT); - test(lrintf, 0x80000000.0p0f, IGNORE, FE_INVALID); - test(lrintf, 0x7fffff80.0p0f, 0x7fffff80l, 0); - - assert(fesetround(FE_TOWARDZERO) == 0); - test(lrint, 0x7fffffff.8p0, 0x7fffffffl, FE_INEXACT); - test(lrint, -0x80000000.8p0, -0x80000000l, FE_INEXACT); - test(lrint, 0x80000000.0p0, IGNORE, FE_INVALID); - test(lrintf, 0x80000000.0p0f, IGNORE, FE_INVALID); - test(lrintf, 0x7fffff80.0p0f, 0x7fffff80l, 0); -#elif (LONG_MAX == 0x7fffffffffffffffll) - assert(fesetround(FE_TONEAREST) == 0); - test(lrint, 0x8000000000000000.0p0, IGNORE, FE_INVALID); - test(lrintf, 0x8000000000000000.0p0f, IGNORE, FE_INVALID); - test(lrint, 0x7ffffffffffffc00.0p0, 0x7ffffffffffffc00l, 0); - test(lrintf, 0x7fffff8000000000.0p0f, 0x7fffff8000000000l, 0); - test(lrint, -0x8000000000000800.0p0, IGNORE, FE_INVALID); - test(lrintf, -0x8000010000000000.0p0f, IGNORE, FE_INVALID); - test(lrint, -0x8000000000000000.0p0, -0x8000000000000000l, 0); - test(lrintf, -0x8000000000000000.0p0f, -0x8000000000000000l, 0); -#else -#error "Unsupported long size" -#endif - -#if (LLONG_MAX == 0x7fffffffffffffffLL) - assert(fesetround(FE_TONEAREST) == 0); - test(llrint, 0x8000000000000000.0p0, IGNORE, FE_INVALID); - test(llrintf, 0x8000000000000000.0p0f, IGNORE, FE_INVALID); - test(llrint, 0x7ffffffffffffc00.0p0, 0x7ffffffffffffc00ll, 0); - test(llrintf, 0x7fffff8000000000.0p0f, 0x7fffff8000000000ll, 0); - test(llrint, -0x8000000000000800.0p0, IGNORE, FE_INVALID); - test(llrintf, -0x8000010000000000.0p0f, IGNORE, FE_INVALID); - test(llrint, -0x8000000000000000.0p0, -0x8000000000000000ll, 0); - test(llrintf, -0x8000000000000000.0p0f, -0x8000000000000000ll, 0); -#else -#error "Unsupported long long size" -#endif -} - -int -main(int argc, char *argv[]) -{ - - printf("1..1\n"); - - run_tests(); -#ifdef __i386__ - fpsetprec(FP_PE); - run_tests(); -#endif - - printf("ok 1 - lrint\n"); - - return (0); -} diff --git a/tools/regression/lib/msun/test-lrint.t b/tools/regression/lib/msun/test-lrint.t deleted file mode 100644 index 8bdfd03..0000000 --- a/tools/regression/lib/msun/test-lrint.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -cd `dirname $0` - -executable=`basename $0 .t` - -make $executable 2>&1 > /dev/null - -exec ./$executable diff --git a/tools/regression/lib/msun/test-nan.c b/tools/regression/lib/msun/test-nan.c deleted file mode 100644 index c12926b..0000000 --- a/tools/regression/lib/msun/test-nan.c +++ /dev/null @@ -1,122 +0,0 @@ -/*- - * Copyright (C) 2007 David Schultz <das@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Test for nan(), nanf(), and nanl(). We also test that strtod("nan(...)") - * and sscanf("nan(...)", ...) work identically. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <assert.h> -#include <fenv.h> -#include <float.h> -#include <locale.h> -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -void -testnan(const char *nan_format) -{ - char nan_str[128]; - char *end; - long double ald[4]; - double ad[4]; - float af[4]; - int i; - - snprintf(nan_str, sizeof(nan_str), "nan(%s)", nan_format); - for (i = 0; i < 4; i++) { - /* - * x86 has an 80-bit long double stored in 96 bits, - * so we need to initialize the memory for the memcmp() - * checks below to work. - */ - bzero(&af[i], sizeof(float)); - bzero(&ad[i], sizeof(double)); - bzero(&ald[i], sizeof(long double)); - - } - - af[0] = nanf(nan_format); - assert(isnan(af[0])); - af[1] = strtof(nan_str, &end); - assert(end == nan_str + strlen(nan_str)); - assert(sscanf(nan_str, "%e", &af[2]) == 1); - assert(memcmp(&af[0], &af[1], sizeof(float)) == 0); - assert(memcmp(&af[1], &af[2], sizeof(float)) == 0); - if (*nan_format == '\0') { - /* nanf("") == strtof("nan") */ - af[3] = strtof("nan", NULL); - assert(memcmp(&af[2], &af[3], sizeof(float)) == 0); - } - - ad[0] = nan(nan_format); - assert(isnan(ad[0])); - ad[1] = strtod(nan_str, &end); - assert(end == nan_str + strlen(nan_str)); - assert(sscanf(nan_str, "%le", &ad[2]) == 1); - assert(memcmp(&ad[0], &ad[1], sizeof(double)) == 0); - assert(memcmp(&ad[1], &ad[2], sizeof(double)) == 0); - if (*nan_format == '\0') { - /* nan("") == strtod("nan") */ - ad[3] = strtod("nan", NULL); - assert(memcmp(&ad[2], &ad[3], sizeof(double)) == 0); - } - - ald[0] = nanl(nan_format); - assert(isnan(ald[0])); - ald[1] = strtold(nan_str, &end); - assert(end == nan_str + strlen(nan_str)); - assert(sscanf(nan_str, "%Le", &ald[2]) == 1); - assert(memcmp(&ald[0], &ald[1], sizeof(long double)) == 0); - assert(memcmp(&ald[1], &ald[2], sizeof(long double)) == 0); - if (*nan_format == '\0') { - /* nanl("") == strtold("nan") */ - ald[3] = strtold("nan", NULL); - assert(memcmp(&ald[2], &ald[3], sizeof(long double)) == 0); - } -} - -int -main(int argc, char *argv[]) -{ - - printf("1..1\n"); - - /* Die if a signalling NaN is returned */ - feenableexcept(FE_INVALID); - - testnan("0x1234"); - testnan(""); - - printf("ok 1 - nan\n"); - - return (0); -} diff --git a/tools/regression/lib/msun/test-nan.t b/tools/regression/lib/msun/test-nan.t deleted file mode 100644 index 8bdfd03..0000000 --- a/tools/regression/lib/msun/test-nan.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -cd `dirname $0` - -executable=`basename $0 .t` - -make $executable 2>&1 > /dev/null - -exec ./$executable diff --git a/tools/regression/lib/msun/test-nearbyint.c b/tools/regression/lib/msun/test-nearbyint.c deleted file mode 100644 index 602ea2a..0000000 --- a/tools/regression/lib/msun/test-nearbyint.c +++ /dev/null @@ -1,176 +0,0 @@ -/*- - * Copyright (c) 2010 David Schultz <das@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Tests for nearbyint{,f,l}() - * - * TODO: - * - adapt tests for rint(3) - * - tests for harder values (more mantissa bits than float) - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <assert.h> -#include <fenv.h> -#include <math.h> -#include <stdio.h> - -#include "test-utils.h" - -static int testnum; - -static const int rmodes[] = { - FE_TONEAREST, FE_DOWNWARD, FE_UPWARD, FE_TOWARDZERO, -}; - -/* Make sure we're testing the library, not some broken compiler built-ins. */ -double (*libnearbyint)(double) = nearbyint; -float (*libnearbyintf)(float) = nearbyintf; -long double (*libnearbyintl)(long double) = nearbyintl; -#define nearbyintf libnearbyintf -#define nearbyint libnearbyint -#define nearbyintl libnearbyintl - -static const struct { - float in; - float out[3]; /* one answer per rounding mode except towardzero */ -} tests[] = { -/* input output (expected) */ - { 0.0, { 0.0, 0.0, 0.0 }}, - { 0.5, { 0.0, 0.0, 1.0 }}, - { M_PI, { 3.0, 3.0, 4.0 }}, - { 65536.5, { 65536, 65536, 65537 }}, - { INFINITY, { INFINITY, INFINITY, INFINITY }}, - { NAN, { NAN, NAN, NAN }}, -}; - -static const int ntests = sizeof(tests) / sizeof(tests[0]); - -/* Get the appropriate result for the current rounding mode. */ -static float -get_output(int testindex, int rmodeindex, int negative) -{ - double out; - - if (negative) { /* swap downwards and upwards if input is negative */ - if (rmodeindex == 1) - rmodeindex = 2; - else if (rmodeindex == 2) - rmodeindex = 1; - } - if (rmodeindex == 3) /* FE_TOWARDZERO uses the value for downwards */ - rmodeindex = 1; - out = tests[testindex].out[rmodeindex]; - return (negative ? -out : out); -} - -static void -test_nearby(int testindex) -{ - float in, out; - int i; - - for (i = 0; i < sizeof(rmodes) / sizeof(rmodes[0]); i++) { - fesetround(rmodes[i]); - feclearexcept(ALL_STD_EXCEPT); - - in = tests[testindex].in; - out = get_output(testindex, i, 0); - assert(fpequal(out, libnearbyintf(in))); - assert(fpequal(out, nearbyint(in))); - assert(fpequal(out, nearbyintl(in))); - assert(fetestexcept(ALL_STD_EXCEPT) == 0); - - in = -tests[testindex].in; - out = get_output(testindex, i, 1); - assert(fpequal(out, nearbyintf(in))); - assert(fpequal(out, nearbyint(in))); - assert(fpequal(out, nearbyintl(in))); - assert(fetestexcept(ALL_STD_EXCEPT) == 0); - } - - printf("ok %d\t\t# nearbyint(+%g)\n", testnum++, in); -} - -static void -test_modf(int testindex) -{ - float in, out; - float ipartf, ipart_expected; - double ipart; - long double ipartl; - int i; - - for (i = 0; i < sizeof(rmodes) / sizeof(rmodes[0]); i++) { - fesetround(rmodes[i]); - feclearexcept(ALL_STD_EXCEPT); - - in = tests[testindex].in; - ipart_expected = tests[testindex].out[1]; - out = copysignf( - isinf(ipart_expected) ? 0.0 : in - ipart_expected, in); - ipartl = ipart = ipartf = 42.0; - - assert(fpequal(out, modff(in, &ipartf))); - assert(fpequal(ipart_expected, ipartf)); - assert(fpequal(out, modf(in, &ipart))); - assert(fpequal(ipart_expected, ipart)); - assert(fpequal(out, modfl(in, &ipartl))); - assert(fpequal(ipart_expected, ipartl)); - assert(fetestexcept(ALL_STD_EXCEPT) == 0); - - in = -in; - ipart_expected = -ipart_expected; - out = -out; - ipartl = ipart = ipartf = 42.0; - assert(fpequal(out, modff(in, &ipartf))); - assert(fpequal(ipart_expected, ipartf)); - assert(fpequal(out, modf(in, &ipart))); - assert(fpequal(ipart_expected, ipart)); - assert(fpequal(out, modfl(in, &ipartl))); - assert(fpequal(ipart_expected, ipartl)); - assert(fetestexcept(ALL_STD_EXCEPT) == 0); - } - - printf("ok %d\t\t# modf(+%g)\n", testnum++, in); -} - -int -main(int argc, char *argv[]) -{ - int i; - - printf("1..%d\n", ntests * 2); - testnum = 1; - for (i = 0; i < ntests; i++) { - test_nearby(i); - test_modf(i); - } - - return (0); -} diff --git a/tools/regression/lib/msun/test-nearbyint.t b/tools/regression/lib/msun/test-nearbyint.t deleted file mode 100644 index 8bdfd03..0000000 --- a/tools/regression/lib/msun/test-nearbyint.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -cd `dirname $0` - -executable=`basename $0 .t` - -make $executable 2>&1 > /dev/null - -exec ./$executable diff --git a/tools/regression/lib/msun/test-next.c b/tools/regression/lib/msun/test-next.c deleted file mode 100644 index d16fa77..0000000 --- a/tools/regression/lib/msun/test-next.c +++ /dev/null @@ -1,265 +0,0 @@ -/*- - * Copyright (c) 2005 David Schultz <das@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Test the correctness of nextafter{,f,l} and nexttoward{,f,l}. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <fenv.h> -#include <float.h> -#include <math.h> -#include <stdio.h> -#include <stdlib.h> - -#ifdef __i386__ -#include <ieeefp.h> -#endif - -#include "test-utils.h" - -#define test(exp, ans, ex) do { \ - double __ans = (ans); \ - feclearexcept(ALL_STD_EXCEPT); \ - _testl(#exp, __LINE__, (exp), __ans, (ex)); \ -} while (0) -#define testf(exp, ans, ex) do { \ - float __ans = (ans); \ - feclearexcept(ALL_STD_EXCEPT); \ - _testl(#exp, __LINE__, (exp), __ans, (ex)); \ -} while (0) -#define testl(exp, ans, ex) do { \ - long double __ans = (ans); \ - feclearexcept(ALL_STD_EXCEPT); \ - _testl(#exp, __LINE__, (exp), __ans, (ex)); \ -} while (0) -#define testboth(arg1, arg2, ans, ex, prec) do { \ - test##prec(nextafter##prec((arg1), (arg2)), (ans), (ex)); \ - test##prec(nexttoward##prec((arg1), (arg2)), (ans), (ex)); \ -} while (0) -#define testall(arg1, arg2, ans, ex) do { \ - testboth((arg1), (arg2), (ans), (ex), ); \ - testboth((arg1), (arg2), (ans), (ex), f); \ - testboth((arg1), (arg2), (ans), (ex), l); \ -} while (0) - -static void _testl(const char *, int, long double, long double, int); -static double idd(double); -static float idf(float); - -int -main(int argc, char *argv[]) -{ - static const int ex_under = FE_UNDERFLOW | FE_INEXACT; /* shorthand */ - static const int ex_over = FE_OVERFLOW | FE_INEXACT; - long double ldbl_small, ldbl_eps, ldbl_max; - - printf("1..5\n"); - -#ifdef __i386__ - fpsetprec(FP_PE); -#endif - /* - * We can't use a compile-time constant here because gcc on - * FreeBSD/i386 assumes long doubles are truncated to the - * double format. - */ - ldbl_small = ldexpl(1.0, LDBL_MIN_EXP - LDBL_MANT_DIG); - ldbl_eps = LDBL_EPSILON; - ldbl_max = ldexpl(1.0 - ldbl_eps / 2, LDBL_MAX_EXP); - - /* - * Special cases involving zeroes. - */ -#define ztest(prec) \ - test##prec(copysign##prec(1.0, nextafter##prec(0.0, -0.0)), -1.0, 0); \ - test##prec(copysign##prec(1.0, nextafter##prec(-0.0, 0.0)), 1.0, 0); \ - test##prec(copysign##prec(1.0, nexttoward##prec(0.0, -0.0)), -1.0, 0);\ - test##prec(copysign##prec(1.0, nexttoward##prec(-0.0, 0.0)), 1.0, 0) - - ztest(); - ztest(f); - ztest(l); -#undef ztest - -#define stest(next, eps, prec) \ - test##prec(next(-0.0, 42.0), eps, ex_under); \ - test##prec(next(0.0, -42.0), -eps, ex_under); \ - test##prec(next(0.0, INFINITY), eps, ex_under); \ - test##prec(next(-0.0, -INFINITY), -eps, ex_under) - - stest(nextafter, 0x1p-1074, ); - stest(nextafterf, 0x1p-149f, f); - stest(nextafterl, ldbl_small, l); - stest(nexttoward, 0x1p-1074, ); - stest(nexttowardf, 0x1p-149f, f); - stest(nexttowardl, ldbl_small, l); -#undef stest - - printf("ok 1 - next\n"); - - /* - * `x == y' and NaN tests - */ - testall(42.0, 42.0, 42.0, 0); - testall(-42.0, -42.0, -42.0, 0); - testall(INFINITY, INFINITY, INFINITY, 0); - testall(-INFINITY, -INFINITY, -INFINITY, 0); - testall(NAN, 42.0, NAN, 0); - testall(42.0, NAN, NAN, 0); - testall(NAN, NAN, NAN, 0); - - printf("ok 2 - next\n"); - - /* - * Tests where x is an ordinary normalized number - */ - testboth(1.0, 2.0, 1.0 + DBL_EPSILON, 0, ); - testboth(1.0, -INFINITY, 1.0 - DBL_EPSILON/2, 0, ); - testboth(1.0, 2.0, 1.0 + FLT_EPSILON, 0, f); - testboth(1.0, -INFINITY, 1.0 - FLT_EPSILON/2, 0, f); - testboth(1.0, 2.0, 1.0 + ldbl_eps, 0, l); - testboth(1.0, -INFINITY, 1.0 - ldbl_eps/2, 0, l); - - testboth(-1.0, 2.0, -1.0 + DBL_EPSILON/2, 0, ); - testboth(-1.0, -INFINITY, -1.0 - DBL_EPSILON, 0, ); - testboth(-1.0, 2.0, -1.0 + FLT_EPSILON/2, 0, f); - testboth(-1.0, -INFINITY, -1.0 - FLT_EPSILON, 0, f); - testboth(-1.0, 2.0, -1.0 + ldbl_eps/2, 0, l); - testboth(-1.0, -INFINITY, -1.0 - ldbl_eps, 0, l); - - /* Cases where nextafter(...) != nexttoward(...) */ - test(nexttoward(1.0, 1.0 + ldbl_eps), 1.0 + DBL_EPSILON, 0); - testf(nexttowardf(1.0, 1.0 + ldbl_eps), 1.0 + FLT_EPSILON, 0); - testl(nexttowardl(1.0, 1.0 + ldbl_eps), 1.0 + ldbl_eps, 0); - - printf("ok 3 - next\n"); - - /* - * Tests at word boundaries, normalization boundaries, etc. - */ - testboth(0x1.87654ffffffffp+0, INFINITY, 0x1.87655p+0, 0, ); - testboth(0x1.87655p+0, -INFINITY, 0x1.87654ffffffffp+0, 0, ); - testboth(0x1.fffffffffffffp+0, INFINITY, 0x1p1, 0, ); - testboth(0x1p1, -INFINITY, 0x1.fffffffffffffp+0, 0, ); - testboth(0x0.fffffffffffffp-1022, INFINITY, 0x1p-1022, 0, ); - testboth(0x1p-1022, -INFINITY, 0x0.fffffffffffffp-1022, ex_under, ); - - testboth(0x1.fffffep0f, INFINITY, 0x1p1, 0, f); - testboth(0x1p1, -INFINITY, 0x1.fffffep0f, 0, f); - testboth(0x0.fffffep-126f, INFINITY, 0x1p-126f, 0, f); - testboth(0x1p-126f, -INFINITY, 0x0.fffffep-126f, ex_under, f); - -#if LDBL_MANT_DIG == 53 - testboth(0x1.87654ffffffffp+0L, INFINITY, 0x1.87655p+0L, 0, l); - testboth(0x1.87655p+0L, -INFINITY, 0x1.87654ffffffffp+0L, 0, l); - testboth(0x1.fffffffffffffp+0L, INFINITY, 0x1p1L, 0, l); - testboth(0x1p1L, -INFINITY, 0x1.fffffffffffffp+0L, 0, l); - testboth(0x0.fffffffffffffp-1022L, INFINITY, 0x1p-1022L, 0, l); - testboth(0x1p-1022L, -INFINITY, 0x0.fffffffffffffp-1022L, ex_under, l); -#elif LDBL_MANT_DIG == 64 && !defined(__i386) - testboth(0x1.87654321fffffffep+0L, INFINITY, 0x1.87654322p+0L, 0, l); - testboth(0x1.87654322p+0L, -INFINITY, 0x1.87654321fffffffep+0L, 0, l); - testboth(0x1.fffffffffffffffep0L, INFINITY, 0x1p1L, 0, l); - testboth(0x1p1L, -INFINITY, 0x1.fffffffffffffffep0L, 0, l); - testboth(0x0.fffffffffffffffep-16382L, INFINITY, 0x1p-16382L, 0, l); - testboth(0x1p-16382L, -INFINITY, - 0x0.fffffffffffffffep-16382L, ex_under, l); -#elif LDBL_MANT_DIG == 113 - testboth(0x1.876543210987ffffffffffffffffp+0L, INFINITY, - 0x1.876543210988p+0, 0, l); - testboth(0x1.876543210988p+0L, -INFINITY, - 0x1.876543210987ffffffffffffffffp+0L, 0, l); - testboth(0x1.ffffffffffffffffffffffffffffp0L, INFINITY, 0x1p1L, 0, l); - testboth(0x1p1L, -INFINITY, 0x1.ffffffffffffffffffffffffffffp0L, 0, l); - testboth(0x0.ffffffffffffffffffffffffffffp-16382L, INFINITY, - 0x1p-16382L, 0, l); - testboth(0x1p-16382L, -INFINITY, - 0x0.ffffffffffffffffffffffffffffp-16382L, ex_under, l); -#endif - - printf("ok 4 - next\n"); - - /* - * Overflow tests - */ - test(idd(nextafter(DBL_MAX, INFINITY)), INFINITY, ex_over); - test(idd(nextafter(INFINITY, 0.0)), DBL_MAX, 0); - test(idd(nexttoward(DBL_MAX, DBL_MAX * 2.0L)), INFINITY, ex_over); -#if LDBL_MANT_DIG > 53 - test(idd(nexttoward(INFINITY, DBL_MAX * 2.0L)), DBL_MAX, 0); -#endif - - testf(idf(nextafterf(FLT_MAX, INFINITY)), INFINITY, ex_over); - testf(idf(nextafterf(INFINITY, 0.0)), FLT_MAX, 0); - testf(idf(nexttowardf(FLT_MAX, FLT_MAX * 2.0)), INFINITY, ex_over); - testf(idf(nexttowardf(INFINITY, FLT_MAX * 2.0)), FLT_MAX, 0); - - testboth(ldbl_max, INFINITY, INFINITY, ex_over, l); - testboth(INFINITY, 0.0, ldbl_max, 0, l); - - printf("ok 5 - next\n"); - - return (0); -} - -static void -_testl(const char *exp, int line, long double actual, long double expected, - int except) -{ - int actual_except; - - actual_except = fetestexcept(ALL_STD_EXCEPT); - if (!fpequal(actual, expected)) { - fprintf(stderr, "%d: %s returned %La, expecting %La\n", - line, exp, actual, expected); - abort(); - } - if (actual_except != except) { - fprintf(stderr, "%d: %s raised 0x%x, expecting 0x%x\n", - line, exp, actual_except, except); - abort(); - } -} - -/* - * The idd() and idf() routines ensure that doubles and floats are - * converted to their respective types instead of stored in the FPU - * with extra precision. - */ -static double -idd(double x) -{ - return (x); -} - -static float -idf(float x) -{ - return (x); -} diff --git a/tools/regression/lib/msun/test-next.t b/tools/regression/lib/msun/test-next.t deleted file mode 100644 index 8bdfd03..0000000 --- a/tools/regression/lib/msun/test-next.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -cd `dirname $0` - -executable=`basename $0 .t` - -make $executable 2>&1 > /dev/null - -exec ./$executable diff --git a/tools/regression/lib/msun/test-rem.c b/tools/regression/lib/msun/test-rem.c deleted file mode 100644 index 36e3476..0000000 --- a/tools/regression/lib/msun/test-rem.c +++ /dev/null @@ -1,207 +0,0 @@ -/*- - * Copyright (c) 2005-2008 David Schultz <das@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Test for remainder functions: remainder, remainderf, remainderl, - * remquo, remquof, and remquol. - * Missing tests: fmod, fmodf. - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <assert.h> -#include <float.h> -#include <math.h> -#include <stdio.h> -#include <stdlib.h> -#include <strings.h> - -static void test_invalid(long double, long double); -static void testl(long double, long double, long double, int); -static void testd(double, double, double, int); -static void testf(float, float, float, int); - -#define test(x, y, e_r, e_q) do { \ - testl(x, y, e_r, e_q); \ - testd(x, y, e_r, e_q); \ - testf(x, y, e_r, e_q); \ -} while (0) - -int -main(int argc, char *argv[]) -{ - - printf("1..3\n"); - - test_invalid(0.0, 0.0); - test_invalid(1.0, 0.0); - test_invalid(INFINITY, 0.0); - test_invalid(INFINITY, 1.0); - test_invalid(-INFINITY, 1.0); - test_invalid(NAN, 1.0); - test_invalid(1.0, NAN); - - test(4, 4, 0, 1); - test(0, 3.0, 0, 0); - testd(0x1p-1074, 1, 0x1p-1074, 0); - testf(0x1p-149, 1, 0x1p-149, 0); - test(3.0, 4, -1, 1); - test(3.0, -4, -1, -1); - testd(275 * 1193040, 275, 0, 1193040); - test(4.5 * 7.5, 4.5, -2.25, 8); /* we should get the even one */ - testf(0x1.9044f6p-1, 0x1.ce662ep-1, -0x1.f109cp-4, 1); -#if LDBL_MANT_DIG > 53 - testl(-0x1.23456789abcdefp-2000L, 0x1.fedcba987654321p-2000L, - 0x1.b72ea61d950c862p-2001L, -1); -#endif - - printf("ok 1 - rem\n"); - - /* - * The actual quotient here is 864062210.50000003..., but - * double-precision division gets -8.64062210.5, which rounds - * the wrong way. This test ensures that remquo() is smart - * enough to get the low-order bit right. - */ - testd(-0x1.98260f22fc6dep-302, 0x1.fb3167c430a13p-332, - 0x1.fb3165b82de72p-333, -864062211); - /* Even harder cases with greater exponent separation */ - test(0x1.fp100, 0x1.ep-40, -0x1.cp-41, 143165577); - testd(-0x1.abcdefp120, 0x1.87654321p-120, - -0x1.69c78ec4p-121, -63816414); - - printf("ok 2 - rem\n"); - - test(0x1.66666cp+120, 0x1p+71, 0.0, 1476395008); - testd(-0x1.0000000000003p+0, 0x1.0000000000003p+0, -0.0, -1); - testl(-0x1.0000000000003p+0, 0x1.0000000000003p+0, -0.0, -1); - testd(-0x1.0000000000001p-749, 0x1.4p-1072, 0x1p-1074, -1288490189); - testl(-0x1.0000000000001p-749, 0x1.4p-1072, 0x1p-1074, -1288490189); - - printf("ok 3 - rem\n"); - - return (0); -} - -static void -test_invalid(long double x, long double y) -{ - int q; - - q = 0xdeadbeef; - - assert(isnan(remainder(x, y))); - assert(isnan(remquo(x, y, &q))); -#ifdef STRICT - assert(q == 0xdeadbeef); -#endif - - assert(isnan(remainderf(x, y))); - assert(isnan(remquof(x, y, &q))); -#ifdef STRICT - assert(q == 0xdeadbeef); -#endif - - assert(isnan(remainderl(x, y))); - assert(isnan(remquol(x, y, &q))); -#ifdef STRICT - assert(q == 0xdeadbeef); -#endif -} - -/* 0x012345 ==> 0x01ffff */ -static inline int -mask(int x) -{ - return ((unsigned)~0 >> (32 - fls(x))); -} - -static void -testl(long double x, long double y, long double expected_rem, int expected_quo) -{ - int q; - long double rem; - - q = random(); - rem = remainderl(x, y); - assert(rem == expected_rem); - assert(!signbit(rem) == !signbit(expected_rem)); - rem = remquol(x, y, &q); - assert(rem == expected_rem); - assert(!signbit(rem) == !signbit(expected_rem)); - assert((q ^ expected_quo) >= 0); /* sign(q) == sign(expected_quo) */ - assert((q & 0x7) == (expected_quo & 0x7)); - if (q != 0) { - assert((q > 0) ^ !(expected_quo > 0)); - q = abs(q); - assert(q == (abs(expected_quo) & mask(q))); - } -} - -static void -testd(double x, double y, double expected_rem, int expected_quo) -{ - int q; - double rem; - - q = random(); - rem = remainder(x, y); - assert(rem == expected_rem); - assert(!signbit(rem) == !signbit(expected_rem)); - rem = remquo(x, y, &q); - assert(rem == expected_rem); - assert(!signbit(rem) == !signbit(expected_rem)); - assert((q ^ expected_quo) >= 0); /* sign(q) == sign(expected_quo) */ - assert((q & 0x7) == (expected_quo & 0x7)); - if (q != 0) { - assert((q > 0) ^ !(expected_quo > 0)); - q = abs(q); - assert(q == (abs(expected_quo) & mask(q))); - } -} - -static void -testf(float x, float y, float expected_rem, int expected_quo) -{ - int q; - float rem; - - q = random(); - rem = remainderf(x, y); - assert(rem == expected_rem); - assert(!signbit(rem) == !signbit(expected_rem)); - rem = remquof(x, y, &q); - assert(rem == expected_rem); - assert(!signbit(rem) == !signbit(expected_rem)); - assert((q ^ expected_quo) >= 0); /* sign(q) == sign(expected_quo) */ - assert((q & 0x7) == (expected_quo & 0x7)); - if (q != 0) { - assert((q > 0) ^ !(expected_quo > 0)); - q = abs(q); - assert((q & mask(q)) == (abs(expected_quo) & mask(q))); - } -} diff --git a/tools/regression/lib/msun/test-rem.t b/tools/regression/lib/msun/test-rem.t deleted file mode 100644 index 8bdfd03..0000000 --- a/tools/regression/lib/msun/test-rem.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -cd `dirname $0` - -executable=`basename $0 .t` - -make $executable 2>&1 > /dev/null - -exec ./$executable diff --git a/tools/regression/lib/msun/test-trig.c b/tools/regression/lib/msun/test-trig.c deleted file mode 100644 index 1dcce1f..0000000 --- a/tools/regression/lib/msun/test-trig.c +++ /dev/null @@ -1,280 +0,0 @@ -/*- - * Copyright (c) 2008 David Schultz <das@FreeBSD.org> - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND - * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE - * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL - * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS - * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. - */ - -/* - * Tests for corner cases in trigonometric functions. Some accuracy tests - * are included as well, but these are very basic sanity checks, not - * intended to be comprehensive. - * - * The program for generating representable numbers near multiples of pi is - * available at http://www.cs.berkeley.edu/~wkahan/testpi/ . - */ - -#include <sys/cdefs.h> -__FBSDID("$FreeBSD$"); - -#include <sys/param.h> - -#include <assert.h> -#include <fenv.h> -#include <float.h> -#include <math.h> -#include <stdio.h> - -#include "test-utils.h" - -#pragma STDC FENV_ACCESS ON - -/* - * Test that a function returns the correct value and sets the - * exception flags correctly. The exceptmask specifies which - * exceptions we should check. We need to be lenient for several - * reasons, but mainly because on some architectures it's impossible - * to raise FE_OVERFLOW without raising FE_INEXACT. - * - * These are macros instead of functions so that assert provides more - * meaningful error messages. - * - * XXX The volatile here is to avoid gcc's bogus constant folding and work - * around the lack of support for the FENV_ACCESS pragma. - */ -#define test(func, x, result, exceptmask, excepts) do { \ - volatile long double _d = x; \ - assert(feclearexcept(FE_ALL_EXCEPT) == 0); \ - assert(fpequal((func)(_d), (result))); \ - assert(((void)(func), fetestexcept(exceptmask) == (excepts))); \ -} while (0) - -#define testall(prefix, x, result, exceptmask, excepts) do { \ - test(prefix, x, (double)result, exceptmask, excepts); \ - test(prefix##f, x, (float)result, exceptmask, excepts); \ - test(prefix##l, x, result, exceptmask, excepts); \ -} while (0) - -#define testdf(prefix, x, result, exceptmask, excepts) do { \ - test(prefix, x, (double)result, exceptmask, excepts); \ - test(prefix##f, x, (float)result, exceptmask, excepts); \ -} while (0) - -/* - * Test special cases in sin(), cos(), and tan(). - */ -static void -run_special_tests(void) -{ - - /* Values at 0 should be exact. */ - testall(tan, 0.0, 0.0, ALL_STD_EXCEPT, 0); - testall(tan, -0.0, -0.0, ALL_STD_EXCEPT, 0); - testall(cos, 0.0, 1.0, ALL_STD_EXCEPT, 0); - testall(cos, -0.0, 1.0, ALL_STD_EXCEPT, 0); - testall(sin, 0.0, 0.0, ALL_STD_EXCEPT, 0); - testall(sin, -0.0, -0.0, ALL_STD_EXCEPT, 0); - - /* func(+-Inf) == NaN */ - testall(tan, INFINITY, NAN, ALL_STD_EXCEPT, FE_INVALID); - testall(sin, INFINITY, NAN, ALL_STD_EXCEPT, FE_INVALID); - testall(cos, INFINITY, NAN, ALL_STD_EXCEPT, FE_INVALID); - testall(tan, -INFINITY, NAN, ALL_STD_EXCEPT, FE_INVALID); - testall(sin, -INFINITY, NAN, ALL_STD_EXCEPT, FE_INVALID); - testall(cos, -INFINITY, NAN, ALL_STD_EXCEPT, FE_INVALID); - - /* func(NaN) == NaN */ - testall(tan, NAN, NAN, ALL_STD_EXCEPT, 0); - testall(sin, NAN, NAN, ALL_STD_EXCEPT, 0); - testall(cos, NAN, NAN, ALL_STD_EXCEPT, 0); -} - -/* - * Tests to ensure argument reduction for large arguments is accurate. - */ -static void -run_reduction_tests(void) -{ - /* floats very close to odd multiples of pi */ - static const float f_pi_odd[] = { - 85563208.0f, - 43998769152.0f, - 9.2763667655669323e+25f, - 1.5458357838905804e+29f, - }; - /* doubles very close to odd multiples of pi */ - static const double d_pi_odd[] = { - 3.1415926535897931, - 91.106186954104004, - 642615.9188844458, - 3397346.5699258847, - 6134899525417045.0, - 3.0213551960457761e+43, - 1.2646209897993783e+295, - 6.2083625380677099e+307, - }; - /* long doubles very close to odd multiples of pi */ -#if LDBL_MANT_DIG == 64 - static const long double ld_pi_odd[] = { - 1.1891886960373841596e+101L, - 1.07999475322710967206e+2087L, - 6.522151627890431836e+2147L, - 8.9368974898260328229e+2484L, - 9.2961044110572205863e+2555L, - 4.90208421886578286e+3189L, - 1.5275546401232615884e+3317L, - 1.7227465626338900093e+3565L, - 2.4160090594000745334e+3808L, - 9.8477555741888350649e+4314L, - 1.6061597222105160737e+4326L, - }; -#elif LDBL_MANT_DIG == 113 - static const long double ld_pi_odd[] = { - /* XXX */ - }; -#endif - - int i; - - for (i = 0; i < nitems(f_pi_odd); i++) { - assert(fabs(sinf(f_pi_odd[i])) < FLT_EPSILON); - assert(cosf(f_pi_odd[i]) == -1.0); - assert(fabs(tan(f_pi_odd[i])) < FLT_EPSILON); - - assert(fabs(sinf(-f_pi_odd[i])) < FLT_EPSILON); - assert(cosf(-f_pi_odd[i]) == -1.0); - assert(fabs(tanf(-f_pi_odd[i])) < FLT_EPSILON); - - assert(fabs(sinf(f_pi_odd[i] * 2)) < FLT_EPSILON); - assert(cosf(f_pi_odd[i] * 2) == 1.0); - assert(fabs(tanf(f_pi_odd[i] * 2)) < FLT_EPSILON); - - assert(fabs(sinf(-f_pi_odd[i] * 2)) < FLT_EPSILON); - assert(cosf(-f_pi_odd[i] * 2) == 1.0); - assert(fabs(tanf(-f_pi_odd[i] * 2)) < FLT_EPSILON); - } - - for (i = 0; i < nitems(d_pi_odd); i++) { - assert(fabs(sin(d_pi_odd[i])) < 2 * DBL_EPSILON); - assert(cos(d_pi_odd[i]) == -1.0); - assert(fabs(tan(d_pi_odd[i])) < 2 * DBL_EPSILON); - - assert(fabs(sin(-d_pi_odd[i])) < 2 * DBL_EPSILON); - assert(cos(-d_pi_odd[i]) == -1.0); - assert(fabs(tan(-d_pi_odd[i])) < 2 * DBL_EPSILON); - - assert(fabs(sin(d_pi_odd[i] * 2)) < 2 * DBL_EPSILON); - assert(cos(d_pi_odd[i] * 2) == 1.0); - assert(fabs(tan(d_pi_odd[i] * 2)) < 2 * DBL_EPSILON); - - assert(fabs(sin(-d_pi_odd[i] * 2)) < 2 * DBL_EPSILON); - assert(cos(-d_pi_odd[i] * 2) == 1.0); - assert(fabs(tan(-d_pi_odd[i] * 2)) < 2 * DBL_EPSILON); - } - -#if LDBL_MANT_DIG > 53 - for (i = 0; i < nitems(ld_pi_odd); i++) { - assert(fabsl(sinl(ld_pi_odd[i])) < LDBL_EPSILON); - assert(cosl(ld_pi_odd[i]) == -1.0); - assert(fabsl(tanl(ld_pi_odd[i])) < LDBL_EPSILON); - - assert(fabsl(sinl(-ld_pi_odd[i])) < LDBL_EPSILON); - assert(cosl(-ld_pi_odd[i]) == -1.0); - assert(fabsl(tanl(-ld_pi_odd[i])) < LDBL_EPSILON); - - assert(fabsl(sinl(ld_pi_odd[i] * 2)) < LDBL_EPSILON); - assert(cosl(ld_pi_odd[i] * 2) == 1.0); - assert(fabsl(tanl(ld_pi_odd[i] * 2)) < LDBL_EPSILON); - - assert(fabsl(sinl(-ld_pi_odd[i] * 2)) < LDBL_EPSILON); - assert(cosl(-ld_pi_odd[i] * 2) == 1.0); - assert(fabsl(tanl(-ld_pi_odd[i] * 2)) < LDBL_EPSILON); - } -#endif -} - -/* - * Tests the accuracy of these functions over the primary range. - */ -static void -run_accuracy_tests(void) -{ - - /* For small args, sin(x) = tan(x) = x, and cos(x) = 1. */ - testall(sin, 0xd.50ee515fe4aea16p-114L, 0xd.50ee515fe4aea16p-114L, - ALL_STD_EXCEPT, FE_INEXACT); - testall(tan, 0xd.50ee515fe4aea16p-114L, 0xd.50ee515fe4aea16p-114L, - ALL_STD_EXCEPT, FE_INEXACT); - testall(cos, 0xd.50ee515fe4aea16p-114L, 1.0, - ALL_STD_EXCEPT, FE_INEXACT); - - /* - * These tests should pass for f32, d64, and ld80 as long as - * the error is <= 0.75 ulp (round to nearest) - */ -#if LDBL_MANT_DIG <= 64 -#define testacc testall -#else -#define testacc testdf -#endif - testacc(sin, 0.17255452780841205174L, 0.17169949801444412683L, - ALL_STD_EXCEPT, FE_INEXACT); - testacc(sin, -0.75431944555904520893L, -0.68479288156557286353L, - ALL_STD_EXCEPT, FE_INEXACT); - testacc(cos, 0.70556358769838947292L, 0.76124620693117771850L, - ALL_STD_EXCEPT, FE_INEXACT); - testacc(cos, -0.34061437849088045332L, 0.94254960031831729956L, - ALL_STD_EXCEPT, FE_INEXACT); - testacc(tan, -0.15862817413325692897L, -0.15997221861309522115L, - ALL_STD_EXCEPT, FE_INEXACT); - testacc(tan, 0.38374784931303813530L, 0.40376500259976759951L, - ALL_STD_EXCEPT, FE_INEXACT); - - /* - * XXX missing: - * - tests for ld128 - * - tests for other rounding modes (probably won't pass for now) - * - tests for large numbers that get reduced to hi+lo with lo!=0 - */ -} - -int -main(int argc, char *argv[]) -{ - - printf("1..3\n"); - - run_special_tests(); - printf("ok 1 - trig\n"); - -#ifndef __i386__ - run_reduction_tests(); -#endif - printf("ok 2 - trig\n"); - -#ifndef __i386__ - run_accuracy_tests(); -#endif - printf("ok 3 - trig\n"); - - return (0); -} diff --git a/tools/regression/lib/msun/test-trig.t b/tools/regression/lib/msun/test-trig.t deleted file mode 100644 index 8bdfd03..0000000 --- a/tools/regression/lib/msun/test-trig.t +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh -# $FreeBSD$ - -cd `dirname $0` - -executable=`basename $0 .t` - -make $executable 2>&1 > /dev/null - -exec ./$executable |