fix/functional_tests #63

Closed
jabber.developer2 wants to merge 33 commits from fix/functional_tests into master
26 changed files with 997 additions and 336 deletions
Showing only changes of commit 8e8d715734 - Show all commits

View File

@@ -167,8 +167,8 @@ Guidelines when writing new functional tests:
1. Prefer `stbbr_for_query(namespace, xml)` for IQ roster or disco queries where the namespace is stable. 1. Prefer `stbbr_for_query(namespace, xml)` for IQ roster or disco queries where the namespace is stable.
2. Use `stbbr_send(xml)` for presence, message, and other push style stanzas. 2. Use `stbbr_send(xml)` for presence, message, and other push style stanzas.
3. Avoid `stbbr_for_id` unless the protocol flow genuinely requires correlating a specific request/response pair not covered by a namespace query. 3. Avoid `stbbr_for_id` unless the protocol flow genuinely requires correlating a specific request/response pair not covered by a namespace query.
4. Keep assertions tolerant of ordering when possible; rely on `exp_expectl` regex matches rather than hard-coded positions. 4. Keep assertions tolerant of ordering when possible; rely on `prof_output_regex()` matches rather than hard-coded positions.
5. If timing flakiness appears, temporarily raise `exp_timeout` around the critical expectation and reset it immediately afterwards. 5. If timing flakiness appears, temporarily raise `prof_timeout()` around the critical expectation and reset it immediately afterwards.
During the migration it's acceptable for a test file to mix old and new styles; opportunistically refactor brittle sections when touching a test for other reasons. During the migration it's acceptable for a test file to mix old and new styles; opportunistically refactor brittle sections when touching a test for other reasons.

View File

@@ -61,24 +61,6 @@ case "$ARCH" in
"--disable-plugins --disable-c-plugins --disable-python-plugins" "--disable-plugins --disable-c-plugins --disable-python-plugins"
# 5. Default configuration # 5. Default configuration
"" ""
# --- Additional configurations (uncomment if needed) ---
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo
# --enable-plugins --enable-c-plugins --enable-python-plugins"
# "--enable-notifications --enable-otr"
# "--enable-notifications --enable-otr --enable-pgp"
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo"
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo --enable-omemo-qrcode"
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo --enable-omemo-qrcode
# --enable-icons-and-clipboard"
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo --enable-omemo-qrcode
# --enable-icons-and-clipboard --enable-gdk-pixbuf"
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo --enable-omemo-qrcode
# --enable-icons-and-clipboard --enable-gdk-pixbuf --with-xscreensaver"
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo --enable-omemo-qrcode
# --enable-icons-and-clipboard --enable-gdk-pixbuf --with-xscreensaver --enable-plugins"
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo --enable-omemo-qrcode
# --enable-icons-and-clipboard --enable-gdk-pixbuf --with-xscreensaver --enable-plugins
# --enable-c-plugins"
) )
source /etc/profile.d/debuginfod.sh 2>/dev/null || true source /etc/profile.d/debuginfod.sh 2>/dev/null || true
;; ;;
@@ -100,18 +82,6 @@ case "$ARCH" in
"--disable-plugins --disable-c-plugins --disable-python-plugins" "--disable-plugins --disable-c-plugins --disable-python-plugins"
# 5. Default configuration # 5. Default configuration
"" ""
# --- Additional configurations (uncomment if needed) ---
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo
# --enable-plugins --enable-c-plugins --enable-python-plugins"
# "--enable-notifications --enable-otr"
# "--enable-notifications --enable-otr --enable-pgp"
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo"
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo
# --enable-plugins"
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo
# --enable-plugins --enable-c-plugins"
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo
# --enable-icons-and-clipboard"
) )
;; ;;
openbsd*) openbsd*)
@@ -139,18 +109,6 @@ case "$ARCH" in
"--disable-plugins --disable-c-plugins --disable-python-plugins" "--disable-plugins --disable-c-plugins --disable-python-plugins"
# 5. Default configuration # 5. Default configuration
"" ""
# --- Additional configurations (uncomment if needed) ---
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo
# --enable-plugins --enable-c-plugins --enable-python-plugins"
# "--enable-notifications --enable-otr"
# "--enable-notifications --enable-otr --enable-pgp"
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo"
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo
# --enable-plugins"
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo
# --enable-plugins --enable-c-plugins"
# "--enable-notifications --enable-otr --enable-pgp --enable-omemo
# --enable-icons-and-clipboard"
) )
;; ;;
esac esac

View File

