~ubuntu-branches/ubuntu/utopic/dovecot/utopic-proposed

« back to all changes in this revision

Viewing changes to src/lib-imap/test-imap-url.c

  • Committer: Package Import Robot
  • Author(s): James Page
  • Date: 2014-01-08 09:35:49 UTC
  • mfrom: (4.1.35 sid)
  • Revision ID: package-import@ubuntu.com-20140108093549-i72o93pux8p0dlaf
Tags: 1:2.2.9-1ubuntu1
* Merge from Debian unstable, remaining changes:
  + Add mail-stack-delivery package:
    - Update d/rules
    - d/control: convert existing dovecot-postfix package to a dummy
      package and add new mail-stack-delivery package.
    - Update maintainer scripts.
    - Rename d/dovecot-postfix.* to debian/mail-stack-delivery.*
    - d/mail-stack-delivery.preinst: Move previously installed backups and
      config files to a new package namespace.
    - d/mail-stack-delivery.prerm: Added to handle downgrades.
  + Use Snakeoil SSL certificates by default:
    - d/control: Depend on ssl-cert.
    - d/dovecot-core.postinst: Relax grep for SSL_* a bit.
  + Add autopkgtest to debian/tests/*.
  + Add ufw integration:
    - d/dovecot-core.ufw.profile: new ufw profile.
    - d/rules: install profile in dovecot-core.
    - d/control: dovecot-core - suggest ufw.
  + d/dovecot-core.dirs: Added usr/share/doc/dovecot-core
  + Add apport hook:
    - d/rules, d/source_dovecot.py
  + Add upstart job:
    - d/rules, d/dovecot-core.dovecot.upstart, d/control,
      d/dovecot-core.dirs, dovecot-imapd.{postrm, postinst, prerm},
      d/dovecot-pop3d.{postinst, postrm, prerm}.
      d/mail-stack-deliver.postinst: Convert init script to upstart.
  + Use the autotools-dev dh addon to update config.guess/config.sub for
    arm64.
* Dropped changes, included in Debian:
  - Update Dovecot name to reflect distribution in login greeting.
  - Update Drac plugin for >= 2.0.0 support.
* d/control: Drop dovecot-postfix package as its no longer required.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Copyright (c) 2013 Dovecot authors, see the included COPYING file */
 
2
 
 
3
#include "lib.h"
 
4
#include "net.h"
 
5
#include "imap-url.h"
 
6
#include "test-common.h"
 
7
 
 
8
struct valid_imap_url_test {
 
9
        const char *url;
 
10
        enum imap_url_parse_flags flags;
 
11
        struct imap_url url_base;
 
12
 
 
13
        struct imap_url url_parsed;
 
14
};
 
15
 
 
16
/* Valid IMAP URL tests */
 
