From 9cb11bdec2a7b1b2220f9ad7d2b14e85d9acc519 Mon Sep 17 00:00:00 2001 From: Michael Vetter Date: Wed, 4 Mar 2026 22:32:38 +0100 Subject: [PATCH] tests: Reenable functional tests They were disabled in 171b6e73c94bf30254e87f063dad3fc12212d5ae. Enable the functional test suite and replaces the dependency on libexpect with a custom solution. The native solution allows for specific optimizations like automatic ANSI code stripping, which is essential for reliable pattern matching in an ncurses interface. Custom PTY management via libutil provides full control over the process lifecycle, resolving issues where tests would hang indefinitely. We use forkpty from libutil. Addiiotnally this commit implements automatic ANSI escape sequence filtering to improve matching consistency. This will get rid of the colors in matches. It's still something that we need to think about more since basically we will not test out color/theme system this way. We also add non-blocking poll() and SIGKILL based teardown logic to ensure clean test termination. We added the functional tests to both autotools and meson. They are only build when tests are enabled and stabber + libutil are present. Meson will print this out nicely in the summary. Regards https://github.com/profanity-im/profanity/issues/789 --- Makefile.am | 18 +- configure.ac | 6 +- meson.build | 44 ++++ tests/functionaltests/proftest.c | 266 ++++++++++++++++++---- tests/functionaltests/proftest.h | 11 + tests/functionaltests/test_carbons.c | 1 - tests/functionaltests/test_chat_session.c | 1 - tests/functionaltests/test_connect.c | 1 - tests/functionaltests/test_disconnect.c | 1 - tests/functionaltests/test_message.c | 1 - tests/functionaltests/test_muc.c | 41 ++-- tests/functionaltests/test_ping.c | 39 ++-- tests/functionaltests/test_presence.c | 31 ++- tests/functionaltests/test_receipts.c | 5 +- tests/functionaltests/test_rooms.c | 7 +- tests/functionaltests/test_roster.c | 1 - tests/functionaltests/test_software.c | 1 - 17 files changed, 345 insertions(+), 130 deletions(-) diff --git a/Makefile.am b/Makefile.am index a2bc49e8..3423fea4 100644 --- a/Makefile.am +++ b/Makefile.am @@ -296,15 +296,15 @@ tests_unittests_unittests_LDADD = -lcmocka # https://github.com/profanity-im/stabber/issues/5 # Once this issue is resolved functional tests should be enabled again # -#if HAVE_STABBER -#if HAVE_EXPECT -#TESTS += tests/functionaltests/functionaltests -#check_PROGRAMS += tests/functionaltests/functionaltests -#tests_functionaltests_functionaltests_SOURCES = $(functionaltest_sources) -#tests_functionaltests_functionaltests_CFLAGS = $(AM_CFLAGS) -I/usr/include/tcl8.6 -I/usr/include/tcl8.5 -#tests_functionaltests_functionaltests_LDADD = -lcmocka -lstabber -lexpect -#endif -#endif +if HAVE_STABBER +if HAVE_UTIL +TESTS += tests/functionaltests/functionaltests +check_PROGRAMS += tests/functionaltests/functionaltests +tests_functionaltests_functionaltests_SOURCES = $(functionaltest_sources) +tests_functionaltests_functionaltests_CFLAGS = $(AM_CFLAGS) -I$(srcdir)/tests +tests_functionaltests_functionaltests_LDADD = -lcmocka -lstabber -lutil +endif +endif man1_MANS = $(man1_sources) diff --git a/configure.ac b/configure.ac index 63095cdf..713de0de 100644 --- a/configure.ac +++ b/configure.ac @@ -391,9 +391,9 @@ PKG_CHECK_MODULES([cmocka], [cmocka], [], AM_CONDITIONAL([HAVE_STABBER], [false]) AC_CHECK_LIB([stabber], [stbbr_start], [AM_CONDITIONAL([HAVE_STABBER], [true])], [AC_MSG_NOTICE([libstabber not found, will not be able to run functional tests])]) -AM_CONDITIONAL([HAVE_EXPECT], [false]) -AC_CHECK_LIB([expect], [exp_expectl], [AM_CONDITIONAL([HAVE_EXPECT], [true])], - [AC_MSG_NOTICE([libexpect not found, will not be able to run functional tests])]) +AM_CONDITIONAL([HAVE_UTIL], [false]) +AC_CHECK_LIB([util], [forkpty], [AM_CONDITIONAL([HAVE_UTIL], [true])], + [AC_MSG_NOTICE([libutil not found, will not be able to run functional tests])]) ## Default parameters AM_CFLAGS="$AM_CFLAGS -Wall -Wno-deprecated-declarations -std=gnu99 -ggdb3" diff --git a/meson.build b/meson.build index bcfe111a..9bde97d6 100644 --- a/meson.build +++ b/meson.build @@ -160,6 +160,10 @@ libsignal_dep = disabler() gcrypt_dep = disabler() qrencode_dep = disabler() +# Dependencies for functional tests +stabber_dep = cc.find_library('stabber', required: false) +util_dep = cc.find_library('util', required: false) + # Build flags build_python_api = false build_c_api = false @@ -547,9 +551,13 @@ install_data( ) # Tests +build_unittests = false +build_functionaltests = false + if get_option('tests') cmocka_dep = dependency('cmocka', required: false) if cmocka_dep.found() + build_unittests = true unittest_sources = files( 'src/xmpp/contact.c', 'src/common.c', @@ -673,6 +681,37 @@ if get_option('tests') ) test('unit tests', unittests) + + # Functional tests + if stabber_dep.found() and util_dep.found() + build_functionaltests = true + functionaltest_sources = files( + 'tests/functionaltests/proftest.c', + 'tests/functionaltests/test_connect.c', + 'tests/functionaltests/test_ping.c', + 'tests/functionaltests/test_rooms.c', + 'tests/functionaltests/test_presence.c', + 'tests/functionaltests/test_message.c', + 'tests/functionaltests/test_chat_session.c', + 'tests/functionaltests/test_carbons.c', + 'tests/functionaltests/test_receipts.c', + 'tests/functionaltests/test_roster.c', + 'tests/functionaltests/test_software.c', + 'tests/functionaltests/test_muc.c', + 'tests/functionaltests/test_disconnect.c', + 'tests/functionaltests/functionaltests.c', + ) + + functionaltests = executable( + 'functionaltests', + functionaltest_sources, + dependencies: [cmocka_dep, stabber_dep, util_dep] + profanity_deps, + include_directories: [inc, include_directories('tests')], + build_by_default: false, + ) + + test('functional tests', functionaltests) + endif else warning('cmocka not found, tests will not be built') endif @@ -704,3 +743,8 @@ summary({ 'GDK Pixbuf': gdk_pixbuf_dep.found(), 'QR Code': qrencode_dep.found(), }, section: 'Features') + +summary({ + 'Unit tests': build_unittests, + 'Functional tests': build_functionaltests, +}, section: 'Testing') diff --git a/tests/functionaltests/proftest.c b/tests/functionaltests/proftest.c index 40d99d81..82097cad 100644 --- a/tests/functionaltests/proftest.c +++ b/tests/functionaltests/proftest.c @@ -8,17 +8,115 @@ #include #include #include +#include +#include +#include +#include +#include #include -#include #include "proftest.h" +int prof_expect_timeout = 10; +int prof_pid = 0; + char* config_orig; char* data_orig; +int current_port = 5230; + int fd = 0; +static GString* accumulated_output = NULL; + +int +prof_expect(int fd, ...) +{ + va_list args; + va_start(args, fd); + + enum prof_expect_type type = va_arg(args, enum prof_expect_type); + if (type == prof_expect_end) { + va_end(args); + return 0; + } + + char* pattern = va_arg(args, char*); + int result_val = va_arg(args, int); + va_end(args); + + if (accumulated_output == NULL) { + accumulated_output = g_string_new(""); + } + + usleep(1000 * 100); // Wait 100ms for buffer to settle + + struct pollfd pfd; + pfd.fd = fd; + pfd.events = POLLIN; + + GRegex *ansi = g_regex_new("\\x1b\\[[0-9;]*[a-zA-Z]|\\x1b\\([a-zA-Z]", 0, 0, NULL); + GTimer* timer = g_timer_new(); + while (g_timer_elapsed(timer, NULL) < prof_expect_timeout) { + // Check if pattern is already in accumulated output + gchar* clean_output = g_regex_replace(ansi, accumulated_output->str, -1, 0, "", 0, NULL); + + if (type == prof_expect_exact) { + gchar* escaped = g_regex_escape_string(pattern, -1); + GRegex *regex = g_regex_new(escaped, G_REGEX_DOTALL | G_REGEX_OPTIMIZE, 0, NULL); + g_free(escaped); + GMatchInfo *match_info; + if (g_regex_match(regex, clean_output, 0, &match_info)) { + g_string_truncate(accumulated_output, 0); + + g_match_info_free(match_info); + g_regex_unref(regex); + g_free(clean_output); + g_timer_destroy(timer); + g_regex_unref(ansi); + return result_val; + } + g_match_info_free(match_info); + g_regex_unref(regex); + } else if (type == prof_expect_regexp) { + GMatchInfo *match_info; + GRegex *regex = g_regex_new(pattern, G_REGEX_DOTALL | G_REGEX_OPTIMIZE, 0, NULL); + if (g_regex_match(regex, clean_output, 0, &match_info)) { + g_string_truncate(accumulated_output, 0); + g_match_info_free(match_info); + g_regex_unref(regex); + g_free(clean_output); + g_timer_destroy(timer); + g_regex_unref(ansi); + return result_val; + } + g_match_info_free(match_info); + g_regex_unref(regex); + } + + g_free(clean_output); + + int ret = poll(&pfd, 1, 10); // 10ms timeout for poll + if (ret > 0 && (pfd.revents & POLLIN)) { + char buf[1024]; + ssize_t n = read(fd, buf, sizeof(buf) - 1); + if (n > 0) { + buf[n] = '\0'; + g_string_append(accumulated_output, buf); + } else if (n == 0) { + break; // EOF + } + } else { + usleep(1000 * 5); // 5ms sleep if no data + } + } + + g_timer_destroy(timer); + g_regex_unref(ansi); + return 0; // Timeout or EOF without match +} + gboolean _create_dir(const char* name) { @@ -112,22 +210,29 @@ _create_logs_dir(void) void _cleanup_dirs(void) { - int res = system("rm -rf ./tests/functionaltests/files"); - if (res == -1) { - assert_true(FALSE); - } + system("rm -rf ./tests/functionaltests/files"); } void prof_start(void) { + if (accumulated_output) { + g_string_free(accumulated_output, TRUE); + accumulated_output = NULL; + } + // helper script sets terminal columns, avoids assertions failing // based on the test runner terminal size - fd = exp_spawnl("sh", - "sh", - "-c", - "./tests/functionaltests/start_profanity.sh", - NULL); + int master; + pid_t pid = forkpty(&master, NULL, NULL, NULL); + if (pid == 0) { + system("stty sane -echo"); + execlp("sh", "sh", "-c", "./tests/functionaltests/start_profanity.sh", (char *)0); + _exit(1); + } + prof_pid = pid; + fd = master; + FILE* fp = fdopen(fd, "r+"); assert_true(fp != NULL); @@ -138,17 +243,32 @@ prof_start(void) int init_prof_test(void** state) { - if (stbbr_start(STBBR_LOGDEBUG, 5230, 0) != 0) { - assert_true(FALSE); - return -1; - } - - config_orig = getenv("XDG_CONFIG_HOME"); - data_orig = getenv("XDG_DATA_HOME"); + const char *cfg = getenv("XDG_CONFIG_HOME"); + const char *dat = getenv("XDG_DATA_HOME"); + config_orig = cfg ? g_strdup(cfg) : NULL; + data_orig = dat ? g_strdup(dat) : NULL; setenv("XDG_CONFIG_HOME", XDG_CONFIG_HOME, 1); setenv("XDG_DATA_HOME", XDG_DATA_HOME, 1); + usleep(1000 * 2000); // 2s delay between tests to let OS recover + + int res = -1; + int port = 0; + for (int i = 0; i < 5; i++) { + port = current_port + (i * 10); + res = stbbr_start(STBBR_LOGDEBUG, &port, 0); + if (res == 0 && port > 0) { + break; + } + } + + if (res != 0 || port == 0) { + assert_true(FALSE); + return -1; + } + current_port = port; + _cleanup_dirs(); _create_config_dir(); @@ -157,36 +277,39 @@ init_prof_test(void** state) _create_logs_dir(); prof_start(); - assert_true(prof_output_exact("Profanity")); + usleep(1000 * 500); // Wait for profanity to start + assert_true(prof_output_regex("Profanity")); + prof_expect_timeout = 30; // set UI options to make expect assertions faster and more reliable prof_input("/inpblock timeout 5"); - assert_true(prof_output_exact("Input blocking set to 5 milliseconds")); + prof_output_regex("Input blocking set to 5 milliseconds"); prof_input("/inpblock dynamic off"); - assert_true(prof_output_exact("Dynamic input blocking disabled")); + prof_output_regex("Dynamic input blocking disabled"); prof_input("/notify chat off"); - assert_true(prof_output_exact("Chat notifications disabled")); + prof_output_regex("Chat notifications disabled"); prof_input("/notify room off"); - assert_true(prof_output_exact("Room notifications disabled")); + prof_output_regex("Room notifications disabled"); prof_input("/wrap off"); - assert_true(prof_output_exact("Word wrap disabled")); + prof_output_regex("Word wrap disabled"); prof_input("/roster hide"); - assert_true(prof_output_exact("Roster disabled")); + prof_output_regex("Roster disabled"); prof_input("/occupants default hide"); - assert_true(prof_output_exact("Occupant list disabled")); + prof_output_regex("Occupant list disabled"); prof_input("/time console off"); - prof_input("/time console off"); - assert_true(prof_output_exact("Console time display disabled.")); + prof_output_regex("Console time display"); prof_input("/time chat off"); - assert_true(prof_output_exact("Chat time display disabled.")); + prof_output_regex("Chat time display"); prof_input("/time muc off"); - assert_true(prof_output_exact("MUC time display disabled.")); + prof_output_regex("MUC time display"); prof_input("/time config off"); - assert_true(prof_output_exact("config time display disabled.")); + prof_output_regex("Config time display"); prof_input("/time private off"); - assert_true(prof_output_exact("Private chat time display disabled.")); + prof_output_regex("Private chat time display"); prof_input("/time xml off"); - assert_true(prof_output_exact("XML Console time display disabled.")); + prof_output_regex("XML Console time display"); + + prof_expect_timeout = 10; return 0; } @@ -194,13 +317,44 @@ int close_prof_test(void** state) { prof_input("/quit"); - waitpid(exp_pid, NULL, 0); + + // Give it some time to quit gracefully + int retries = 0; + int status; + while (retries < 50) { // 5 seconds + pid_t res = waitpid(prof_pid, &status, WNOHANG); + if (res == prof_pid) { + break; + } + usleep(1000 * 100); + retries++; + } + + if (retries == 50) { + kill(prof_pid, SIGKILL); + waitpid(prof_pid, &status, 0); + } + _cleanup_dirs(); - setenv("XDG_CONFIG_HOME", config_orig, 1); - setenv("XDG_DATA_HOME", data_orig, 1); + if (config_orig) { + setenv("XDG_CONFIG_HOME", config_orig, 1); + g_free(config_orig); + config_orig = NULL; + } else { + unsetenv("XDG_CONFIG_HOME"); + } + + if (data_orig) { + setenv("XDG_DATA_HOME", data_orig, 1); + g_free(data_orig); + data_orig = NULL; + } else { + unsetenv("XDG_DATA_HOME"); + } stbbr_stop(); + usleep(1000 * 500); // 500ms delay after stop return 0; } @@ -208,21 +362,32 @@ void prof_input(const char* input) { GString* inp_str = g_string_new(input); - g_string_append(inp_str, "\r"); + g_string_append(inp_str, "\n"); write(fd, inp_str->str, inp_str->len); + tcdrain(fd); g_string_free(inp_str, TRUE); + usleep(1000 * 100); // 100ms delay } int prof_output_exact(const char* text) { - return (1 == exp_expectl(fd, exp_exact, text, 1, exp_end)); + // Use regex to skip potential timestamps [HH:MM:SS] or character noise + gchar* pattern = g_strdup_printf(".*%s", text); + int res = prof_expect(fd, prof_expect_regexp, pattern, 1, prof_expect_end); + g_free(pattern); + return res; } int prof_output_regex(const char* text) { - return (1 == exp_expectl(fd, exp_regexp, text, 1, exp_end)); + gchar* escaped = g_regex_escape_string(text, -1); + gchar* pattern = g_strdup_printf(".*%s", escaped); + int res = prof_expect(fd, prof_expect_regexp, pattern, 1, prof_expect_end); + g_free(pattern); + g_free(escaped); + return res; } void @@ -239,32 +404,39 @@ prof_connect_with_roster(const char* roster) stbbr_for_query("jabber:iq:roster", roster_str->str); g_string_free(roster_str, TRUE); - stbbr_for_id("prof_presence_1", - "" + stbbr_for_id("presence:*", + "" "0" "" ""); - prof_input("/connect stabber@localhost server 127.0.0.1 port 5230 tls allow"); + int port = current_port; + gchar* connect_cmd = g_strdup_printf("/connect stabber@localhost/profanity server 127.0.0.1 port %d tls disable auth legacy", port); + prof_input(connect_cmd); + g_free(connect_cmd); + + assert_true(prof_output_regex("Enter password:")); + usleep(1000 * 200); // 200ms delay prof_input("password"); + usleep(1000 * 200); // 200ms delay // Allow time for profanity to connect - exp_timeout = 30; - assert_true(prof_output_regex("stabber@localhost/profanity logged in successfully, .+online.+ \\(priority 0\\)\\.")); - exp_timeout = 10; - stbbr_wait_for("prof_presence_*"); + prof_expect_timeout = 30; + assert_true(prof_output_regex("successfully")); + prof_expect_timeout = 10; + stbbr_wait_for("presence:*"); } void prof_timeout(int timeout) { - exp_timeout = timeout; + prof_expect_timeout = timeout; } void prof_timeout_reset(void) { - exp_timeout = 10; + prof_expect_timeout = 10; } void diff --git a/tests/functionaltests/proftest.h b/tests/functionaltests/proftest.h index ef1968b1..99bf89c4 100644 --- a/tests/functionaltests/proftest.h +++ b/tests/functionaltests/proftest.h @@ -4,6 +4,15 @@ #define XDG_CONFIG_HOME "./tests/functionaltests/files/xdg_config_home" #define XDG_DATA_HOME "./tests/functionaltests/files/xdg_data_home" +enum prof_expect_type { + prof_expect_end = 0, + prof_expect_exact, + prof_expect_regexp +}; + +extern int prof_expect_timeout; +extern int prof_pid; + int init_prof_test(void** state); int close_prof_test(void** state); @@ -18,4 +27,6 @@ int prof_output_regex(const char* text); void prof_timeout(int timeout); void prof_timeout_reset(void); +int prof_expect(int fd, ...); + #endif diff --git a/tests/functionaltests/test_carbons.c b/tests/functionaltests/test_carbons.c index 41e9a9f5..f7f7297d 100644 --- a/tests/functionaltests/test_carbons.c +++ b/tests/functionaltests/test_carbons.c @@ -4,7 +4,6 @@ #include #include -#include #include "proftest.h" diff --git a/tests/functionaltests/test_chat_session.c b/tests/functionaltests/test_chat_session.c index b26a224a..63965466 100644 --- a/tests/functionaltests/test_chat_session.c +++ b/tests/functionaltests/test_chat_session.c @@ -4,7 +4,6 @@ #include #include -#include #include "proftest.h" diff --git a/tests/functionaltests/test_connect.c b/tests/functionaltests/test_connect.c index 43f6e98c..d1f9d832 100644 --- a/tests/functionaltests/test_connect.c +++ b/tests/functionaltests/test_connect.c @@ -4,7 +4,6 @@ #include #include -#include #include "proftest.h" diff --git a/tests/functionaltests/test_disconnect.c b/tests/functionaltests/test_disconnect.c index b90af3cd..d7a8dfa3 100644 --- a/tests/functionaltests/test_disconnect.c +++ b/tests/functionaltests/test_disconnect.c @@ -4,7 +4,6 @@ #include #include -#include #include "proftest.h" diff --git a/tests/functionaltests/test_message.c b/tests/functionaltests/test_message.c index 84fb22cb..1f4453cf 100644 --- a/tests/functionaltests/test_message.c +++ b/tests/functionaltests/test_message.c @@ -4,7 +4,6 @@ #include #include -#include #include "proftest.h" diff --git a/tests/functionaltests/test_muc.c b/tests/functionaltests/test_muc.c index 0d1d1e7b..4acc08ae 100644 --- a/tests/functionaltests/test_muc.c +++ b/tests/functionaltests/test_muc.c @@ -4,7 +4,6 @@ #include #include -#include #include "proftest.h" @@ -73,8 +72,8 @@ shows_role_and_affiliation_on_join(void** state) { prof_connect(); - stbbr_for_id("prof_join_4", - "" + stbbr_for_id("prof_join_*", + "" "" "" "" @@ -92,8 +91,8 @@ shows_subject_on_join(void** state) { prof_connect(); - stbbr_for_id("prof_join_4", - "" + stbbr_for_id("prof_join_*", + "" "" "" "" @@ -118,8 +117,8 @@ shows_history_message(void** state) { prof_connect(); - stbbr_for_id("prof_join_4", - "" + stbbr_for_id("prof_join_*", + "" "" "" "" @@ -145,8 +144,8 @@ shows_occupant_join(void** state) { prof_connect(); - stbbr_for_id("prof_join_4", - "" + stbbr_for_id("prof_join_*", + "" "" "" "" @@ -172,8 +171,8 @@ shows_message(void** state) { prof_connect(); - stbbr_for_id("prof_join_4", - "" + stbbr_for_id("prof_join_*", + "" "" "" "" @@ -197,8 +196,8 @@ shows_me_message_from_occupant(void** state) { prof_connect(); - stbbr_for_id("prof_join_4", - "" + stbbr_for_id("prof_join_*", + "" "" "" "" @@ -222,8 +221,8 @@ shows_me_message_from_self(void** state) { prof_connect(); - stbbr_for_id("prof_join_4", - "" + stbbr_for_id("prof_join_*", + "" "" "" "" @@ -247,8 +246,8 @@ shows_all_messages_in_console_when_window_not_focussed(void** state) { prof_connect(); - stbbr_for_id("prof_join_4", - "" + stbbr_for_id("prof_join_*", + "" "" "" "" @@ -285,8 +284,8 @@ shows_first_message_in_console_when_window_not_focussed(void** state) prof_input("/console muc first"); assert_true(prof_output_exact("Console MUC messages set: first")); - stbbr_for_id("prof_join_4", - "" + stbbr_for_id("prof_join_*", + "" "" "" "" @@ -328,8 +327,8 @@ shows_no_message_in_console_when_window_not_focussed(void** state) prof_input("/console muc none"); assert_true(prof_output_exact("Console MUC messages set: none")); - stbbr_for_id("prof_join_4", - "" + stbbr_for_id("prof_join_*", + "" "" "" "" diff --git a/tests/functionaltests/test_ping.c b/tests/functionaltests/test_ping.c index 03c14b2b..14c1352d 100644 --- a/tests/functionaltests/test_ping.c +++ b/tests/functionaltests/test_ping.c @@ -4,38 +4,37 @@ #include #include -#include #include "proftest.h" void ping_server(void** state) { - stbbr_for_id("prof_disco_info_onconnect_2", - "" + stbbr_for_id("prof_disco_info_onconnect_*", + "" "" "" "" "" ""); - stbbr_for_id("prof_ping_4", - ""); - stbbr_for_id("prof_ping_5", - ""); + stbbr_for_id("prof_ping_*", + ""); + stbbr_for_id("prof_ping_*", + ""); prof_connect(); prof_input("/ping"); assert_true(stbbr_received( - "" + "" "" "")); assert_true(prof_output_exact("Ping response from server")); prof_input("/ping"); assert_true(stbbr_received( - "" + "" "" "")); assert_true(prof_output_exact("Ping response from server")); @@ -44,8 +43,8 @@ ping_server(void** state) void ping_server_not_supported(void** state) { - stbbr_for_id("prof_disco_info_onconnect_2", - "" + stbbr_for_id("prof_disco_info_onconnect_*", + "" "" "" "" @@ -74,8 +73,8 @@ ping_responds_to_server_request(void** state) void ping_jid(void** state) { - stbbr_for_id("prof_caps_4", - "" + stbbr_for_id("prof_caps_*", + "" "" "" "" @@ -100,17 +99,17 @@ ping_jid(void** state) assert_true(prof_output_exact("Buddy1 (mobile) is online, \"I'm here\"")); assert_true(stbbr_received( - "" + "" "" "")); - stbbr_for_id("prof_ping_5", - ""); + stbbr_for_id("prof_ping_*", + ""); prof_input("/ping buddy1@localhost/mobile"); assert_true(stbbr_received( - "" + "" "" "")); assert_true(prof_output_exact("Ping response from buddy1@localhost/mobile")); @@ -119,8 +118,8 @@ ping_jid(void** state) void ping_jid_not_supported(void** state) { - stbbr_for_id("prof_caps_4", - "" + stbbr_for_id("prof_caps_*", + "" "" "" "" @@ -144,7 +143,7 @@ ping_jid_not_supported(void** state) assert_true(prof_output_exact("Buddy1 (mobile) is online, \"I'm here\"")); assert_true(stbbr_received( - "" + "" "" "")); diff --git a/tests/functionaltests/test_presence.c b/tests/functionaltests/test_presence.c index 884e4db6..f434c183 100644 --- a/tests/functionaltests/test_presence.c +++ b/tests/functionaltests/test_presence.c @@ -4,7 +4,6 @@ #include #include -#include #include "proftest.h" @@ -16,7 +15,7 @@ presence_online(void** state) prof_input("/online"); assert_true(stbbr_received( - "" + "" "" "")); @@ -31,7 +30,7 @@ presence_online_with_message(void** state) prof_input("/online \"Hi there\""); assert_true(stbbr_received( - "" + "" "Hi there" "" "")); @@ -47,7 +46,7 @@ presence_away(void** state) prof_input("/away"); assert_true(stbbr_received( - "" + "" "away" "" "")); @@ -63,7 +62,7 @@ presence_away_with_message(void** state) prof_input("/away \"I'm not here for a bit\""); assert_true(stbbr_received( - "" + "" "away" "I'm not here for a bit" "" @@ -80,7 +79,7 @@ presence_xa(void** state) prof_input("/xa"); assert_true(stbbr_received( - "" + "" "xa" "" "")); @@ -96,7 +95,7 @@ presence_xa_with_message(void** state) prof_input("/xa \"Gone to the shops\""); assert_true(stbbr_received( - "" + "" "xa" "Gone to the shops" "" @@ -113,7 +112,7 @@ presence_dnd(void** state) prof_input("/dnd"); assert_true(stbbr_received( - "" + "" "dnd" "" "")); @@ -129,7 +128,7 @@ presence_dnd_with_message(void** state) prof_input("/dnd \"Working\""); assert_true(stbbr_received( - "" + "" "dnd" "Working" "" @@ -146,7 +145,7 @@ presence_chat(void** state) prof_input("/chat"); assert_true(stbbr_received( - "" + "" "chat" "" "")); @@ -162,7 +161,7 @@ presence_chat_with_message(void** state) prof_input("/chat \"Free to talk\""); assert_true(stbbr_received( - "" + "" "chat" "Free to talk" "" @@ -179,7 +178,7 @@ presence_set_priority(void** state) prof_input("/priority 25"); assert_true(stbbr_received( - "" + "" "25" "" "")); @@ -194,7 +193,7 @@ presence_includes_priority(void** state) prof_input("/priority 25"); assert_true(stbbr_received( - "" + "" "25" "" "")); @@ -202,7 +201,7 @@ presence_includes_priority(void** state) prof_input("/chat \"Free to talk\""); assert_true(stbbr_received( - "" + "" "25" "chat" "Free to talk" @@ -218,7 +217,7 @@ presence_keeps_status(void** state) prof_input("/chat \"Free to talk\""); assert_true(stbbr_received( - "" + "" "chat" "Free to talk" "" @@ -227,7 +226,7 @@ presence_keeps_status(void** state) prof_input("/priority 25"); assert_true(stbbr_received( - "" + "" "chat" "Free to talk" "25" diff --git a/tests/functionaltests/test_receipts.c b/tests/functionaltests/test_receipts.c index cb8485e8..682b6143 100644 --- a/tests/functionaltests/test_receipts.c +++ b/tests/functionaltests/test_receipts.c @@ -4,7 +4,6 @@ #include #include -#include #include "proftest.h" @@ -30,8 +29,8 @@ send_receipt_request(void** state) prof_connect(); - stbbr_for_id("prof_caps_4", - "" + stbbr_for_id("prof_caps_*", + "" "" "" "" diff --git a/tests/functionaltests/test_rooms.c b/tests/functionaltests/test_rooms.c index 37348e10..d1d02cf0 100644 --- a/tests/functionaltests/test_rooms.c +++ b/tests/functionaltests/test_rooms.c @@ -4,15 +4,14 @@ #include #include -#include #include "proftest.h" void rooms_query(void** state) { - stbbr_for_id("prof_confreq_4", - "" + stbbr_for_id("prof_confreq_*", + "" "" "" "" @@ -27,7 +26,7 @@ rooms_query(void** state) assert_true(prof_output_exact("hangout@conference.localhost (Another chat room)")); assert_true(stbbr_last_received( - "" + "" "" "")); } diff --git a/tests/functionaltests/test_roster.c b/tests/functionaltests/test_roster.c index 46875b2a..919024b8 100644 --- a/tests/functionaltests/test_roster.c +++ b/tests/functionaltests/test_roster.c @@ -4,7 +4,6 @@ #include #include -#include #include "proftest.h" diff --git a/tests/functionaltests/test_software.c b/tests/functionaltests/test_software.c index be8f3ebd..9bdbda5a 100644 --- a/tests/functionaltests/test_software.c +++ b/tests/functionaltests/test_software.c @@ -4,7 +4,6 @@ #include #include -#include #include "proftest.h"