diff --git a/Makefile.am b/Makefile.am
index e16c5352..4a0d9dea 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 925ded99..5d6b7bc2 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)
@@ -74,6 +75,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 064f5192..d064a349 100644
--- a/tests/functionaltests/proftest.c
+++ b/tests/functionaltests/proftest.c
@@ -245,16 +245,10 @@ prof_output_glob(char *text)
}
void
-prof_connect(void)
+prof_connect_with_roster(char *roster)
{
- stbbr_for_query("jabber:iq:roster",
- ""
- ""
- "- "
- "
- "
- "
"
- ""
- );
+ stbbr_for_query("jabber:iq:roster", roster);
+
stbbr_for_id("prof_presence_1",
""
"0"
@@ -271,3 +265,16 @@ prof_connect(void)
exp_timeout = 10;
stbbr_wait_for("prof_presence_*");
}
+
+void
+prof_connect(void)
+{
+ prof_connect_with_roster(
+ ""
+ ""
+ "- "
+ "
- "
+ "
"
+ ""
+ );
+}
diff --git a/tests/functionaltests/proftest.h b/tests/functionaltests/proftest.h
index 4ce67e9f..163cf221 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
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+#include
+
+#include "proftest.h"
+
+void
+sends_new_item(void **state)
+{
+ prof_connect();
+
+ stbbr_for_query("jabber:iq:roster",
+ ""
+ ""
+ "- "
+ "
"
+ ""
+ );
+
+ prof_input("/roster add bob@localhost");
+
+ assert_true(stbbr_received(
+ ""
+ ""
+ "- "
+ "
"
+ ""
+ ));
+
+ 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",
+ ""
+ ""
+ "- "
+ "
"
+ ""
+ );
+
+ prof_input("/roster add bob@localhost Bobby");
+
+ assert_true(stbbr_received(
+ ""
+ ""
+ "- "
+ "
"
+ ""
+ ));
+
+ assert_true(prof_output_exact("Roster item added: bob@localhost (Bobby)"));
+}
+
+void
+sends_remove_item(void **state)
+{
+ prof_connect_with_roster(
+ ""
+ ""
+ "- "
+ "
- "
+ "
"
+ ""
+ );
+
+ stbbr_for_query("jabber:iq:roster",
+ ""
+ ""
+ "- "
+ "
"
+ ""
+ );
+
+ prof_input("/roster remove buddy1@localhost");
+
+ assert_true(stbbr_received(
+ ""
+ ""
+ "- "
+ "
"
+ ""
+ ));
+
+ assert_true(prof_output_exact("Roster item removed: buddy1@localhost"));
+}
+
+void
+sends_nick_change(void **state)
+{
+ prof_connect_with_roster(
+ ""
+ ""
+ "- "
+ "
"
+ ""
+ );
+
+ prof_input("/roster nick buddy1@localhost Buddy1");
+
+ assert_true(prof_output_exact("Nickname for buddy1@localhost set to: Buddy1."));
+
+ assert_true(stbbr_received(
+ ""
+ ""
+ "- "
+ "
"
+ ""
+ ));
+}
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);