about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorJames Booth <boothj5@gmail.com>2015-07-22 22:59:20 +0100
committerJames Booth <boothj5@gmail.com>2015-07-22 22:59:20 +0100
commite55ef63f617d74a450d6d6d59029782697fe1442 (patch)
tree9e32cc2d34bd6e668e249eca14572d1b86bbc140
parente66f0cf7569f8f959ef3ce7faed4e1a94a97c470 (diff)
parentf9a7e35001107dcbd3e03f24833478cf869caf5a (diff)
downloadprofani-tty-e55ef63f617d74a450d6d6d59029782697fe1442.tar.gz
Merge branch 'master' into help
-rw-r--r--Makefile.am1
-rw-r--r--src/xmpp/roster.c11
-rw-r--r--src/xmpp/stanza.c4
-rw-r--r--tests/functionaltests/functionaltests.c6
-rw-r--r--tests/functionaltests/proftest.c25
-rw-r--r--tests/functionaltests/proftest.h1
-rw-r--r--tests/functionaltests/test_roster.c121
-rw-r--r--tests/functionaltests/test_roster.h4
8 files changed, 160 insertions, 13 deletions
diff --git a/Makefile.am b/Makefile.am
index 87bc1502..6fba8900 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -103,6 +103,7 @@ functionaltest_sources = \
 	tests/functionaltests/test_chat_session.c tests/functionaltests/test_chat_session.h \
 	tests/functionaltests/test_carbons.c tests/functionaltests/test_carbons.h \
 	tests/functionaltests/test_receipts.c tests/functionaltests/test_receipts.h \
+	tests/functionaltests/test_roster.c tests/functionaltests/test_roster.h \
 	tests/functionaltests/functionaltests.c
 
 main_source = src/main.c
diff --git a/src/xmpp/roster.c b/src/xmpp/roster.c
index 5c9fa5d4..84a88d62 100644
--- a/src/xmpp/roster.c
+++ b/src/xmpp/roster.c
@@ -102,7 +102,9 @@ roster_send_add_new(const char * const barejid, const char * const name)
 {
     xmpp_conn_t * const conn = connection_get_conn();
     xmpp_ctx_t * const ctx = connection_get_ctx();
-    xmpp_stanza_t *iq = stanza_create_roster_set(ctx, NULL, barejid, name, NULL);
+    char *id = create_unique_id("roster");
+    xmpp_stanza_t *iq = stanza_create_roster_set(ctx, id, barejid, name, NULL);
+    free(id);
     xmpp_send(conn, iq);
     xmpp_stanza_release(iq);
 }
@@ -122,8 +124,9 @@ roster_send_name_change(const char * const barejid, const char * const new_name,
 {
     xmpp_conn_t * const conn = connection_get_conn();
     xmpp_ctx_t * const ctx = connection_get_ctx();
-    xmpp_stanza_t *iq = stanza_create_roster_set(ctx, NULL, barejid, new_name,
-        groups);
+    char *id = create_unique_id("roster");
+    xmpp_stanza_t *iq = stanza_create_roster_set(ctx, id, barejid, new_name, groups);
+    free(id);
     xmpp_send(conn, iq);
     xmpp_stanza_release(iq);
 }
@@ -354,4 +357,4 @@ _get_groups_from_item(xmpp_stanza_t *item)
     }
 
     return groups;
-}
\ No newline at end of file
+}
diff --git a/src/xmpp/stanza.c b/src/xmpp/stanza.c
index ed188a3b..be85c330 100644
--- a/src/xmpp/stanza.c
+++ b/src/xmpp/stanza.c
@@ -373,6 +373,10 @@ stanza_create_roster_remove_set(xmpp_ctx_t *ctx, const char * const barejid)
     xmpp_stanza_set_name(iq, STANZA_NAME_IQ);
     xmpp_stanza_set_type(iq, STANZA_TYPE_SET);
 
+    char *id = create_unique_id("roster");
+    xmpp_stanza_set_id(iq, id);
+    free(id);
+
     xmpp_stanza_t *query = xmpp_stanza_new(ctx);
     xmpp_stanza_set_name(query, STANZA_NAME_QUERY);
     xmpp_stanza_set_ns(query, XMPP_NS_ROSTER);
