wget  

Re: About Automated Unit Test for Wget

Micah Cowan
Fri, 04 Apr 2008 00:47:49 -0700

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Yoshihiro Tanaka wrote:
> Hello, I want to ask about Unit test of Wget in the future.
> I want to ask about unit test.
> 
> Now unit test of Wget is written only for following .c files.
>  -- http.c init.c main.c res.c url.c utils.c (test.c)
> 
> So as written in Wiki, new unit test suite is necessary.
>    (ref. http://wget.addictivecode.org/FeatureSpecifications/Testing)

Well, or expansions to the existing one.

However, it's my desire (as expressed on that page) that the test code
be separated from the .c files containing the code-to-test. This may
mean making some functions that are currently "static" to be externally
linked.

IMO, if it's worth testing, it's probably better to have external
linkage anyway.

> In order to make new unit test suite, I think following work is necessary.
> 
>  1) Select functions which can be tested in unit test.
>     But How can I select them? is difficult.
>     Basically the less dependency the function has, more easy to
>     include in unit test, but about boundary line, I'm not sure.

This is precisely the problem, and one reason I've been thinking that
this might not make an ideal topic for a GSoC proposal, unless you want
to include refactoring existing functions like gethttp and http_loop
into more logically discreet sets of functions. Essentially, to get
better coverage of the code that needs it the most, that code will need
to be rewritten. I believe this can be an iterative process (find one
function to factor out, write a unit test for it, make it work...).

>  2) In order to do above 1), How about Making a list of all functions
>     in Wget? and maintain?
> 
>     The advantage of 2) is ...
>         * make clear which function is included in Unit test
>         * make clear which function is _not_ in Unit test
>         * make easy to manage testing
>         * make easy to devide testing work

Hm... I'm not sure that the benefits are worth the effort.

If we _really_ wanted this, I'd propose that we use a naming convention
(or processed comment, etc) for the unit test functions so that the list
of functions that are covered can be determined automatically by a
program; the ones that aren't covered would be any functions remaining.

However, I personally wouldn't find this useful. I don't intend that
every function in existence has to have a unit test covering it. Some
functions will have already been tested through the exercise of
higher-level calling functions (in which case they should probably have
internal linkage); others may have been tested through the exercise of
the functions it calls.

What I'm most keenly interested in, is the ability to verify the logic
of how follow/don't-follow is decided (that actually may not be too hard
to write tests against now), how Wget handles various protocol-level
situations, how it chooses the filename and deals with the local
filesystem, etc. I will be very, _very_ happy when everything that's in
http_loop and gethttp is verified by unit tests.

But a lot of getting to where we can test that may mean abstracting out
things like the Berkeley Sockets API and filesystem interactions, so
that we can drop in "fake" replacements for testing.

> (test tools, other preliminary work for unit test, how manage it ...)

There is an incredibly basic test framework, completely defined in
src/test.h. See src/test.c for how it is being used.

I'm familiar with a framework called (simply) "Check", which might be
worth considering. It forks a new process for each test, which isolates
it from interfering with the other tests, and also provides a clean way
to handle things like segmentation violations or aborts. However, it's
intended for Unix, and probably doesn't compile on other systems.

http://check.sourceforge.net/

- --
Micah J. Cowan
Programmer, musician, typesetting enthusiast, gamer,
and GNU Wget Project Maintainer.
http://micah.cowan.name/
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFH9d0Q7M8hyUobTrERApdnAJ905n4j0oglUHekP6MJaE4dBCEw+QCeL4RE
0lnwnZgHQjSEom4f1MfiviM=
=UejZ
-----END PGP SIGNATURE-----