17
struct valid_imap_url_test valid_url_tests[] = {
 
18
        {
 
19
                .url = "imap://localhost",
 
20
                .url_parsed = {
 
21
                        .host_name = "localhost" }
 
22
        },{
 
23
                .url = "imap://user@localhost",
 
24
                .url_parsed = {
 
25
                        .host_name = "localhost",
 
26
                        .userid = "user" }
 
27
        },{
 
28
                .url = "imap://user;AUTH=PLAIN@localhost",
 
29
                .url_parsed = {
 
30
                        .host_name = "localhost",
 
31
                        .userid = "user",
 
32
                        .auth_type = "PLAIN" }
 
33
        },{
 
34
                .url = "imap://;AUTH=PLAIN@localhost",
 
35
                .url_parsed = {
 
36
                        .host_name = "localhost",
 
37
                        .auth_type = "PLAIN" }
 
38
        },{
 
39
                .url = "imap://%68endri%6B;AUTH=GSS%41PI@%65%78%61%6d%70%6c%65.com",
 
40
                .url_parsed = {
 
41
                        .host_name = "example.com",
 
42
                        .userid = "hendrik",
 
43
                        .auth_type = "GSSAPI" }
 
44
        },{
 
45
                .url = "imap://user@localhost:993",
 
46
                .url_parsed = {
 
47
                        .host_name = "localhost",
 
48
                        .userid = "user",
 
49
                        .port = 993, .have_port = TRUE }
 
50
        },{
 
51
                .url = "imap://user@127.0.0.1",
 
52
                .url_parsed = {
 
53
                        .host_name = "127.0.0.1",
 
54
                        .userid = "user",
 
55
                        .have_host_ip = TRUE }
 
56
#ifdef HAVE_IPV6
 
57
        },{
 
58
                .url = "imap://user@[::1]",
 
59
                .url_parsed = {
 
60
                        .host_name = "[::1]",
 
61
                        .userid = "user",
 
62
                        .have_host_ip = TRUE }
 
63
#endif
 
64
        },{
 
65
                .url = "imap://user@4example.com:423",
 
66
                .url_parsed = {
 
67
                        .host_name = "4example.com",
 
68
                        .userid = "user",
 
69
                        .port = 423, .have_port = TRUE }
 
70
        },{
 
71
                .url = "imap://beelzebub@666.4example.com:999",
 
72
                .url_parsed = {
 
73
                        .host_name = "666.4example.com",
 
74
                        .userid = "beelzebub",
 
75
                        .port = 999, .have_port = TRUE }
 
76
        },{
 
77
                .url = "imap://user@example.com/",
 
78
                .url_parsed = {
 
79
                        .host_name = "example.com",
 
80
                        .userid = "user",
 
81
                        .mailbox = NULL }
 
82
        },{
 
83
                .url = "imap://user@example.com/./",
 
84
                .url_parsed = {
 
85
                        .host_name = "example.com",
 
86
                        .userid = "user",
 
87
                        .mailbox = NULL }
 
88
        },{
 
89
                .url = "imap://user@example.com/INBOX",
 
90
                .url_parsed = {
 
91
                        .host_name = "example.com",
 
92
                        .userid = "user",
 
93
                        .mailbox = "INBOX" }
 
94
        },{
 
95
                .url = "imap://user@example.com/INBOX/",
 
96
                .url_parsed = {
 
97
                        .host_name = "example.com",
 
98
                        .userid = "user",
 
99
                        .mailbox = "INBOX/" }
 
100
        },{
 
101
                .url = "imap://user@example.com//",
 
102
                .url_parsed = {
 
103
                        .host_name = "example.com",
 
104
                        .userid = "user",
 
105
                        .mailbox = "/" }
 
106
        },{
 
107
                .url = "imap://user@example.com/INBOX/Trash",
 
108
                .url_parsed = {
 
109
                        .host_name = "example.com",
 
110
                        .userid = "user",
 
111
                        .mailbox = "INBOX/Trash" }
 
112
        },{
 
113
                .url = "imap://user@example.com/INBOX/Trash/..",
 
114
                .url_parsed = {
 
115
                        .host_name = "example.com",
 
116
                        .userid = "user",
 
117
                        .mailbox = "INBOX/" }
 
118
        },{
 
119
                .url = "imap://user@example.com/INBOX/Trash/../",
 
120
                .url_parsed = {
 
121
                        .host_name = "example.com",
 
122
                        .userid = "user",
 
123
                        .mailbox = "INBOX/" }
 
124
        },{
 
125
                .url = "imap://user@example.com/INBOX/Trash/../..",
 
126
                .url_parsed = {
 
127
                        .host_name = "example.com",
 
128
                        .userid = "user",
 
129
                        .mailbox = NULL }
 
130
        },{
 
131
                .url = "imap://user@example.com/INBOX.Trash",
 
132
                .url_parsed = {
 
133
                        .host_name = "example.com",
 
134
                        .userid = "user",
 
135
                        .mailbox = "INBOX.Trash" }
 
136
        },{
 
137
                .url = "imap://user@example.com/INBOX%3BTrash",
 
138
                .url_parsed = {
 
139
                        .host_name = "example.com",
 
140
                        .userid = "user",
 
141
                        .mailbox = "INBOX;Trash" }
 
142
        },{
 
143
                .url = "imap://user@example.com/INBOX;UIDVALIDITY=1341",
 
144
                .url_parsed = {
 
145
                        .host_name = "example.com",
 
146
                        .userid = "user",
 
147
                        .mailbox = "INBOX", .uidvalidity = 1341 }
 
148
        },{
 
149
                .url = "imap://user@example.com/INBOX/;UIDVALIDITY=23423",
 
150
                .url_parsed = {
 
151
                        .host_name = "example.com",
 
152
                        .userid = "user",
 
153
                        .mailbox = "INBOX/", .uidvalidity = 23423 }
 
154
        },{
 
155
                .url = "imap://user@example.com/INBOX/Drafts;UIDVALIDITY=6567",
 
156
                .url_parsed = {
 
157
                        .host_name = "example.com",
 
158
                        .userid = "user",
 
159
                        .mailbox = "INBOX/Drafts", .uidvalidity = 6567 }
 
160
        },{
 
161
                .url = "imap://user@example.com/INBOX/Drafts;UIDVALIDITY=788/;UID=16",
 
162
                .url_parsed = {
 
163
                        .host_name = "example.com",
 
164
                        .userid = "user",
 
165
                        .mailbox = "INBOX/Drafts", .uidvalidity = 788,
 
166
                        .uid = 16 }
 
167
        },{
 
168
                .url = "imap://user@example.com/INBOX/Drafts;UIDVALIDITY=788/;UID=16/..",
 
169
                .url_parsed = {
 
170
                        .host_name = "example.com",
 
171
                        .userid = "user",
 
172
                        .mailbox = "INBOX/Drafts", .uidvalidity = 788,
 
173
                        .uid = 0 }
 
174
        },{
 
175
                .url = "imap://user@example.com/INBOX/Drafts;UIDVALIDITY=788/;UID=16/../..",
 
176
                .url_parsed = {
 
177
                        .host_name = "example.com",
 
178
                        .userid = "user",
 
179
                        .mailbox = "INBOX/", .uidvalidity = 0,
 
180
                        .uid = 0 }
 
181
        },{
 
182
                .url = "imap://user@example.com/INBOX/Junk;UIDVALIDITY=27667/"
 
183
                        ";UID=434/;SECTION=HEADER",
 
184
                .url_parsed = {
 
185
                        .host_name = "example.com",
 
186
                        .userid = "user",
 
187
                        .mailbox = "INBOX/Junk", .uidvalidity = 27667,
 
188
                        .uid = 434, .section = "HEADER" }
 
189
        },{
 
190
                .url = "imap://user@example.com/INBOX/Important/"
 
191
                        ";UID=437/;SECTION=1.2.MIME",
 
192
                .url_parsed = {
 
193
                        .host_name = "example.com",
 
194
                        .userid = "user",
 
195
                        .mailbox = "INBOX/Important",
 
196
                        .uid = 437, .section = "1.2.MIME" }
 
197
        },{
 
198
                .url = "imap://user@example.com/INBOX/Important/;UID=56/;SECTION=AA/BB",
 
199
                .url_parsed = {
 
200
                        .host_name = "example.com",
 
201
                        .userid = "user",
 
202
                        .mailbox = "INBOX/Important",
 
203
                        .uid = 56, .section = "AA/BB" }
 
204
        },{
 
205
                .url = "imap://user@example.com/INBOX/Important/;UID=56/;SECTION=AA/BB/..",
 
206
                .url_parsed = {
 
207
                        .host_name = "example.com",
 
208
                        .userid = "user",
 
209
                        .mailbox = "INBOX/Important",
 
210
                        .uid = 56, .section = "AA/" }
 
211
        },{
 
212
                .url = "imap://user@example.com/INBOX/Important/;UID=56/"
 
213
                        ";SECTION=AA/BB/../..",
 
214
                .url_parsed = {
 
215
                        .host_name = "example.com",
 
216
                        .userid = "user",
 
217
                        .mailbox = "INBOX/Important",
 
218
                        .uid = 56, .section = NULL }
 
219
        },{
 
220
                .url = "imap://user@example.com/INBOX/Important/;UID=234/"
 
221
                        ";SECTION=HEADER.FIELDS%20(%22To%22%20%22From%22)",
 
222
                .url_parsed = {
 
223
                        .host_name = "example.com",
 
224
                        .userid = "user",
 
225
                        .mailbox = "INBOX/Important",
 
226
                        .uid = 234, .section = "HEADER.FIELDS (\"To\" \"From\")" }
 
227
        },{
 
228
                .url = "imap://user@example.com/INBOX/Important/;UID=234/"
 
229
                        ";PARTIAL=10.250",
 
230
                .url_parsed = {
 
231
                        .host_name = "example.com",
 
232
                        .userid = "user",
 
233
                        .mailbox = "INBOX/Important",
 
234
                        .uid = 234, .section = NULL, .partial_offset = 10, .partial_size = 250 }
 
235
        },{
 
236
                .url = "imap://hendrik@example.com/INBOX/Important/;UID=34534/"
 
237
                        ";SECTION=1.3.TEXT/;PARTIAL=0.34254",
 
238
                .url_parsed = {
 
239
                        .host_name = "example.com",
 
240
                        .userid = "hendrik",
 
241
                        .mailbox = "INBOX/Important",
 
242
                        .uid = 34534, .section = "1.3.TEXT",
 
243
                        .partial_offset = 0, .partial_size = 34254 }
 
244
        },{
 
245
                .url = "imap://hendrik@example.com/INBOX/Sent"
 
246
                        ";UIDVALIDITY=534?SUBJECT%20%22Frop?%22",
 
247
                .url_parsed = {
 
248
                        .host_name = "example.com",
 
249
                        .userid = "hendrik",
 
250
                        .mailbox = "INBOX/Sent", .uidvalidity = 534,
 
251
                        .search_program = "SUBJECT \"Frop?\"" }
 
252
        },{
 
253
                .url = "//hendrik@example.org/INBOX/Trash",
 
254
                .url_base = {
 
255
                        .host_name = "example.com",
 
256
                        .userid = "user" },
 
257
                .url_parsed = {
 
258
                        .host_name = "example.org",
 
259
                        .userid = "hendrik",
 
260
                        .mailbox = "INBOX/Trash" }
 
261
        },{
 
262
                .url = "/INBOX/Trash",
 
263
                .url_base = {
 
264
                        .host_name = "example.com",
 
265
                        .userid = "user" },
 
266
                .url_parsed = {
 
267
                        .host_name = "example.com",
 
268
                        .userid = "user",
 
269
                        .mailbox = "INBOX/Trash" }
 
270
        },{
 
271
                .url = "user@example.com",
 
272
                .url_base = {
 
273
                        .host_name = "example.com",
 
274
                        .userid = "user",
 
275
                        .mailbox = "INBOX/Accounts" },
 
276
                .url_parsed = {
 
277
                        .host_name = "example.com",
 
278
                        .userid = "user",
 
279
                        .mailbox = "INBOX/Accounts/user@example.com" }
 
280
        },{
 
281
                .url = "Drafts",
 
282
                .url_base = {
 
283
                        .host_name = "example.com",
 
284
                        .userid = "user",
 
285
                        .mailbox = "INBOX/" },
 
286
                .url_parsed = {
 
287
                        .host_name = "example.com",
 
288
                        .userid = "user",
 
289
                        .mailbox = "INBOX/Drafts" }
 
290
        },{
 
291
                .url = "../Drafts",
 
292
                .url_base = {
 
293
                        .host_name = "example.com",
 
294
                        .userid = "user",
 
295
                        .mailbox = "INBOX/Trash" },
 
296
                .url_parsed = {
 
297
                        .host_name = "example.com",
 
298
                        .userid = "user",
 
299
                        .mailbox = "INBOX/Drafts" }
 
300
        },{
 
301
                .url = "../Junk",
 
302
                .url_base = {
 
303
                        .host_name = "example.com",
 
304
                        .userid = "user",
 
305
                        .mailbox = "INBOX/Trash",
 
306
                        .uidvalidity = 23452 },
 
307
                .url_parsed = {
 
308
                        .host_name = "example.com",
 
309
                        .userid = "user",
 
310
                        .mailbox = "INBOX/Junk",
 
311
                        .uidvalidity = 0 }
 
312
        },{
 
313
                .url = "../Junk;UIDVALIDITY=23",
 
314
                .url_base = {
 
315
                        .host_name = "example.com",
 
316
                        .userid = "user",
 
317
                        .mailbox = "INBOX/Trash",
 
318
                        .uidvalidity = 23452 },
 
319
                .url_parsed = {
 
320
                        .host_name = "example.com",
 
321
                        .userid = "user",
 
322
                        .mailbox = "INBOX/Junk",
 
323
                        .uidvalidity = 23 }
 
324
        },{
 
325
                .url = "../../%23shared;UIDVALIDITY=23452",
 
326
                .url_base = {
 
327
                        .host_name = "example.com",
 
328
                        .userid = "user",
 
329
                        .mailbox = "INBOX/Trash",
 
330
                        .uidvalidity = 764 },
 
331
                .url_parsed = {
 
332
                        .host_name = "example.com",
 
333
                        .userid = "user",
 
334
                        .mailbox = "#shared",
 
335
                        .uidvalidity = 23452 }
 
336
        },{
 
337
                .url = "../../%23news;UIDVALIDITY=546/;UID=456",
 
338
                .url_base = {
 
339
                        .host_name = "example.com",
 
340
                        .userid = "user",
 
341
                        .mailbox = "INBOX/Trash",
 
342
                        .uidvalidity = 23452,
 
343
                        .uid = 65 },
 
344
                .url_parsed = {
 
345
                        .host_name = "example.com",
 
346
                        .userid = "user",
 
347
                        .mailbox = "#news",
 
348
                        .uidvalidity = 546,
 
349
                        .uid = 456 }
 
350
        },{
 
351
                .url = ";UID=4767",
 
352
                .url_base = {
 
353
                        .host_name = "example.com",
 
354
                        .userid = "user",
 
355
                        .mailbox = "INBOX/Trash",
 
356
                        .uidvalidity = 23452,
 
357
                        .uid = 65 },
 
358
                .url_parsed = {
 
359
                        .host_name = "example.com",
 
360
                        .userid = "user",
 
361
                        .mailbox = "INBOX/Trash",
 
362
                        .uidvalidity = 23452,
 
363
                        .uid = 4767 }
 
364
        },{
 
365
                .url = ";UID=4767",
 
366
                .url_base = {
 
367
                        .host_name = "example.com",
 
368
                        .userid = "user",
 
369
                        .mailbox = "INBOX/Trash",
 
370
                        .uidvalidity = 23452},
 
371
                .url_parsed = {
 
372
                        .host_name = "example.com",
 
373
                        .userid = "user",
 
374
                        .mailbox = "INBOX/Trash",
 
375
                        .uidvalidity = 23452,
 
376
                        .uid = 4767 }
 
377
        },{
 
378
                .url = "../;UID=4767",
 
379
                .url_base = {
 
380
                        .host_name = "example.com",
 
381
                        .userid = "user",
 
382
                        .mailbox = "INBOX/Trash",
 
383
                        .uidvalidity = 23452,
 
384
                        .uid = 65 },
 
385
                .url_parsed = {
 
386
                        .host_name = "example.com",
 
387
                        .userid = "user",
 
388
                        .mailbox = "INBOX",
 
389
                        .uidvalidity = 0,
 
390
                        .uid = 4767 }
 
391
        },{
 
392
                .url = "../;UID=4767/;SECTION=TEXT",
 
393
                .url_base = {
 
394
                        .host_name = "example.com",
 
395
                        .userid = "user",
 
396
                        .mailbox = "INBOX/Trash",
 
397
                        .uidvalidity = 23452,
 
398
                        .uid = 65,
 
399
                        .section = "1.2.3.MIME" },
 
400
                .url_parsed = {
 
401
                        .host_name = "example.com",
 
402
                        .userid = "user",
 
403
                        .mailbox = "INBOX/Trash",
 
404
                        .uidvalidity = 23452,
 
405
                        .uid = 4767,
 
406
                        .section = "TEXT" }
 
407
        },{
 
408
                .url = ";SECTION=TEXT",
 
409
                .url_base = {
 
410
                        .host_name = "example.com",
 
411
                        .userid = "user",
 
412
                        .mailbox = "INBOX/Drafts",
 
413
                        .uidvalidity = 769,
 
414
                        .uid = 43,
 
415
                        .section = "1.2.3.MIME" },
 
416
                .url_parsed = {
 
417
                        .host_name = "example.com",
 
418
                        .userid = "user",
 
419
                        .mailbox = "INBOX/Drafts",
 
420
                        .uidvalidity = 769,
 
421
                        .uid = 43,
 
422
                        .section = "TEXT" }
 
423
        },{
 
424
                .url = "..",
 
425
                .url_base = {
 
426
                        .host_name = "example.com",
 
427
                        .userid = "user",
 
428
                        .mailbox = "INBOX/Drafts",
 
429
                        .uidvalidity = 769,
 
430
                        .uid = 43,
 
431
                        .section = "AA/BB" },
 
432
                .url_parsed = {
 
433
                        .host_name = "example.com",
 
434
                        .userid = "user",
 
435
                        .mailbox = "INBOX/Drafts",
 
436
                        .uidvalidity = 769,
 
437
                        .uid = 43 }
 
438
        },{
 
439
                .url = "../;SECTION=CC",
 
440
                .url_base = {
 
441
                        .host_name = "example.com",
 
442
                        .userid = "user",
 
443
                        .mailbox = "INBOX/Drafts",
 
444
                        .uidvalidity = 769,
 
445
                        .uid = 43,
 
446
                        .section = "AA/BB" },
 
447
                .url_parsed = {
 
448
                        .host_name = "example.com",
 
449
                        .userid = "user",
 
450
                        .mailbox = "INBOX/Drafts",
 
451
                        .uidvalidity = 769,
 
452
                        .uid = 43,
 
453
                        .section = "CC" }
 
454
        },{
 
455
                .url = "CC",
 
456
                .url_base = {
 
457
                        .host_name = "example.com",
 
458
                        .userid = "user",
 
459
                        .mailbox = "INBOX/Drafts",
 
460
                        .uidvalidity = 769,
 
461
                        .uid = 43,
 
462
                        .section = "AA/BB" },
 
463
                .url_parsed = {
 
464
                        .host_name = "example.com",
 
465
                        .userid = "user",
 
466
                        .mailbox = "INBOX/Drafts",
 
467
                        .uidvalidity = 769,
 
468
                        .uid = 43,
 
469
                        .section = "AA/CC" }
 
470
        },{
 
471
                .url = ";PARTIAL=1024.1024",
 
472
                .url_base = {
 
473
                        .host_name = "example.com",
 
474
                        .userid = "user",
 
475
                        .mailbox = "INBOX/Drafts",
 
476
                        .uidvalidity = 769,
 
477
                        .uid = 43,
 
478
                        .have_partial = TRUE, .partial_offset = 0, .partial_size = 1024 },
 
479
                .url_parsed = {
 
480
                        .host_name = "example.com",
 
481
                        .userid = "user",
 
482
                        .mailbox = "INBOX/Drafts",
 
483
                        .uidvalidity = 769,
 
484
                        .uid = 43,
 
485
                        .have_partial = TRUE, .partial_offset = 1024, .partial_size = 1024 }
 
486
        },{
 
487
                .url = "../CC/;PARTIAL=0.512",
 
488
                .url_base = {
 
489
                        .host_name = "example.com",
 
490
                        .userid = "user",
 
491
                        .mailbox = "INBOX/Drafts",
 
492
                        .uidvalidity = 769,
 
493
                        .uid = 43,
 
494
                        .section = "AA/BB",
 
495
                        .have_partial = TRUE, .partial_offset = 1024, .partial_size = 1024 },
 
496
                .url_parsed = {
 
497
                        .host_name = "example.com",
 
498
                        .userid = "user",
 
499
                        .mailbox = "INBOX/Drafts",
 
500
                        .uidvalidity = 769,
 
501
                        .uid = 43,
 
502
                        .section = "AA/CC",
 
503
                        .have_partial = TRUE, .partial_offset = 0, .partial_size = 512 }
 
504
        },{
 
505
                .url = "imap://user@example.com/INBOX/;UID=377;URLAUTH=anonymous",
 
506
                .flags = IMAP_URL_PARSE_ALLOW_URLAUTH,
 
507
                .url_parsed = {
 
508
                        .host_name = "example.com",
 
509
                        .userid = "user",
 
510
                        .mailbox = "INBOX",
 
511
                        .uid = 377,
 
512
                        .uauth_rumpurl = "imap://user@example.com/INBOX/;UID=377"
 
513
                                ";URLAUTH=anonymous",
 
514
                        .uauth_access_application = "anonymous"}
 
515
        },{
 
516
                .url = "imap://user@example.com/INBOX/;UID=377"
 
517
                        ";URLAUTH=anonymous:internal:4142434445464748494A4B4C4D4E4F5051525354",
 
518
                .flags = IMAP_URL_PARSE_ALLOW_URLAUTH,
 
519
                .url_parsed = {
 
520
                        .host_name = "example.com",
 
521
                        .userid = "user",
 
522
                        .mailbox = "INBOX",
 
523
                        .uid = 377,
 
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}
 
530
        },{
 
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,
 
535
                .url_parsed = {
 
536
                        .host_name = "example.com",
 
537
                        .userid = "user",
 
538
                        .mailbox = "INBOX",
 
539
                        .uid = 377,
 
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}
 
547
        }
 
548
};
 