diff --git a/tests/functionaltests/functionaltests.c b/tests/functionaltests/functionaltests.c
index f244b95a..6eb57589 100644
--- a/tests/functionaltests/functionaltests.c
+++ b/tests/functionaltests/functionaltests.c
@@ -18,6 +18,7 @@
 #include "test_carbons.h"
 #include "test_chat_session.h"
 #include "test_receipts.h"
+#include "test_roster.h"
 
 #define PROF_FUNC_TEST(test) unit_test_setup_teardown(test, init_prof_test, close_prof_test)
 
@@ -68,6 +69,11 @@ int main(int argc, char* argv[]) {
 
         PROF_FUNC_TEST(send_receipt_request),
         PROF_FUNC_TEST(send_receipt_on_request),
+
+        PROF_FUNC_TEST(sends_new_item),
+        PROF_FUNC_TEST(sends_new_item_nick),
+        PROF_FUNC_TEST(sends_remove_item),
+        PROF_FUNC_TEST(sends_nick_change),
     };
 
     return run_tests(all_tests);
diff --git a/tests/functionaltests/proftest.c b/tests/functionaltests/proftest.c
index 4f641821..403e47d7 100644
--- a/tests/functionaltests/proftest.c
+++ b/tests/functionaltests/proftest.c
@@ -210,16 +210,10 @@ prof_output_regex(char *text)
 }
 
 void