@@ -12,27 +12,6 @@
# Functional tests suppressions (stabber/pthread) # Functional tests suppressions (stabber/pthread)
# ============================================ # ============================================
{
stabber_recv_shutdown
Memcheck:Param
socketcall.recvfrom(buf)
fun:recv
fun:_shutdown
...
obj:*/libstabber*
}
{
stabber_recv_read_stream
Memcheck:Param
socketcall.recvfrom(buf)
fun:recv
...
fun:read_stream
...
obj:*/libstabber*
}
{ {
stabber_pthread_create stabber_pthread_create
Memcheck:Leak Memcheck:Leak

View File

@@ -139,6 +139,7 @@ static const struct cmd_t command_defs[] = {
"Show version and license information.") "Show version and license information.")
}, },
// Max args: account + server <s> + port <p> + tls <t> + auth <a> = 9
{ CMD_PREAMBLE("/connect", { CMD_PREAMBLE("/connect",
parse_args, 0, 9, NULL) parse_args, 0, 9, NULL)
CMD_MAINFUNC(cmd_connect) CMD_MAINFUNC(cmd_connect)

View File

@@ -8,6 +8,12 @@
* init_prof_test (starts stabber server and profanity client) * init_prof_test (starts stabber server and profanity client)
jabber.developer marked this conversation as resolved
Review

Seems rather inefficient. Do we restart a client and a server for each test?

Seems rather inefficient. Do we restart a client and a server for each test?

It is good practice to check each test case in clean environment to get rid of unexpected dependencies. Additional complex test cases can be added if needed.

It is good practice to check each test case in clean environment to get rid of unexpected dependencies. Additional complex test cases can be added if needed.
* and close_prof_test (cleanup) as setup/teardown functions. * and close_prof_test (cleanup) as setup/teardown functions.
* *
* NOTE: We restart client and server for each test to ensure complete
* isolation. This prevents state leakage between tests (roster entries,
* MUC rooms, presence subscriptions, etc.). While slower, it eliminates
* flaky tests caused by leftover state. The overhead is acceptable since
* functional tests run less frequently than unit tests.
*
* Tests are organized into groups for better maintainability: * Tests are organized into groups for better maintainability:
* Group 1: Connection, Ping, Rooms, Presence * Group 1: Connection, Ping, Rooms, Presence
* Group 2: Messages, Receipts, Roster management * Group 2: Messages, Receipts, Roster management

View File

@@ -24,7 +24,11 @@ int fd = 0;
int stub_port = 5230; int stub_port = 5230;
pid_t child_pid = 0; pid_t child_pid = 0;
/* Buffer for accumulating output from profanity */ /*
* Buffer for accumulating output from profanity.
* 64KB is sufficient for typical test output while keeping memory usage
* reasonable. When full, older half is discarded (ring buffer behavior).
*/
#define OUTPUT_BUF_SIZE 65536 #define OUTPUT_BUF_SIZE 65536
static char output_buffer[OUTPUT_BUF_SIZE]; static char output_buffer[OUTPUT_BUF_SIZE];
static size_t output_len = 0; static size_t output_len = 0;
@@ -300,7 +304,12 @@ close_prof_test(void **state)
} }
stbbr_stop(); stbbr_stop();
// Give stabber time to release the port /*
* TODO: Replace with proper synchronization.
* stabber doesn't provide wait_stopped() API yet, so we use delay
* to ensure the port is released before the next test starts.
* See: https://git.jabber.space/devs/stabber/issues/3
*/
usleep(100000); // 100ms usleep(100000); // 100ms
return 0; return 0;
} }

View File

@@ -144,7 +144,11 @@ resets_to_barejid_after_presence_received(void **state)
"<show>dnd</show>" "<show>dnd</show>"
"</presence>" "</presence>"
); );
sleep(1); // TODO: This assertion is currently disabled because the presence update
// may not reliably appear in the console output when a chat session is active.
// The test verifies that the message is sent to barejid (not fulljid) after
// receiving presence from a different resource, which is the main goal.
// See: PR #63 review discussion
// assert_true(prof_output_regex("Buddy1.*dnd")); // assert_true(prof_output_regex("Buddy1.*dnd"));
prof_input("/msg buddy1@localhost Outgoing 2"); prof_input("/msg buddy1@localhost Outgoing 2");

View File

@@ -8,6 +8,14 @@
#include "proftest.h" #include "proftest.h"
/*
* NOTE: We use prof_output_regex() throughout this file even for seemingly
* exact strings because some output may include timestamps, color codes,
* or other dynamic content depending on configuration. Using regex provides
* more robust matching. For patterns without regex metacharacters, the
* performance difference is negligible.
*/
void void
sends_room_join(void **state) sends_room_join(void **state)
{ {

View File

@@ -11,8 +11,13 @@
void void
ping_server(void **state) ping_server(void **state)
{ {
// This test verifies that profanity correctly handles the /ping command /*
// when the server supports ping (urn:xmpp:ping feature) * This test verifies that profanity correctly handles the /ping command
* when the server supports ping (urn:xmpp:ping feature).
*
* We register disco#info response with ping support, then verify
* profanity sends ping and receives "Pinged server" confirmation.
*/
// Register disco#info response that includes ping support // Register disco#info response that includes ping support
stbbr_for_query("http://jabber.org/protocol/disco#info", stbbr_for_query("http://jabber.org/protocol/disco#info",
@@ -31,15 +36,18 @@ ping_server(void **state)
prof_connect(); prof_connect();
// Wait for disco#info exchange to complete /*
* Wait for disco#info exchange to complete.
* TODO: Replace with proper wait mechanism (e.g., wait for capabilities
* to be cached). Currently we use sleep to ensure disco#info response
* is processed before sending /ping command.
*/
sleep(3); sleep(3);
// Send ping command - should either work or report server doesn't support it
prof_input("/ping"); prof_input("/ping");
prof_timeout(10); prof_timeout(10);
// Accept either outcome: ping was sent OR server doesn't support assert_true(prof_output_regex("Pinged server"));
assert_true(prof_output_regex("Ping|Server does not support"));
prof_timeout_reset(); prof_timeout_reset();
} }