549
 
 
550
unsigned int valid_url_test_count = N_ELEMENTS(valid_url_tests);
 
551
 
 
552
static void test_imap_url_valid(void)
 
553
{
 
554
        unsigned int i;
 
555
 
 
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;
 
563
 
 
564
                test_begin(t_strdup_printf("imap url valid [%d]", i));
 
565
 
 
566
                if (urlb->host_name == NULL) urlb = NULL;
 
567
                if (imap_url_parse(url, urlb, flags, &urlp, &error) < 0)
 
568
                        urlp = NULL;
 
569
 
 
570
                test_out_reason(t_strdup_printf("imap_url_parse(%s)",
 
571
                        valid_url_tests[i].url), urlp != NULL, error);
 
572
                if (urlp != NULL) {
 
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);
 
576
                        } else {
 
577
                                test_out(t_strdup_printf("url->host_name = %s", urlp->host_name),
 
578
                                        strcmp(urlp->host_name, urlt->host_name) == 0);
 
579
                        }
 
580
                        if (urlp->userid == NULL || urlt->userid == NULL) {
 
581
                                test_out(t_strdup_printf("url->userid = %s", urlp->userid),
 
582
                                        urlp->userid == urlt->userid);
 
583
                        } else {
 
584
                                test_out(t_strdup_printf("url->userid = %s", urlp->userid),
 
585
                                        strcmp(urlp->userid, urlt->userid) == 0);
 
586
                        }
 
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);
 