-prof_connect(void)
+prof_connect_with_roster(char *roster)
 {
-    stbbr_for_query("jabber:iq:roster",
-        "<iq type=\"result\" to=\"stabber@localhost/profanity\">"
-            "<query xmlns=\"jabber:iq:roster\" ver=\"362\">"
-                "<item jid=\"buddy1@localhost\" subscription=\"both\" name=\"Buddy1\"/>"
-                "<item jid=\"buddy2@localhost\" subscription=\"both\" name=\"Buddy2\"/>"
-            "</query>"
-        "</iq>"
-    );
+    stbbr_for_query("jabber:iq:roster", roster);
+
     stbbr_for_id("prof_presence_1",
         "<presence id=\"prof_presence_1\" lang=\"en\" to=\"stabber@localhost/profanity\" from=\"stabber@localhost/profanity\">"
             "<priority>0</priority>"
@@ -236,3 +230,16 @@ prof_connect(void)
     exp_timeout = 10;
     stbbr_wait_for("prof_presence_*");
 }
+
+void
+prof_connect(void)
+{
+    prof_connect_with_roster(
+        "<iq type=\"result\" to=\"stabber@localhost/profanity\">"
+            "<query xmlns=\"jabber:iq:roster\" ver=\"362\">"
+                "<item jid=\"buddy1@localhost\" subscription=\"both\" name=\"Buddy1\"/>"
+                "<item jid=\"buddy2@localhost\" subscription=\"both\" name=\"Buddy2\"/>"
+            "</query>"
+        "</iq>"
+    );
+}
diff --git a/tests/functionaltests/proftest.h b/tests/functionaltests/proftest.h
index 2283ab01..547b2c11 100644
--- a/tests/functionaltests/proftest.h
+++ b/tests/functionaltests/proftest.h
@@ -9,6 +9,7 @@ void close_prof_test(void **state);
 
 void prof_start(void);
 void prof_connect(void);
+void prof_connect_with_roster(char *roster);
 void prof_input(char *input);
 
 int prof_output_exact(char *text);
diff --git a/tests/functionaltests/test_roster.c b/tests/functionaltests/test_roster.c
new file mode 100644
index 00000000..ba1c851a
--- /dev/null
+++ b/tests/functionaltests/test_roster.c
@@ -0,0 +1,121 @@
+#include <glib.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <setjmp.h>
+#include <cmocka.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <stabber.h>
+#include <expect.h>
+
+#include "proftest.h"
+
+void
+sends_new_item(void **state)
+{
+    prof_connect();
+
+    stbbr_for_query("jabber:iq:roster",
+        "<iq type=\"set\" from=\"stabber@localhost\">"
+            "<query xmlns=\"jabber:iq:roster\">"
+                "<item jid=\"bob@localhost\" subscription=\"none\" name=\"\"/>"
+            "</query>"
+        "</iq>"
+    );
+
+    prof_input("/roster add bob@localhost");
+
+    assert_true(stbbr_received(
+        "<iq type=\"set\" id=\"*\">"
+            "<query xmlns=\"jabber:iq:roster\">"
+                "<item jid=\"bob@localhost\" name=\"\"/>"
+            "</query>"
+        "</iq>"
+    ));
+
+    assert_true(prof_output_exact("Roster item added: bob@localhost"));
+}
+
+void
+sends_new_item_nick(void **state)
+{
+    prof_connect();
+
+    stbbr_for_query("jabber:iq:roster",
+        "<iq type=\"set\" from=\"stabber@localhost\">"
+            "<query xmlns=\"jabber:iq:roster\">"
+                "<item jid=\"bob@localhost\" subscription=\"none\" name=\"Bobby\"/>"
+            "</query>"
+        "</iq>"
+    );
+
+    prof_input("/roster add bob@localhost Bobby");
+
+    assert_true(stbbr_received(
+        "<iq type=\"set\" id=\"*\">"
+            "<query xmlns=\"jabber:iq:roster\">"
+                "<item jid=\"bob@localhost\" name=\"Bobby\"/>"
+            "</query>"
+        "</iq>"
+    ));
+
+    assert_true(prof_output_exact("Roster item added: bob@localhost (Bobby)"));
+}
+
+void
+sends_remove_item(void **state)
+{
+    prof_connect_with_roster(
+        "<iq type=\"result\" to=\"stabber@localhost/profanity\">"
+            "<query xmlns=\"jabber:iq:roster\" ver=\"362\">"
+                "<item jid=\"buddy1@localhost\" subscription=\"both\"/>"
+                "<item jid=\"buddy2@localhost\" subscription=\"both\"/>"
+            "</query>"
+        "</iq>"
+    );
+
+    stbbr_for_query("jabber:iq:roster",
+        "<iq id=\"*\" type=\"set\">"
+            "<query xmlns=\"jabber:iq:roster\">"
+                "<item jid=\"buddy1@localhost\" subscription=\"remove\"/>"
+            "</query>"
+        "</iq>"
+    );
+
+    prof_input("/roster remove buddy1@localhost");
+
+    assert_true(stbbr_received(
+        "<iq type=\"set\" id=\"*\">"
+            "<query xmlns=\"jabber:iq:roster\">"
+                "<item jid=\"buddy1@localhost\" subscription=\"remove\"/>"
+            "</query>"
+        "</iq>"
+    ));
+
+    assert_true(prof_output_exact("Roster item removed: buddy1@localhost"));
+}
+
+void
+sends_nick_change(void **state)
+{
+    prof_connect_with_roster(
+        "<iq type=\"result\" to=\"stabber@localhost/profanity\">"
+            "<query xmlns=\"jabber:iq:roster\" ver=\"362\">"
+                "<item jid=\"buddy1@localhost\" subscription=\"both\"/>"
+            "</query>"
+        "</iq>"
+    );
+
+    prof_input("/roster nick buddy1@localhost Buddy1");
+
+    assert_true(prof_output_exact("Nickname for buddy1@localhost set to: Buddy1."));
+
+    assert_true(stbbr_received(
+        "<iq type=\"set\" id=\"*\">"
+            "<query xmlns=\"jabber:iq:roster\">"
+                "<item jid=\"buddy1@localhost\" name=\"Buddy1\"/>"
+            "</query>"
+        "</iq>"
+    ));
+}
diff --git a/tests/functionaltests/test_roster.h b/tests/functionaltests/test_roster.h
new file mode 100644
index 00000000..9b34e82a
--- /dev/null
+++ b/tests/functionaltests/test_roster.h
@@ -0,0 +1,4 @@
+void sends_new_item(void **state);
+void sends_new_item_nick(void **state);
+void sends_remove_item(void **state);
+void sends_nick_change(void **state);