Subject: SoC atf: Organization of tests
To: None <tech-userlevel@NetBSD.org>
From: Julio M. Merino Vidal <jmmv84@gmail.com>
List: tech-userlevel
Date: 07/14/2007 20:50:59
Hello,

[ This is something I outlined in a previous, unrelated mail, so I'm  
reposting it now in its own thread with more details. ]

[ CC'ing my project mentor ]

One of the "key features" of atf is the ability to install test  
programs into the target system (i.e. under /usr/tests/...) as a  
natural step so that end users can easily run them all.  This makes  
me think what should the structure of those installed tests be, which  
is "of course" (not necessarily, but conveniently) correlated to the  
structure of the test programs in the source tree.

The first possibility is to organize test programs as is done now in  
src/regress: that is, mimicking the organization of the source tree.   
This way, we'd have something like the following:

     /usr/tests/bin - Tests for programs built from src/bin.
     /usr/tests/usr.bin - Tests for programs built from src/usr.bin.
     /usr/tests/lib - Tests for libraries (/lib and /usr/lib).
     /usr/tests/share/mk - Tests for mk makefiles.
     /usr/tests/sys/kern - Tests for core kernel functionality.
     /usr/tests/sys/fs/{ntfs,udf,tmpfs,...} - Tests for kernel file- 
systems.
     Etc.

The advantage of this approach is that, given a specific *file* in  
the system, you can guess where its tests are.  It suits quite well  
tests for basic tools such as /bin/ls, /bin/cp, etc. and also some  
subsystems (such as the kernel) because they are already self- 
contained in the source tree.

The downsides are that logically-related tests are completely  
spread.  A couple of examples:

- If I wanted to test make and all of its infrastructure, I'd like
   to go to a single directory and run all the tests.  This could
   ensure that make(1) works and that all the bsd.*.mk files behave
   correctly.
- If I wanted to test the atf framework, what'd I do?  The tests for
   its tools could be located in tests/bin, tests/libexec... the tests
   for its libraries in tests/lib/libatf, the tests for its shell
   routines in tests/share/atf, etc.  It'd be painful to run them all,
   and I couldn't know which is the correct "order" (from most basic
   unit testing to more complete integration tests).

This could be somewhat solved by tagging each test program with the  
logical application it belongs to.  But still, this doesn't preserve  
the order, and running all the tests for a specific component could  
involve scanning the full tests tree, which I bet will be very  
large.  (This will most-likely be implemented, but shouldn't be  
relied on for regular operation given how slow it will possibly be.)

The opposite approach is to organize tests logically both in the  
source tree and in the installed files.  And instead of inventing a  
brand-new organization, it has just occurred to me that we could  
follow the structure of syspkgs (I know, they are not here yet, but  
the components are already defined).  So, considering that all  
packages follow the following scheme: set-component-type (for lack of  
better names), I'd pick the component part (the second element) and  
use that as a directory name under /usr/tests.  Then, put all related  
tests into there.

For example, skimming through the list of current sets, we'd have:

     /usr/tests/amd/...
     /usr/tests/atf/...
     /usr/tests/bind/...
     /usr/tests/calendar/...
     /usr/tests/games/...
     /usr/tests/util/...
     Etc.

Each component could be free to organize tests under its hierarchy as  
it wanted.  The most obvious example are the tests for the kernel,  
which can easily be categorized into different areas.

The advantage of this approach is that the user could quickly find  
all the tests related to a given logical *component*.  And this can  
make a lot of sense if we get syspkgs some day.

The disadvantage is that the source tree for the tests does not  
follow the source tree for the code, which can cause some confusion  
among developers.  (A possible fix for this could be to put the  
source code for the tests *alongside* the source code for the  
programs/auxiliary files/whatever.  But that can make things complex.)

At the moment I prefer the second option basically because when  
someone is editing a system component, he wants to easily run all  
logically related tests.  It doesn't make sense to be editing the  
pkg_install's code and have to run the tests for postinstall, just  
because the two happen to be under the same usr.sbin source  
directory.  Are there strong objections against it?

Kind regards,

-- 
Julio M. Merino Vidal <jmmv84@gmail.com>