#include #include #include "prof_cmocka.h" #include #include #include #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 sends_room_join(void **state) { prof_connect(); prof_input("/join testroom@conference.localhost"); assert_true(stbbr_received( "" "" "" "" )); } void sends_room_join_with_nick(void **state) { prof_connect(); prof_input("/join testroom@conference.localhost nick testnick"); assert_true(stbbr_received( "" "" "" "" )); } void sends_room_join_with_password(void **state) { prof_connect(); prof_input("/join testroom@conference.localhost password testpassword"); assert_true(stbbr_received( "" "" "testpassword" "" "" "" )); } 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_received( "" "" "testpassword" "" "" "" )); } void shows_role_and_affiliation_on_join(void **state) { prof_connect(); stbbr_for_presence_to("testroom@conference.localhost/stabber", "" "" "" "" "" "" "" ); prof_input("/join testroom@conference.localhost"); assert_true(prof_output_regex("-> You have joined the room as stabber, role: participant, affiliation: none")); } void shows_subject_on_join(void **state) { prof_connect(); stbbr_for_presence_to("testroom@conference.localhost/stabber", "" "" "" "" "" "" "" ); prof_input("/join testroom@conference.localhost"); assert_true(prof_output_regex("-> You have joined the room as stabber, role: participant, affiliation: none")); stbbr_send( "" "Test room subject" "anothernick has set the subject to: Test room subject" "" ); assert_true(prof_output_regex("Room subject: .+Test room subject")); } void shows_history_message(void **state) { prof_connect(); stbbr_for_presence_to("testroom@conference.localhost/stabber", "" "" "" "" "" "" "" ); prof_input("/join testroom@conference.localhost"); assert_true(prof_output_regex("-> You have joined the room as stabber, role: participant, affiliation: none")); stbbr_send( "" "an old message" "" "" "" ); prof_timeout(10); assert_true(prof_output_regex("testoccupant:.*an old message")); prof_timeout_reset(); } void shows_occupant_join(void **state) { prof_connect(); // Enable MUC status messages to see occupant join/leave prof_input("/presence room all"); assert_true(prof_output_regex("All presence updates will appear")); stbbr_for_presence_to("testroom@conference.localhost/stabber", "" "" "" "" "" "" "" ); prof_input("/join testroom@conference.localhost"); assert_true(prof_output_regex("-> You have joined the room as stabber, role: participant, affiliation: none")); stbbr_send( "" "" "" "" "" ); sleep(1); assert_true(prof_output_regex("testoccupant has joined")); } void shows_message(void **state) { prof_connect(); stbbr_for_presence_to("testroom@conference.localhost/stabber", "" "" "" "" "" "" "" ); prof_input("/join testroom@conference.localhost"); assert_true(prof_output_regex("-> You have joined the room as stabber, role: participant, affiliation: none")); stbbr_send( "" "a new message" "" ); assert_true(prof_output_regex("testoccupant: .+a new message")); } void shows_me_message_from_occupant(void **state) { prof_connect(); stbbr_for_presence_to("testroom@conference.localhost/stabber", "" "" "" "" "" "" "" ); prof_input("/join testroom@conference.localhost"); assert_true(prof_output_regex("-> You have joined the room as stabber, role: participant, affiliation: none")); stbbr_send( "" "/me did something" "" ); assert_true(prof_output_regex("\\*testoccupant did something")); } void shows_me_message_from_self(void **state) { prof_connect(); stbbr_for_presence_to("testroom@conference.localhost/stabber", "" "" "" "" "" "" "" ); prof_input("/join testroom@conference.localhost"); assert_true(prof_output_regex("-> You have joined the room as stabber, role: participant, affiliation: none")); stbbr_send( "" "/me did something" "" ); assert_true(prof_output_regex("\\*stabber did something")); } void shows_all_messages_in_console_when_window_not_focussed(void **state) { prof_connect(); stbbr_for_presence_to("testroom@conference.localhost/stabber", "" "" "" "" "" "" "" ); prof_input("/join testroom@conference.localhost"); assert_true(prof_output_regex("-> You have joined the room as stabber, role: participant, affiliation: none")); prof_input("/win 1"); assert_true(prof_output_regex("CProof\\. Type /help for help information\\.")); stbbr_send( "" "a new message" "" ); assert_true(prof_output_regex("<< room message: testoccupant in testroom@conference\\.localhost \\(win 2\\)")); stbbr_send( "" "some other message" "" ); assert_true(prof_output_regex("<< 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_regex("Console MUC messages set: first")); stbbr_for_presence_to("testroom@conference.localhost/stabber", "" "" "" "" "" "" "" ); prof_input("/join testroom@conference.localhost"); assert_true(prof_output_regex("-> You have joined the room as stabber, role: participant, affiliation: none")); prof_input("/win 1"); assert_true(prof_output_regex("CProof\\. Type /help for help information\\.")); stbbr_send( "" "a new message" "" ); sleep(1); assert_true(prof_output_regex("room message.*testroom@conference\\.localhost")); prof_input("/clear"); prof_input("/about"); assert_true(prof_output_regex("Type '/help' to show complete help\\.")); stbbr_send( "" "some other message" "" ); prof_timeout(2); assert_false(prof_output_regex("<< 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_regex("Console MUC messages set: none")); stbbr_for_presence_to("testroom@conference.localhost/stabber", "" "" "" "" "" "" "" ); prof_input("/join testroom@conference.localhost"); assert_true(prof_output_regex("-> You have joined the room as stabber, role: participant, affiliation: none")); prof_input("/win 1"); assert_true(prof_output_regex("CProof\\. Type /help for help information\\.")); stbbr_send( "" "a new message" "" ); prof_timeout(2); assert_false(prof_output_regex("testroom@conference\\.localhost \\(win 2\\)")); prof_timeout_reset(); } void sends_affiliation_list_request(void **state) { prof_connect(); stbbr_for_presence_to("testroom@conference.localhost/stabber", "" "" "" "" "" "" "" ); prof_input("/join testroom@conference.localhost"); assert_true(prof_output_regex("-> You have joined the room as stabber, role: moderator, affiliation: owner")); prof_input("/affiliation owner list"); assert_true(stbbr_received( "" "" "" "" "" )); } void sends_kick_request(void **state) { prof_connect(); // Enable MUC presence messages to see occupant join/leave prof_input("/presence room all"); assert_true(prof_output_regex("All presence updates will appear")); stbbr_for_presence_to("testroom@conference.localhost/stabber", "" "" "" "" "" "" "" ); prof_input("/join testroom@conference.localhost"); assert_true(prof_output_regex("-> You have joined the room as stabber, role: moderator, affiliation: admin")); // Simulate another user in the room stbbr_send( "" "" "" "" "" ); sleep(1); assert_true(prof_output_regex("baduser has joined")); // Register success response for kick stbbr_for_query("http://jabber.org/protocol/muc#admin", "" ); prof_input("/kick baduser \"spamming\""); assert_true(stbbr_received( "" "" "" "spamming" "" "" "" )); }