This runs openvpn --help to check if the output is somewhat
sensible and sane.  It will catch if the binary segfaults,
if it is a normal build or an --enable-small build and
does some simple checks when a list of options is produced.

This is based on the discussions in this [1] mailing thread.

[1] 
https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg15172.html
    Message-Id: <20170807132301.22759-3-chipits...@gmail.com>

Signed-off-by: David Sommerseth <dav...@openvpn.net>
---
 tests/Makefile.am       |   2 +-
 tests/t_sanity_check.sh | 118 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 119 insertions(+), 1 deletion(-)
 create mode 100755 tests/t_sanity_check.sh

diff --git a/tests/Makefile.am b/tests/Makefile.am
index 0795680c..7af5101e 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -14,7 +14,7 @@ MAINTAINERCLEANFILES = \
 
 SUBDIRS = unit_tests
 
-test_scripts = t_client.sh
+test_scripts = t_sanity_check.sh t_client.sh
 if ENABLE_CRYPTO
 test_scripts += t_lpback.sh t_cltsrv.sh
 endif
diff --git a/tests/t_sanity_check.sh b/tests/t_sanity_check.sh
new file mode 100755
index 00000000..e6c228c8
--- /dev/null
+++ b/tests/t_sanity_check.sh
@@ -0,0 +1,118 @@
+#! /bin/sh
+#
+# t_sanity_check.sh  --  Check that openvpn --help makes somewhat sense
+#
+# Copyright (C) 2017  David Sommerseth <dav...@openvpn.net>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+# 02110-1301, USA.
+
+set -u
+top_builddir="${top_builddir:-..}"
+
+failed=0
+count_failure()
+{
+    failed=$(($failed + 1))
+}
+
+
+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)"
+}
+
+
+check_options_present()
+{
+    for opt in $*;
+    do
+        echo -n "Checking for option --${opt} ..."
+        grep -E "^--${opt} " sanity_check_options.$$ 1>/dev/null 2>&1
+        if [ $? -ne 0 ]; then
+            echo "FAIL (missing option)"
+            count_failure
+        else
+            echo "PASS"
+        fi
+    done
+}
+
+echo "*** OpenVPN sanity check: openvpn --help"
+echo -n "Running 'openvpn --help' ... "
+"${top_builddir}/src/openvpn/openvpn" --help > sanity_check_log.$$ 2>&1
+res=$?
+if [ $res -ne 1 ]; then
+    echo "FAIL   (Something bad happened)"
+    cat sanity_check_log.$$
+    count_failure
+else
+    echo "PASS"
+    echo -n "Check build type ... "
+    linecount="$(cat sanity_check_log.$$ | wc -l)"
+    if [ $linecount -eq 1 ]; then
+        # Is this an --enable-small build?
+        grep "Usage message not available" sanity_check_log.$$ \
+            1> /dev/null 2> /dev/null
+        if [ $? -ne 0 ]; then
+            echo "Unknown build type"
+            cat sanity_check_log.$$
+            count_failure
+        else
+            echo "PASS  (--enable-small build, no further checks)"
+        fi
+    else
+        echo "PASS  (normal build)"
+
+        # Extract only the options
+        echo -n "Extracting options ... "
+        grep -E -- ^-- sanity_check_log.$$ > sanity_check_options.$$
+        if [ $? -ne 0 ]; then
+            echo "FAIL"
+            count_failure
+        else
+            echo "PASS"
+
+            # Check that the number of option counts are between 220 and 245
+            check_option_count 225 245
+
+            # Check for a selected subset of options we always expect to see
+            options_check="dev dev-type remote local port proto topology route 
ifconfig"
+            check_options_present $options_check
+        fi
+    fi
+fi
+echo "*** OpenVPN sanity check result - Failed tasks: $failed"
+
+rm -f sanity_check_log.$$ sanity_check_options.$$
+if [ $failed -gt 0 ]; then
+    exit 1
+fi
+exit 0
-- 
2.11.0


------------------------------------------------------------------------------
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

Reply via email to