Hi, On 12-08-17 23:12, David Sommerseth wrote: > On 12/08/17 12:33, Steffan Karger wrote: > > [...] > >>> +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 > 237 > $ grep -E 'if \(streq\(p\[0\], ".*"\) && ' options.c | wc -l > 277 > > 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.
All this sounds quite complex. How about splitting this patch in 2 parts: 1) the return value check and 'must always be present' check, and 2) a more elaborate options check. This way we can have the simple checks in soon, and can do the more complex checking later. As for the solution directions for 2), I think the truly elegant way would be to redo the options parser and add unit tests. That's a lot cleaner than a wrapper script. But also a lot of work... > 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. Fair point. Though the check should fail as fast as possible, which in this case means the counts should be strict. Otherwise, if I add an option, and 'make check' doesn't fail on my system, it might fail on other systems. This is what I mean when I say I think this approach is fragile. I'm afraid we will too often find failures only after commit-and-push. And that is annoying to maintain. -Steffan
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 Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel