about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--src/server_events.c32
-rw-r--r--src/server_events.h5
-rw-r--r--src/xmpp/message.c13
-rw-r--r--tests/test_server_events.c9
-rw-r--r--tests/test_server_events.h1
-rw-r--r--tests/testsuite.c1
-rw-r--r--tests/ui/mock_ui.c18
-rw-r--r--tests/ui/mock_ui.h3
8 files changed, 52 insertions, 30 deletions
diff --git a/src/server_events.c b/src/server_events.c
index e9dd7997..1e99383c 100644
--- a/src/server_events.c
+++ b/src/server_events.c
@@ -37,6 +37,7 @@
 #include "otr.h"
 #endif
 
+// TODO - replace with stanza error handlers
 void
 handle_error_message(const char *from, const char *err_msg)
 {
@@ -52,25 +53,26 @@ handle_error_message(const char *from, const char *err_msg)
     }
 }
 
+// handle message stanza errors
 void
-handle_recipient_not_found(const char * const recipient, const char * const err_msg)
+handle_message_error(const char * const from, const char * const type,
+    const char * const err_msg)
 {
-    ui_handle_recipient_not_found(recipient, err_msg);
-    if (prefs_get_boolean(PREF_STATES) && chat_session_exists(recipient)) {
-        chat_session_set_recipient_supports(recipient, FALSE);
-    }
-}
+    // handle recipient not found ('from' contains a value and type is 'cancel')
+    if ((from != NULL) && ((type != NULL && (strcmp(type, "cancel") == 0)))) {
+        ui_handle_recipient_not_found(from, err_msg);
+        if (prefs_get_boolean(PREF_STATES) && chat_session_exists(from)) {
+            chat_session_set_recipient_supports(from, FALSE);
+        }
 
-void
-handle_recipient_error(const char * const recipient, const char * const err_msg)
-{
-    ui_handle_recipient_error(recipient, err_msg);
-}
+    // handle any other error from recipient
+    } else if (from != NULL) {
+        ui_handle_recipient_error(from, err_msg);
 
-void
-handle_error(const char * const err_msg)
-{
-    ui_handle_error(err_msg);
+    // handle errors from no recipient
+    } else {
+        ui_handle_error(err_msg);
+    }
 }
 
 void
diff --git a/src/server_events.h b/src/server_events.h
index ab2e29fd..a0ea6d13 100644
--- a/src/server_events.h
+++ b/src/server_events.h
@@ -75,8 +75,7 @@ void handle_group_remove(const char * const contact,
 void handle_roster_remove(const char * const barejid);
 void handle_roster_add(const char * const barejid, const char * const name);
 void handle_autoping_cancel(void);
-void handle_recipient_not_found(const char * const recipient, const char * const err_msg);
-void handle_recipient_error(const char * const recipient, const char * const err_msg);
-void handle_error(const char * const err_msg);
+void handle_message_error(const char * const from, const char * const type,
+    const char * const err_msg);
 
 #endif
diff --git a/src/xmpp/message.c b/src/xmpp/message.c
index 5ea54f2d..5a7e9075 100644
--- a/src/xmpp/message.c
+++ b/src/xmpp/message.c
@@ -224,18 +224,7 @@ _message_error_handler(xmpp_conn_t * const conn, xmpp_stanza_t * const stanza,
 
     g_string_free(log_msg, TRUE);
 
-    // handle recipient not found ('from' contains a value and type is 'cancel')
-    if ((from != NULL) && ((type != NULL && (strcmp(type, "cancel") == 0)))) {
-        handle_recipient_not_found(from, err_msg);
-
-    // handle any other error from recipient
-    } else if (from != NULL) {
-        handle_recipient_error(from, err_msg);
-
-    // handle errors from no recipient
-    } else {
-        handle_error(err_msg);
-    }
+    handle_message_error(from, type, err_msg);
 
     free(err_msg);
 
diff --git a/tests/test_server_events.c b/tests/test_server_events.c
index f800f4dc..e8a1de33 100644
--- a/tests/test_server_events.c
+++ b/tests/test_server_events.c
@@ -104,3 +104,12 @@ void console_shows_dnd_presence_when_set_all(void **state)
 
     roster_clear();
 }
+
+void handle_message_stanza_error_when_no_from(void **state)
+{
+    char *err_msg = "Some error.";
+    mock_ui_handle_error();
+    expect_ui_handle_error(err_msg);
+
+    handle_message_error(NULL, "cancel", err_msg);
+}
diff --git a/tests/test_server_events.h b/tests/test_server_events.h
index b6774456..c238bc07 100644
--- a/tests/test_server_events.h
+++ b/tests/test_server_events.h
@@ -4,3 +4,4 @@ void console_shows_online_presence_when_set_all(void **state);
 void console_doesnt_show_dnd_presence_when_set_none(void **state);
 void console_doesnt_show_dnd_presence_when_set_online(void **state);
 void console_shows_dnd_presence_when_set_all(void **state);
+void handle_message_stanza_error_when_no_from(void **state);
diff --git a/tests/testsuite.c b/tests/testsuite.c
index 9cd35304..2e4b35cb 100644
--- a/tests/testsuite.c
+++ b/tests/testsuite.c
@@ -389,6 +389,7 @@ int main(int argc, char* argv[]) {
         unit_test_setup_teardown(console_shows_dnd_presence_when_set_all,
             init_preferences,
             close_preferences),
+        unit_test(handle_message_stanza_error_when_no_from)
     };
 
     const UnitTest cmd_alias_tests[] = {
diff --git a/tests/ui/mock_ui.c b/tests/ui/mock_ui.c
index e03b77c5..5e2be5f6 100644
--- a/tests/ui/mock_ui.c
+++ b/tests/ui/mock_ui.c
@@ -93,6 +93,12 @@ char * _stub_ui_ask_password(void)
 }
 
 static
+void _mock_ui_handle_error(const char * const err_msg)
+{
+    check_expected(err_msg);
+}
+
+static
 void _stub_ui_chat_win_contact_online(PContact contact, Resource *resource, GDateTime *last_activity)
 {
 }
@@ -160,6 +166,12 @@ stub_cons_show(void)
 }
 
 void
+mock_ui_handle_error(void)
+{
+    ui_handle_error = _mock_ui_handle_error;
+}
+
+void
 expect_cons_show(char *output)
 {
     expect_string(_mock_cons_show, output, output);
@@ -213,3 +225,9 @@ mock_ui_ask_password_returns(char *password)
 {
     will_return(_mock_ui_ask_password, strdup(password));
 }
+
+void
+expect_ui_handle_error(char *err_msg)
+{
+    expect_string(_mock_ui_handle_error, err_msg, err_msg);
+}
diff --git a/tests/ui/mock_ui.h b/tests/ui/mock_ui.h
index b0a5a80d..a7a53e53 100644
--- a/tests/ui/mock_ui.h
+++ b/tests/ui/mock_ui.h
@@ -18,6 +18,9 @@ void stub_ui_chat_win_contact_online(void);
 void mock_cons_show_error(void);
 void expect_cons_show_error(char *output);
 
+void mock_ui_handle_error(void);
+void expect_ui_handle_error(char *err_msg);
+
 void mock_cons_show_account(void);
 void expect_cons_show_account(ProfAccount *account);