590
                        } else {
 
591
                                test_out(t_strdup_printf("url->auth_type = %s", urlp->auth_type),
 
592
                                        strcmp(urlp->auth_type, urlt->auth_type) == 0);
 
593
                        }
 
594
                        if (urlp->have_port) {
 
595
                                test_out("url->port = (unspecified)",
 
596
                                        urlp->have_port == urlt->have_port);
 
597
                        } else {
 
598
                                test_out(t_strdup_printf("url->port = %u", urlp->port),
 
599
                                        urlp->have_port == urlt->have_port && urlp->port == urlt->port);
 
600
                        }
 
601
                        if (!urlp->have_host_ip) {
 
602
                                test_out("url->host_ip = (unspecified)",
 
603
                                        urlp->have_host_ip == urlt->have_host_ip);
 
604
                        } else {
 
605
                                test_out("url->host_ip = (valid)",
 
606
                                        urlp->have_host_ip == urlt->have_host_ip);
 
607
                        }
 
608
                        if (urlp->mailbox == NULL || urlt->mailbox == NULL) {
 
609
                                test_out(t_strdup_printf("url->mailbox = %s", urlp->mailbox),
 
610
                                        urlp->mailbox == urlt->mailbox);
 
611
                        } else {
 
612
                                test_out(t_strdup_printf("url->mailbox = %s", urlp->mailbox),
 
613
                                        strcmp(urlp->mailbox, urlt->mailbox) == 0);
 
614
                        }
 
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);
 
