]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
Allow unit tests to fall back to hard coded location
authorArne Schwabe <arne@rfc2549.org>
Thu, 1 Feb 2024 14:48:17 +0000 (15:48 +0100)
committerGert Doering <gert@greenie.muc.de>
Thu, 1 Feb 2024 17:22:02 +0000 (18:22 +0100)
Settings the environment variable required for running unit tests is
tiresome in my IDE (Clion). So allow unit tests to fall back to a hard
coded location in case the environment variable is not set.

Change-Id: Ide72b81f497088dd0fd2cdcfff83cbce5b48f145
Acked-by: Frank Lichtenheld <frank@lichtenheld.com>
Message-Id: <20240201144817.188884-1-frank@lichtenheld.com>
URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg28161.html
Signed-off-by: Gert Doering <gert@greenie.muc.de>
CMakeLists.txt
tests/unit_tests/openvpn/test_common.h
tests/unit_tests/openvpn/test_user_pass.c

index be55c60fa2652e7ab9fba1e0b5a1203eb6474c31..fdd2b017a80355cb9ecbfb884704810e68b70434 100644 (file)
@@ -682,6 +682,10 @@ if (BUILD_TESTING)
 
         target_include_directories(${test_name} PRIVATE src/openvpn)
 
+        # for compat with IDEs like Clion that ignore the tests properties
+        # for the environment variable srcdir when running tests as fallback
+        target_compile_definitions(${test_name} PRIVATE "-DUNIT_TEST_SOURCEDIR=\"${CMAKE_SOURCE_DIR}/tests/unit_tests/openvpn\"")
+
         if (NOT ${test_name} STREQUAL "test_buffer")
             target_sources(${test_name} PRIVATE
                 src/openvpn/buffer.c
index 50e16d6daae45357ff7fcdb69184a1725affcff1..f219e93e9a080686b5af065f7cbdf31fb0a1eae7 100644 (file)
  * This has a openvpn prefix to avoid confusion with cmocka's unit_test_setup_*
  * methods
  */
-void
+static inline void
 openvpn_unit_test_setup()
 {
     assert_int_equal(setvbuf(stdout, NULL, _IONBF, BUFSIZ), 0);
     assert_int_equal(setvbuf(stderr, NULL, _IONBF, BUFSIZ), 0);
 }
+
+/**
+ * Helper function to get a file path from the unit test directory to open it
+ * or pass its path to another function. This function will first look for
+ * an environment variable or if failing that, will fall back to a hardcoded
+ * value from compile time if compiled with CMake.
+ *
+ * @param buf           buffer holding the path to the file
+ * @param bufsize       size of buf
+ * @param filename      name of the filename to retrieve relative to the
+ *                      unit test source directory
+ */
+void
+openvpn_test_get_srcdir_dir(char *buf, size_t bufsize, const char *filename)
+{
+    const char *srcdir = getenv("srcdir");
+
+#if defined(UNIT_TEST_SOURCEDIR)
+    if (!srcdir)
+    {
+        srcdir = UNIT_TEST_SOURCEDIR;
+    }
+#endif
+    assert_non_null(srcdir);
+
+    snprintf(buf, bufsize, "%s/%s", srcdir, filename);
+}
index 277cb1db8fb4cdf752cfa0bd18784b1c660ad432..bd4eb1fd2c2a368f9b51715ffd9be5e9a02d0d7a 100644 (file)
@@ -35,6 +35,7 @@
 #include <string.h>
 #include <setjmp.h>
 #include <cmocka.h>
+#include "test_common.h"
 
 #include "misc.c"
 
@@ -232,11 +233,9 @@ test_get_user_pass_authfile_file(void **state)
     reset_user_pass(&up);
     unsigned int flags = 0;
 
-    const char *srcdir = getenv("srcdir");
-    assert_non_null(srcdir);
     char authfile[PATH_MAX] = { 0 };
+    openvpn_test_get_srcdir_dir(authfile, PATH_MAX, "input/user_pass.txt" );
 
-    snprintf(authfile, PATH_MAX, "%s/%s", srcdir, "input/user_pass.txt");
     /*FIXME: query_user_exec() called even though nothing queued */
     will_return(query_user_exec_builtin, true);
     assert_true(get_user_pass_cr(&up, authfile, "UT", flags, NULL));
@@ -246,7 +245,7 @@ test_get_user_pass_authfile_file(void **state)
 
     reset_user_pass(&up);
 
-    snprintf(authfile, PATH_MAX, "%s/%s", srcdir, "input/user_only.txt");
+    openvpn_test_get_srcdir_dir(authfile, PATH_MAX, "input/user_only.txt");
     expect_string(query_user_exec_builtin, query_user[i].prompt, "Enter UT Password:");
     will_return(query_user_exec_builtin, "cpassword");
     will_return(query_user_exec_builtin, true);
@@ -259,7 +258,7 @@ test_get_user_pass_authfile_file(void **state)
     reset_user_pass(&up);
 
     flags |= GET_USER_PASS_PASSWORD_ONLY;
-    snprintf(authfile, PATH_MAX, "%s/%s", srcdir, "input/user_only.txt");
+    openvpn_test_get_srcdir_dir(authfile, PATH_MAX, "input/user_only.txt");
     /*FIXME: query_user_exec() called even though nothing queued */
     will_return(query_user_exec_builtin, true);
     assert_true(get_user_pass_cr(&up, authfile, "UT", flags, NULL));
@@ -279,5 +278,6 @@ const struct CMUnitTest user_pass_tests[] = {
 int
 main(void)
 {
+    openvpn_unit_test_setup();
     return cmocka_run_group_tests(user_pass_tests, NULL, NULL);
 }