Simple framework for regression tests in src/tools/regression

Alfred Perlstein alfred at freebsd.org
Thu Jan 17 17:36:58 PST 2008


* John Baldwin <jhb at freebsd.org> [080117 14:28] wrote:
> When I converted the test program for the posix shm stuff over to a regression 
> test I added some framework bits to manage the output format prove(1) 
> expects.  You can find it in src/tools/regression/posixshm/test.[ch].  I was 
> curious if we wanted to perhaps make it a library in the base system 
> (libbsdtest.a or some such) that our regression tools could use.
> 
> The basic organization of the current test.[ch] is that you have a linker set 
> of tests which it uses to number the tests and determine the test count.  The 
> framework provides routines for the test to indicate its result like so:
> 
> pass()			- indicates test passed
> fail()			- indicates test failed with no error message
> fail_err(fmt, ...)	- failure with printf(3) error message
> fail_errno(fmt, ...)	- failure with error message followed by strerror(3)
> 			  output similar to err(3)
> skip(const char *)	- test skipped with reason for skip
> todo(const char *)	- test marked as TODO
> 
> If a given test doesn't call any of the status indicators above, then the main 
> test loop will fail the test with an error of "unknown status".  No effort is 
> made to handle multiple status indications for a given test.  I assume 
> prove(1) would handle complaining about such anomalies in the test output.
> 
> Tests consist of a void foo(void) function along with a description and each 
> test is created via the TEST() macro like so:
> 
> void
> mytest(void)
> {
> 	struct passwd *pwd;
> 
> 	pwd = getpwuid(getuid());
> 	if (strcmp(pwd->pw_name, "jhb") == 0) {
> 		fail_err("great evil detected");
> 		return;
> 	}
> 	pass();
> }
> TEST(mytest, "check for evil users");
> 
> To invoke the tests, one executes the 'run_tests()' method provided by the 
> framework.  It outputs the header expected by prove(1) and then executes each 
> test in succession.  I specifically didn't put main() in the framework in 
> case a test utility wants to take optional arguments, etc.  A simple test 
> utility (like posixshm.c) just invokes run_tests() in its main().
> 
> One design decision that I'm sure will be debated is that I went with the 
> functions to indicate results (fail, etc.) rather than having the test method 
> return a value because it becomes more complicated to handle error messages 
> otherwise.  If this were C++ the tests could return a std::pair<> of a status 
> code and some sort of object with a toString() method or something (or if it 
> was python I would return a tuple).  However, this is C. :)  It's also nicer 
> to be able to just pass the va args to vprintf() directly w/o having to print 
> them into strings and print them out later, etc.
> 
> Anyways, comments, etc.?

There is C++ in the base system.

You can return a pair by returning a structure which is supported in
C.

-Alfred


More information about the freebsd-arch mailing list