622
                        } else {
 
623
                                test_out(t_strdup_printf("url->section = %s", urlp->section),
 
624
                                        strcmp(urlp->section, urlt->section) == 0);
 
625
                        }
 
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);
 
634
                        } else {
 
635
                                test_out(t_strdup_printf(
 
636
                                                "url->search_program = %s", urlp->search_program),
 
637
                                        strcmp(urlp->search_program, urlt->search_program) == 0);
 
638
                        }
 
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);                                
 
643
                                } else {
 
644
                                        test_out(t_strdup_printf(
 
645
                                                        "url->uauth_rumpurl = %s", urlp->uauth_rumpurl),
 
646
                                                strcmp(urlp->uauth_rumpurl, urlt->uauth_rumpurl) == 0);                         
 
647
                                }
 
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);                              
 
653
                                } else {
 
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);                          
 
658
                                }
 
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);                            
 
664
                                } else {
 
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);                         
 
669
                                }
 
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);                                
 
674
                                } else {
 
675
                                        test_out(t_strdup_printf(
 
676
                                                        "url->uauth_mechanism = %s", urlp->uauth_mechanism),
 
677
                                                strcmp(urlp->uauth_mechanism, urlt->uauth_mechanism) == 0);                             
 
678
                                }
 
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);                                
 
