Migrate the remaining libc/gen tests to atf
This commit is contained in:
parent
69585815cc
commit
66bfd22447
@ -1,4 +1,4 @@
|
||||
# $NetBSD: mi,v 1.195 2010/12/28 09:15:24 he Exp $
|
||||
# $NetBSD: mi,v 1.196 2010/12/28 12:46:15 pgoyette Exp $
|
||||
#
|
||||
# Note: don't delete entries from here - mark them as "obsolete" instead.
|
||||
#
|
||||
@ -319,9 +319,14 @@
|
||||
./usr/libdata/debug/usr/tests/lib/libc tests-lib-debug
|
||||
./usr/libdata/debug/usr/tests/lib/libc/gen tests-lib-debug
|
||||
./usr/libdata/debug/usr/tests/lib/libc/gen/t_basedirname.debug tests-lib-debug debug,atf
|
||||
./usr/libdata/debug/usr/tests/lib/libc/gen/t_dir.debug tests-lib-debug debug,atf
|
||||
./usr/libdata/debug/usr/tests/lib/libc/gen/t_fmtcheck.debug tests-lib-debug debug,atf
|
||||
./usr/libdata/debug/usr/tests/lib/libc/gen/t_glob_star.debug tests-lib-debug debug,atf
|
||||
./usr/libdata/debug/usr/tests/lib/libc/gen/t_syslog_pthread.debug tests-lib-debug debug,atf
|
||||
./usr/libdata/debug/usr/tests/lib/libc/gen/t_humanize_number.debug tests-lib-debug debug,atf
|
||||
./usr/libdata/debug/usr/tests/lib/libc/gen/t_rbstress.debug tests-lib-debug debug,atf
|
||||
./usr/libdata/debug/usr/tests/lib/libc/gen/t_syslog_pthread.debug tests-lib-debug debug,atf
|
||||
./usr/libdata/debug/usr/tests/lib/libc/gen/t_siginfo.debug tests-lib-debug debug,atf
|
||||
./usr/libdata/debug/usr/tests/lib/libc/gen/t_vis.debug tests-lib-debug debug,atf
|
||||
./usr/libdata/debug/usr/tests/lib/libc/hash tests-lib-debug
|
||||
./usr/libdata/debug/usr/tests/lib/libc/hash/t_sha2.debug tests-lib-debug debug,atf
|
||||
./usr/libdata/debug/usr/tests/lib/libc/setjmp tests-lib-debug
|
||||
@ -1565,9 +1570,14 @@
|
||||
./usr/tests/lib/libc/gen tests-lib-tests
|
||||
./usr/tests/lib/libc/gen/Atffile tests-lib-tests atf
|
||||
./usr/tests/lib/libc/gen/t_basedirname tests-lib-tests atf
|
||||
./usr/tests/lib/libc/gen/t_dir tests-lib-tests atf
|
||||
./usr/tests/lib/libc/gen/t_fmtcheck tests-lib-tests atf
|
||||
./usr/tests/lib/libc/gen/t_glob_star tests-lib-tests atf
|
||||
./usr/tests/lib/libc/gen/t_humanize_number tests-lib-tests atf
|
||||
./usr/tests/lib/libc/gen/t_rbstress tests-lib-tests atf
|
||||
./usr/tests/lib/libc/gen/t_syslog_pthread tests-lib-tests atf
|
||||
./usr/tests/lib/libc/gen/t_siginfo tests-lib-tests atf
|
||||
./usr/tests/lib/libc/gen/t_vis tests-lib-tests atf
|
||||
./usr/tests/lib/libc/hash tests-lib-tests
|
||||
./usr/tests/lib/libc/hash/Atffile tests-lib-tests atf
|
||||
./usr/tests/lib/libc/hash/t_sha2 tests-lib-tests atf
|
||||
|
@ -1,12 +1,17 @@
|
||||
# $NetBSD: Makefile,v 1.6 2010/12/25 01:25:37 pgoyette Exp $
|
||||
# $NetBSD: Makefile,v 1.7 2010/12/28 12:46:15 pgoyette Exp $
|
||||
|
||||
.include <bsd.own.mk>
|
||||
|
||||
TESTSDIR= ${TESTSBASE}/lib/libc/gen
|
||||
|
||||
TESTS_C+= t_glob_star
|
||||
TESTS_C+= t_syslog_pthread
|
||||
TESTS_C+= t_basedirname
|
||||
TESTS_C+= t_dir
|
||||
TESTS_C+= t_fmtcheck
|
||||
TESTS_C+= t_glob_star
|
||||
TESTS_C+= t_humanize_number
|
||||
TESTS_C+= t_rbstress
|
||||
TESTS_C+= t_syslog_pthread
|
||||
TESTS_C+= t_vis
|
||||
|
||||
.if !make(obj) && !make(cleandir)
|
||||
HAVE_SIGINFO != if (echo "\#include <signal.h>" && echo "SA_SIGINFO") | ${CC} -E -I${DESTDIR}/usr/include - | grep -sq 0x0040; then echo yes; else echo no; fi
|
||||
|
163
tests/lib/libc/gen/t_dir.c
Normal file
163
tests/lib/libc/gen/t_dir.c
Normal file
@ -0,0 +1,163 @@
|
||||
/* $NetBSD: t_dir.c,v 1.1 2010/12/28 12:46:15 pgoyette Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2010 The NetBSD Foundation, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to The NetBSD Foundation
|
||||
* by
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <atf-c.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <dirent.h>
|
||||
#include <err.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <sys/stat.h>
|
||||
|
||||
ATF_TC(seekdir);
|
||||
|
||||
ATF_TC_HEAD(seekdir, tc)
|
||||
{
|
||||
|
||||
atf_tc_set_md_var(tc, "descr",
|
||||
"Check telldir(3) and seekdir(3) for correct behavior (PR/24324)");
|
||||
}
|
||||
|
||||
ATF_TC_BODY(seekdir, tc)
|
||||
{
|
||||
DIR *dp;
|
||||
char *wasname;
|
||||
struct dirent *entry;
|
||||
long here;
|
||||
|
||||
mkdir("t", 0755);
|
||||
creat("t/a", 0600);
|
||||
creat("t/b", 0600);
|
||||
creat("t/c", 0600);
|
||||
|
||||
dp = opendir("t");
|
||||
if ( dp == NULL)
|
||||
atf_tc_fail("Could not open temp directory.");
|
||||
|
||||
/* skip two for . and .. */
|
||||
entry = readdir(dp);
|
||||
entry = readdir(dp);
|
||||
|
||||
/* get first entry */
|
||||
entry = readdir(dp);
|
||||
here = telldir(dp);
|
||||
|
||||
/* get second entry */
|
||||
entry = readdir(dp);
|
||||
wasname = strdup(entry->d_name);
|
||||
|
||||
/* get third entry */
|
||||
entry = readdir(dp);
|
||||
|
||||
/* try to return to the position after the first entry */
|
||||
seekdir(dp, here);
|
||||
entry = readdir(dp);
|
||||
|
||||
if (strcmp(entry->d_name, wasname) != 0)
|
||||
atf_tc_fail("1st seekdir found wrong name");
|
||||
|
||||
/* try again, and throw in a telldir() for good measure */
|
||||
seekdir(dp, here);
|
||||
here = telldir(dp);
|
||||
entry = readdir(dp);
|
||||
|
||||
if (strcmp(entry->d_name, wasname) != 0)
|
||||
atf_tc_fail("2nd seekdir found wrong name");
|
||||
|
||||
/* One more time, to make sure that telldir() doesn't affect result */
|
||||
seekdir(dp, here);
|
||||
entry = readdir(dp);
|
||||
|
||||
if (strcmp(entry->d_name, wasname) != 0)
|
||||
atf_tc_fail("3rd seekdir found wrong name");
|
||||
|
||||
closedir(dp);
|
||||
}
|
||||
|
||||
ATF_TC(telldir_leak);
|
||||
|
||||
ATF_TC_HEAD(telldir_leak, tc)
|
||||
{
|
||||
|
||||
atf_tc_set_md_var(tc, "descr",
|
||||
"Check telldir(3) for memory leakage (PR/24324)");
|
||||
}
|
||||
|
||||
ATF_TC_BODY(telldir_leak, tc)
|
||||
{
|
||||
DIR *dp;
|
||||
long loc;
|
||||
char *memused;
|
||||
int i;
|
||||
int oktouse = 4096;
|
||||
|
||||
dp = opendir(".");
|
||||
if (dp == NULL)
|
||||
atf_tc_fail("Could not open current directory");
|
||||
|
||||
loc = telldir(dp);
|
||||
memused = sbrk(0);
|
||||
closedir(dp);
|
||||
|
||||
for (i=0; i<1000; i++) {
|
||||
dp = opendir(".");
|
||||
if (dp == NULL)
|
||||
atf_tc_fail("Could not open current directory");
|
||||
|
||||
loc = telldir(dp);
|
||||
closedir(dp);
|
||||
|
||||
if ((char *)(sbrk(0)) - memused > oktouse) {
|
||||
(void)printf("Used %td extra bytes for %d telldir "
|
||||
"calls", ((char *)(sbrk(0)) - memused), i);
|
||||
oktouse = (char *)(sbrk(0)) - memused;
|
||||
}
|
||||
}
|
||||
if (oktouse > 4096) {
|
||||
atf_tc_fail("Failure: leaked %td bytes", oktouse);
|
||||
} else {
|
||||
(void)printf("OK: used %td bytes\n", (char *)(sbrk(0))-memused);
|
||||
}
|
||||
}
|
||||
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
{
|
||||
|
||||
ATF_TP_ADD_TC(tp, seekdir);
|
||||
ATF_TP_ADD_TC(tp, telldir_leak);
|
||||
|
||||
return atf_no_error();
|
||||
}
|
116
tests/lib/libc/gen/t_fmtcheck.c
Normal file
116
tests/lib/libc/gen/t_fmtcheck.c
Normal file
@ -0,0 +1,116 @@
|
||||
/* $NetBSD: t_fmtcheck.c,v 1.1 2010/12/28 12:46:15 pgoyette Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2000 The NetBSD Foundation, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code was contributed to The NetBSD Foundation by Allen Briggs.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <atf-c.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
const char *fmtcheck(const char *f1, const char *f2)
|
||||
__attribute__((__format_arg__(2)));
|
||||
|
||||
#include <err.h>
|
||||
|
||||
struct test_fmt {
|
||||
const char *fmt1;
|
||||
const char *fmt2;
|
||||
int correct;
|
||||
} test_fmts[] = {
|
||||
{ "%d", "%d", 1 },
|
||||
{ "%2d", "%2.2d", 1 },
|
||||
{ "%x", "%d", 1 },
|
||||
{ "%u", "%d", 1 },
|
||||
{ "%03d", "%d", 1 },
|
||||
{ "%-2d", "%d", 1 },
|
||||
{ "%d", "%-12.1d", 1 },
|
||||
{ "%d", "%-01.3d", 1 },
|
||||
{ "%X", "%-01.3d", 1 },
|
||||
{ "%D", "%ld", 1 },
|
||||
{ "%s", "%s", 1 },
|
||||
{ "%s", "This is a %s test", 1 },
|
||||
{ "Hi, there. This is a %s test", "%s", 1 },
|
||||
{ "%d", "%s", 2 },
|
||||
{ "%e", "%s", 2 },
|
||||
{ "%r", "%d", 2 },
|
||||
{ "%*.2d", "%*d", 1 },
|
||||
{ "%2.*d", "%*d", 2 },
|
||||
{ "%*d", "%*d", 1 },
|
||||
{ "%-3", "%d", 2 },
|
||||
{ "%d %s", "%d", 2 },
|
||||
{ "%*.*.*d", "%*.*.*d", 2 },
|
||||
{ "%d", "%d %s", 1 },
|
||||
{ "%40s", "%20s", 1 },
|
||||
{ "%x %x %x", "%o %u %d", 1 },
|
||||
{ "%o %u %d", "%x %x %X", 1 },
|
||||
{ "%#o %u %#-d", "%x %#x %X", 1 },
|
||||
{ "%qd", "%llx", 1 },
|
||||
{ "%%", "%llx", 1 },
|
||||
{ "%p %30s %#llx %-10.*e", "This number %lu%% and string %s has %qd numbers and %.*g floats", 1 },
|
||||
};
|
||||
|
||||
ATF_TC(tc_fmtcheck);
|
||||
|
||||
ATF_TC_HEAD(tc_fmtcheck, tc)
|
||||
{
|
||||
|
||||
atf_tc_set_md_var(tc, "descr", "Test fmtcheck(3)");
|
||||
}
|
||||
|
||||
ATF_TC_BODY(tc_fmtcheck, tc)
|
||||
{
|
||||
unsigned int i, r;
|
||||
const char *f, *cf, *f1, *f2;
|
||||
|
||||
r = 0;
|
||||
for (i = 0 ; i < __arraycount(test_fmts); i++) {
|
||||
f1 = test_fmts[i].fmt1;
|
||||
f2 = test_fmts[i].fmt2;
|
||||
f = fmtcheck(f1, f2);
|
||||
if (test_fmts[i].correct == 1) {
|
||||
cf = f1;
|
||||
} else {
|
||||
cf = f2;
|
||||
}
|
||||
if (f != cf) {
|
||||
r++;
|
||||
atf_tc_fail_nonfatal("Test %d: (%s) vs. (%s) failed "
|
||||
"(should have returned %s)", i, f1, f2,
|
||||
(test_fmts[i].correct == 1) ? "1st" : "2nd");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
{
|
||||
|
||||
ATF_TP_ADD_TC(tp, tc_fmtcheck);
|
||||
|
||||
return atf_no_error();
|
||||
}
|
257
tests/lib/libc/gen/t_humanize_number.c
Normal file
257
tests/lib/libc/gen/t_humanize_number.c
Normal file
@ -0,0 +1,257 @@
|
||||
/* $NetBSD: t_humanize_number.c,v 1.1 2010/12/28 12:46:15 pgoyette Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2010 The NetBSD Foundation, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to The NetBSD Foundation
|
||||
* by
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <atf-c.h>
|
||||
|
||||
#include <err.h>
|
||||
#include <inttypes.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <util.h>
|
||||
|
||||
const struct hnopts {
|
||||
size_t ho_len;
|
||||
int64_t ho_num;
|
||||
const char *ho_suffix;
|
||||
int ho_scale;
|
||||
int ho_flags;
|
||||
int ho_retval; /* expected return value */
|
||||
const char *ho_retstr; /* expected string in buffer */
|
||||
} hnopts[] = {
|
||||
/*
|
||||
* Rev. 1.6 produces "10.0".
|
||||
*/
|
||||
{ 5, 10737418236ULL * 1024, "",
|
||||
HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL, 3, "10T" },
|
||||
|
||||
{ 5, 10450000, "",
|
||||
HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL, 3, "10M" },
|
||||
{ 5, 10500000, "", /* just for reference */
|
||||
HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL, 3, "10M" },
|
||||
|
||||
/*
|
||||
* Trailing space. Rev. 1.7 produces "1 ".
|
||||
*/
|
||||
{ 5, 1, "", 0, HN_NOSPACE, 1, "1" },
|
||||
|
||||
{ 5, 1, "", 0, 0, 2, "1 " }, /* just for reference */
|
||||
{ 5, 1, "", 0, HN_B, 3, "1 B" }, /* and more ... */
|
||||
{ 5, 1, "", 0, HN_DECIMAL, 2, "1 " },
|
||||
{ 5, 1, "", 0, HN_NOSPACE | HN_B, 2, "1B" },
|
||||
{ 5, 1, "", 0, HN_B | HN_DECIMAL, 3, "1 B" },
|
||||
{ 5, 1, "", 0, HN_NOSPACE | HN_B | HN_DECIMAL, 2, "1B" },
|
||||
|
||||
/*
|
||||
* Space and HN_B. Rev. 1.7 produces "1B".
|
||||
*/
|
||||
{ 5, 1, "", HN_AUTOSCALE, HN_B, 3, "1 B" },
|
||||
{ 5, 1000, "", /* just for reference */
|
||||
HN_AUTOSCALE, HN_B, 3, "1 K" },
|
||||
|
||||
/*
|
||||
* Truncated output. Rev. 1.7 produces "1.0 K".
|
||||
*/
|
||||
{ 6, 1000, "A", HN_AUTOSCALE, HN_DECIMAL, -1, "" },
|
||||
|
||||
/*
|
||||
* Failure case reported by Greg Troxel <gdt@NetBSD.org>.
|
||||
* Rev. 1.11 incorrectly returns 5 with filling the buffer
|
||||
* with "1000".
|
||||
*/
|
||||
{ 5, 1048258238, "",
|
||||
HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL, 4, "1.0G" },
|
||||
/* Similar case it prints 1000 where it shouldn't */
|
||||
{ 5, 1023488, "",
|
||||
HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL, 4, "1.0M" },
|
||||
{ 5, 1023999, "",
|
||||
HN_AUTOSCALE, HN_B | HN_NOSPACE | HN_DECIMAL, 4, "1.0M" },
|
||||
};
|
||||
|
||||
struct hnflags {
|
||||
int hf_flags;
|
||||
const char *hf_name;
|
||||
};
|
||||
|
||||
const struct hnflags scale_flags[] = {
|
||||
{ HN_GETSCALE, "HN_GETSCALE" },
|
||||
{ HN_AUTOSCALE, "HN_AUTOSCALE" },
|
||||
};
|
||||
const struct hnflags normal_flags[] = {
|
||||
{ HN_DECIMAL, "HN_DECIMAL" },
|
||||
{ HN_NOSPACE, "HN_NOSPACE" },
|
||||
{ HN_B, "HN_B" },
|
||||
{ HN_DIVISOR_1000, "HN_DIVISOR_1000" },
|
||||
};
|
||||
|
||||
const char *
|
||||
formatflags(char *, size_t, const struct hnflags *, size_t, int);
|
||||
void newline(void);
|
||||
void w_printf(const char *, ...);
|
||||
int main(int, char *[]);
|
||||
|
||||
const char *
|
||||
formatflags(char *buf, size_t buflen, const struct hnflags *hfs,
|
||||
size_t hfslen, int flags)
|
||||
{
|
||||
const struct hnflags *hf;
|
||||
char *p = buf;
|
||||
ssize_t len = buflen;
|
||||
unsigned int i, found;
|
||||
int n;
|
||||
|
||||
if (flags == 0) {
|
||||
snprintf(buf, buflen, "0");
|
||||
return (buf);
|
||||
}
|
||||
for (i = found = 0; i < hfslen && flags & ~found; i++) {
|
||||
hf = &hfs[i];
|
||||
if (flags & hf->hf_flags) {
|
||||
found |= hf->hf_flags;
|
||||
n = snprintf(p, len, "|%s", hf->hf_name);
|
||||
if (n >= len) {
|
||||
p = buf;
|
||||
len = buflen;
|
||||
/* Print `flags' as number */
|
||||
goto bad;
|
||||
}
|
||||
p += n;
|
||||
len -= n;
|
||||
}
|
||||
}
|
||||
flags &= ~found;
|
||||
if (flags)
|
||||
bad:
|
||||
snprintf(p, len, "|0x%x", flags);
|
||||
return (*buf == '|' ? buf + 1 : buf);
|
||||
}
|
||||
|
||||
static int col, bol = 1;
|
||||
void
|
||||
newline(void)
|
||||
{
|
||||
|
||||
fprintf(stderr, "\n");
|
||||
col = 0;
|
||||
bol = 1;
|
||||
}
|
||||
|
||||
void
|
||||
w_printf(const char *fmt, ...)
|
||||
{
|
||||
char buf[80];
|
||||
va_list ap;
|
||||
int n;
|
||||
|
||||
va_start(ap, fmt);
|
||||
if (col >= 0) {
|
||||
n = vsnprintf(buf, sizeof(buf), fmt, ap);
|
||||
if (n >= (int)sizeof(buf)) {
|
||||
col = -1;
|
||||
goto overflow;
|
||||
} else if (n == 0)
|
||||
goto out;
|
||||
|
||||
if (!bol) {
|
||||
if (col + n > 75)
|
||||
fprintf(stderr, "\n "), col = 4;
|
||||
else
|
||||
fprintf(stderr, " "), col++;
|
||||
}
|
||||
fprintf(stderr, "%s", buf);
|
||||
col += n;
|
||||
bol = 0;
|
||||
} else {
|
||||
overflow:
|
||||
vfprintf(stderr, fmt, ap);
|
||||
}
|
||||
out:
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
ATF_TC(humanize);
|
||||
|
||||
ATF_TC_HEAD(humanize, tc)
|
||||
{
|
||||
|
||||
atf_tc_set_md_var(tc, "descr", "Test humanize_number(3)");
|
||||
}
|
||||
|
||||
ATF_TC_BODY(humanize, tc)
|
||||
{
|
||||
char fbuf[128];
|
||||
const struct hnopts *ho;
|
||||
char *buf = NULL;
|
||||
size_t buflen = 0;
|
||||
unsigned int i;
|
||||
int rv = 0;
|
||||
|
||||
for (i = 0; i < __arraycount(hnopts); i++) {
|
||||
ho = &hnopts[i];
|
||||
if (buflen < ho->ho_len) {
|
||||
buflen = ho->ho_len;
|
||||
buf = realloc(buf, buflen);
|
||||
if (buf == NULL)
|
||||
atf_tc_fail("realloc(..., %d) failed", buflen);
|
||||
}
|
||||
|
||||
rv = humanize_number(buf, ho->ho_len, ho->ho_num,
|
||||
ho->ho_suffix, ho->ho_scale, ho->ho_flags);
|
||||
|
||||
if (rv == ho->ho_retval &&
|
||||
(rv == -1 || strcmp(buf, ho->ho_retstr) == 0))
|
||||
continue;
|
||||
|
||||
w_printf("humanize_number(\"%s\", %d, %" PRId64 ",",
|
||||
ho->ho_retstr, ho->ho_len, ho->ho_num);
|
||||
w_printf("\"%s\",", ho->ho_suffix);
|
||||
w_printf("%s,", formatflags(fbuf, sizeof(fbuf), scale_flags,
|
||||
sizeof(scale_flags) / sizeof(scale_flags[0]),
|
||||
ho->ho_scale));
|
||||
w_printf("%s)", formatflags(fbuf, sizeof(fbuf), normal_flags,
|
||||
sizeof(normal_flags) / sizeof(normal_flags[0]),
|
||||
ho->ho_flags));
|
||||
w_printf("= %d,", ho->ho_retval);
|
||||
w_printf("but got");
|
||||
w_printf("%d/[%s]", rv, rv == -1 ? "" : buf);
|
||||
newline();
|
||||
atf_tc_fail_nonfatal("Failed for table entry %d", i);
|
||||
}
|
||||
}
|
||||
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
{
|
||||
|
||||
ATF_TP_ADD_TC(tp, humanize);
|
||||
|
||||
return atf_no_error();
|
||||
}
|
127
tests/lib/libc/gen/t_rbstress.c
Normal file
127
tests/lib/libc/gen/t_rbstress.c
Normal file
@ -0,0 +1,127 @@
|
||||
/* $NetBSD: t_rbstress.c,v 1.1 2010/12/28 12:46:15 pgoyette Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2010 The NetBSD Foundation, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to The NetBSD Foundation
|
||||
* by
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include <atf-c.h>
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#include <sys/tree.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
struct mist {
|
||||
RB_ENTRY(mist) rbentry;
|
||||
int key;
|
||||
};
|
||||
RB_HEAD(head, mist) tt;
|
||||
|
||||
static int
|
||||
mistcmp(struct mist *a, struct mist *b)
|
||||
{
|
||||
#if 0
|
||||
return (b->key - a->key); /* wrong, can overflow */
|
||||
#else
|
||||
if (b->key > a->key)
|
||||
return 1;
|
||||
else if (b->key < a->key)
|
||||
return (-1);
|
||||
else
|
||||
return 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
RB_PROTOTYPE(head, mist, rbentry, mistcmp)
|
||||
RB_GENERATE(head, mist, rbentry, mistcmp)
|
||||
|
||||
static struct mist *
|
||||
addmist(int key)
|
||||
{
|
||||
struct mist *m;
|
||||
|
||||
m = malloc(sizeof(struct mist));
|
||||
m->key = key;
|
||||
RB_INSERT(head, &tt, m);
|
||||
return m;
|
||||
}
|
||||
|
||||
static int
|
||||
findmist(struct mist *m)
|
||||
{
|
||||
|
||||
return (!!RB_FIND(head, &tt, m));
|
||||
}
|
||||
|
||||
#define N 1000
|
||||
static int
|
||||
test(void)
|
||||
{
|
||||
struct mist *m[N];
|
||||
int fail, i, j;
|
||||
|
||||
RB_INIT(&tt);
|
||||
fail = 0;
|
||||
for (i = 0; i < N; i++) {
|
||||
m[i] = addmist(random() << 1); /* use all 32 bits */
|
||||
for (j = 0; j <= i; j++)
|
||||
if (!findmist(m[j]))
|
||||
fail++;
|
||||
}
|
||||
return fail;
|
||||
}
|
||||
|
||||
ATF_TC(rbstress);
|
||||
ATF_TC_HEAD(rbstress, tc)
|
||||
{
|
||||
|
||||
atf_tc_set_md_var(tc, "descr", "rb-tree stress test");
|
||||
}
|
||||
|
||||
ATF_TC_BODY(rbstress, tc)
|
||||
{
|
||||
int i, fail, f;
|
||||
|
||||
srandom(4711);
|
||||
fail = 0;
|
||||
for (i = 0; i < 10; i++) {
|
||||
f = test();
|
||||
if (f) {
|
||||
atf_tc_fail_nonfatal("loop %d: %d errors\n", i, f);
|
||||
fail += f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
{
|
||||
|
||||
ATF_TP_ADD_TC(tp, rbstress);
|
||||
|
||||
return atf_no_error();
|
||||
}
|
98
tests/lib/libc/gen/t_vis.c
Normal file
98
tests/lib/libc/gen/t_vis.c
Normal file
@ -0,0 +1,98 @@
|
||||
/* $NetBSD: t_vis.c,v 1.1 2010/12/28 12:46:15 pgoyette Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 2002 The NetBSD Foundation, Inc.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code was 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.
|
||||
*/
|
||||
|
||||
#include <atf-c.h>
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <err.h>
|
||||
#include <vis.h>
|
||||
|
||||
static int styles[] = {
|
||||
VIS_OCTAL,
|
||||
VIS_CSTYLE,
|
||||
VIS_SP,
|
||||
VIS_TAB,
|
||||
VIS_NL,
|
||||
VIS_WHITE,
|
||||
VIS_SAFE,
|
||||
#if 0 /* Not reversible */
|
||||
VIS_NOSLASH,
|
||||
#endif
|
||||
#ifdef VIS_HTTPSTYLE
|
||||
VIS_HTTPSTYLE
|
||||
#endif
|
||||
};
|
||||
|
||||
#define SIZE 256
|
||||
|
||||
ATF_TC(vis);
|
||||
|
||||
ATF_TC_HEAD(vis, tc)
|
||||
{
|
||||
|
||||
atf_tc_set_md_var(tc, "descr", "Test strvis(3)");
|
||||
}
|
||||
|
||||
ATF_TC_BODY(vis, tc)
|
||||
{
|
||||
char *srcbuf, *dstbuf, *visbuf;
|
||||
unsigned int i, j;
|
||||
|
||||
dstbuf = malloc(SIZE);
|
||||
srcbuf = malloc(SIZE);
|
||||
visbuf = malloc(SIZE * 4 + 1);
|
||||
|
||||
for (i = 0; i < SIZE; i++)
|
||||
srcbuf[i] = (char)i;
|
||||
|
||||
for (i = 0; i < __arraycount(styles); i++) {
|
||||
strsvisx(visbuf, srcbuf, SIZE, styles[i], "");
|
||||
/*
|
||||
* XXX: The strunvisx api is busted; flags should be
|
||||
* UNVIS_ flags, buf we follow FreeBSD's lead. This
|
||||
* needs to be redone, by moving UNVIS_END into the
|
||||
* VIS_ space, and bump the library/symbol.
|
||||
*/
|
||||
strunvisx(dstbuf, visbuf, styles[i] & VIS_HTTPSTYLE);
|
||||
for (j = 0; j < SIZE; j++)
|
||||
if (dstbuf[j] != (char)j)
|
||||
atf_tc_fail_nonfatal("Failed for style %x, "
|
||||
"char %d [%d]", styles[i], j, dstbuf[j]);
|
||||
}
|
||||
}
|
||||
|
||||
ATF_TP_ADD_TCS(tp)
|
||||
{
|
||||
|
||||
ATF_TP_ADD_TC(tp, vis);
|
||||
|
||||
return atf_no_error();
|
||||
}
|
Loading…
Reference in New Issue
Block a user