Add two new command line options to help integration into ATF:

-L lists the available test cases, -T executes a single named test.
This commit is contained in:
martin 2012-09-12 08:47:14 +00:00
parent bba80928a8
commit a76a87c096

View File

@ -1,4 +1,4 @@
/* $NetBSD: npftest.c,v 1.6 2012/08/21 20:52:11 rmind Exp $ */
/* $NetBSD: npftest.c,v 1.7 2012/09/12 08:47:14 martin Exp $ */
/*
* NPF testing framework.
@ -29,19 +29,37 @@ static bool verbose, quiet;
static void
usage(void)
{
printf("usage: %s: [ -q | -v ] [ -c <config> ] "
"[ -i <interface> ] < -b | -t | -s file >\n"
printf("usage:\n"
" %s [ -q | -v ] [ -c <config> ] "
"[ -i <interface> ] < -b | -t | -s file >\n"
" %s -T <testname> -c <config>\n"
" %s -L\n"
"where:\n"
"\t-b: benchmark\n"
"\t-t: regression test\n"
"\t-T <testname>: specific test\n"
"\t-s <file>: pcap stream\n"
"\t-c <config>: NPF configuration file\n"
"\t-i <interface>: primary interface\n"
"\t-L: list testnames and description for -T\n"
"\t-q: quiet mode\n"
"\t-v: verbose mode\n",
getprogname());
getprogname(), getprogname(), getprogname());
exit(EXIT_FAILURE);
}
static void
describe_tests(void)
{
printf( "nbuf\tbasic npf mbuf handling\n"
"processor\tncode processing\n"
"table\ttable handling\n"
"state\tstate handling and processing\n"
"rule\trule processing\n"
"nat\tNAT rule processing\n");
exit(EXIT_SUCCESS);
}
static bool
result(const char *testcase, bool ok)
{
@ -119,13 +137,15 @@ arc4random(void)
int
main(int argc, char **argv)
{
bool benchmark, test, ok, fail;
char *config, *interface, *stream;
bool benchmark, test, ok, fail, tname_matched;
char *config, *interface, *stream, *testname;
int idx = -1, ch;
benchmark = false;
test = false;
tname_matched = false;
testname = NULL;
config = NULL;
interface = NULL;
stream = NULL;
@ -133,7 +153,7 @@ main(int argc, char **argv)
verbose = false;
quiet = false;
while ((ch = getopt(argc, argv, "bqvc:i:s:t")) != -1) {
while ((ch = getopt(argc, argv, "bqvc:i:s:tT:L")) != -1) {
switch (ch) {
case 'b':
benchmark = true;
@ -156,6 +176,12 @@ main(int argc, char **argv)
case 't':
test = true;
break;
case 'T':
test = true;
testname = optarg;
break;
case 'L':
describe_tests();
default:
usage();
}
@ -189,25 +215,43 @@ main(int argc, char **argv)
fail = false;
if (test) {
ok = rumpns_npf_nbuf_test(verbose);
fail |= result("nbuf", ok);
if (!testname || strcmp("nbuf", testname) == 0) {
ok = rumpns_npf_nbuf_test(verbose);
fail |= result("nbuf", ok);
tname_matched = true;
}
ok = rumpns_npf_processor_test(verbose);
fail |= result("processor", ok);
if (!testname || strcmp("processor", testname) == 0) {
ok = rumpns_npf_processor_test(verbose);
fail |= result("processor", ok);
tname_matched = true;
}
ok = rumpns_npf_table_test(verbose);
fail |= result("table", ok);
if (!testname || strcmp("table", testname) == 0) {
ok = rumpns_npf_table_test(verbose);
fail |= result("table", ok);
tname_matched = true;
}
ok = rumpns_npf_state_test(verbose);
fail |= result("state", ok);
if (!testname || strcmp("state", testname) == 0) {
ok = rumpns_npf_state_test(verbose);
fail |= result("state", ok);
tname_matched = true;
}
}
if (test && config) {
ok = rumpns_npf_rule_test(verbose);
fail |= result("rule", ok);
if (!testname || strcmp("rule", testname) == 0) {
ok = rumpns_npf_rule_test(verbose);
fail |= result("rule", ok);
tname_matched = true;
}
ok = rumpns_npf_nat_test(verbose);
fail |= result("nat", ok);
if (!testname || strcmp("nat", testname) == 0) {
ok = rumpns_npf_nat_test(verbose);
fail |= result("nat", ok);
tname_matched = true;
}
}
if (stream) {
@ -216,5 +260,8 @@ main(int argc, char **argv)
rump_unschedule();
if (testname && !tname_matched)
errx(EXIT_FAILURE, "test \"%s\" unknown", testname);
return fail ? EXIT_FAILURE : EXIT_SUCCESS;
}