683
                                } else {
 
684
                                        bool equal = urlp->uauth_token_size == urlt->uauth_token_size;
 
685
                                        size_t i;
 
686
                                        test_out(t_strdup_printf(
 
687
                                                        "url->uauth_token_size = %"PRIuSIZE_T, urlp->uauth_token_size),
 
688
                                                equal);
 
689
 
 
690
                                        if (equal) {
 
691
                                                for (i = 0; i < urlp->uauth_token_size; i++) {
 
692
                                                        if (urlp->uauth_token[i] != urlt->uauth_token[i]) {
 
693
                                                                equal = FALSE;
 
694
                                                                break;
 
695
                                                        }
 
696
                                                }
 
697
                                                test_out(t_strdup_printf("url->uauth_token [index=%d]", (int)i),
 
698
                                                        equal);
 
699
                                        }
 
700
                                }
 
701
                        }
 
702
                }
 
703
 
 
704
                test_end();
 
705
        } T_END;
 
706
}
 
707
 
 
708
struct invalid_imap_url_test {
 
709
        const char *url;
 
710
        enum imap_url_parse_flags flags;
 
711
        struct imap_url url_base;
 
712
};
 
713
 
 
714
struct invalid_imap_url_test invalid_url_tests[] = {
 
715
        {
 
716
                .url = "http://www.dovecot.org"
 
717
        },{
 
718
                .url = "imap:/INBOX"
 
719
        },{
 
720
                .url = "imap://user@example.com/INBOX",
 
721
                .flags = IMAP_URL_PARSE_REQUIRE_RELATIVE,
 
722
                .url_base = {
 
723
                        .host_name = "example.com",
 
724
                        .userid = "user" }
 
725
        },{
 
726
                .url = ""
 
727
        },{
 
728
                .url = "/INBOX/;UID=377"
 
729
        },{
 
730
                .url = "imap://user@example.com/INBOX/;UID=377/;SECTION=TEXT?ALL"
 
731
        },{
 
732
                .url = "imap://user@example.com/INBOX/?"
 
733
        },{
 
734
                .url = "imap://user@example.com/INBOX/#Fragment"
 
735
        },{
 
736
                .url = "imap://user@example.com/INBOX/\""
 
737
        },{
 
738
                .url = "imap:///INBOX"
 
739
        },{
 
740
                .url = "imap://[]/INBOX"
 
741
        },{
 
742
                .url = "imap://[v08.234:232:234:234:2221]/INBOX"
 
743
#ifdef HAVE_IPV6
 
744
        },{
 
745
                .url = "imap://[1::34a:34:234::6]/INBOX"
 
746
#endif
 
747
        },{
 
748
                .url = "imap://example%a.com/INBOX"
 
749
        },{
 
750
                .url = "imap://example.com%/INBOX"
 
751
        },{
 
752
                .url = "imap://example%00.com/INBOX"
 
753
        },{
 
754
                .url = "imap://example.com:65539/INBOX"
 
755
        },{
 
756
                .url = "imap://user;ATH=frop@example.com"
 
757
        },{
 
758
                .url = "imap://user;AUTH=frop;friep@example.com"
 
759
        },{
 
760
                .url = "imap://user;AUTH=@example.com"
 
761
        },{
 
762
                .url = "imap://user:password@example.com"
 
763
        },{
 
764
                .url = "imap://user;AUTH=A:B@example.com"
 
765
        },{
 
766
                .url = "imap://user%@example.com"
 
767
        },{
 
768
                .url = "imap://user%00@example.com"
 
769
        },{
 
770
                .url = "imap://user%ar;AUTH=*@example.com"
 
771
        },{
 
772
                .url = "imap://;AUTH=FR%etD@example.com"
 
773
        },{
 
774
                .url = "imap://user;AUTH=%@example.com"
 
775
        },{
 
776
                .url = "imap://user;AUTH=%00@example.com"
 
777
        },{
 
778
                .url = "imap://example.com/INBOX/%00/"
 
779
        },{
 
780
                .url = "imap://example.com/INBOX/%0r/"
 
781
        },{
 
782
                .url = "imap://example.com/INBOX/Trash/%/"
 
783
        },{
 
784
                .url = "imap://example.com/INBOX;UIDVALIDITY=23423;FROP=friep/"
 
785
        },{
 
786
                .url = "imap://example.com/INBOX;UIDVALIDITY=0/;UID=377"
 
787
        },{
 
788
                .url = "imap://example.com/INBOX;UIDVALIDITY=/"
 
789
        },{
 
790
                .url = "imap://example.com/INBOX;UIDVALIDITY=33a/"
 
791
        },{
 
792
                .url = "imap://example.com/INBOX;FROP=friep/"
 
793
        },{
 
794
                .url = "imap://example.com/INBOX/;UID=377;FROP=friep/"
 
795
        },{
 
796
                .url = "imap://example.com/INBOX/;UID=0/"
 
797
        },{
 
798
                .url = "imap://example.com/INBOX/;UID=/"
 
799
        },{
 
800
                .url = "imap://example.com/INBOX/;UID=5e6/"
 
801
        },{
 
802
                .url = "imap://example.com/INBOX/;UID=35/;SECTION=ALL;FROP=43/"
 
803
        },{
 
804
                .url = "imap://example.com/INBOX/;UID=35/;SECTION=/"
 
805
        },{
 
806
                .url = "imap://example.com/INBOX/;UID=34/;PARTIAL="
 
807
        },{
 
808
                .url = "imap://example.com/INBOX/;UID=34/;PARTIAL=0."
 
809
        },{
 
810
                .url = "imap://example.com/INBOX/;UID=34/;PARTIAL=0.e10"
 
811
        },{
 
812
                .url = "imap://example.com/INBOX/;UID=34/;PARTIAL=.3"
 
813
        },{
 
814
                .url = "imap://example.com/INBOX/;UID=34/;PARTIAL=5t4.3"
 
815
        },{
 
816
                .url = "imap://example.com/INBOX/;UID=34/;PARTIAL=0.0"
 
817
        },{
 
818
                .url = "imap://example.com/INBOX/;UID=34/;PARTIAL=0.23409823409820938409823"
 
819
        },{
 
820
                .url = "imap://example.com/INBOX/;UID=377/;FROP=34"
 
821
        },{
 
822
                .url = "imap://example.com/INBOX/;UID=377;FROP=34"
 
823
        },{
 
824
                .url = "imap://example.com/INBOX/;UID=377;EXPIRE=2010-02-02T12:00:12Z"
 
825
        },{
 
826
                .url = "imap://example.com/INBOX/;UID=377"
 
827
                        ";URLAUTH=anonymous:internal:0ad89fafd79f54afe4523f45aadf2afe"
 
828
        },{
 
829
                .url = "imap://example.com/INBOX/;UID=377;EXPIRE=2011-15-02T00:00:00Z"
 
830
                        ";URLAUTH=anonymous:internal:0ad89fafd79f54afe4523f45aadf2afe",
 
831
                .flags = IMAP_URL_PARSE_ALLOW_URLAUTH
 
832
        },{
 
833
                .url = "imap://example.com/INBOX/;UID=377;EXPIRE=2011-10-02T00:00:00Z",
 
834
                .flags = IMAP_URL_PARSE_ALLOW_URLAUTH
 
835
        },{
 
836
                .url = "/INBOX/;UID=377;EXPIRE=2011-10-02T00:00:00Z"
 
837
                        ";URLAUTH=anonymous:internal:0ad89fafd79f54afe4523f45aadf2afe",
 
838
                .flags = IMAP_URL_PARSE_ALLOW_URLAUTH
 
839
        },{
 
840
                .url = "imap://example.com/INBOX/;UID=377;URLAUTH=",
 
841
                .flags = IMAP_URL_PARSE_ALLOW_URLAUTH
 
842
        },{
 
843
                .url = "imap://example.com/INBOX/;UID=377"
 
844
                        ";URLAUTH=:internal:0ad89fafd79f54afe4523f45aadf2afe",
 
845
                .flags = IMAP_URL_PARSE_ALLOW_URLAUTH
 
846
        },{
 
847
                .url = "imap://example.com/INBOX/;UID=377"
 
848
                        ";URLAUTH=user+:internal:0ad89fafd79f54afe4523f45aadf2afe",
 
849
                .flags = IMAP_URL_PARSE_ALLOW_URLAUTH
 
850
        },{
 
851
                .url = "imap://example.com/INBOX/;UID=377"
 
852
                        ";URLAUTH=+frop:internal:0ad89fafd79f54afe4523f45aadf2afe",
 
853
                .flags = IMAP_URL_PARSE_ALLOW_URLAUTH
 
854
        },{
 
855
                .url = "imap://example.com/INBOX/;UID=377;URLAUTH=anonymous:",
 
856
                .flags = IMAP_URL_PARSE_ALLOW_URLAUTH
 
857
        },{
 
858
                .url = "imap://example.com/INBOX/;UID=377"
 
859
                        ";URLAUTH=anonymous::0ad89fafd79f54afe4523f45aadf2afe",
 
860
                .flags = IMAP_URL_PARSE_ALLOW_URLAUTH
 
861
        },{
 
862
                .url = "imap://example.com/INBOX/;UID=377;URLAUTH=anonymous:internal:",
 
863
                .flags = IMAP_URL_PARSE_ALLOW_URLAUTH
 
864
        },{
 
865
                .url = "imap://example.com/INBOX/;UID=377"
 
866
                        ";URLAUTH=anonymous:internal:fd79f54afe4523",
 
867
                .flags = IMAP_URL_PARSE_ALLOW_URLAUTH
 
868
        },{
 
869
                .url = "imap://example.com/INBOX/;UID=377;EXPIRE=2011-10-02T00:00:00Z"
 
870
                        ";URLAUTH=anonymous:internal:0ad89fafd79f54afe4523q45aadf2afe",
 
871
                .flags = IMAP_URL_PARSE_ALLOW_URLAUTH
 
872
        },
 
873
};
 
