Module Name:    src
Committed By:   martin
Date:           Wed Sep 12 08:47:14 UTC 2012

Modified Files:
        src/usr.sbin/npf/npftest: npftest.c

Log Message:
Add two new command line options to help integration into ATF:
-L lists the available test cases, -T executes a single named test.


To generate a diff of this commit:
cvs rdiff -u -r1.6 -r1.7 src/usr.sbin/npf/npftest/npftest.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/usr.sbin/npf/npftest/npftest.c
diff -u src/usr.sbin/npf/npftest/npftest.c:1.6 src/usr.sbin/npf/npftest/npftest.c:1.7
--- src/usr.sbin/npf/npftest/npftest.c:1.6	Tue Aug 21 20:52:11 2012
+++ src/usr.sbin/npf/npftest/npftest.c	Wed Sep 12 08:47:14 2012
@@ -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;
 }

Reply via email to