On 12/08/17 12:33, Steffan Karger wrote:
>> ---
>>  tests/Makefile.am       |   2 +-
>>  tests/t_sanity_check.sh | 118 
>> ++++++++++++++++++++++++++++++++++++++++++++++++
> t_sanity_check is less descriptive than the t_usage proposed by Ilya.
> (Sanity check could be anything, while we specifically test the usage
> output.)

Fair point.  I tried to avoid t_usage, as it also checks for a segfault
(which is where this all started).  But when thinking of it, it does
strictly tests usage*() for segfault.  I can switch back to t_usage.


>> +check_option_count()
>> +{
>> +    num_min="$1"
>> +    num_max="$2"
>> +
>> +    echo -n "Checking if number of options are between $num_min and 
>> $num_max ... "
>> +    optcount="$(cat sanity_check_options.$$ | wc -l )"
>> +    if [ $optcount -le $num_min ]; then
>> +        echo "FAIL  (too few, found $optcount options)"
>> +        count_failure
>> +        return
>> +    fi
>> +    if [ $optcount -gt $num_max ]; then
>> +        echo "FAIL  (too many, found $optcount options)"
>> +        count_failure
>> +        return
>> +    fi
>> +    echo "PASS (found $optcount options)"
>> +}
> This is quite fragile.  For example, this breaks 'make check' for
> --disable-crypto builds.  It will also fail easily after adding or
> removing some options, and we probably have more configure flags that
> will cause this check to fail.  That's we I don't like it very much.

Eeek, so the threshold values are not good enough.  Well, that said, I
never expected this proposal to get acceptance on the first review :)
This is just to have a starting point for these checks.

Based on how the current option parser is designed, it is hard to get
this 100% correct.  So I think we need to consider a threshold.  For
example, my system:

$ openvpn --help | grep -E -- '^--'  | wc -l
$ grep -E 'if \(streq\(p\[0\], ".*"\) && ' options.c  | wc -l

We might be able to get closer to a realistic number by sending
options.c via the preprocessor with the right set of "define" arguments.

Or to rework the complete option parser to be based on a struct-like
model where it is easy to write a tool which extracts the number of
options and which options to expect which can be compared against the
--help output.  This way we could get a close to 100% perfect match.
But I don't think doing such a code refactoring shoul be based purely on
the testing requirements in our case.  The code paths involved are quite
solid and re-used in almost every possible way by OpenVPN (config files,
PUSH_REPLY, CCD, CCD via management/plug-ins/script hooks, etc).

Or we could get started on moving the man page over to a more parseable
file format so we could extract options from the man page and compare it
to --help.  This way we enforce that the man page is up-to-date too.
And it could make the man-page be generated according to which features
OpenVPN is built with.

Another approach is to make the threshold values (min/max) be based on
which configure options/defines are enabled - which directly impacts the
add_option() function in options.c.  So have a baseline of arguments, if
ENABLE_CRYPTO - add X to the baseline, and so on.

I do think this test makes sense, as it can ensure 'make check' fails if
we do something wonky with options.c.  But I agree it is hard to get it
right.  So just pondering the alternatives and which ones makes most sense.

That said, I don't buy the argument that testing options can make 'make
check' fail if adding/removing options.  To me that is similar to say
unit tests are bad because they will fail when you change the behaviour
or API of a function which already have a unit test.  So tests will need
to be adopted according to the changes done on code it is expected to
test.  But we can ensure doing those changes in the test-case can be
done in an easily and understandable way.

kind regards,

David Sommerseth
OpenVPN Technologies, Inc

Attachment: signature.asc
Description: OpenPGP digital signature

Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
Openvpn-devel mailing list

Reply via email to