[Dnsmasq-discuss] [PATCH] unittests

Petr Menšík pemensik at redhat.com
Mon May 3 10:53:39 UTC 2021

On 4/30/21 12:42 AM, Simon Kelley wrote:
> On 14/04/2021 18:35, Petr Menšík wrote:
>> Hi Simon and other dnsmasq friends,
>> after some struggling with Makefile support, I am sending my dnsmasq
>> unit tests. It uses another directory with tests specific code. I moved
>> some common parts to Makefile.config, in order to be able to reuse them.
>> Unit tests are under tests directory with own Makefile.
>> New target make check should work also from top directory. Some checks
>> would work only from tests directory (make kyua). Current coverage is
>> rather poor, but I hope can be used as a building block to better tests.
>> Especially option parsing tests are easy to write. Testing of sending
>> and receiving packets seems to be difficult, it should be tested by
>> different kind of test IMHO.
>> First is attempt to refactor, the second is what evolved into more
>> complex set of tests.
>> Original separate commits are still available on github [1].
>> What do you think?
> Well, I applied the patch, and run "make check" and all the tests passed!
> Now I have to understand how to write new tests.

Configuration parsing tests are easy, just provide input parameters
similar way to existing test and then check expected values are provided.
> Would it make sense to consider some changes to the main code to make
> the tests easier? I see that die() is a problem. Can we change the code
> in die() to do something useful when testing?

I have chosen to omit dnsmasq.c code from tests. It contains main()
function, cannot be part of test anyway. Sure, some code changes would
help with reducing needed repetitions in tests. Especially init code
required in tests should be moved out of dnsmasq.c, where it could be
called directly from tests. Shared init code must not be static
functions of course.

die does make sense everywhere where it is a corner case. If we move
die() calls to dnsmasq.c, it would be okay. Other files should return
indication of fatal error, but not die directly. It would need
additional wrappers in dnsmasq.c, but such functions would be more testable.
> Also the tests seem to can copies of initialisation code, does it make
> sense to abstract the initialisation in main() so that it can be used by
> the tests standalone?
Yes, it make sense to move parts of initialization to subsystem-specific
initialization functions. I would move dns_init() into rfc1035.c,
dhcp_init() into dhcp-common.c etc. It should make main source file
shorter and it would be more obvious, which subsystems are initialized
in which order, whether they depend on anything before it. I think the
best practice is to break long functions into several shorter, more
readable functions. I think current main() is a great example to break
into more smaller functions and move some of them to shareable files.
Parts required by current tests are small enough.
> I'm thinking of changing the existing main()
> main()
> {
>     <initialise stuff>
>     while (1)
>         events()
> }
> into
> main()
> {
>     init();
>     while (1)
>       events()
> }
> So that init() is available for testing.
> Cheers,
> Simon.
>> PS: sending this message again, because patch #2 were big enough to
>> require moderator's approval. Compressed it as a workaround.
>> Cheers,
>> Petr
>> 1. https://github.com/InfrastructureServices/dnsmasq/tree/unittests

Petr Menšík
Software Engineer
Red Hat, http://www.redhat.com/
email: pemensik at redhat.com
PGP: DFCF908DB7C87E8E529925BC4931CA5B6C9FC5CB

-------------- next part --------------
A non-text attachment was scrubbed...
Name: OpenPGP_signature
Type: application/pgp-signature
Size: 495 bytes
Desc: OpenPGP digital signature
URL: <http://lists.thekelleys.org.uk/pipermail/dnsmasq-discuss/attachments/20210503/cabafa30/attachment.sig>

More information about the Dnsmasq-discuss mailing list