Migrate the remaining libc/gen tests to atf

This commit is contained in:
pgoyette 2010-12-28 12:46:15 +00:00
parent 69585815cc
commit 66bfd22447
7 changed files with 781 additions and 5 deletions

View File

@ -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

View File

@ -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
View 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();
}

View 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();
}

View 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();
}

View 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();
}

View 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();
}