#include #include "prof_cmocka.h" #include #include #include #include "proftest.h" void presence_online(void **state) { prof_connect(); prof_input("/status set online"); assert_true(prof_output_exact("Status set to online (priority 0), \"online\".")); assert_true(stbbr_received( "" "online" "" "" )); } void presence_online_with_message(void **state) { prof_connect(); prof_input("/status set online \"Hi there\""); assert_true(prof_output_exact("Status set to online (priority 0), \"Hi there\".")); assert_true(stbbr_received( "" "Hi there" "" "" )); } void presence_away(void **state) { prof_connect(); prof_input("/status set away"); assert_true(prof_output_exact("Status set to away (priority 0), \"away\".")); assert_true(stbbr_received( "" "away" "away" "" "" )); } void presence_away_with_message(void **state) { prof_connect(); prof_input("/status set away \"I'm not here for a bit\""); assert_true(prof_output_exact("Status set to away (priority 0), \"I'm not here for a bit\".")); assert_true(stbbr_received( "" "away" "I'm not here for a bit" "" "" )); } void presence_xa(void **state) { prof_connect(); prof_input("/status set xa"); assert_true(prof_output_exact("Status set to xa (priority 0), \"xa\".")); assert_true(stbbr_received( "" "xa" "xa" "" "" )); } void presence_xa_with_message(void **state) { prof_connect(); prof_input("/status set xa \"Gone to the shops\""); assert_true(prof_output_exact("Status set to xa (priority 0), \"Gone to the shops\".")); assert_true(stbbr_received( "" "xa" "Gone to the shops" "" "" )); } void presence_dnd(void **state) { prof_connect(); prof_input("/status set dnd"); assert_true(prof_output_exact("Status set to dnd (priority 0), \"dnd\".")); assert_true(stbbr_received( "" "dnd" "dnd" "" "" )); } void presence_dnd_with_message(void **state) { prof_connect(); prof_input("/status set dnd \"Working\""); assert_true(prof_output_exact("Status set to dnd (priority 0), \"Working\".")); assert_true(stbbr_received( "" "dnd" "Working" "" "" )); } void presence_chat(void **state) { prof_connect(); prof_input("/status set chat"); assert_true(prof_output_exact("Status set to chat (priority 0), \"chat\".")); assert_true(stbbr_received( "" "chat" "chat" "" "" )); } void presence_chat_with_message(void **state) { prof_connect(); prof_input("/status set chat \"Free to talk\""); assert_true(prof_output_exact("Status set to chat (priority 0), \"Free to talk\".")); assert_true(stbbr_received( "" "chat" "Free to talk" "" "" )); } void presence_set_priority(void **state) { prof_connect(); prof_input("/priority 25"); assert_true(prof_output_exact("Priority set to 25.")); assert_true(stbbr_received( "" "25" "" "" )); } void presence_includes_priority(void **state) { prof_connect(); prof_input("/priority 25"); assert_true(prof_output_exact("Priority set to 25.")); assert_true(stbbr_received( "" "25" "" "" )); prof_input("/status set chat \"Free to talk\""); assert_true(prof_output_exact("Status set to chat (priority 25), \"Free to talk\".")); assert_true(stbbr_received( "" "25" "chat" "Free to talk" "" "" )); } void presence_keeps_status(void **state) { prof_connect(); prof_input("/status set chat \"Free to talk\""); assert_true(prof_output_exact("Status set to chat (priority 0), \"Free to talk\".")); assert_true(stbbr_received( "" "chat" "Free to talk" "" "" )); prof_input("/priority 25"); assert_true(prof_output_exact("Priority set to 25.")); assert_true(stbbr_received( "" "chat" "Free to talk" "25" "" "" )); } void presence_received(void **state) { prof_connect(); stbbr_send( "" "10" "I'm here" "" ); assert_true(prof_output_exact("Buddy1 (mobile) is online, \"I'm here\"")); } // Typical use case for gateways that don't support resources void presence_missing_resource_defaults(void **state) { prof_connect(); stbbr_send( "" "15" "My status" "" ); assert_true(prof_output_exact("Buddy1 is online, \"My status\"")); prof_input("/info Buddy1"); assert_true(prof_output_exact("__prof_default (15), online")); } /* Regression tests for issue #148 (REQ-INP-01): presence handlers used to * dereference jid_create() results without a NULL check, so a stanza with a * missing or invalid 'from' crashed the client. */ void presence_error_invalid_from_no_crash(void **state) { prof_connect(); /* MUC join error with an invalid 'from' */ stbbr_send( "" "" "" "" ); /* same, with no 'from' at all */ stbbr_send( "" "" "" "" ); /* client is still alive and processing stanzas */ stbbr_send( "" "still alive" "" ); assert_true(prof_output_exact("Buddy1 (mobile) is online, \"still alive\"")); } void presence_subscription_invalid_from_no_crash(void **state) { prof_connect(); stbbr_send(""); stbbr_send(""); stbbr_send(""); stbbr_send( "" "still alive" "" ); assert_true(prof_output_exact("Buddy1 (mobile) is online, \"still alive\"")); }