1
/* Copyright (c) 2013 Dovecot authors, see the included COPYING file */
6
#include "test-common.h"
8
struct valid_imap_url_test {
10
enum imap_url_parse_flags flags;
11
struct imap_url url_base;
13
struct imap_url url_parsed;
16
/* Valid IMAP URL tests */
17
struct valid_imap_url_test valid_url_tests[] = {
19
.url = "imap://localhost",
21
.host_name = "localhost" }
23
.url = "imap://user@localhost",
25
.host_name = "localhost",
28
.url = "imap://user;AUTH=PLAIN@localhost",
30
.host_name = "localhost",
32
.auth_type = "PLAIN" }
34
.url = "imap://;AUTH=PLAIN@localhost",
36
.host_name = "localhost",
37
.auth_type = "PLAIN" }
39
.url = "imap://%68endri%6B;AUTH=GSS%41PI@%65%78%61%6d%70%6c%65.com",
41
.host_name = "example.com",
43
.auth_type = "GSSAPI" }
45
.url = "imap://user@localhost:993",
47
.host_name = "localhost",
49
.port = 993, .have_port = TRUE }
51
.url = "imap://user@127.0.0.1",
53
.host_name = "127.0.0.1",
55
.have_host_ip = TRUE }
58
.url = "imap://user@[::1]",
62
.have_host_ip = TRUE }
65
.url = "imap://user@4example.com:423",
67
.host_name = "4example.com",
69
.port = 423, .have_port = TRUE }
71
.url = "imap://beelzebub@666.4example.com:999",
73
.host_name = "666.4example.com",
74
.userid = "beelzebub",
75
.port = 999, .have_port = TRUE }
77
.url = "imap://user@example.com/",
79
.host_name = "example.com",
83
.url = "imap://user@example.com/./",
85
.host_name = "example.com",
89
.url = "imap://user@example.com/INBOX",
91
.host_name = "example.com",
95
.url = "imap://user@example.com/INBOX/",
97
.host_name = "example.com",
101
.url = "imap://user@example.com//",
103
.host_name = "example.com",
107
.url = "imap://user@example.com/INBOX/Trash",
109
.host_name = "example.com",
111
.mailbox = "INBOX/Trash" }
113
.url = "imap://user@example.com/INBOX/Trash/..",
115
.host_name = "example.com",
117
.mailbox = "INBOX/" }
119
.url = "imap://user@example.com/INBOX/Trash/../",
121
.host_name = "example.com",
123
.mailbox = "INBOX/" }
125
.url = "imap://user@example.com/INBOX/Trash/../..",
127
.host_name = "example.com",
131
.url = "imap://user@example.com/INBOX.Trash",
133
.host_name = "example.com",
135
.mailbox = "INBOX.Trash" }
137
.url = "imap://user@example.com/INBOX%3BTrash",
139
.host_name = "example.com",
141
.mailbox = "INBOX;Trash" }
143
.url = "imap://user@example.com/INBOX;UIDVALIDITY=1341",
145
.host_name = "example.com",
147
.mailbox = "INBOX", .uidvalidity = 1341 }
149
.url = "imap://user@example.com/INBOX/;UIDVALIDITY=23423",
151
.host_name = "example.com",
153
.mailbox = "INBOX/", .uidvalidity = 23423 }
155
.url = "imap://user@example.com/INBOX/Drafts;UIDVALIDITY=6567",
157
.host_name = "example.com",
159
.mailbox = "INBOX/Drafts", .uidvalidity = 6567 }
161
.url = "imap://user@example.com/INBOX/Drafts;UIDVALIDITY=788/;UID=16",
163
.host_name = "example.com",
165
.mailbox = "INBOX/Drafts", .uidvalidity = 788,
168
.url = "imap://user@example.com/INBOX/Drafts;UIDVALIDITY=788/;UID=16/..",
170
.host_name = "example.com",
172
.mailbox = "INBOX/Drafts", .uidvalidity = 788,
175
.url = "imap://user@example.com/INBOX/Drafts;UIDVALIDITY=788/;UID=16/../..",
177
.host_name = "example.com",
179
.mailbox = "INBOX/", .uidvalidity = 0,
182
.url = "imap://user@example.com/INBOX/Junk;UIDVALIDITY=27667/"
183
";UID=434/;SECTION=HEADER",
185
.host_name = "example.com",
187
.mailbox = "INBOX/Junk", .uidvalidity = 27667,
188
.uid = 434, .section = "HEADER" }
190
.url = "imap://user@example.com/INBOX/Important/"
191
";UID=437/;SECTION=1.2.MIME",
193
.host_name = "example.com",
195
.mailbox = "INBOX/Important",
196
.uid = 437, .section = "1.2.MIME" }
198
.url = "imap://user@example.com/INBOX/Important/;UID=56/;SECTION=AA/BB",
200
.host_name = "example.com",
202
.mailbox = "INBOX/Important",
203
.uid = 56, .section = "AA/BB" }
205
.url = "imap://user@example.com/INBOX/Important/;UID=56/;SECTION=AA/BB/..",
207
.host_name = "example.com",
209
.mailbox = "INBOX/Important",
210
.uid = 56, .section = "AA/" }
212
.url = "imap://user@example.com/INBOX/Important/;UID=56/"
213
";SECTION=AA/BB/../..",
215
.host_name = "example.com",
217
.mailbox = "INBOX/Important",
218
.uid = 56, .section = NULL }
220
.url = "imap://user@example.com/INBOX/Important/;UID=234/"
221
";SECTION=HEADER.FIELDS%20(%22To%22%20%22From%22)",
223
.host_name = "example.com",
225
.mailbox = "INBOX/Important",
226
.uid = 234, .section = "HEADER.FIELDS (\"To\" \"From\")" }
228
.url = "imap://user@example.com/INBOX/Important/;UID=234/"
231
.host_name = "example.com",
233
.mailbox = "INBOX/Important",
234
.uid = 234, .section = NULL, .partial_offset = 10, .partial_size = 250 }
236
.url = "imap://hendrik@example.com/INBOX/Important/;UID=34534/"
237
";SECTION=1.3.TEXT/;PARTIAL=0.34254",
239
.host_name = "example.com",
241
.mailbox = "INBOX/Important",
242
.uid = 34534, .section = "1.3.TEXT",
243
.partial_offset = 0, .partial_size = 34254 }
245
.url = "imap://hendrik@example.com/INBOX/Sent"
246
";UIDVALIDITY=534?SUBJECT%20%22Frop?%22",
248
.host_name = "example.com",
250
.mailbox = "INBOX/Sent", .uidvalidity = 534,
251
.search_program = "SUBJECT \"Frop?\"" }
253
.url = "//hendrik@example.org/INBOX/Trash",
255
.host_name = "example.com",
258
.host_name = "example.org",
260
.mailbox = "INBOX/Trash" }
262
.url = "/INBOX/Trash",
264
.host_name = "example.com",
267
.host_name = "example.com",
269
.mailbox = "INBOX/Trash" }
271
.url = "user@example.com",
273
.host_name = "example.com",
275
.mailbox = "INBOX/Accounts" },
277
.host_name = "example.com",
279
.mailbox = "INBOX/Accounts/user@example.com" }
283
.host_name = "example.com",
285
.mailbox = "INBOX/" },
287
.host_name = "example.com",
289
.mailbox = "INBOX/Drafts" }
293
.host_name = "example.com",
295
.mailbox = "INBOX/Trash" },
297
.host_name = "example.com",
299
.mailbox = "INBOX/Drafts" }
303
.host_name = "example.com",
305
.mailbox = "INBOX/Trash",
306
.uidvalidity = 23452 },
308
.host_name = "example.com",
310
.mailbox = "INBOX/Junk",
313
.url = "../Junk;UIDVALIDITY=23",
315
.host_name = "example.com",
317
.mailbox = "INBOX/Trash",
318
.uidvalidity = 23452 },
320
.host_name = "example.com",
322
.mailbox = "INBOX/Junk",
325
.url = "../../%23shared;UIDVALIDITY=23452",
327
.host_name = "example.com",
329
.mailbox = "INBOX/Trash",
330
.uidvalidity = 764 },
332
.host_name = "example.com",
334
.mailbox = "#shared",
335
.uidvalidity = 23452 }
337
.url = "../../%23news;UIDVALIDITY=546/;UID=456",
339
.host_name = "example.com",
341
.mailbox = "INBOX/Trash",
342
.uidvalidity = 23452,
345
.host_name = "example.com",
353
.host_name = "example.com",
355
.mailbox = "INBOX/Trash",
356
.uidvalidity = 23452,
359
.host_name = "example.com",
361
.mailbox = "INBOX/Trash",
362
.uidvalidity = 23452,
367
.host_name = "example.com",
369
.mailbox = "INBOX/Trash",
370
.uidvalidity = 23452},
372
.host_name = "example.com",
374
.mailbox = "INBOX/Trash",
375
.uidvalidity = 23452,
378
.url = "../;UID=4767",
380
.host_name = "example.com",
382
.mailbox = "INBOX/Trash",
383
.uidvalidity = 23452,
386
.host_name = "example.com",
392
.url = "../;UID=4767/;SECTION=TEXT",
394
.host_name = "example.com",
396
.mailbox = "INBOX/Trash",
397
.uidvalidity = 23452,
399
.section = "1.2.3.MIME" },
401
.host_name = "example.com",
403
.mailbox = "INBOX/Trash",
404
.uidvalidity = 23452,
408
.url = ";SECTION=TEXT",
410
.host_name = "example.com",
412
.mailbox = "INBOX/Drafts",
415
.section = "1.2.3.MIME" },
417
.host_name = "example.com",
419
.mailbox = "INBOX/Drafts",
426
.host_name = "example.com",
428
.mailbox = "INBOX/Drafts",
431
.section = "AA/BB" },
433
.host_name = "example.com",
435
.mailbox = "INBOX/Drafts",
439
.url = "../;SECTION=CC",
441
.host_name = "example.com",
443
.mailbox = "INBOX/Drafts",
446
.section = "AA/BB" },
448
.host_name = "example.com",
450
.mailbox = "INBOX/Drafts",
457
.host_name = "example.com",
459
.mailbox = "INBOX/Drafts",
462
.section = "AA/BB" },
464
.host_name = "example.com",
466
.mailbox = "INBOX/Drafts",
471
.url = ";PARTIAL=1024.1024",
473
.host_name = "example.com",
475
.mailbox = "INBOX/Drafts",
478
.have_partial = TRUE, .partial_offset = 0, .partial_size = 1024 },
480
.host_name = "example.com",
482
.mailbox = "INBOX/Drafts",
485
.have_partial = TRUE, .partial_offset = 1024, .partial_size = 1024 }
487
.url = "../CC/;PARTIAL=0.512",
489
.host_name = "example.com",
491
.mailbox = "INBOX/Drafts",
495
.have_partial = TRUE, .partial_offset = 1024, .partial_size = 1024 },
497
.host_name = "example.com",
499
.mailbox = "INBOX/Drafts",
503
.have_partial = TRUE, .partial_offset = 0, .partial_size = 512 }
505
.url = "imap://user@example.com/INBOX/;UID=377;URLAUTH=anonymous",
506
.flags = IMAP_URL_PARSE_ALLOW_URLAUTH,
508
.host_name = "example.com",
512
.uauth_rumpurl = "imap://user@example.com/INBOX/;UID=377"
513
";URLAUTH=anonymous",
514
.uauth_access_application = "anonymous"}
516
.url = "imap://user@example.com/INBOX/;UID=377"
517
";URLAUTH=anonymous:internal:4142434445464748494A4B4C4D4E4F5051525354",
518
.flags = IMAP_URL_PARSE_ALLOW_URLAUTH,
520
.host_name = "example.com",
524
.uauth_rumpurl = "imap://user@example.com/INBOX/;UID=377"
525
";URLAUTH=anonymous",
526
.uauth_access_application = "anonymous",
527
.uauth_mechanism = "internal",
528
.uauth_token = (const unsigned char *)"ABCDEFGHIJKLMNOPQRST",
529
.uauth_token_size = 20}
531
.url = "imap://user@example.com/INBOX/;UID=377"
532
";EXPIRE=2011-02-12T12:45:14+01:00"
533
";URLAUTH=user+frop:internal:4142434445464748494A4B4C4D4E4F5051525354",
534
.flags = IMAP_URL_PARSE_ALLOW_URLAUTH,
536
.host_name = "example.com",
540
.uauth_rumpurl = "imap://user@example.com/INBOX/;UID=377"
541
";EXPIRE=2011-02-12T12:45:14+01:00;URLAUTH=user+frop",
542
.uauth_access_application = "user",
543
.uauth_access_user = "frop",
544
.uauth_mechanism = "internal",
545
.uauth_token = (const unsigned char *)"ABCDEFGHIJKLMNOPQRST",
546
.uauth_token_size = 20}
550
unsigned int valid_url_test_count = N_ELEMENTS(valid_url_tests);
552
static void test_imap_url_valid(void)
556
for (i = 0; i < valid_url_test_count; i++) T_BEGIN {
557
const char *url = valid_url_tests[i].url;
558
enum imap_url_parse_flags flags = valid_url_tests[i].flags;
559
struct imap_url *urlt = &valid_url_tests[i].url_parsed;
560
struct imap_url *urlb = &valid_url_tests[i].url_base;
561
struct imap_url *urlp;
562
const char *error = NULL;
564
test_begin(t_strdup_printf("imap url valid [%d]", i));
566
if (urlb->host_name == NULL) urlb = NULL;
567
if (imap_url_parse(url, urlb, flags, &urlp, &error) < 0)
570
test_out_reason(t_strdup_printf("imap_url_parse(%s)",
571
valid_url_tests[i].url), urlp != NULL, error);
573
if (urlp->host_name == NULL || urlt->host_name == NULL) {
574
test_out(t_strdup_printf("url->host_name = %s", urlp->host_name),
575
urlp->host_name == urlt->host_name);
577
test_out(t_strdup_printf("url->host_name = %s", urlp->host_name),
578
strcmp(urlp->host_name, urlt->host_name) == 0);
580
if (urlp->userid == NULL || urlt->userid == NULL) {
581
test_out(t_strdup_printf("url->userid = %s", urlp->userid),
582
urlp->userid == urlt->userid);
584
test_out(t_strdup_printf("url->userid = %s", urlp->userid),
585
strcmp(urlp->userid, urlt->userid) == 0);
587
if (urlp->auth_type == NULL || urlt->auth_type == NULL) {
588
test_out(t_strdup_printf("url->auth_type = %s", urlp->auth_type),
589
urlp->auth_type == urlt->auth_type);
591
test_out(t_strdup_printf("url->auth_type = %s", urlp->auth_type),
592
strcmp(urlp->auth_type, urlt->auth_type) == 0);
594
if (urlp->have_port) {
595
test_out("url->port = (unspecified)",
596
urlp->have_port == urlt->have_port);
598
test_out(t_strdup_printf("url->port = %u", urlp->port),
599
urlp->have_port == urlt->have_port && urlp->port == urlt->port);
601
if (!urlp->have_host_ip) {
602
test_out("url->host_ip = (unspecified)",
603
urlp->have_host_ip == urlt->have_host_ip);
605
test_out("url->host_ip = (valid)",
606
urlp->have_host_ip == urlt->have_host_ip);
608
if (urlp->mailbox == NULL || urlt->mailbox == NULL) {
609
test_out(t_strdup_printf("url->mailbox = %s", urlp->mailbox),
610
urlp->mailbox == urlt->mailbox);
612
test_out(t_strdup_printf("url->mailbox = %s", urlp->mailbox),
613
strcmp(urlp->mailbox, urlt->mailbox) == 0);
615
test_out(t_strdup_printf("url->uidvalidity = %u", urlp->uidvalidity),
616
urlp->uidvalidity == urlt->uidvalidity);
617
test_out(t_strdup_printf("url->uid = %u", urlp->uid),
618
urlp->uid == urlt->uid);
619
if (urlp->section == NULL || urlt->section == NULL) {
620
test_out(t_strdup_printf("url->section = %s", urlp->section),
621
urlp->section == urlt->section);
623
test_out(t_strdup_printf("url->section = %s", urlp->section),
624
strcmp(urlp->section, urlt->section) == 0);
626
test_out(t_strdup_printf("url->partial = %"PRIuUOFF_T".%"PRIuUOFF_T,
627
urlp->partial_offset, urlp->partial_size),
628
urlp->partial_offset == urlt->partial_offset &&
629
urlp->partial_size == urlt->partial_size);
630
if (urlp->search_program == NULL || urlt->search_program == NULL) {
631
test_out(t_strdup_printf(
632
"url->search_program = %s", urlp->search_program),
633
urlp->search_program == urlt->search_program);
635
test_out(t_strdup_printf(
636
"url->search_program = %s", urlp->search_program),
637
strcmp(urlp->search_program, urlt->search_program) == 0);
639
if (urlt->uauth_rumpurl != NULL) {
640
if (urlp->uauth_rumpurl == NULL) {
641
test_out(t_strdup_printf(
642
"url->uauth_rumpurl = %s", urlp->uauth_rumpurl), FALSE);
644
test_out(t_strdup_printf(
645
"url->uauth_rumpurl = %s", urlp->uauth_rumpurl),
646
strcmp(urlp->uauth_rumpurl, urlt->uauth_rumpurl) == 0);
648
if (urlp->uauth_access_application == NULL ||
649
urlt->uauth_access_application == NULL) {
650
test_out(t_strdup_printf("url->uauth_access_application = %s",
651
urlp->uauth_access_application),
652
urlp->uauth_access_application == urlt->uauth_access_application);
654
test_out(t_strdup_printf("url->uauth_access_application = %s",
655
urlp->uauth_access_application),
656
strcmp(urlp->uauth_access_application,
657
urlt->uauth_access_application) == 0);
659
if (urlp->uauth_access_user == NULL ||
660
urlt->uauth_access_user == NULL) {
661
test_out(t_strdup_printf("url->uauth_access_user = %s",
662
urlp->uauth_access_user),
663
urlp->uauth_access_user == urlt->uauth_access_user);
665
test_out(t_strdup_printf("url->uauth_access_user = %s",
666
urlp->uauth_access_user),
667
strcmp(urlp->uauth_access_user,
668
urlt->uauth_access_user) == 0);
670
if (urlp->uauth_mechanism == NULL || urlt->uauth_mechanism == NULL) {
671
test_out(t_strdup_printf(
672
"url->uauth_mechanism = %s", urlp->uauth_mechanism),
673
urlp->uauth_mechanism == urlt->uauth_mechanism);
675
test_out(t_strdup_printf(
676
"url->uauth_mechanism = %s", urlp->uauth_mechanism),
677
strcmp(urlp->uauth_mechanism, urlt->uauth_mechanism) == 0);
679
if (urlp->uauth_token == NULL || urlt->uauth_token == NULL) {
680
test_out(t_strdup_printf(
681
"url->uauth_token = %s", urlp->uauth_token),
682
urlp->uauth_token == urlt->uauth_token);
684
bool equal = urlp->uauth_token_size == urlt->uauth_token_size;
686
test_out(t_strdup_printf(
687
"url->uauth_token_size = %"PRIuSIZE_T, urlp->uauth_token_size),
691
for (i = 0; i < urlp->uauth_token_size; i++) {
692
if (urlp->uauth_token[i] != urlt->uauth_token[i]) {
697
test_out(t_strdup_printf("url->uauth_token [index=%d]", (int)i),
708
struct invalid_imap_url_test {
710
enum imap_url_parse_flags flags;
711
struct imap_url url_base;
714
struct invalid_imap_url_test invalid_url_tests[] = {
716
.url = "http://www.dovecot.org"
720
.url = "imap://user@example.com/INBOX",
721
.flags = IMAP_URL_PARSE_REQUIRE_RELATIVE,
723
.host_name = "example.com",
728
.url = "/INBOX/;UID=377"
730
.url = "imap://user@example.com/INBOX/;UID=377/;SECTION=TEXT?ALL"
732
.url = "imap://user@example.com/INBOX/?"
734
.url = "imap://user@example.com/INBOX/#Fragment"
736
.url = "imap://user@example.com/INBOX/\""
738
.url = "imap:///INBOX"
740
.url = "imap://[]/INBOX"
742
.url = "imap://[v08.234:232:234:234:2221]/INBOX"
745
.url = "imap://[1::34a:34:234::6]/INBOX"
748
.url = "imap://example%a.com/INBOX"
750
.url = "imap://example.com%/INBOX"
752
.url = "imap://example%00.com/INBOX"
754
.url = "imap://example.com:65539/INBOX"
756
.url = "imap://user;ATH=frop@example.com"
758
.url = "imap://user;AUTH=frop;friep@example.com"
760
.url = "imap://user;AUTH=@example.com"
762
.url = "imap://user%@example.com"
764
.url = "imap://user%00@example.com"
766
.url = "imap://user%ar;AUTH=*@example.com"
768
.url = "imap://;AUTH=FR%etD@example.com"
770
.url = "imap://user;AUTH=%@example.com"
772
.url = "imap://user;AUTH=%00@example.com"
774
.url = "imap://example.com/INBOX/%00/"
776
.url = "imap://example.com/INBOX/%0r/"
778
.url = "imap://example.com/INBOX/Trash/%/"
780
.url = "imap://example.com/INBOX;UIDVALIDITY=23423;FROP=friep/"
782
.url = "imap://example.com/INBOX;UIDVALIDITY=0/;UID=377"
784
.url = "imap://example.com/INBOX;UIDVALIDITY=/"
786
.url = "imap://example.com/INBOX;UIDVALIDITY=33a/"
788
.url = "imap://example.com/INBOX;FROP=friep/"
790
.url = "imap://example.com/INBOX/;UID=377;FROP=friep/"
792
.url = "imap://example.com/INBOX/;UID=0/"
794
.url = "imap://example.com/INBOX/;UID=/"
796
.url = "imap://example.com/INBOX/;UID=5e6/"
798
.url = "imap://example.com/INBOX/;UID=35/;SECTION=ALL;FROP=43/"
800
.url = "imap://example.com/INBOX/;UID=35/;SECTION=/"
802
.url = "imap://example.com/INBOX/;UID=34/;PARTIAL="
804
.url = "imap://example.com/INBOX/;UID=34/;PARTIAL=0."
806
.url = "imap://example.com/INBOX/;UID=34/;PARTIAL=0.e10"
808
.url = "imap://example.com/INBOX/;UID=34/;PARTIAL=.3"
810
.url = "imap://example.com/INBOX/;UID=34/;PARTIAL=5t4.3"
812
.url = "imap://example.com/INBOX/;UID=34/;PARTIAL=0.0"
814
.url = "imap://example.com/INBOX/;UID=34/;PARTIAL=0.23409823409820938409823"
816
.url = "imap://example.com/INBOX/;UID=377/;FROP=34"
818
.url = "imap://example.com/INBOX/;UID=377;FROP=34"
820
.url = "imap://example.com/INBOX/;UID=377;EXPIRE=2010-02-02T12:00:12Z"
822
.url = "imap://example.com/INBOX/;UID=377"
823
";URLAUTH=anonymous:internal:0ad89fafd79f54afe4523f45aadf2afe"
825
.url = "imap://example.com/INBOX/;UID=377;EXPIRE=2011-15-02T00:00:00Z"
826
";URLAUTH=anonymous:internal:0ad89fafd79f54afe4523f45aadf2afe",
827
.flags = IMAP_URL_PARSE_ALLOW_URLAUTH
829
.url = "imap://example.com/INBOX/;UID=377;EXPIRE=2011-10-02T00:00:00Z",
830
.flags = IMAP_URL_PARSE_ALLOW_URLAUTH
832
.url = "/INBOX/;UID=377;EXPIRE=2011-10-02T00:00:00Z"
833
";URLAUTH=anonymous:internal:0ad89fafd79f54afe4523f45aadf2afe",
834
.flags = IMAP_URL_PARSE_ALLOW_URLAUTH
836
.url = "imap://example.com/INBOX/;UID=377;URLAUTH=",
837
.flags = IMAP_URL_PARSE_ALLOW_URLAUTH
839
.url = "imap://example.com/INBOX/;UID=377"
840
";URLAUTH=:internal:0ad89fafd79f54afe4523f45aadf2afe",
841
.flags = IMAP_URL_PARSE_ALLOW_URLAUTH
843
.url = "imap://example.com/INBOX/;UID=377"
844
";URLAUTH=user+:internal:0ad89fafd79f54afe4523f45aadf2afe",
845
.flags = IMAP_URL_PARSE_ALLOW_URLAUTH
847
.url = "imap://example.com/INBOX/;UID=377"
848
";URLAUTH=+frop:internal:0ad89fafd79f54afe4523f45aadf2afe",
849
.flags = IMAP_URL_PARSE_ALLOW_URLAUTH
851
.url = "imap://example.com/INBOX/;UID=377;URLAUTH=anonymous:",
852
.flags = IMAP_URL_PARSE_ALLOW_URLAUTH
854
.url = "imap://example.com/INBOX/;UID=377"
855
";URLAUTH=anonymous::0ad89fafd79f54afe4523f45aadf2afe",
856
.flags = IMAP_URL_PARSE_ALLOW_URLAUTH
858
.url = "imap://example.com/INBOX/;UID=377;URLAUTH=anonymous:internal:",
859
.flags = IMAP_URL_PARSE_ALLOW_URLAUTH
861
.url = "imap://example.com/INBOX/;UID=377"
862
";URLAUTH=anonymous:internal:fd79f54afe4523",
863
.flags = IMAP_URL_PARSE_ALLOW_URLAUTH
865
.url = "imap://example.com/INBOX/;UID=377;EXPIRE=2011-10-02T00:00:00Z"
866
";URLAUTH=anonymous:internal:0ad89fafd79f54afe4523q45aadf2afe",
867
.flags = IMAP_URL_PARSE_ALLOW_URLAUTH
871
unsigned int invalid_url_test_count = N_ELEMENTS(invalid_url_tests);
873
static void test_imap_url_invalid(void)
877
for (i = 0; i < invalid_url_test_count; i++) T_BEGIN {
878
const char *url = invalid_url_tests[i].url;
879
enum imap_url_parse_flags flags = invalid_url_tests[i].flags;
880
struct imap_url *urlb = &invalid_url_tests[i].url_base;
881
struct imap_url *urlp;
882
const char *error = NULL;
884
if (urlb->host_name == NULL)
887
test_begin(t_strdup_printf("imap url invalid [%d]", i));
889
if (imap_url_parse(url, urlb, flags, &urlp, &error) < 0)
891
test_out_reason(t_strdup_printf("parse %s", url), urlp == NULL, error);
898
const char *parse_create_url_tests[] = {
899
"imap://host.example.com/",
904
"imap://user@host.example.com/",
905
"imap://user@host.example.com:993/",
906
"imap://user;AUTH=PLAIN@host.example.com/",
907
"imap://user;AUTH=PLAIN@host.example.com/INBOX",
908
"imap://user;AUTH=PLAIN@host.example.com/INBOX/;UID=5",
909
"imap://user;AUTH=PLAIN@host.example.com/INBOX;UIDVALIDITY=15/;UID=5",
910
"imap://user;AUTH=PLAIN@host.example.com/INBOX;UIDVALIDITY=15/;UID=5"
912
"imap://user;AUTH=PLAIN@host.example.com/INBOX;UIDVALIDITY=15/;UID=5"
913
"/;SECTION=TEXT/;PARTIAL=1",
914
"imap://user;AUTH=PLAIN@host.example.com/INBOX;UIDVALIDITY=15/;UID=5"
915
"/;SECTION=TEXT/;PARTIAL=1.14",
916
"imap://user;AUTH=PLAIN@host.example.com/INBOX;UIDVALIDITY=15/;UID=5"
917
"/;SECTION=TEXT/;PARTIAL=1.14;URLAUTH=anonymous",
918
"imap://user;AUTH=PLAIN@host.example.com/INBOX;UIDVALIDITY=15/;UID=5"
919
"/;SECTION=TEXT/;PARTIAL=1.14;URLAUTH=user+username",
920
"imap://user;AUTH=PLAIN@host.example.com/INBOX/?SUBJECT%20%22Frop?%22",
921
"imap://host.%23example.com/",
922
"imap://user%3ba@host.example.com/",
923
"imap://user%40example.com@host.example.com/",
924
"imap://user%40example.com;AUTH=STR%23ANGE@host.example.com/",
925
"imap://user;AUTH=PLAIN@host.example.com/INBOX/Important%3bWork",
926
"imap://user@host.example.com/%23shared/news",
927
"imap://user@host.example.com/INBOX;UIDVALIDITY=15/;UID=5"
928
"/;SECTION=HEADER.FIELDS%20(DATE%20FROM)",
929
"imap://user@host.example.com/INBOX;UIDVALIDITY=15/;UID=5"
930
"/;SECTION=TEXT/;PARTIAL=1.14;URLAUTH=user+user%3bname",
933
unsigned int parse_create_url_test_count = N_ELEMENTS(parse_create_url_tests);
935
static void test_imap_url_parse_create(void)
939
for (i = 0; i < parse_create_url_test_count; i++) T_BEGIN {
940
const char *url = parse_create_url_tests[i];
941
struct imap_url *urlp;
942
const char *error = NULL;
944
test_begin(t_strdup_printf("imap url parse/create [%d]", i));
947
(url, NULL, IMAP_URL_PARSE_ALLOW_URLAUTH, &urlp, &error) < 0)
949
test_out_reason(t_strdup_printf("parse %s", url), urlp != NULL, error);
951
const char *urlnew = imap_url_create(urlp);
952
test_out(t_strdup_printf
953
("create %s", urlnew), strcmp(url, urlnew) == 0);
964
static void (*test_functions[])(void) = {
966
test_imap_url_invalid,
967
test_imap_url_parse_create,
970
return test_run(test_functions);