[ovs-dev] [RFC PATCH ovn 0/3] Unit Testing in OVN
Ilya Maximets
i.maximets at ovn.org
Mon Oct 12 15:13:24 UTC 2020
On 10/12/20 4:57 PM, Mark Gray wrote:
> On 09/10/2020 18:23, Ilya Maximets wrote:
>> On 10/9/20 5:29 PM, Mark Michelson wrote:
>>> OVN has had a test framework for as long as I've been working on the
>>> project. The test framework is designed for performing functional tests
>>> of OVN. That is, with the entirety of OVN up and running, we can provide
>>> configuration and test data and ensure that OVN does with that data what
>>> we expect. This is 100% a good thing and has helped us to detect lots of
>>> bugs before they can actually be merged in.
>>>
>>> What's missing, though, are smaller-scale unit tests. As an example, if
>>> I wanted to test ovn-northd's IPAM code, I would need to start up
>>> ovn-northd, create a logical switch, configure that logical switch to
>>> use IPAM, and then create logical switch ports to exercise the IPAM
>>> code. This can be overkill if my only goal is to ensure that IPAM's
>>> algorithm for selecting the next IP address is correct.
>>>
>>> This patch series proposes a unit test framework for OVN.
>>>
>>> If you want to run the unit tests, you can do so in a couple of ways.
>>>
>>> 1) Within the testsuite.
>>> ./configure --with-ovs-source=/path/to/ovs --enable-unit-tests
>>> make check TESTSUITEFLAGS="-k unit"
>>>
>>> 2) One-off from the command line
>>> ./configure --with-ovs-source=/path/to/ovs --enable-unit-tests
>>> make sandbox
>>> ovn-appctl -t ovn-northd unit-test <test_name>
>>>
>>> Some notes on this patch series
>>> 1) Patch 1 is the most important one in the series. This is an RFC
>>> because I'm trying to find out if the unit test framework itself is
>>> good. The refactoring in patch 2 and the unit tests added in patch 3 are
>>> meant to illustrate examples of the framework. They do not necessarily
>>> need to be merged as-is. Feel free to comment on them if you'd like,
>>> though.
>>> 2) Ideally, new unit tests could be added to the testsuite via a script.
>>> They've been added manually in this patch series.
>>> 3) This patch series only adds unit test capabilities to ovn-northd.
>>> However, the patch series we actually merge should add unit test
>>> capabilities to ovn-controller as well.
>>
>> That is an interesting approach, thanks for working n this!
>
> +1
>
>> This is very similar to ovstest framework (tests/ovstest.{c,h}), however
>> there are few differences:
>>
>> - ovstest is a separate executable and tests are implemented as a separate
>> source files. So, usage is 'ovstest mytest' instead of
>> 'ovn-appctl -t ovn-northd mytest'. Upside of ovstest is that it doesn't
>> require test code being integrated to the main executable. Downside
>> is that it requires functions being in a separate library that could
>> be included. Not sure if this is a downside though, as it forces
>> developers to avoid huge source files with static functions.
>>
>
> I don't think this is a downside. If the code was broken down into
> smaller modules, we could do exactly what you are suggesting Ilya. If we
> enable the ability to test code like this, it may reduce the motivation
> for modularization of the code :)
>
> However, if we did go down this path, the other way that I have seen
> this done (while minimizing the amount test code leaking into production
> code) is to include .c files in your test code.
>
> #include "northd/ovn-northd.c"
>
> That way the test code can access private functions and structure in
> the code under test.
That's nasty. :) Anyway, you can not just include ovn-northd.c because
it contains main() function. You need to get rid of it somehow at first.
>
>
>> - current implementation of ovn unit test framework doesn't allow passing
>> datasets via cmdline, while each unit test with ovstest could be called
>> with different cmdline arguments. This makes it easier to test, as you
>> don't need to rebuild binaries under test.
>>
>> - since ovn unit test framework implements tests inside main source files
>> these files will, ideally, grow significantly. ovn-northd is already
>> 13K lines of code, so this, probably, is not a very good thing.
>>
>> You also did a good job decoupling init_ipam_info out of northd stuff,
>> so it basically self-sufficient now. What my suggestion here is to take
>> one more step forward and move this function to its own library, e.g.
>> move all the ipam related code that could be decoupled to lib/ipam.c
>> and lib/ipam.h. This might be a good thing to do not only for unit
>> testing purposes, but just as a generic refactoring step that will
>> reduce code complexity and increase readability and maintainability.
>> Also, this will open a road to write separate testing module like
>> tests/test-ipam.c and integrate it into ovstest-like testing framework.
>> Same could be done for all other logically separable parts of northd.
>> Even actual logic of a northd itself could be split in parts, e.g.
>> northd/ovs-northd-something.{c,h}. In this case all the northd-specific
>> datastructures/functions needed in different modules could be moved to
>> northd/ovs-northd-private.{c,h}. OVS uses this approach in many places,
>> e.g. ovsdb/raft.{c,h}, ovsdb/raft-rpc.{c,h}, ovsdb/raft-private.{c,h}.
>> In this example rpc moved outside of main raft logic code and all required
>> common code moved to raft-private module.
>>
>> What do you think?
>>
>> Best regards, Ilya Maximets.
>> _______________________________________________
>> dev mailing list
>> dev at openvswitch.org
>> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
>>
>
More information about the dev
mailing list