summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libpurple/protocols/jabber/caps.c15
-rw-r--r--libpurple/protocols/jabber/caps.h11
-rw-r--r--libpurple/tests/Makefile.am1
-rw-r--r--libpurple/tests/check_libpurple.c1
-rw-r--r--libpurple/tests/test_jabber_caps.c36
-rw-r--r--libpurple/tests/tests.h1
6 files changed, 54 insertions, 11 deletions
diff --git a/libpurple/protocols/jabber/caps.c b/libpurple/protocols/jabber/caps.c
index 60a06130eb..3cc39c7552 100644
--- a/libpurple/protocols/jabber/caps.c
+++ b/libpurple/protocols/jabber/caps.c
@@ -41,14 +41,6 @@ static GHashTable *capstable = NULL; /* JabberCapsTuple -> JabberCapsClientInfo
static GHashTable *nodetable = NULL; /* char *node -> JabberCapsNodeExts */
static guint save_timer = 0;
-/**
- * Processes a query-node and returns a JabberCapsClientInfo object with all relevant info.
- *
- * @param query A query object.
- * @return A JabberCapsClientInfo object.
- */
-static JabberCapsClientInfo *jabber_caps_parse_client_info(xmlnode *query);
-
/* Free a GList of allocated char* */
static void
free_string_glist(GList *list)
@@ -764,13 +756,14 @@ jabber_xdata_compare(gconstpointer a, gconstpointer b)
return result;
}
-static JabberCapsClientInfo *jabber_caps_parse_client_info(xmlnode *query)
+JabberCapsClientInfo *jabber_caps_parse_client_info(xmlnode *query)
{
xmlnode *child;
JabberCapsClientInfo *info;
- if (!query || strcmp(query->xmlns, NS_DISCO_INFO))
- return 0;
+ if (!query || !g_str_equal(query->name, "query") ||
+ !purple_strequal(query->xmlns, NS_DISCO_INFO))
+ return NULL;
info = g_new0(JabberCapsClientInfo, 1);
diff --git a/libpurple/protocols/jabber/caps.h b/libpurple/protocols/jabber/caps.h
index 46a6dd770e..897754f6d9 100644
--- a/libpurple/protocols/jabber/caps.h
+++ b/libpurple/protocols/jabber/caps.h
@@ -115,4 +115,15 @@ const gchar* jabber_caps_get_own_hash(JabberStream *js);
*/
void jabber_caps_broadcast_change(void);
+/**
+ * Parse the <query/> element from an IQ stanza into a JabberCapsClientInfo
+ * struct.
+ *
+ * Exposed for tests
+ *
+ * @param query The 'query' element from an IQ reply stanza.
+ * @returns A JabberCapsClientInfo struct, or NULL on error
+ */
+JabberCapsClientInfo *jabber_caps_parse_client_info(xmlnode *query);
+
#endif /* PURPLE_JABBER_CAPS_H_ */
diff --git a/libpurple/tests/Makefile.am b/libpurple/tests/Makefile.am
index 1e48399821..ac1423ac79 100644
--- a/libpurple/tests/Makefile.am
+++ b/libpurple/tests/Makefile.am
@@ -10,6 +10,7 @@ check_libpurple_SOURCES=\
check_libpurple.c \
tests.h \
test_cipher.c \
+ test_jabber_caps.c \
test_jabber_jutil.c \
test_jabber_scram.c \
test_qq.c \
diff --git a/libpurple/tests/check_libpurple.c b/libpurple/tests/check_libpurple.c
index a6afa7d043..836b0dfa9c 100644
--- a/libpurple/tests/check_libpurple.c
+++ b/libpurple/tests/check_libpurple.c
@@ -84,6 +84,7 @@ int main(void)
sr = srunner_create (master_suite());
srunner_add_suite(sr, cipher_suite());
+ srunner_add_suite(sr, jabber_caps_suite());
srunner_add_suite(sr, jabber_jutil_suite());
srunner_add_suite(sr, jabber_scram_suite());
srunner_add_suite(sr, qq_suite());
diff --git a/libpurple/tests/test_jabber_caps.c b/libpurple/tests/test_jabber_caps.c
new file mode 100644
index 0000000000..811c7c6840
--- /dev/null
+++ b/libpurple/tests/test_jabber_caps.c
@@ -0,0 +1,36 @@
+#include <string.h>
+
+#include "tests.h"
+#include "../xmlnode.h"
+#include "../protocols/jabber/caps.h"
+
+START_TEST(test_parse_invalid)
+{
+ xmlnode *query;
+
+ fail_unless(NULL == jabber_caps_parse_client_info(NULL));
+
+ /* Something other than a disco#info query */
+ query = xmlnode_new("foo");
+ fail_unless(NULL == jabber_caps_parse_client_info(query));
+ xmlnode_free(query);
+
+ query = xmlnode_new("query");
+ fail_unless(NULL == jabber_caps_parse_client_info(query));
+ xmlnode_set_namespace(query, "jabber:iq:last");
+ fail_unless(NULL == jabber_caps_parse_client_info(query));
+ xmlnode_free(query);
+}
+END_TEST
+
+Suite *
+jabber_caps_suite(void)
+{
+ Suite *s = suite_create("Jabber Caps Functions");
+
+ TCase *tc = tcase_create("Parsing invalid ndoes");
+ tcase_add_test(tc, test_parse_invalid);
+ suite_add_tcase(s, tc);
+
+ return s;
+}
diff --git a/libpurple/tests/tests.h b/libpurple/tests/tests.h
index 40ba1864c8..d3cbdb2c37 100644
--- a/libpurple/tests/tests.h
+++ b/libpurple/tests/tests.h
@@ -9,6 +9,7 @@
/* remember to add the suite to the runner in check_libpurple.c */
Suite * master_suite(void);
Suite * cipher_suite(void);
+Suite * jabber_caps_suite(void);
Suite * jabber_jutil_suite(void);
Suite * jabber_scram_suite(void);
Suite * qq_suite(void);