Standardize all protocol header guard macros.
[pidgin-git.git] / libpurple / protocols / jabber / tests / test_jabber_jutil.c
blob5be3d650b0ea0a2673abd3d6499df5d75840d3b8
1 #include <glib.h>
3 #include "account.h"
4 #include "conversation.h"
5 #include "glibcompat.h"
6 #include "tests.h"
7 #include "xmlnode.h"
8 #include "protocols/jabber/jutil.h"
10 static void
11 test_jabber_util_get_resource_exists(void) {
12 PurpleTestStringData data[] = {
13 { "foo@bar/baz", "baz" },
14 { "bar/baz", "baz" },
15 { "foo@bar/baz/bat", "baz/bat" },
16 { "bar/baz/bat", "baz/bat" },
17 { NULL, NULL },
20 purple_test_string_compare_free(jabber_get_resource, data);
23 static void
24 test_jabber_util_get_resource_none(void) {
25 PurpleTestStringData data[] = {
26 { "foo@bar", NULL },
27 { "bar", NULL },
28 { NULL, NULL },
31 purple_test_string_compare_free(jabber_get_resource, data);
34 static void
35 test_jabber_util_get_bare_jid(void) {
36 PurpleTestStringData data[] = {
37 { "foo@bar", "foo@bar" },
38 { "foo@bar/baz", "foo@bar" },
39 { "bar", "bar" },
40 { "bar/baz", "bar" },
41 { NULL, NULL },
44 purple_test_string_compare_free(jabber_get_bare_jid, data);
47 static void
48 test_jabber_util_nodeprep_validate(void) {
49 const gchar *data[] = {
50 "foo",
51 "%d",
52 "y\\z",
53 "a=",
54 "a,",
55 NULL,
57 gchar *longnode;
58 gint i;
60 for(i = 0; data[i]; i++) {
61 g_assert_true(jabber_nodeprep_validate(data[i]));
64 longnode = g_strnfill(1023, 'a');
65 g_assert_true(jabber_nodeprep_validate(longnode));
66 g_free(longnode);
68 longnode = g_strnfill(1024, 'a');
69 g_assert_false(jabber_nodeprep_validate(longnode));
70 g_free(longnode);
73 static void
74 test_jabber_util_nodeprep_validate_illegal_chars(void) {
75 const gchar *data[] = {
76 "don't",
77 "m@ke",
78 "\"me\"",
79 "&ngry",
80 "c:",
81 "a/b",
82 "4>2",
83 "4<7",
84 NULL,
86 gint i;
88 for(i = 0; data[i]; i++)
89 g_assert_false(jabber_nodeprep_validate(data[i]));
92 static void
93 test_jabber_util_nodeprep_validate_too_long(void) {
94 gchar *longnode = g_strnfill(1024, 'a');
96 g_assert_false(jabber_nodeprep_validate(longnode));
98 g_free(longnode);
101 static void
102 test_jabber_util_jabber_id_new_valid(void) {
103 const gchar *jids[] = {
104 "gmail.com",
105 "gmail.com/Test",
106 "gmail.com/Test@",
107 "gmail.com/@",
108 "gmail.com/Test@alkjaweflkj",
109 "noone@example.com",
110 "noone@example.com/Test12345",
111 "noone@example.com/Test@12345",
112 "noone@example.com/Te/st@12@//345",
113 "わいど@conference.jabber.org",
114 "まりるーむ@conference.jabber.org",
115 "noone@example.com/まりるーむ",
116 "noone@example/stuff.org",
117 "noone@nödåtXäYZ.example",
118 "noone@nödåtXäYZ.example/まりるーむ",
119 "noone@わいど.org",
120 "noone@まつ.おおかみ.net",
121 "noone@310.0.42.230/s",
122 "noone@[::1]", /* IPv6 */
123 "noone@[3001:470:1f05:d58::2]",
124 "noone@[3001:470:1f05:d58::2]/foo",
125 "no=one@310.0.42.230",
126 "no,one@310.0.42.230",
127 NULL
129 gint i;
131 for(i = 0; jids[i]; i++) {
132 JabberID *jid = jabber_id_new(jids[i]);
134 g_assert_nonnull(jid);
136 jabber_id_free(jid);
140 static void
141 test_jabber_util_jabber_id_new_invalid(void) {
142 const gchar *jids[] = {
143 "@gmail.com",
144 "@@gmail.com",
145 "noone@@example.com/Test12345",
146 "no@one@example.com/Test12345",
147 "@example.com/Test@12345",
148 "/Test@12345",
149 "noone@",
150 "noone/",
151 "noone@gmail_stuff.org",
152 "noone@gmail[stuff.org",
153 "noone@gmail\\stuff.org",
154 "noone@[::1]124",
155 "noone@2[::1]124/as",
156 "noone@まつ.おおかみ/\x01",
158 * RFC 3454 Section 6 reads, in part,
159 * "If a string contains any RandALCat character, the
160 * string MUST NOT contain any LCat character."
161 * The character is U+066D (ARABIC FIVE POINTED STAR).
163 "foo@example.com/٭simplexe٭",
164 NULL,
166 gint i;
168 for(i = 0; jids[i]; i++)
169 g_assert_null(jabber_id_new(jids[i]));
172 #define assert_jid_parts(expect_node, expect_domain, str) G_STMT_START { \
173 JabberID *jid = jabber_id_new(str); \
174 g_assert_nonnull(jid); \
175 g_assert_nonnull(jid->node); \
176 g_assert_nonnull(jid->domain); \
177 g_assert_null(jid->resource); \
178 g_assert_cmpstr(expect_node, ==, jid->node); \
179 g_assert_cmpstr(expect_domain, ==, jid->domain); \
180 jabber_id_free(jid); \
181 } G_STMT_END
184 static void
185 test_jabber_util_jid_parts(void) {
186 /* Ensure that jabber_id_new is properly lowercasing node and domains */
187 assert_jid_parts("noone", "example.com", "NoOne@example.com");
188 assert_jid_parts("noone", "example.com", "noone@ExaMPle.CoM");
190 /* These case-mapping tests culled from examining RFC3454 B.2 */
192 /* Cyrillic capital EF (U+0424) maps to lowercase EF (U+0444) */
193 assert_jid_parts("ф", "example.com", "Ф@example.com");
195 #ifdef USE_IDN
197 * These character (U+A664 and U+A665) are not mapped to anything in
198 * RFC3454 B.2. This first test *fails* when not using IDN because glib's
199 * case-folding/utf8_strdown improperly (for XMPP) lowercases the character.
201 * This is known, but not (very?) likely to actually cause a problem, so
202 * this test is commented out when using glib's functions.
204 assert_jid_parts("Ꙥ", "example.com", "Ꙥ@example.com");
205 assert_jid_parts("ꙥ", "example.com", "ꙥ@example.com");
206 #endif
208 /* U+04E9 to U+04E9 */
209 assert_jid_parts("noone", "өexample.com", "noone@Өexample.com");
212 static const gchar *
213 partial_jabber_normalize(const gchar *str) {
214 return jabber_normalize(NULL, str);
217 static void
218 test_jabber_util_jabber_normalize(void) {
219 PurpleTestStringData data[] = {
221 "NoOnE@ExAMplE.com",
222 "noone@example.com",
223 }, {
224 "NoOnE@ExampLE.cOM/",
225 "noone@example.com",
226 }, {
227 "NoONe@exAMPle.CoM/resource",
228 "noone@example.com",
229 }, {
230 NULL,
231 NULL,
235 purple_test_string_compare(partial_jabber_normalize, data);
238 gint
239 main(gint argc, gchar **argv) {
240 g_test_init(&argc, &argv, NULL);
242 g_test_add_func("/jabber/util/get_resource/exists",
243 test_jabber_util_get_resource_exists);
244 g_test_add_func("/jabber/util/get_resource/none",
245 test_jabber_util_get_resource_none);
247 g_test_add_func("/jabber/util/get_bare_jid",
248 test_jabber_util_get_bare_jid);
250 g_test_add_func("/jabber/util/nodeprep/validate/valid",
251 test_jabber_util_nodeprep_validate);
252 g_test_add_func("/jabber/util/nodeprep/validate/illegal_chars",
253 test_jabber_util_nodeprep_validate_illegal_chars);
254 g_test_add_func("/jabber/util/nodeprep/validate/too_long",
255 test_jabber_util_nodeprep_validate_too_long);
257 g_test_add_func("/jabber/util/id_new/valid",
258 test_jabber_util_jabber_id_new_valid);
259 g_test_add_func("/jabber/util/id_new/invalid",
260 test_jabber_util_jabber_id_new_invalid);
261 g_test_add_func("/jabber/util/id_new/jid_parts",
262 test_jabber_util_jid_parts);
264 g_test_add_func("/jabber/util/normalize",
265 test_jabber_util_jabber_normalize);
267 return g_test_run();