From 9fc0326428eae41f15b60e27b77b4129b1153c61 Mon Sep 17 00:00:00 2001 From: Steffen Jaeckel Date: Fri, 7 Mar 2025 20:38:18 +0100 Subject: [PATCH] Add Valgrind to CI * Also pass `$*` to `configure` when invoking `ci-build.sh`, so one can e.g. run `./ci-build.sh --without-xscreensaver` Signed-off-by: Steffen Jaeckel --- Dockerfile.arch | 1 + Dockerfile.debian | 1 + Dockerfile.fedora | 1 + Dockerfile.tumbleweed | 1 + Dockerfile.ubuntu | 1 + Makefile.am | 3 + ci-build.sh | 24 ++- configure.ac | 6 + m4/ax_valgrind_check.m4 | 239 ++++++++++++++++++++++++++ prof.supp | 21 +++ src/xmpp/chat_session.c | 2 +- src/xmpp/muc.c | 10 +- tests/unittests/test_callbacks.c | 5 +- tests/unittests/test_cmd_bookmark.c | 10 -- tests/unittests/test_cmd_disconnect.c | 2 +- tests/unittests/test_cmd_join.c | 8 - tests/unittests/test_common.c | 2 +- tests/unittests/test_muc.c | 3 + tests/unittests/unittests.c | 20 ++- 19 files changed, 319 insertions(+), 41 deletions(-) create mode 100644 m4/ax_valgrind_check.m4 diff --git a/Dockerfile.arch b/Dockerfile.arch index 3fe70dff..fa2afb87 100644 --- a/Dockerfile.arch +++ b/Dockerfile.arch @@ -28,6 +28,7 @@ RUN pacman -Syu --noconfirm && pacman -S --needed --noconfirm \ python \ wget \ sqlite \ + valgrind \ gdk-pixbuf2 \ qrencode diff --git a/Dockerfile.debian b/Dockerfile.debian index 6da1f414..114aec28 100644 --- a/Dockerfile.debian +++ b/Dockerfile.debian @@ -27,6 +27,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config \ python3-dev \ python-dev-is-python3 \ + valgrind \ libsqlite3-dev \ libgdk-pixbuf-2.0-dev \ libqrencode-dev diff --git a/Dockerfile.fedora b/Dockerfile.fedora index effefc5c..56499b30 100644 --- a/Dockerfile.fedora +++ b/Dockerfile.fedora @@ -33,6 +33,7 @@ RUN dnf install -y \ readline-devel \ openssl-devel \ sqlite-devel \ + valgrind \ gdk-pixbuf2-devel \ qrencode-devel diff --git a/Dockerfile.tumbleweed b/Dockerfile.tumbleweed index 5cd6c20c..1777d170 100644 --- a/Dockerfile.tumbleweed +++ b/Dockerfile.tumbleweed @@ -33,6 +33,7 @@ RUN zypper --non-interactive in --no-recommends \ python310-devel \ readline-devel \ sqlite3-devel \ + valgrind \ gdk-pixbuf-devel \ qrencode-devel diff --git a/Dockerfile.ubuntu b/Dockerfile.ubuntu index 853544c0..7f100ddd 100644 --- a/Dockerfile.ubuntu +++ b/Dockerfile.ubuntu @@ -28,6 +28,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config \ python3-dev \ python-dev-is-python3 \ + valgrind \ libsqlite3-dev \ libgdk-pixbuf-2.0-dev \ libqrencode-dev diff --git a/Makefile.am b/Makefile.am index 99370e82..e9a1c365 100644 --- a/Makefile.am +++ b/Makefile.am @@ -354,6 +354,9 @@ my-prof.supp: check-unit: tests/unittests/unittests tests/unittests/unittests +@VALGRIND_CHECK_RULES@ +VALGRIND_SUPPRESSIONS_FILES=prof.supp + format: $(all_c_sources) clang-format -i $(all_c_sources) diff --git a/ci-build.sh b/ci-build.sh index 0e84cae9..963db462 100755 --- a/ci-build.sh +++ b/ci-build.sh @@ -13,6 +13,7 @@ error_handler() log_content ./config.log log_content ./test-suite.log + log_content ./test-suite-memcheck.log echo echo "Error ${ERR_CODE} with command '${BASH_COMMAND}' on line ${BASH_LINENO[0]}. Exiting." @@ -39,7 +40,9 @@ tests=() MAKE="make --quiet -j$(num_cores)" CC="gcc" -case $(uname | tr '[:upper:]' '[:lower:]') in +ARCH="$(uname | tr '[:upper:]' '[:lower:]')" + +case "$ARCH" in linux*) tests=( "--enable-notifications --enable-icons-and-clipboard --enable-otr --enable-pgp @@ -114,14 +117,29 @@ case $(uname | tr '[:upper:]' '[:lower:]') in ;; esac +case "$ARCH" in + linux*) + echo + echo "--> Building with ./configure ${tests[0]} --enable-valgrind $*" + echo + + # shellcheck disable=SC2086 + ./configure ${tests[0]} --enable-valgrind $* + + $MAKE CC="${CC}" + $MAKE check-valgrind + $MAKE distclean + ;; +esac + for features in "${tests[@]}" do echo - echo "--> Building with ./configure ${features}" + echo "--> Building with ./configure ${features} $*" echo # shellcheck disable=SC2086 - ./configure $features + ./configure $features $* $MAKE CC="${CC}" $MAKE check diff --git a/configure.ac b/configure.ac index d645c140..844778fe 100644 --- a/configure.ac +++ b/configure.ac @@ -70,6 +70,12 @@ AC_ARG_ENABLE([gdk-pixbuf], AC_ARG_ENABLE([omemo-qrcode], [AS_HELP_STRING([--enable-omemo-qrcode], [enable ability to display omemo qr code])]) +m4_include([m4/ax_valgrind_check.m4]) +AX_VALGRIND_DFLT([drd], [off]) +AX_VALGRIND_DFLT([helgrind], [off]) +AX_VALGRIND_DFLT([sgcheck], [off]) +AX_VALGRIND_CHECK + # Required dependencies AC_CHECK_FUNCS([atexit memset strdup strstr]) diff --git a/m4/ax_valgrind_check.m4 b/m4/ax_valgrind_check.m4 new file mode 100644 index 00000000..a1b58307 --- /dev/null +++ b/m4/ax_valgrind_check.m4 @@ -0,0 +1,239 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_valgrind_check.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_VALGRIND_DFLT(memcheck|helgrind|drd|sgcheck, on|off) +# AX_VALGRIND_CHECK() +# +# DESCRIPTION +# +# AX_VALGRIND_CHECK checks whether Valgrind is present and, if so, allows +# running `make check` under a variety of Valgrind tools to check for +# memory and threading errors. +# +# Defines VALGRIND_CHECK_RULES which should be substituted in your +# Makefile; and $enable_valgrind which can be used in subsequent configure +# output. VALGRIND_ENABLED is defined and substituted, and corresponds to +# the value of the --enable-valgrind option, which defaults to being +# enabled if Valgrind is installed and disabled otherwise. Individual +# Valgrind tools can be disabled via --disable-valgrind-, the +# default is configurable via the AX_VALGRIND_DFLT command or is to use +# all commands not disabled via AX_VALGRIND_DFLT. All AX_VALGRIND_DFLT +# calls must be made before the call to AX_VALGRIND_CHECK. +# +# If unit tests are written using a shell script and automake's +# LOG_COMPILER system, the $(VALGRIND) variable can be used within the +# shell scripts to enable Valgrind, as described here: +# +# https://www.gnu.org/software/gnulib/manual/html_node/Running-self_002dtests-under-valgrind.html +# +# Usage example: +# +# configure.ac: +# +# AX_VALGRIND_DFLT([sgcheck], [off]) +# AX_VALGRIND_CHECK +# +# in each Makefile.am with tests: +# +# @VALGRIND_CHECK_RULES@ +# VALGRIND_SUPPRESSIONS_FILES = my-project.supp +# EXTRA_DIST = my-project.supp +# +# This results in a "check-valgrind" rule being added. Running `make +# check-valgrind` in that directory will recursively run the module's test +# suite (`make check`) once for each of the available Valgrind tools (out +# of memcheck, helgrind and drd) while the sgcheck will be skipped unless +# enabled again on the commandline with --enable-valgrind-sgcheck. The +# results for each check will be output to test-suite-$toolname.log. The +# target will succeed if there are zero errors and fail otherwise. +# +# Alternatively, a "check-valgrind-$TOOL" rule will be added, for $TOOL in +# memcheck, helgrind, drd and sgcheck. These are useful because often only +# some of those tools can be ran cleanly on a codebase. +# +# The macro supports running with and without libtool. +# +# LICENSE +# +# Copyright (c) 2014, 2015, 2016 Philip Withnall +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 23 + +dnl Configured tools +m4_define([valgrind_tool_list], [[memcheck], [helgrind], [drd], [sgcheck]]) +m4_set_add_all([valgrind_exp_tool_set], [sgcheck]) +m4_foreach([vgtool], [valgrind_tool_list], + [m4_define([en_dflt_valgrind_]vgtool, [on])]) + +AC_DEFUN([AX_VALGRIND_DFLT],[ + m4_define([en_dflt_valgrind_$1], [$2]) +])dnl + +AC_DEFUN([AX_VALGRIND_CHECK],[ + AM_EXTRA_RECURSIVE_TARGETS([check-valgrind]) + m4_foreach([vgtool], [valgrind_tool_list], + [AM_EXTRA_RECURSIVE_TARGETS([check-valgrind-]vgtool)]) + + dnl Check for --enable-valgrind + AC_ARG_ENABLE([valgrind], + [AS_HELP_STRING([--enable-valgrind], [Whether to enable Valgrind on the unit tests])], + [enable_valgrind=$enableval],[enable_valgrind=]) + + AS_IF([test "$enable_valgrind" != "no"],[ + # Check for Valgrind. + AC_CHECK_PROG([VALGRIND],[valgrind],[valgrind]) + AS_IF([test "$VALGRIND" = ""],[ + AS_IF([test "$enable_valgrind" = "yes"],[ + AC_MSG_ERROR([Could not find valgrind; either install it or reconfigure with --disable-valgrind]) + ],[ + enable_valgrind=no + ]) + ],[ + enable_valgrind=yes + ]) + ]) + + AM_CONDITIONAL([VALGRIND_ENABLED],[test "$enable_valgrind" = "yes"]) + AC_SUBST([VALGRIND_ENABLED],[$enable_valgrind]) + + # Check for Valgrind tools we care about. + [valgrind_enabled_tools=] + m4_foreach([vgtool],[valgrind_tool_list],[ + AC_ARG_ENABLE([valgrind-]vgtool, + m4_if(m4_defn([en_dflt_valgrind_]vgtool),[off],dnl +[AS_HELP_STRING([--enable-valgrind-]vgtool, [Whether to use ]vgtool[ during the Valgrind tests])],dnl +[AS_HELP_STRING([--disable-valgrind-]vgtool, [Whether to skip ]vgtool[ during the Valgrind tests])]), + [enable_valgrind_]vgtool[=$enableval], + [enable_valgrind_]vgtool[=]) + AS_IF([test "$enable_valgrind" = "no"],[ + enable_valgrind_]vgtool[=no], + [test "$enable_valgrind_]vgtool[" ]dnl +m4_if(m4_defn([en_dflt_valgrind_]vgtool), [off], [= "yes"], [!= "no"]),[ + AC_CACHE_CHECK([for Valgrind tool ]vgtool, + [ax_cv_valgrind_tool_]vgtool,[ + ax_cv_valgrind_tool_]vgtool[=no + m4_set_contains([valgrind_exp_tool_set],vgtool, + [m4_define([vgtoolx],[exp-]vgtool)], + [m4_define([vgtoolx],vgtool)]) + AS_IF([`$VALGRIND --tool=]vgtoolx[ --help >/dev/null 2>&1`],[ + ax_cv_valgrind_tool_]vgtool[=yes + ]) + ]) + AS_IF([test "$ax_cv_valgrind_tool_]vgtool[" = "no"],[ + AS_IF([test "$enable_valgrind_]vgtool[" = "yes"],[ + AC_MSG_ERROR([Valgrind does not support ]vgtool[; reconfigure with --disable-valgrind-]vgtool) + ],[ + enable_valgrind_]vgtool[=no + ]) + ],[ + enable_valgrind_]vgtool[=yes + ]) + ]) + AS_IF([test "$enable_valgrind_]vgtool[" = "yes"],[ + valgrind_enabled_tools="$valgrind_enabled_tools ]m4_bpatsubst(vgtool,[^exp-])[" + ]) + AC_SUBST([ENABLE_VALGRIND_]vgtool,[$enable_valgrind_]vgtool) + ]) + AC_SUBST([valgrind_tools],["]m4_join([ ], valgrind_tool_list)["]) + AC_SUBST([valgrind_enabled_tools],[$valgrind_enabled_tools]) + +[VALGRIND_CHECK_RULES=' +# Valgrind check +# +# Optional: +# - VALGRIND_SUPPRESSIONS_FILES: Space-separated list of Valgrind suppressions +# files to load. (Default: empty) +# - VALGRIND_FLAGS: General flags to pass to all Valgrind tools. +# (Default: --num-callers=30) +# - VALGRIND_$toolname_FLAGS: Flags to pass to Valgrind $toolname (one of: +# memcheck, helgrind, drd, sgcheck). (Default: various) + +# Optional variables +VALGRIND_SUPPRESSIONS ?= $(addprefix --suppressions=,$(VALGRIND_SUPPRESSIONS_FILES)) +VALGRIND_FLAGS ?= --num-callers=30 +VALGRIND_memcheck_FLAGS ?= --leak-check=full --show-reachable=no +VALGRIND_helgrind_FLAGS ?= --history-level=approx +VALGRIND_drd_FLAGS ?= +VALGRIND_sgcheck_FLAGS ?= + +# Internal use +valgrind_log_files = $(addprefix test-suite-,$(addsuffix .log,$(valgrind_tools))) + +valgrind_memcheck_flags = --tool=memcheck $(VALGRIND_memcheck_FLAGS) +valgrind_helgrind_flags = --tool=helgrind $(VALGRIND_helgrind_FLAGS) +valgrind_drd_flags = --tool=drd $(VALGRIND_drd_FLAGS) +valgrind_sgcheck_flags = --tool=exp-sgcheck $(VALGRIND_sgcheck_FLAGS) + +valgrind_quiet = $(valgrind_quiet_$(V)) +valgrind_quiet_ = $(valgrind_quiet_$(AM_DEFAULT_VERBOSITY)) +valgrind_quiet_0 = --quiet +valgrind_v_use = $(valgrind_v_use_$(V)) +valgrind_v_use_ = $(valgrind_v_use_$(AM_DEFAULT_VERBOSITY)) +valgrind_v_use_0 = @echo " USE " $(patsubst check-valgrind-%-local,%,$''@):; + +# Support running with and without libtool. +ifneq ($(LIBTOOL),) +valgrind_lt = $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=execute +else +valgrind_lt = +endif + +# Use recursive makes in order to ignore errors during check +check-valgrind-local: +ifeq ($(VALGRIND_ENABLED),yes) + $(A''M_V_at)$(MAKE) $(AM_MAKEFLAGS) -k \ + $(foreach tool, $(valgrind_enabled_tools), check-valgrind-$(tool)) +else + @echo "Need to reconfigure with --enable-valgrind" +endif + +# Valgrind running +VALGRIND_TESTS_ENVIRONMENT = \ + $(TESTS_ENVIRONMENT) \ + env VALGRIND=$(VALGRIND) \ + G_SLICE=always-malloc,debug-blocks \ + G_DEBUG=fatal-warnings,fatal-criticals,gc-friendly + +VALGRIND_LOG_COMPILER = \ + $(valgrind_lt) \ + $(VALGRIND) $(VALGRIND_SUPPRESSIONS) --error-exitcode=1 $(VALGRIND_FLAGS) + +define valgrind_tool_rule +check-valgrind-$(1)-local: +ifeq ($$(VALGRIND_ENABLED)-$$(ENABLE_VALGRIND_$(1)),yes-yes) +ifneq ($$(TESTS),) + $$(valgrind_v_use)$$(MAKE) check-TESTS \ + TESTS_ENVIRONMENT="$$(VALGRIND_TESTS_ENVIRONMENT)" \ + LOG_COMPILER="$$(VALGRIND_LOG_COMPILER)" \ + LOG_FLAGS="$$(valgrind_$(1)_flags)" \ + TEST_SUITE_LOG=test-suite-$(1).log +endif +else ifeq ($$(VALGRIND_ENABLED),yes) + @echo "Need to reconfigure with --enable-valgrind-$(1)" +else + @echo "Need to reconfigure with --enable-valgrind" +endif +endef + +$(foreach tool,$(valgrind_tools),$(eval $(call valgrind_tool_rule,$(tool)))) + +A''M_DISTCHECK_CONFIGURE_FLAGS ?= +A''M_DISTCHECK_CONFIGURE_FLAGS += --disable-valgrind + +MOSTLYCLEANFILES ?= +MOSTLYCLEANFILES += $(valgrind_log_files) + +.PHONY: check-valgrind $(addprefix check-valgrind-,$(valgrind_tools)) +'] + + AC_SUBST([VALGRIND_CHECK_RULES]) + m4_ifdef([_AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE([VALGRIND_CHECK_RULES])]) +]) \ No newline at end of file diff --git a/prof.supp b/prof.supp index 3d0c5880..36f9ef71 100644 --- a/prof.supp +++ b/prof.supp @@ -252,6 +252,27 @@ fun:Py_InitializeEx fun:python_env_init } +{ + Custom Inittab can only be cleaned by calling PyMain, which we don't do + Memcheck:Leak + ... + fun:PyImport_ExtendInittab + fun:PyImport_AppendInittab + fun:python_init_prof + ... +} + +# Specific for unit test issues +{ + Libc TLS allocation + Memcheck:Leak + ... + fun:allocate_dtv + fun:_dl_allocate_tls + ... + fun:unique_filename_from_url + ... +} # AUTO-GENERATED START diff --git a/src/xmpp/chat_session.c b/src/xmpp/chat_session.c index 65b6b32f..0f5f03c2 100644 --- a/src/xmpp/chat_session.c +++ b/src/xmpp/chat_session.c @@ -89,7 +89,7 @@ void chat_sessions_clear(void) { if (sessions) { - g_hash_table_remove_all(sessions); + g_hash_table_destroy(sessions); sessions = NULL; } } diff --git a/src/xmpp/muc.c b/src/xmpp/muc.c index b6bb57c9..312ac941 100644 --- a/src/xmpp/muc.c +++ b/src/xmpp/muc.c @@ -94,14 +94,14 @@ static void _occupant_free(Occupant* occupant); static void _muc_close(void) { - autocomplete_free(invite_ac); - autocomplete_free(confservers_ac); - g_hash_table_destroy(rooms); g_hash_table_destroy(invite_passwords); - rooms = NULL; invite_passwords = NULL; - invite_ac = NULL; + g_hash_table_destroy(rooms); + rooms = NULL; + autocomplete_free(confservers_ac); confservers_ac = NULL; + autocomplete_free(invite_ac); + invite_ac = NULL; } void diff --git a/tests/unittests/test_callbacks.c b/tests/unittests/test_callbacks.c index e545fce1..678c6415 100644 --- a/tests/unittests/test_callbacks.c +++ b/tests/unittests/test_callbacks.c @@ -12,7 +12,7 @@ void returns_no_commands(void** state) { - callbacks_init(); + plugins_init(); GList* commands = plugins_get_command_names(); assert_true(commands == NULL); @@ -21,8 +21,7 @@ returns_no_commands(void** state) void returns_commands(void** state) { - callbacks_init(); - + plugins_init(); PluginCommand* command1 = calloc(1, sizeof(PluginCommand)); command1->command_name = strdup("command1"); callbacks_add_command("plugin1", command1); diff --git a/tests/unittests/test_cmd_bookmark.c b/tests/unittests/test_cmd_bookmark.c index 2859f143..c77e0bf1 100644 --- a/tests/unittests/test_cmd_bookmark.c +++ b/tests/unittests/test_cmd_bookmark.c @@ -196,8 +196,6 @@ cmd_bookmark_add_adds_bookmark_with_jid(void** state) void cmd_bookmark_uses_roomjid_in_room(void** state) { - muc_init(); - gchar* args[] = { NULL }; ProfMucWin muc_win; muc_win.window.type = WIN_MUC; @@ -221,8 +219,6 @@ cmd_bookmark_uses_roomjid_in_room(void** state) void cmd_bookmark_add_uses_roomjid_in_room(void** state) { - muc_init(); - gchar* args[] = { "add", NULL }; ProfMucWin muc_win; muc_win.window.type = WIN_MUC; @@ -246,8 +242,6 @@ cmd_bookmark_add_uses_roomjid_in_room(void** state) void cmd_bookmark_add_uses_supplied_jid_in_room(void** state) { - muc_init(); - char* jid = "room1@conf.server"; gchar* args[] = { "add", jid, NULL }; ProfMucWin muc_win; @@ -378,8 +372,6 @@ cmd_bookmark_remove_shows_message_when_no_bookmark(void** state) void cmd_bookmark_remove_uses_roomjid_in_room(void** state) { - muc_init(); - gchar* args[] = { "remove", NULL }; ProfMucWin muc_win; muc_win.window.type = WIN_MUC; @@ -400,8 +392,6 @@ cmd_bookmark_remove_uses_roomjid_in_room(void** state) void cmd_bookmark_remove_uses_supplied_jid_in_room(void** state) { - muc_init(); - char* jid = "room1@conf.server"; gchar* args[] = { "remove", jid, NULL }; ProfMucWin muc_win; diff --git a/tests/unittests/test_cmd_disconnect.c b/tests/unittests/test_cmd_disconnect.c index ac3c36da..227c7fbc 100644 --- a/tests/unittests/test_cmd_disconnect.c +++ b/tests/unittests/test_cmd_disconnect.c @@ -23,7 +23,7 @@ clears_chat_sessions(void** state) chat_session_recipient_active("mike@server.org", "work", FALSE); will_return(connection_get_status, JABBER_CONNECTED); - will_return(connection_get_barejid, strdup("myjid@myserver.com")); + will_return(connection_get_barejid, "myjid@myserver.com"); expect_any_cons_show(); gboolean result = cmd_disconnect(NULL, CMD_DISCONNECT, NULL); diff --git a/tests/unittests/test_cmd_join.c b/tests/unittests/test_cmd_join.c index 8e1ef4a9..e933dc89 100644 --- a/tests/unittests/test_cmd_join.c +++ b/tests/unittests/test_cmd_join.c @@ -73,8 +73,6 @@ cmd_join_uses_account_mucservice_when_no_service_specified(void** state) ProfAccount* account = account_new(account_name, g_strdup("user@server.org"), NULL, NULL, TRUE, NULL, 0, g_strdup("laptop"), NULL, NULL, 0, 0, 0, 0, 0, account_service, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0); - muc_init(); - will_return(connection_get_status, JABBER_CONNECTED); will_return(session_get_account_name, account_name); @@ -99,8 +97,6 @@ cmd_join_uses_supplied_nick(void** state) ProfAccount* account = account_new(account_name, g_strdup("user@server.org"), NULL, NULL, TRUE, NULL, 0, g_strdup("laptop"), NULL, NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0); - muc_init(); - will_return(connection_get_status, JABBER_CONNECTED); will_return(session_get_account_name, account_name); @@ -125,8 +121,6 @@ cmd_join_uses_account_nick_when_not_supplied(void** state) ProfAccount* account = account_new(account_name, g_strdup("user@server.org"), NULL, NULL, TRUE, NULL, 0, g_strdup("laptop"), NULL, NULL, 0, 0, 0, 0, 0, NULL, account_nick, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0); - muc_init(); - will_return(connection_get_status, JABBER_CONNECTED); will_return(session_get_account_name, account_name); @@ -154,8 +148,6 @@ cmd_join_uses_password_when_supplied(void** state) ProfAccount* account = account_new(account_name, g_strdup("user@server.org"), NULL, NULL, TRUE, NULL, 0, g_strdup("laptop"), NULL, NULL, 0, 0, 0, 0, 0, account_service, account_nick, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0); - muc_init(); - will_return(connection_get_status, JABBER_CONNECTED); will_return(session_get_account_name, account_name); diff --git a/tests/unittests/test_common.c b/tests/unittests/test_common.c index 98eb712a..f381947b 100644 --- a/tests/unittests/test_common.c +++ b/tests/unittests/test_common.c @@ -543,7 +543,7 @@ prof_occurrences_of_large_message_tests(void** state) */ const size_t haystack_sz = 1024; size_t haystack_cur = 0; - char* haystack = malloc(haystack_sz); + auto_char char* haystack = malloc(haystack_sz); const char needle[] = "needle "; while (haystack_sz - haystack_cur > sizeof(needle)) { memcpy(&haystack[haystack_cur], needle, sizeof(needle)); diff --git a/tests/unittests/test_muc.c b/tests/unittests/test_muc.c index 71fecd5d..57fd79e8 100644 --- a/tests/unittests/test_muc.c +++ b/tests/unittests/test_muc.c @@ -6,6 +6,8 @@ #include "xmpp/muc.h" +void prof_shutdown(void); + int muc_before_test(void** state) { @@ -16,6 +18,7 @@ muc_before_test(void** state) int muc_after_test(void** state) { + prof_shutdown(); return 0; } diff --git a/tests/unittests/unittests.c b/tests/unittests/unittests.c index 8e6c1b9b..e0d4d792 100644 --- a/tests/unittests/unittests.c +++ b/tests/unittests/unittests.c @@ -39,6 +39,8 @@ #include "test_callbacks.h" #include "test_plugins_disco.h" +#define muc_unit_test(f) cmocka_unit_test_setup_teardown(f, muc_before_test, muc_after_test) + int main(int argc, char* argv[]) { @@ -501,11 +503,11 @@ main(int argc, char* argv[]) cmocka_unit_test(cmd_bookmark_list_shows_bookmarks), cmocka_unit_test(cmd_bookmark_add_shows_message_when_invalid_jid), cmocka_unit_test(cmd_bookmark_add_adds_bookmark_with_jid), - cmocka_unit_test(cmd_bookmark_uses_roomjid_in_room), - cmocka_unit_test(cmd_bookmark_add_uses_roomjid_in_room), - cmocka_unit_test(cmd_bookmark_add_uses_supplied_jid_in_room), - cmocka_unit_test(cmd_bookmark_remove_uses_roomjid_in_room), - cmocka_unit_test(cmd_bookmark_remove_uses_supplied_jid_in_room), + muc_unit_test(cmd_bookmark_uses_roomjid_in_room), + muc_unit_test(cmd_bookmark_add_uses_roomjid_in_room), + muc_unit_test(cmd_bookmark_add_uses_supplied_jid_in_room), + muc_unit_test(cmd_bookmark_remove_uses_roomjid_in_room), + muc_unit_test(cmd_bookmark_remove_uses_supplied_jid_in_room), cmocka_unit_test(cmd_bookmark_add_adds_bookmark_with_jid_nick), cmocka_unit_test(cmd_bookmark_add_adds_bookmark_with_jid_autojoin), cmocka_unit_test(cmd_bookmark_add_adds_bookmark_with_jid_nick_autojoin), @@ -576,10 +578,10 @@ main(int argc, char* argv[]) cmocka_unit_test(cmd_join_shows_message_when_connecting), cmocka_unit_test(cmd_join_shows_message_when_disconnected), cmocka_unit_test(cmd_join_shows_error_message_when_invalid_room_jid), - cmocka_unit_test(cmd_join_uses_account_mucservice_when_no_service_specified), - cmocka_unit_test(cmd_join_uses_supplied_nick), - cmocka_unit_test(cmd_join_uses_account_nick_when_not_supplied), - cmocka_unit_test(cmd_join_uses_password_when_supplied), + muc_unit_test(cmd_join_uses_account_mucservice_when_no_service_specified), + muc_unit_test(cmd_join_uses_supplied_nick), + muc_unit_test(cmd_join_uses_account_nick_when_not_supplied), + muc_unit_test(cmd_join_uses_password_when_supplied), cmocka_unit_test(cmd_roster_shows_message_when_disconnecting), cmocka_unit_test(cmd_roster_shows_message_when_connecting),