Automate the subr_unit test.

Build and install the subr_unit test program originally written by phk, and
run it with the other ATF tests.

tests/sys/kern/Makefile
	* Build and install the subr_unit test as a plain test

sys/kern/subr_unit.c
	* Reduce the default number of repetitions from 100 to 1, and add a
	  command-line parser to override it.
	* Don't be so noisy by default
	* Fix an include problem for the test build

Reviewed by:	ngie
MFC after:	4 weeks
Sponsored by:	Spectra Logic Corp
Differential Revision:	https://reviews.freebsd.org/D6038
This commit is contained in:
Alan Somers 2016-04-29 21:11:31 +00:00
parent 1ffe58516c
commit 794277da54
2 changed files with 77 additions and 22 deletions

View File

@ -68,11 +68,11 @@
*/
#include <sys/types.h>
#include <sys/bitstring.h>
#include <sys/_unrhdr.h>
#ifdef _KERNEL
#include <sys/bitstring.h>
#include <sys/param.h>
#include <sys/malloc.h>
#include <sys/kernel.h>
@ -98,6 +98,11 @@ MTX_SYSINIT(unit, &unitmtx, "unit# allocation", MTX_DEF);
#else /* ...USERLAND */
#include <bitstring.h>
#include <err.h>
#include <errno.h>
#include <getopt.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@ -880,9 +885,13 @@ free_unr(struct unrhdr *uh, u_int item)
#ifndef _KERNEL /* USERLAND test driver */
/*
* Simple stochastic test driver for the above functions
* Simple stochastic test driver for the above functions. The code resides
* here so that it can access static functions and structures.
*/
static bool verbose;
#define VPRINTF(...) {if (verbose) printf(__VA_ARGS__);}
static void
print_unr(struct unrhdr *uh, struct unr *up)
{
@ -933,7 +942,7 @@ test_alloc_unr(struct unrhdr *uh, u_int i, char a[])
int j;
if (a[i]) {
printf("F %u\n", i);
VPRINTF("F %u\n", i);
free_unr(uh, i);
a[i] = 0;
} else {
@ -941,7 +950,7 @@ test_alloc_unr(struct unrhdr *uh, u_int i, char a[])
j = alloc_unr(uh);
if (j != -1) {
a[j] = 1;
printf("A %d\n", j);
VPRINTF("A %d\n", j);
}
no_alloc = 0;
}
@ -954,40 +963,73 @@ test_alloc_unr_specific(struct unrhdr *uh, u_int i, char a[])
j = alloc_unr_specific(uh, i);
if (j == -1) {
printf("F %u\n", i);
VPRINTF("F %u\n", i);
a[i] = 0;
free_unr(uh, i);
} else {
a[i] = 1;
printf("A %d\n", j);
VPRINTF("A %d\n", j);
}
}
/* Number of unrs to test */
#define NN 10000
static void
usage(char** argv)
{
printf("%s [-h] [-r REPETITIONS] [-v]\n", argv[0]);
}
int
main(int argc __unused, const char **argv __unused)
main(int argc, char **argv)
{
struct unrhdr *uh;
char *a;
long count = 10000; /* Number of unrs to test */
long reps = 1;
int ch;
u_int i, x, m, j;
char a[NN];
verbose = false;
while ((ch = getopt(argc, argv, "hr:v")) != -1) {
switch (ch) {
case 'r':
errno = 0;
reps = strtol(optarg, NULL, 0);
if (errno == ERANGE || errno == EINVAL) {
usage(argv);
exit(2);
}
break;
case 'v':
verbose = true;
break;
case 'h':
default:
usage(argv);
exit(2);
}
}
setbuf(stdout, NULL);
uh = new_unrhdr(0, NN - 1, NULL);
uh = new_unrhdr(0, count - 1, NULL);
print_unrhdr(uh);
memset(a, 0, sizeof a);
a = calloc(count, sizeof(char));
if (a == NULL)
err(1, "calloc failed");
srandomdev();
fprintf(stderr, "sizeof(struct unr) %zu\n", sizeof(struct unr));
fprintf(stderr, "sizeof(struct unrb) %zu\n", sizeof(struct unrb));
fprintf(stderr, "sizeof(struct unrhdr) %zu\n", sizeof(struct unrhdr));
fprintf(stderr, "NBITS %d\n", NBITS);
printf("sizeof(struct unr) %zu\n", sizeof(struct unr));
printf("sizeof(struct unrb) %zu\n", sizeof(struct unrb));
printf("sizeof(struct unrhdr) %zu\n", sizeof(struct unrhdr));
printf("NBITS %d\n", NBITS);
x = 1;
for (m = 0; m < NN * 100; m++) {
for (m = 0; m < count * reps; m++) {
j = random();
i = (j >> 1) % NN;
i = (j >> 1) % count;
#if 0
if (a[i] && (j & 1))
continue;
@ -997,19 +1039,22 @@ main(int argc __unused, const char **argv __unused)
else
test_alloc_unr_specific(uh, i, a);
if (1) /* XXX: change this for detailed debug printout */
if (verbose)
print_unrhdr(uh);
check_unrhdr(uh, __LINE__);
}
for (i = 0; i < NN; i++) {
for (i = 0; i < count; i++) {
if (a[i]) {
printf("C %u\n", i);
if (verbose) {
printf("C %u\n", i);
print_unrhdr(uh);
}
free_unr(uh, i);
print_unrhdr(uh);
}
}
print_unrhdr(uh);
delete_unrhdr(uh);
free(a);
return (0);
}
#endif

View File

@ -4,12 +4,14 @@ PACKAGE= tests
FILESGROUPS= TESTS
TESTSPACKAGE= ${PACKAGE}
TESTSRC= ${SRCTOP}/contrib/netbsd-tests/kernel
.PATH: ${SRCTOP}/sys/kern
TESTSDIR= ${TESTSBASE}/sys/kern
ATF_TESTS_C+= kern_copyin
ATF_TESTS_C+= kern_descrip_test
ATF_TESTS_C+= ptrace_test
PLAIN_TESTS_C+= subr_unit_test
ATF_TESTS_C+= unix_seqpacket_test
ATF_TESTS_C+= unix_passfd_test
TEST_METADATA.unix_seqpacket_test+= timeout="15"
@ -23,6 +25,14 @@ NETBSD_ATF_TESTS_C+= mqueue_test
CFLAGS.mqueue_test+= -I${SRCTOP}/tests
LIBADD.mqueue_test+= rt
# subr_unit.c contains functions whose prototypes lie in headers that cannot be
# included in userland. But as far as subr_unit_test goes, they're effectively
# static. So it's ok to disable -Wmissing-prototypes for this program.
CFLAGS.subr_unit.c+= -Wno-missing-prototypes
# XXX: -Wno-sign-compare will be eliminated as part of D6004
CFLAGS.subr_unit.c+= -Wno-sign-compare
SRCS.subr_unit_test+= subr_unit.c
WARNS?= 5
TESTS_SUBDIRS+= acct