Compare commits
3 Commits
feat/paral
...
6086391b0e
| Author | SHA1 | Date | |
|---|---|---|---|
|
6086391b0e
|
|||
|
8353a29b4f
|
|||
|
85c817ee8c
|
11
.github/workflows/ci-code.yml
vendored
11
.github/workflows/ci-code.yml
vendored
@@ -31,7 +31,7 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Run tests
|
||||
run: |
|
||||
docker build --no-cache -f Dockerfile.${{ matrix.flavor }} -t profanity .
|
||||
docker build -f Dockerfile.${{ matrix.flavor }} -t profanity .
|
||||
docker run profanity ./ci-build.sh
|
||||
|
||||
code-style:
|
||||
@@ -121,10 +121,5 @@ jobs:
|
||||
--output-file /coverage/coverage.info \
|
||||
--rc branch_coverage=1 \
|
||||
--ignore-errors inconsistent,empty,unused
|
||||
'
|
||||
- name: Upload coverage to Codecov
|
||||
uses: codecov/codecov-action@v4
|
||||
with:
|
||||
files: ./coverage/coverage.info
|
||||
fail_ci_if_error: false
|
||||
verbose: true
|
||||
lcov --summary /coverage/coverage.info
|
||||
'
|
||||
@@ -147,9 +147,28 @@ The functional test suite uses [stabber](https://git.jabber.space/devs/stabber)
|
||||
Functional tests require stabber to be installed. Once installed, tests run as part of `make check`:
|
||||
|
||||
```bash
|
||||
make check
|
||||
make check # Run all tests (unit + functional)
|
||||
make check-functional-parallel # Run functional tests in parallel (~3x faster)
|
||||
./tests/functionaltests/functionaltests # Run all functional tests sequentially
|
||||
./tests/functionaltests/functionaltests 1 # Run specific group (1-4)
|
||||
```
|
||||
|
||||
#### Test groups
|
||||
|
||||
Tests are organized into 4 groups for parallel execution:
|
||||
|
||||
| Group | Description |
|
||||
|-------|-------------|
|
||||
| 1 | Connect, Ping, Rooms, Software |
|
||||
| 2 | Message, Receipts, Roster, Chat Session |
|
||||
| 3 | Presence, Disconnect |
|
||||
| 4 | MUC, Carbons |
|
||||
|
||||
To add a new group:
|
||||
1. Define the test array in `functionaltests.c`
|
||||
2. Add entry to `groups[]` array
|
||||
3. Update `FUNC_TEST_GROUPS` in `Makefile.am`
|
||||
|
||||
#### Writing functional tests
|
||||
|
||||
Use content-based stubbing with stabber:
|
||||
@@ -168,4 +187,5 @@ Guidelines:
|
||||
2. Use `stbbr_send(xml)` for presence, message, and other push-style stanzas.
|
||||
3. Keep assertions tolerant of ordering when possible; use `prof_output_regex()` for flexible matching.
|
||||
4. If timing issues appear, use `prof_timeout()` around critical expectations and reset afterwards.
|
||||
5. When adding new tests, place them in the appropriate group based on functionality.
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@ RUN pacman -S --needed --noconfirm \
|
||||
autoconf-archive \
|
||||
automake \
|
||||
base-devel \
|
||||
ca-certificates \
|
||||
ccache \
|
||||
check \
|
||||
cmake \
|
||||
@@ -64,7 +65,7 @@ USER root
|
||||
RUN pacman -U --noconfirm libstrophe-git/libstrophe-git-*.pkg.tar.zst
|
||||
|
||||
WORKDIR /usr/src
|
||||
RUN git clone --depth 1 -c http.sslverify=false https://git.jabber.space/devs/stabber
|
||||
RUN git clone --depth 1 https://git.jabber.space/devs/stabber
|
||||
|
||||
WORKDIR /usr/src/stabber
|
||||
RUN ./bootstrap.sh
|
||||
|
||||
@@ -9,6 +9,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
autoconf \
|
||||
autoconf-archive \
|
||||
automake \
|
||||
ca-certificates \
|
||||
ccache \
|
||||
gcc \
|
||||
git \
|
||||
@@ -40,8 +41,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
RUN mkdir -p /usr/src/{stabber,libstrophe,profanity}
|
||||
WORKDIR /usr/src
|
||||
|
||||
RUN git clone --depth 1 -c http.sslverify=false https://git.jabber.space/devs/stabber
|
||||
RUN git clone --depth 1 -c http.sslverify=false https://github.com/strophe/libstrophe
|
||||
RUN git clone --depth 1 https://git.jabber.space/devs/stabber
|
||||
RUN git clone --depth 1 https://github.com/strophe/libstrophe
|
||||
|
||||
WORKDIR /usr/src/stabber
|
||||
RUN ./bootstrap.sh
|
||||
|
||||
@@ -11,6 +11,7 @@ RUN dnf install -y \
|
||||
autoconf-archive \
|
||||
automake \
|
||||
awk \
|
||||
ca-certificates \
|
||||
ccache \
|
||||
gcc \
|
||||
git \
|
||||
@@ -50,7 +51,7 @@ ENV TERM=xterm
|
||||
RUN mkdir -p /usr/src
|
||||
WORKDIR /usr/src
|
||||
|
||||
RUN git clone --depth 1 -c http.sslverify=false https://git.jabber.space/devs/stabber
|
||||
RUN git clone --depth 1 https://git.jabber.space/devs/stabber
|
||||
WORKDIR /usr/src/stabber
|
||||
RUN ./bootstrap.sh
|
||||
RUN ./configure --prefix=/usr --disable-dependency-tracking
|
||||
@@ -59,7 +60,7 @@ RUN make install
|
||||
|
||||
WORKDIR /usr/src
|
||||
RUN mkdir -p /usr/src/libstrophe
|
||||
RUN git clone --depth 1 -c http.sslverify=false https://github.com/strophe/libstrophe
|
||||
RUN git clone --depth 1 https://github.com/strophe/libstrophe
|
||||
WORKDIR /usr/src/libstrophe
|
||||
RUN ./bootstrap.sh
|
||||
RUN ./configure --prefix=/usr
|
||||
|
||||
@@ -10,6 +10,7 @@ RUN zypper --non-interactive in --no-recommends \
|
||||
autoconf \
|
||||
autoconf-archive \
|
||||
automake \
|
||||
ca-certificates \
|
||||
ccache \
|
||||
gcc \
|
||||
git \
|
||||
@@ -49,7 +50,7 @@ ENV TERM=xterm
|
||||
RUN mkdir -p /usr/src
|
||||
WORKDIR /usr/src
|
||||
|
||||
RUN git clone --depth 1 -c http.sslverify=false https://git.jabber.space/devs/stabber
|
||||
RUN git clone --depth 1 https://git.jabber.space/devs/stabber
|
||||
WORKDIR /usr/src/stabber
|
||||
RUN ./bootstrap.sh
|
||||
RUN ./configure --prefix=/usr --disable-dependency-tracking
|
||||
|
||||
@@ -8,6 +8,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
autoconf \
|
||||
autoconf-archive \
|
||||
automake \
|
||||
ca-certificates \
|
||||
ccache \
|
||||
gcc \
|
||||
git \
|
||||
@@ -39,8 +40,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||
RUN mkdir -p /usr/src/{stabber,libstrophe,profanity}
|
||||
WORKDIR /usr/src
|
||||
|
||||
RUN git clone --depth 1 -c http.sslverify=false https://git.jabber.space/devs/stabber
|
||||
RUN git clone --depth 1 -c http.sslverify=false https://github.com/strophe/libstrophe
|
||||
RUN git clone --depth 1 https://git.jabber.space/devs/stabber
|
||||
RUN git clone --depth 1 https://github.com/strophe/libstrophe
|
||||
|
||||
WORKDIR /usr/src/stabber
|
||||
RUN ./bootstrap.sh
|
||||
|
||||
24
Makefile.am
24
Makefile.am
@@ -308,18 +308,22 @@ tests_functionaltests_functionaltests_LDADD = -lcmocka -lstabber @FORKPTY_LIB@
|
||||
|
||||
# Parallel functional tests target (~3x faster than sequential)
|
||||
# Usage: make check-functional-parallel
|
||||
# To add more groups: increase FUNC_TEST_GROUPS and add group in functionaltests.c
|
||||
FUNC_TEST_GROUPS = 1 2 3 4
|
||||
|
||||
check-functional-parallel: tests/functionaltests/functionaltests
|
||||
@echo "Running functional tests in parallel (4 groups)..."
|
||||
@echo "Running functional tests in parallel ($(words $(FUNC_TEST_GROUPS)) groups)..."
|
||||
@mkdir -p $(builddir)/test-logs
|
||||
@failed=0; \
|
||||
./tests/functionaltests/functionaltests 1 > $(builddir)/test-logs/group1.log 2>&1 & pid1=$$!; \
|
||||
./tests/functionaltests/functionaltests 2 > $(builddir)/test-logs/group2.log 2>&1 & pid2=$$!; \
|
||||
./tests/functionaltests/functionaltests 3 > $(builddir)/test-logs/group3.log 2>&1 & pid3=$$!; \
|
||||
./tests/functionaltests/functionaltests 4 > $(builddir)/test-logs/group4.log 2>&1 & pid4=$$!; \
|
||||
wait $$pid1 || { echo "Group 1 FAILED (exit $$?)"; cat $(builddir)/test-logs/group1.log; failed=1; }; \
|
||||
wait $$pid2 || { echo "Group 2 FAILED (exit $$?)"; cat $(builddir)/test-logs/group2.log; failed=1; }; \
|
||||
wait $$pid3 || { echo "Group 3 FAILED (exit $$?)"; cat $(builddir)/test-logs/group3.log; failed=1; }; \
|
||||
wait $$pid4 || { echo "Group 4 FAILED (exit $$?)"; cat $(builddir)/test-logs/group4.log; failed=1; }; \
|
||||
@pids=""; \
|
||||
for g in $(FUNC_TEST_GROUPS); do \
|
||||
./tests/functionaltests/functionaltests $$g > $(builddir)/test-logs/group$$g.log 2>&1 & \
|
||||
pids="$$pids $$!"; \
|
||||
done; \
|
||||
failed=0; i=1; \
|
||||
for pid in $$pids; do \
|
||||
wait $$pid || { echo "Group $$i FAILED"; cat $(builddir)/test-logs/group$$i.log; failed=1; }; \
|
||||
i=$$((i + 1)); \
|
||||
done; \
|
||||
echo "=== Test Results Summary ==="; \
|
||||
grep -E 'PASSED|FAILED|Running' $(builddir)/test-logs/group*.log || true; \
|
||||
if [ $$failed -ne 0 ]; then echo "FUNCTIONAL TESTS FAILED"; exit 1; fi; \
|
||||
|
||||
@@ -1959,12 +1959,14 @@ static const struct cmd_t command_defs[] = {
|
||||
CMD_TAG_CONNECTION)
|
||||
CMD_SYN(
|
||||
"/autoping set <seconds>",
|
||||
"/autoping timeout <seconds>")
|
||||
"/autoping timeout <seconds>",
|
||||
"/autoping warning enable|disable")
|
||||
CMD_DESC(
|
||||
"Set the interval between sending ping requests to the server to ensure the connection is kept alive.")
|
||||
CMD_ARGS(
|
||||
{ "set <seconds>", "Number of seconds between sending pings, a value of 0 disables autoping." },
|
||||
{ "timeout <seconds>", "Seconds to wait for autoping responses, after which the connection is considered broken." })
|
||||
{ "timeout <seconds>", "Seconds to wait for autoping responses, after which the connection is considered broken." },
|
||||
{"warning enable|disable", "Enable or disable autoping availability warning."})
|
||||
},
|
||||
|
||||
{ CMD_PREAMBLE("/ping",
|
||||
|
||||
@@ -6350,6 +6350,8 @@ cmd_autoping(ProfWin* window, const char* const command, gchar** args)
|
||||
cons_bad_cmd_usage(command);
|
||||
}
|
||||
|
||||
} else if (g_strcmp0(cmd, "warning") == 0) {
|
||||
_cmd_set_boolean_preference(value, "Autoping availability warning", PREF_AUTOPING_WARNING);
|
||||
} else {
|
||||
cons_bad_cmd_usage(command);
|
||||
}
|
||||
|
||||
@@ -1816,6 +1816,7 @@ _get_group(preference_t pref)
|
||||
case PREF_TRAY:
|
||||
case PREF_TRAY_READ:
|
||||
case PREF_ADV_NOTIFY_DISCO_OR_VERSION:
|
||||
case PREF_AUTOPING_WARNING:
|
||||
return PREF_GROUP_NOTIFICATIONS;
|
||||
case PREF_DBLOG:
|
||||
case PREF_CHLOG:
|
||||
@@ -2156,6 +2157,8 @@ _get_key(preference_t pref)
|
||||
return "force-encryption.enabled";
|
||||
case PREF_FORCE_ENCRYPTION_MODE:
|
||||
return "force-encryption.policy";
|
||||
case PREF_AUTOPING_WARNING:
|
||||
return "autoping.warning";
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
@@ -2208,6 +2211,7 @@ _get_default_boolean(preference_t pref)
|
||||
case PREF_MOOD:
|
||||
case PREF_STROPHE_SM_ENABLED:
|
||||
case PREF_STROPHE_SM_RESEND:
|
||||
case PREF_AUTOPING_WARNING:
|
||||
return TRUE;
|
||||
case PREF_PGP_PUBKEY_AUTOIMPORT:
|
||||
case PREF_FORCE_ENCRYPTION:
|
||||
|
||||
@@ -188,7 +188,8 @@ typedef enum {
|
||||
PREF_VCARD_PHOTO_CMD,
|
||||
PREF_STATUSBAR_TABMODE,
|
||||
PREF_FORCE_ENCRYPTION,
|
||||
PREF_FORCE_ENCRYPTION_MODE
|
||||
PREF_FORCE_ENCRYPTION_MODE,
|
||||
PREF_AUTOPING_WARNING
|
||||
} preference_t;
|
||||
|
||||
typedef struct prof_alias_t
|
||||
|
||||
@@ -1739,6 +1739,11 @@ cons_notify_setting(void)
|
||||
else
|
||||
cons_show("Subscription requests (/notify sub) : OFF");
|
||||
|
||||
if (prefs_get_boolean(PREF_AUTOPING_WARNING))
|
||||
cons_show("Autoping warning (/autoping warn) : ON");
|
||||
else
|
||||
cons_show("Autoping warning (/autoping warn) : OFF");
|
||||
|
||||
gint remind_period = prefs_get_notify_remind();
|
||||
if (remind_period == 0) {
|
||||
cons_show("Reminder period (/notify remind) : OFF");
|
||||
@@ -2048,21 +2053,27 @@ cons_autoping_setting(void)
|
||||
{
|
||||
gint autoping_interval = prefs_get_autoping();
|
||||
if (autoping_interval == 0) {
|
||||
cons_show("Autoping interval (/autoping) : OFF");
|
||||
cons_show("Autoping interval (/autoping) : OFF");
|
||||
} else if (autoping_interval == 1) {
|
||||
cons_show("Autoping interval (/autoping) : 1 second");
|
||||
cons_show("Autoping interval (/autoping) : 1 second");
|
||||
} else {
|
||||
cons_show("Autoping interval (/autoping) : %d seconds", autoping_interval);
|
||||
cons_show("Autoping interval (/autoping) : %d seconds", autoping_interval);
|
||||
}
|
||||
|
||||
gint autoping_timeout = prefs_get_autoping_timeout();
|
||||
if (autoping_timeout == 0) {
|
||||
cons_show("Autoping timeout (/autoping) : OFF");
|
||||
cons_show("Autoping timeout (/autoping) : OFF");
|
||||
} else if (autoping_timeout == 1) {
|
||||
cons_show("Autoping timeout (/autoping) : 1 second");
|
||||
cons_show("Autoping timeout (/autoping) : 1 second");
|
||||
} else {
|
||||
cons_show("Autoping timeout (/autoping) : %d seconds", autoping_timeout);
|
||||
cons_show("Autoping timeout (/autoping) : %d seconds", autoping_timeout);
|
||||
}
|
||||
|
||||
if (prefs_get_boolean(PREF_AUTOPING_WARNING))
|
||||
cons_show("Autoping warning (/autoping warn) : ON");
|
||||
else
|
||||
cons_show("Autoping warning (/autoping warn) : OFF");
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -129,6 +129,7 @@ static void _ping_get_handler(xmpp_stanza_t* const stanza);
|
||||
static int _version_result_id_handler(xmpp_stanza_t* const stanza, void* const userdata);
|
||||
static int _disco_info_response_id_handler(xmpp_stanza_t* const stanza, void* const userdata);
|
||||
static int _disco_info_response_id_handler_onconnect(xmpp_stanza_t* const stanza, void* const userdata);
|
||||
static int _disco_autoping_warning_message(GHashTable* features);
|
||||
static int _http_upload_response_id_handler(xmpp_stanza_t* const stanza, void* const upload_ctx);
|
||||
static int _last_activity_response_id_handler(xmpp_stanza_t* const stanza, void* const userdata);
|
||||
static int _room_info_response_id_handler(xmpp_stanza_t* const stanza, void* const userdata);
|
||||
@@ -2439,6 +2440,7 @@ _disco_info_response_id_handler_onconnect(xmpp_stanza_t* const stanza, void* con
|
||||
}
|
||||
child = xmpp_stanza_get_next(child);
|
||||
}
|
||||
_disco_autoping_warning_message(features);
|
||||
}
|
||||
|
||||
connection_features_received(from);
|
||||
@@ -2446,6 +2448,22 @@ _disco_info_response_id_handler_onconnect(xmpp_stanza_t* const stanza, void* con
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
_disco_autoping_warning_message(GHashTable* features)
|
||||
{
|
||||
gboolean server_supports_ping = g_hash_table_contains(features, "urn:xmpp:ping");
|
||||
gboolean users_prefers_warning = prefs_get_boolean(PREF_AUTOPING_WARNING);
|
||||
gboolean is_autoping_enabled = prefs_get_autoping() != 0;
|
||||
|
||||
if (!is_autoping_enabled && server_supports_ping && users_prefers_warning) {
|
||||
cons_show("This server supports XEP-0199: XMPP Ping (better keepalive detection),\n"
|
||||
"but autoping feature is currently disabled in settings.\n"
|
||||
"Consider enabling it (e.g., `/autoping set 30`) for improved connection stability.\n"
|
||||
"Use `/autoping warn disable` to disable this message.");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
_http_upload_response_id_handler(xmpp_stanza_t* const stanza, void* const userdata)
|
||||
{
|
||||
|
||||
@@ -15,17 +15,14 @@
|
||||
* functional tests run less frequently than unit tests.
|
||||
*
|
||||
* Tests are organized into groups for better maintainability and parallel execution:
|
||||
* Group 1: Connect, Ping, Rooms, Software (17 tests)
|
||||
* Group 2: Message, Receipts, Roster, Chat Session (17 tests)
|
||||
* Group 3: Presence (16 tests)
|
||||
* Group 4: MUC, Carbons (19 tests)
|
||||
* Group 1: Connect, Ping, Rooms, Software
|
||||
* Group 2: Message, Receipts, Roster, Chat Session
|
||||
* Group 3: Presence, Disconnect
|
||||
* Group 4: MUC, Carbons
|
||||
*
|
||||
* Parallel execution:
|
||||
* ./functionaltests - run all tests sequentially
|
||||
* ./functionaltests 1 - run group 1 only
|
||||
* ./functionaltests 2 - run group 2 only
|
||||
* ./functionaltests 3 - run group 3 only
|
||||
* ./functionaltests 4 - run group 4 only
|
||||
* ./functionaltests N - run group N only (N = 1..num_groups)
|
||||
*
|
||||
* For parallel execution, run multiple groups simultaneously:
|
||||
* ./functionaltests 1 & ./functionaltests 2 & ./functionaltests 3 & ./functionaltests 4 & wait
|
||||
@@ -41,6 +38,7 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "common.h"
|
||||
#include "proftest.h"
|
||||
#include "test_connect.h"
|
||||
#include "test_ping.h"
|
||||
@@ -71,11 +69,12 @@ main(int argc, char* argv[])
|
||||
}
|
||||
}
|
||||
|
||||
/* GROUP 1: Connect, Ping, Rooms, Software (17 tests)
|
||||
* Basic XMPP session establishment and server queries */
|
||||
|
||||
/* Connection tests - verify login, roster, bookmarks */
|
||||
/* ============================================================
|
||||
* GROUP 1: Connect, Ping, Rooms, Software
|
||||
* Basic XMPP session establishment and server queries
|
||||
* ============================================================ */
|
||||
const struct CMUnitTest group1_tests[] = {
|
||||
/* Connection tests - verify login, roster, bookmarks */
|
||||
PROF_FUNC_TEST(connect_jid_requests_roster),
|
||||
PROF_FUNC_TEST(connect_jid_sends_presence_after_receiving_roster),
|
||||
PROF_FUNC_TEST(connect_jid_requests_bookmarks),
|
||||
@@ -101,10 +100,11 @@ main(int argc, char* argv[])
|
||||
PROF_FUNC_TEST(display_software_version_result_in_chat),
|
||||
};
|
||||
|
||||
/* GROUP 2: Message, Receipts, Roster, Chat Session (17 tests)
|
||||
* Core messaging and contact management */
|
||||
/* ============================================================
|
||||
* GROUP 2: Message, Receipts, Roster, Chat Session
|
||||
* Core messaging and contact management
|
||||
* ============================================================ */
|
||||
const struct CMUnitTest group2_tests[] = {
|
||||
|
||||
/* Basic message send/receive */
|
||||
PROF_FUNC_TEST(message_send),
|
||||
PROF_FUNC_TEST(message_receive_console),
|
||||
@@ -131,8 +131,10 @@ main(int argc, char* argv[])
|
||||
PROF_FUNC_TEST(new_session_when_message_received_from_different_fulljid),
|
||||
};
|
||||
|
||||
/* GROUP 3: Presence (16 tests)
|
||||
* Online/away/xa/dnd/chat status management */
|
||||
/* ============================================================
|
||||
* GROUP 3: Presence, Disconnect
|
||||
* Online/away/xa/dnd/chat status management
|
||||
* ============================================================ */
|
||||
const struct CMUnitTest group3_tests[] = {
|
||||
PROF_FUNC_TEST(presence_online),
|
||||
PROF_FUNC_TEST(presence_online_with_message),
|
||||
@@ -154,10 +156,11 @@ main(int argc, char* argv[])
|
||||
PROF_FUNC_TEST(disconnect_ends_session),
|
||||
};
|
||||
|
||||
/* GROUP 4: MUC, Carbons (19 tests)
|
||||
* Multi-user chat and message synchronization */
|
||||
/* ============================================================
|
||||
* GROUP 4: MUC, Carbons
|
||||
* Multi-user chat and message synchronization
|
||||
* ============================================================ */
|
||||
const struct CMUnitTest group4_tests[] = {
|
||||
|
||||
/* MUC room join with various options - XEP-0045 */
|
||||
PROF_FUNC_TEST(sends_room_join),
|
||||
PROF_FUNC_TEST(sends_room_join_with_nick),
|
||||
@@ -188,28 +191,31 @@ main(int argc, char* argv[])
|
||||
PROF_FUNC_TEST(receive_private_carbon),
|
||||
};
|
||||
|
||||
/* Test group registry for easy extension */
|
||||
struct {
|
||||
const char* name;
|
||||
const struct CMUnitTest* tests;
|
||||
size_t count;
|
||||
} groups[] = {
|
||||
{ "Group 1: Connect/Ping/Rooms/Software", group1_tests, ARRAY_SIZE(group1_tests) },
|
||||
{ "Group 2: Message/Receipts/Roster/Session", group2_tests, ARRAY_SIZE(group2_tests) },
|
||||
{ "Group 3: Presence/Disconnect", group3_tests, ARRAY_SIZE(group3_tests) },
|
||||
{ "Group 4: MUC/Carbons", group4_tests, ARRAY_SIZE(group4_tests) },
|
||||
};
|
||||
const int num_groups = ARRAY_SIZE(groups);
|
||||
|
||||
int result = 0;
|
||||
|
||||
switch (group) {
|
||||
case 1:
|
||||
result = cmocka_run_group_tests_name("Group 1: Connect/Ping/Rooms/Software", group1_tests, NULL, NULL);
|
||||
break;
|
||||
case 2:
|
||||
result = cmocka_run_group_tests_name("Group 2: Message/Receipts/Roster/Session", group2_tests, NULL, NULL);
|
||||
break;
|
||||
case 3:
|
||||
result = cmocka_run_group_tests_name("Group 3: Presence", group3_tests, NULL, NULL);
|
||||
break;
|
||||
case 4:
|
||||
result = cmocka_run_group_tests_name("Group 4: MUC/Carbons", group4_tests, NULL, NULL);
|
||||
break;
|
||||
default:
|
||||
/* Run all groups sequentially */
|
||||
result |= cmocka_run_group_tests_name("Group 1: Connect/Ping/Rooms/Software", group1_tests, NULL, NULL);
|
||||
result |= cmocka_run_group_tests_name("Group 2: Message/Receipts/Roster/Session", group2_tests, NULL, NULL);
|
||||
result |= cmocka_run_group_tests_name("Group 3: Presence", group3_tests, NULL, NULL);
|
||||
result |= cmocka_run_group_tests_name("Group 4: MUC/Carbons", group4_tests, NULL, NULL);
|
||||
break;
|
||||
if (group > 0 && group <= num_groups) {
|
||||
/* Run specific group */
|
||||
result = _cmocka_run_group_tests(groups[group - 1].name, groups[group - 1].tests,
|
||||
groups[group - 1].count, NULL, NULL);
|
||||
} else {
|
||||
/* Run all groups sequentially */
|
||||
for (int i = 0; i < num_groups; i++) {
|
||||
result |= _cmocka_run_group_tests(groups[i].name, groups[i].tests,
|
||||
groups[i].count, NULL, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
|
||||
@@ -2,9 +2,9 @@
|
||||
#define __H_PROFTEST
|
||||
|
||||
/*
|
||||
* XDG paths are now dynamic, generated per-test based on stub_port.
|
||||
* This allows parallel test execution without file conflicts.
|
||||
* Use xdg_config_home and xdg_data_home variables instead of macros.
|
||||
* XDG paths are dynamic and generated per-test based on stub_port.
|
||||
* Each test instance uses unique directories (./tests/functionaltests/files/{port}/xdg_*)
|
||||
* to allow parallel test execution without file conflicts.
|
||||
*/
|
||||
extern char xdg_config_home[256];
|
||||
extern char xdg_data_home[256];
|
||||
|
||||
Reference in New Issue
Block a user