874
 
 
875
unsigned int invalid_url_test_count = N_ELEMENTS(invalid_url_tests);
 
876
 
 
877
static void test_imap_url_invalid(void)
 
878
{
 
879
        unsigned int i;
 
880
 
 
881
        for (i = 0; i < invalid_url_test_count; i++) T_BEGIN {
 
882
                const char *url = invalid_url_tests[i].url;
 
883
                enum imap_url_parse_flags flags = invalid_url_tests[i].flags;
 
884
                struct imap_url *urlb = &invalid_url_tests[i].url_base;
 
885
                struct imap_url *urlp;
 
886
                const char *error = NULL;
 
887
 
 
888
                if (urlb->host_name == NULL)
 
889
                        urlb = NULL;
 
890
 
 
891
                test_begin(t_strdup_printf("imap url invalid [%d]", i));
 
892
 
 
893
                if (imap_url_parse(url, urlb, flags, &urlp, &error) < 0)
 
894
                        urlp = NULL;
 
895
                test_out_reason(t_strdup_printf("parse %s", url), urlp == NULL, error);
 
896
 
 
897
                test_end();
 
898
        } T_END;
 
899
 
 
900
}
 
901
 
 
902
const char *parse_create_url_tests[] = {
 
903
        "imap://host.example.com/",
 
904
        "imap://10.0.0.1/",
 
905
#ifdef HAVE_IPV6
 
906
        "imap://[::1]/",
 
907
#endif
 
908
        "imap://user@host.example.com/",
 
909
        "imap://user@host.example.com:993/",
 
910
        "imap://su%3auser@host.example.com/",
 
911
        "imap://user;AUTH=PLAIN@host.example.com/",
 
912
        "imap://user;AUTH=PLAIN@host.example.com/INBOX",
 
913
        "imap://user;AUTH=PLAIN@host.example.com/INBOX/;UID=5",
 
914
        "imap://user;AUTH=PLAIN@host.example.com/INBOX;UIDVALIDITY=15/;UID=5",
 
915
        "imap://user;AUTH=PLAIN@host.example.com/INBOX;UIDVALIDITY=15/;UID=5"
 
916
                "/;SECTION=TEXT",
 
917
        "imap://user;AUTH=PLAIN@host.example.com/INBOX;UIDVALIDITY=15/;UID=5"
 
918
                "/;SECTION=TEXT/;PARTIAL=1",
 
919
        "imap://user;AUTH=PLAIN@host.example.com/INBOX;UIDVALIDITY=15/;UID=5"
 
920
                "/;SECTION=TEXT/;PARTIAL=1.14",
 
921
        "imap://user;AUTH=PLAIN@host.example.com/INBOX;UIDVALIDITY=15/;UID=5"
 
922
                "/;SECTION=TEXT/;PARTIAL=1.14;URLAUTH=anonymous",
 
923
        "imap://user;AUTH=PLAIN@host.example.com/INBOX;UIDVALIDITY=15/;UID=5"
 
924
                "/;SECTION=TEXT/;PARTIAL=1.14;URLAUTH=user+username",
 
925
        "imap://user;AUTH=PLAIN@host.example.com/INBOX/?SUBJECT%20%22Frop?%22",
 
926
        "imap://host.%23example.com/",
 
927
        "imap://user%3ba@host.example.com/",
 
928
        "imap://user%40example.com@host.example.com/",
 
929
        "imap://user%40example.com;AUTH=STR%23ANGE@host.example.com/",
 
930
        "imap://user;AUTH=PLAIN@host.example.com/INBOX/Important%3bWork",
 
931
        "imap://user@host.example.com/%23shared/news",
 
932
        "imap://user@host.example.com/INBOX;UIDVALIDITY=15/;UID=5"
 
933
                "/;SECTION=HEADER.FIELDS%20(DATE%20FROM)",
 
934
        "imap://user@host.example.com/INBOX;UIDVALIDITY=15/;UID=5"
 
935
                "/;SECTION=TEXT/;PARTIAL=1.14;URLAUTH=user+user%3bname",
 
936
};
 
