@@ -291,6 +291,18 @@
)
set(HAVE_CONFIG_VERSION_H YES)
+if (BUILD_TESTING)
+ find_package(cmocka CONFIG)
+ if (TARGET cmocka::cmocka)
+ set(CMOCKA_LIBRARIES cmocka::cmocka)
+ else ()
+ pkg_search_module(cmocka cmocka REQUIRED IMPORTED_TARGET)
+ set(CMOCKA_LIBRARIES PkgConfig::cmocka)
+ endif ()
+ set(CMAKE_REQUIRED_LIBRARIES ${CMOCKA_LIBRARIES})
+ check_include_files(cmocka_version.h HAVE_CMOCKA_VERSION_H)
+endif ()
+
configure_file(config.h.cmake.in config.h)
configure_file(include/openvpn-plugin.h.in openvpn-plugin.h)
# TODO we should remove the need for this, and always include config.h
@@ -541,14 +553,6 @@
if (BUILD_TESTING)
- find_package(cmocka CONFIG)
- if (TARGET cmocka::cmocka)
- set(CMOCKA_LIBRARIES cmocka::cmocka)
- else ()
- pkg_search_module(cmocka cmocka REQUIRED IMPORTED_TARGET)
- set(CMOCKA_LIBRARIES PkgConfig::cmocka)
- endif ()
-
set(unit_tests
"test_auth_token"
"test_buffer"
@@ -86,6 +86,9 @@
/* git version information in config-version.h */
#cmakedefine HAVE_CONFIG_VERSION_H
+/* cmocka version information available in cmocka_version.h (>= 2.0.0) */
+#cmakedefine HAVE_CMOCKA_VERSION_H
+
/* Define to 1 if you have the `daemon' function. */
#cmakedefine HAVE_DAEMON
@@ -1525,7 +1525,16 @@
[have_cmocka="yes"],
[AC_MSG_WARN([cmocka.pc not found on the system using pkg-config ${pkg_config_found}. Unit tests disabled])]
)
-AM_CONDITIONAL([ENABLE_UNITTESTS], [test "${enable_unit_tests}" = "yes" -a "${have_cmocka}" = "yes" ])
+AM_CONDITIONAL([ENABLE_UNITTESTS], [false])
+if test "${enable_unit_tests}" = "yes" -a "${have_cmocka}" = "yes"; then
+ AM_CONDITIONAL([ENABLE_UNITTESTS], [true])
+
+ saved_CFLAGS="${CFLAGS}"
+ CFLAGS="${CFLAGS} ${CMOCKA_CFLAGS}"
+ # detect cmocka < 2.0.0 that had no cmocka_version.h
+ AC_CHECK_HEADERS([cmocka_version.h])
+ CFLAGS="${saved_CFLAGS}"
+fi
AC_SUBST([ENABLE_UNITTESTS])
TEST_LDFLAGS="${OPTIONAL_CRYPTO_LIBS} ${OPTIONAL_PKCS11_HELPER_LIBS}"
@@ -25,6 +25,27 @@
#include <setjmp.h>
#include <cmocka.h>
+/* Do we use cmocka < 2.0.0? */
+#ifndef HAVE_CMOCKA_VERSION_H
+#define HAVE_OLD_CMOCKA_API 1
+/* compat with various versions of cmocka.h
+ * Older versions have LargestIntegralType. Newer
+ * versions use uintmax_t. But LargestIntegralType
+ * is not guaranteed to be equal to uintmax_t, so
+ * we can't use that unconditionally. So we only use
+ * it if cmocka.h does not define LargestIntegralType.
+ */
+#ifndef LargestIntegralType
+#define LargestIntegralType uintmax_t
+#endif
+/* redefine 2.x API in terms of 1.x API */
+#define CMockaValueData LargestIntegralType
+#define check_expected_uint check_expected
+#define expect_uint_value expect_value
+#define expect_check_data expect_check
+#define cast_ptr_to_cmocka_value(x) (x)
+#endif
+
/**
* Sets up the environment for unit tests like making both stderr and stdout
* non-buffered to avoid messages getting lost if the program exits early.
@@ -112,8 +112,8 @@
__wrap_buffer_write_file(const char *filename, const struct buffer *buf)
{
const char *pem = BSTR(buf);
- check_expected(filename);
- check_expected(pem);
+ check_expected_ptr(filename);
+ check_expected_ptr(pem);
return mock_type(bool);
}
@@ -121,7 +121,7 @@
struct buffer
__wrap_buffer_read_from_file(const char *filename, struct gc_arena *gc)
{
- check_expected(filename);
+ check_expected_ptr(filename);
const char *pem_str = mock_ptr_type(const char *);
struct buffer ret = alloc_buf_gc(strlen(pem_str) + 1, gc);