mirror of
https://git.jabber.space/devs/cproof.git
synced 2026-07-18 21:56:21 +00:00
They were disabled in 171b6e73c9.
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
354 lines
14 KiB
C
354 lines
14 KiB
C
#include <glib.h>
|
|
#include "prof_cmocka.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
#include <stabber.h>
|
|
|
|
#include "proftest.h"
|
|
|
|
void
|
|
sends_room_join(void** state)
|
|
{
|
|
prof_connect();
|
|
|
|
prof_input("/join testroom@conference.localhost");
|
|
|
|
assert_true(stbbr_last_received(
|
|
"<presence id='*' to='testroom@conference.localhost/stabber'>"
|
|
"<x xmlns='http://jabber.org/protocol/muc'/>"
|
|
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' ver='*' node='http://profanity-im.github.io'/>"
|
|
"</presence>"));
|
|
}
|
|
|
|
void
|
|
sends_room_join_with_nick(void** state)
|
|
{
|
|
prof_connect();
|
|
|
|
prof_input("/join testroom@conference.localhost nick testnick");
|
|
|
|
assert_true(stbbr_last_received(
|
|
"<presence id='*' to='testroom@conference.localhost/testnick'>"
|
|
"<x xmlns='http://jabber.org/protocol/muc'/>"
|
|
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' ver='*' node='http://profanity-im.github.io'/>"
|
|
"</presence>"));
|
|
}
|
|
|
|
void
|
|
sends_room_join_with_password(void** state)
|
|
{
|
|
prof_connect();
|
|
|
|
prof_input("/join testroom@conference.localhost password testpassword");
|
|
|
|
assert_true(stbbr_last_received(
|
|
"<presence id='*' to='testroom@conference.localhost/stabber'>"
|
|
"<x xmlns='http://jabber.org/protocol/muc'>"
|
|
"<password>testpassword</password>"
|
|
"</x>"
|
|
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' ver='*' node='http://profanity-im.github.io'/>"
|
|
"</presence>"));
|
|
}
|
|
|
|
void
|
|
sends_room_join_with_nick_and_password(void** state)
|
|
{
|
|
prof_connect();
|
|
|
|
prof_input("/join testroom@conference.localhost nick testnick password testpassword");
|
|
|
|
assert_true(stbbr_last_received(
|
|
"<presence id='*' to='testroom@conference.localhost/testnick'>"
|
|
"<x xmlns='http://jabber.org/protocol/muc'>"
|
|
"<password>testpassword</password>"
|
|
"</x>"
|
|
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' ver='*' node='http://profanity-im.github.io'/>"
|
|
"</presence>"));
|
|
}
|
|
|
|
void
|
|
shows_role_and_affiliation_on_join(void** state)
|
|
{
|
|
prof_connect();
|
|
|
|
stbbr_for_id("prof_join_*",
|
|
"<presence id='prof_join_*' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
|
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://profanity-im.github.io' ver='*'/>"
|
|
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
|
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
|
"</x>"
|
|
"<status code='110'/>"
|
|
"</presence>");
|
|
|
|
prof_input("/join testroom@conference.localhost");
|
|
|
|
assert_true(prof_output_exact("-> You have joined the room as stabber, role: participant, affiliation: none"));
|
|
}
|
|
|
|
void
|
|
shows_subject_on_join(void** state)
|
|
{
|
|
prof_connect();
|
|
|
|
stbbr_for_id("prof_join_*",
|
|
"<presence id='prof_join_*' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
|
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://profanity-im.github.io' ver='*'/>"
|
|
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
|
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
|
"</x>"
|
|
"<status code='110'/>"
|
|
"</presence>");
|
|
|
|
prof_input("/join testroom@conference.localhost");
|
|
assert_true(prof_output_exact("-> You have joined the room as stabber, role: participant, affiliation: none"));
|
|
|
|
stbbr_send(
|
|
"<message type='groupchat' to='stabber@localhost/profanity' from='testroom@conference.localhost'>"
|
|
"<subject>Test room subject</subject>"
|
|
"<body>anothernick has set the subject to: Test room subject</body>"
|
|
"</message>");
|
|
|
|
assert_true(prof_output_regex("Room subject: .+Test room subject"));
|
|
}
|
|
|
|
void
|
|
shows_history_message(void** state)
|
|
{
|
|
prof_connect();
|
|
|
|
stbbr_for_id("prof_join_*",
|
|
"<presence id='prof_join_*' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
|
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://profanity-im.github.io' ver='*'/>"
|
|
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
|
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
|
"</x>"
|
|
"<status code='110'/>"
|
|
"</presence>");
|
|
|
|
prof_input("/join testroom@conference.localhost");
|
|
assert_true(prof_output_exact("-> You have joined the room as stabber, role: participant, affiliation: none"));
|
|
|
|
stbbr_send(
|
|
"<message type='groupchat' to='stabber@localhost/profanity' from='testroom@conference.localhost/testoccupant'>"
|
|
"<body>an old message</body>"
|
|
"<delay xmlns='urn:xmpp:delay' stamp='2015-12-19T23:55:25Z' from='testroom@conference.localhost'/>"
|
|
"<x xmlns='jabber:x:delay' stamp='20151219T23:55:25'/>"
|
|
"</message>");
|
|
|
|
assert_true(prof_output_regex("testoccupant: an old message"));
|
|
}
|
|
|
|
void
|
|
shows_occupant_join(void** state)
|
|
{
|
|
prof_connect();
|
|
|
|
stbbr_for_id("prof_join_*",
|
|
"<presence id='prof_join_*' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
|
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://profanity-im.github.io' ver='*'/>"
|
|
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
|
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
|
"</x>"
|
|
"<status code='110'/>"
|
|
"</presence>");
|
|
|
|
prof_input("/join testroom@conference.localhost");
|
|
assert_true(prof_output_exact("-> You have joined the room as stabber, role: participant, affiliation: none"));
|
|
|
|
stbbr_send(
|
|
"<presence to='stabber@localhost/profanity' from='testroom@conference.localhost/testoccupant'>"
|
|
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
|
"<item role='participant' jid='someuser@someserver.org/work' affiliation='none'/>"
|
|
"</x>"
|
|
"</presence>");
|
|
|
|
assert_true(prof_output_exact("-> testoccupant has joined the room, role: participant, affiliation: none"));
|
|
}
|
|
|
|
void
|
|
shows_message(void** state)
|
|
{
|
|
prof_connect();
|
|
|
|
stbbr_for_id("prof_join_*",
|
|
"<presence id='prof_join_*' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
|
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://profanity-im.github.io' ver='*'/>"
|
|
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
|
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
|
"</x>"
|
|
"<status code='110'/>"
|
|
"</presence>");
|
|
|
|
prof_input("/join testroom@conference.localhost");
|
|
assert_true(prof_output_exact("-> You have joined the room as stabber, role: participant, affiliation: none"));
|
|
|
|
stbbr_send(
|
|
"<message type='groupchat' to='stabber@localhost/profanity' from='testroom@conference.localhost/testoccupant'>"
|
|
"<body>a new message</body>"
|
|
"</message>");
|
|
|
|
assert_true(prof_output_regex("testoccupant: .+a new message"));
|
|
}
|
|
|
|
void
|
|
shows_me_message_from_occupant(void** state)
|
|
{
|
|
prof_connect();
|
|
|
|
stbbr_for_id("prof_join_*",
|
|
"<presence id='prof_join_*' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
|
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://profanity-im.github.io' ver='*'/>"
|
|
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
|
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
|
"</x>"
|
|
"<status code='110'/>"
|
|
"</presence>");
|
|
|
|
prof_input("/join testroom@conference.localhost");
|
|
assert_true(prof_output_exact("-> You have joined the room as stabber, role: participant, affiliation: none"));
|
|
|
|
stbbr_send(
|
|
"<message type='groupchat' to='stabber@localhost/profanity' from='testroom@conference.localhost/testoccupant'>"
|
|
"<body>/me did something</body>"
|
|
"</message>");
|
|
|
|
assert_true(prof_output_exact("*testoccupant did something"));
|
|
}
|
|
|
|
void
|
|
shows_me_message_from_self(void** state)
|
|
{
|
|
prof_connect();
|
|
|
|
stbbr_for_id("prof_join_*",
|
|
"<presence id='prof_join_*' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
|
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://profanity-im.github.io' ver='*'/>"
|
|
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
|
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
|
"</x>"
|
|
"<status code='110'/>"
|
|
"</presence>");
|
|
|
|
prof_input("/join testroom@conference.localhost");
|
|
assert_true(prof_output_exact("-> You have joined the room as stabber, role: participant, affiliation: none"));
|
|
|
|
stbbr_send(
|
|
"<message type='groupchat' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
|
"<body>/me did something</body>"
|
|
"</message>");
|
|
|
|
assert_true(prof_output_exact("*stabber did something"));
|
|
}
|
|
|
|
void
|
|
shows_all_messages_in_console_when_window_not_focussed(void** state)
|
|
{
|
|
prof_connect();
|
|
|
|
stbbr_for_id("prof_join_*",
|
|
"<presence id='prof_join_*' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
|
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://profanity-im.github.io' ver='*'/>"
|
|
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
|
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
|
"</x>"
|
|
"<status code='110'/>"
|
|
"</presence>");
|
|
|
|
prof_input("/join testroom@conference.localhost");
|
|
assert_true(prof_output_exact("-> You have joined the room as stabber, role: participant, affiliation: none"));
|
|
|
|
prof_input("/win 1");
|
|
assert_true(prof_output_exact("Profanity. Type /help for help information."));
|
|
|
|
stbbr_send(
|
|
"<message type='groupchat' to='stabber@localhost/profanity' from='testroom@conference.localhost/testoccupant'>"
|
|
"<body>a new message</body>"
|
|
"</message>");
|
|
|
|
assert_true(prof_output_exact("<< room message: testoccupant in testroom@conference.localhost (win 2)"));
|
|
|
|
stbbr_send(
|
|
"<message type='groupchat' to='stabber@localhost/profanity' from='testroom@conference.localhost/anotheroccupant'>"
|
|
"<body>some other message</body>"
|
|
"</message>");
|
|
|
|
assert_true(prof_output_exact("<< room message: anotheroccupant in testroom@conference.localhost (win 2)"));
|
|
}
|
|
|
|
void
|
|
shows_first_message_in_console_when_window_not_focussed(void** state)
|
|
{
|
|
prof_connect();
|
|
|
|
prof_input("/console muc first");
|
|
assert_true(prof_output_exact("Console MUC messages set: first"));
|
|
|
|
stbbr_for_id("prof_join_*",
|
|
"<presence id='prof_join_*' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
|
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://profanity-im.github.io' ver='*'/>"
|
|
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
|
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
|
"</x>"
|
|
"<status code='110'/>"
|
|
"</presence>");
|
|
|
|
prof_input("/join testroom@conference.localhost");
|
|
assert_true(prof_output_exact("-> You have joined the room as stabber, role: participant, affiliation: none"));
|
|
|
|
prof_input("/win 1");
|
|
assert_true(prof_output_exact("Profanity. Type /help for help information."));
|
|
|
|
stbbr_send(
|
|
"<message type='groupchat' to='stabber@localhost/profanity' from='testroom@conference.localhost/testoccupant'>"
|
|
"<body>a new message</body>"
|
|
"</message>");
|
|
|
|
assert_true(prof_output_exact("<< room message: testroom@conference.localhost (win 2)"));
|
|
prof_input("/clear");
|
|
prof_input("/about");
|
|
assert_true(prof_output_exact("Type '/help' to show complete help."));
|
|
|
|
stbbr_send(
|
|
"<message type='groupchat' to='stabber@localhost/profanity' from='testroom@conference.localhost/anotheroccupant'>"
|
|
"<body>some other message</body>"
|
|
"</message>");
|
|
|
|
prof_timeout(2);
|
|
assert_false(prof_output_exact("<< room message: testroom@conference.localhost (win 2)"));
|
|
prof_timeout_reset();
|
|
}
|
|
|
|
void
|
|
shows_no_message_in_console_when_window_not_focussed(void** state)
|
|
{
|
|
prof_connect();
|
|
|
|
prof_input("/console muc none");
|
|
assert_true(prof_output_exact("Console MUC messages set: none"));
|
|
|
|
stbbr_for_id("prof_join_*",
|
|
"<presence id='prof_join_*' lang='en' to='stabber@localhost/profanity' from='testroom@conference.localhost/stabber'>"
|
|
"<c hash='sha-1' xmlns='http://jabber.org/protocol/caps' node='http://profanity-im.github.io' ver='*'/>"
|
|
"<x xmlns='http://jabber.org/protocol/muc#user'>"
|
|
"<item role='participant' jid='stabber@localhost/profanity' affiliation='none'/>"
|
|
"</x>"
|
|
"<status code='110'/>"
|
|
"</presence>");
|
|
|
|
prof_input("/join testroom@conference.localhost");
|
|
assert_true(prof_output_exact("-> You have joined the room as stabber, role: participant, affiliation: none"));
|
|
|
|
prof_input("/win 1");
|
|
assert_true(prof_output_exact("Profanity. Type /help for help information."));
|
|
|
|
stbbr_send(
|
|
"<message type='groupchat' to='stabber@localhost/profanity' from='testroom@conference.localhost/testoccupant'>"
|
|
"<body>a new message</body>"
|
|
"</message>");
|
|
|
|
prof_timeout(2);
|
|
assert_false(prof_output_exact("testroom@conference.localhost (win 2)"));
|
|
prof_timeout_reset();
|
|
}
|