937
 
 
938
unsigned int parse_create_url_test_count = N_ELEMENTS(parse_create_url_tests);
 
939
 
 
940
static void test_imap_url_parse_create(void)
 
941
{
 
942
        unsigned int i;
 
943
 
 
944
        for (i = 0; i < parse_create_url_test_count; i++) T_BEGIN {
 
945
                const char *url = parse_create_url_tests[i];
 
946
                struct imap_url *urlp;
 
947
                const char *error = NULL;
 
948
 
 
949
                test_begin(t_strdup_printf("imap url parse/create [%d]", i));
 
950
 
 
951
                if (imap_url_parse
 
952
                        (url, NULL, IMAP_URL_PARSE_ALLOW_URLAUTH, &urlp, &error) < 0)
 
953
                        urlp = NULL;
 
954
                test_out_reason(t_strdup_printf("parse  %s", url), urlp != NULL, error);
 
955
                if (urlp != NULL) {
 
956
                        const char *urlnew = imap_url_create(urlp);
 
957
                        test_out(t_strdup_printf
 
958
                                ("create %s", urlnew), strcmp(url, urlnew) == 0);
 
959
                }
 
960
 
 
961
                test_end();
 
962
        } T_END;
 
963
 
 
964
}
 
965
 
 
966
 
 
967
int main(void)
 
968
{
 
969
        static void (*test_functions[])(void) = {
 
970
                test_imap_url_valid,
 
971
                test_imap_url_invalid,
 
972
                test_imap_url_parse_create,
 
973
                NULL
 
974
        };
 
975
        return test_run(test_functions);
 
976
}