1 /*
2 * Copyright (c) 2004-2012 NFG Net Facilities Group BV support@nfg.nl
3 *
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU General Public License
6 * as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later
8 * version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18 *
19 *
20 *
21 *
22 *
23 *
24 *
25 * Basic unit-test framework for dbmail (www.dbmail.org)
26 *
27 * See http://check.sf.net for details and docs.
28 *
29 *
30 * Run 'make check' to see some action.
31 *
32 */
33
34 #include <check.h>
35 #include "check_dbmail.h"
36
37 extern char configFile[PATH_MAX];
38 extern char *multipart_message;
39 extern char *multipart_message_part;
40 extern char *raw_lmtp_data;
41
42
43 /*
44 *
45 * the test fixtures
46 *
47 */
48
49
setup(void)50 void setup(void)
51 {
52 config_get_file();
53 config_read(configFile);
54 configure_debug(NULL,511,0);
55 GetDBParams();
56 db_connect();
57 auth_connect();
58 }
59
teardown(void)60 void teardown(void)
61 {
62 db_disconnect();
63 auth_disconnect();
64 config_free();
65 }
66
67 //DbmailMessage * dbmail_message_new(void);
START_TEST(test_dbmail_message_new)68 START_TEST(test_dbmail_message_new)
69 {
70 DbmailMessage *m = dbmail_message_new(NULL);
71 fail_unless(m->id==0,"dbmail_message_new failed");
72 dbmail_message_free(m);
73 }
74 END_TEST
75 //void dbmail_message_set_class(DbmailMessage *self, int klass);
START_TEST(test_dbmail_message_set_class)76 START_TEST(test_dbmail_message_set_class)
77 {
78 int result;
79 DbmailMessage *m = dbmail_message_new(NULL);
80 result = dbmail_message_set_class(m,DBMAIL_MESSAGE);
81 fail_unless(result==0,"dbmail_message_set_class failed");
82 result = dbmail_message_set_class(m,DBMAIL_MESSAGE_PART);
83 fail_unless(result==0,"dbmail_message_set_class failed");
84 result = dbmail_message_set_class(m,10);
85 fail_unless(result!=0,"dbmail_message_set_class failed");
86
87 dbmail_message_free(m);
88 }
89 END_TEST
90 //int dbmail_message_get_class(DbmailMessage *self);
START_TEST(test_dbmail_message_get_class)91 START_TEST(test_dbmail_message_get_class)
92 {
93 int klass;
94 DbmailMessage *m = dbmail_message_new(NULL);
95
96 /* default */
97 klass = dbmail_message_get_class(m);
98 fail_unless(klass==DBMAIL_MESSAGE,"dbmail_message_get_class failed");
99
100 /* set explicitely */
101 dbmail_message_set_class(m,DBMAIL_MESSAGE_PART);
102 klass = dbmail_message_get_class(m);
103 fail_unless(klass==DBMAIL_MESSAGE_PART,"dbmail_message_get_class failed");
104
105 dbmail_message_set_class(m,DBMAIL_MESSAGE);
106 klass = dbmail_message_get_class(m);
107 fail_unless(klass==DBMAIL_MESSAGE,"dbmail_message_get_class failed");
108
109 dbmail_message_free(m);
110 }
111 END_TEST
showdiff(const char * a,const char * b)112 static char * showdiff(const char *a, const char *b)
113 {
114 assert(a && b);
115 while (*a++ == *b++)
116 ;
117 return g_strdup_printf("[%s]\n[%s]\n", --a, --b);
118 }
119
120 FILE *i;
121 #define COMPARE(a,b) \
122 { \
123 int d; size_t l; char *s;\
124 l = strlen(a); \
125 d = memcmp((a),(b),l); \
126 if (d) { \
127 s = showdiff(a,b); \
128 fail_unless(d == 0, "store store/retrieve failed\n%s\n\n", s); \
129 g_free(s); \
130 } \
131 }
132
message_init(const char * message)133 static DbmailMessage * message_init(const char *message)
134 {
135 DbmailMessage *m;
136
137 m = dbmail_message_new(NULL);
138 m = dbmail_message_init_with_string(m, message);
139
140 //fail_unless(m != NULL, "dbmail_message_init_with_string failed");
141
142 return m;
143
144 }
store_and_retrieve(DbmailMessage * m)145 static char *store_and_retrieve(DbmailMessage *m)
146 {
147 uint64_t physid;
148 DbmailMessage *n;
149 char *t;
150
151 dbmail_message_store(m);
152 physid = dbmail_message_get_physid(m);
153 fail_unless(physid != 0,"dbmail_message_store failed. physid [%" PRIu64 "]", physid);
154 dbmail_message_free(m);
155
156 n = dbmail_message_new(NULL);
157 dbmail_message_set_physid(n, physid);
158 n = dbmail_message_retrieve(n,physid);
159 fail_unless(n != NULL, "_mime_retrieve failed");
160
161 t = dbmail_message_to_string(n);
162 dbmail_message_free(n);
163 return t;
164 }
165
START_TEST(test_g_mime_object_get_body)166 START_TEST(test_g_mime_object_get_body)
167 {
168 char * result;
169 DbmailMessage *m;
170
171 m = message_init(multipart_message);
172
173 result = g_mime_object_get_body(GMIME_OBJECT(m->content));
174 fail_unless(strlen(result)==1057,"g_mime_object_get_body failed [%d:%s]\n", strlen(result), result);
175 g_free(result);
176 dbmail_message_free(m);
177
178 m = message_init(rfc822);
179 result = g_mime_object_get_body(GMIME_OBJECT(m->content));
180 COMPARE("\n this is a test message\n\n", result);
181 g_free(result);
182 dbmail_message_free(m);
183 }
184 END_TEST
185
186
START_TEST(test_dbmail_message_store)187 START_TEST(test_dbmail_message_store)
188 {
189 DbmailMessage *m;
190 char *t, *e;
191 //-----------------------------------------
192 m = message_init("From: paul\n");
193 e = dbmail_message_to_string(m);
194 t = store_and_retrieve(m);
195 fail_unless(MATCH(e,t),"test_dbmail_message_store failed\n%s\n%s", e, t);
196 COMPARE(e,t);
197 g_free(e);
198 g_free(t);
199 //-----------------------------------------
200 m = message_init(simple);
201 e = dbmail_message_to_string(m);
202 t = store_and_retrieve(m);
203 printf("%s %s",e,t);
204 COMPARE(e,t);
205 COMPARE(simple, t);
206 g_free(e);
207 g_free(t);
208 //-----------------------------------------
209 m = message_init(rfc822);
210 e = dbmail_message_to_string(m);
211 t = store_and_retrieve(m);
212 COMPARE(e,t);
213 COMPARE(rfc822, t);
214 g_free(e);
215 g_free(t);
216 //-----------------------------------------
217 m = message_init(multipart_message);
218 e = dbmail_message_to_string(m);
219 t = store_and_retrieve(m);
220 COMPARE(e,t);
221 COMPARE(multipart_message, t);
222 g_free(e);
223 g_free(t);
224 //-----------------------------------------
225 m = message_init(multipart_message2);
226 e = dbmail_message_to_string(m);
227 t = store_and_retrieve(m);
228 COMPARE(e,t);
229 COMPARE(multipart_message2, t);
230 g_free(e);
231 g_free(t);
232 //-----------------------------------------
233 m = message_init(message_rfc822);
234 e = dbmail_message_to_string(m);
235 t = store_and_retrieve(m);
236 COMPARE(e,t);
237 COMPARE(message_rfc822, t);
238 g_free(e);
239 g_free(t);
240 //-----------------------------------------
241 m = message_init(multipart_message3);
242 e = dbmail_message_to_string(m);
243 t = store_and_retrieve(m);
244 COMPARE(e,t);
245 COMPARE(multipart_message3, t);
246 g_free(e);
247 g_free(t);
248 //-----------------------------------------
249 m = message_init(multipart_message4);
250 e = dbmail_message_to_string(m);
251 t = store_and_retrieve(m);
252 COMPARE(e,t);
253 COMPARE(multipart_message4, t);
254 g_free(e);
255 g_free(t);
256 //-----------------------------------------
257 m = message_init(multipart_message5);
258 e = dbmail_message_to_string(m);
259 t = store_and_retrieve(m);
260 COMPARE(e,t);
261 COMPARE(multipart_message5, t);
262 g_free(e);
263 g_free(t);
264 //-----------------------------------------
265 m = message_init(multipart_message6);
266 e = dbmail_message_to_string(m);
267 t = store_and_retrieve(m);
268 COMPARE(e,t);
269 //COMPARE(multipart_message6, t);
270 g_free(e);
271 g_free(t);
272 //-----------------------------------------
273 m = message_init(multipart_message7);
274 e = dbmail_message_to_string(m);
275 t = store_and_retrieve(m);
276 COMPARE(e,t);
277 g_free(e);
278 g_free(t);
279 //-----------------------------------------
280 m = message_init(multipart_message8);
281 e = dbmail_message_to_string(m);
282 t = store_and_retrieve(m);
283 COMPARE(e,t);
284 g_free(e);
285 g_free(t);
286 //-----------------------------------------
287 m = message_init(multipart_message9);
288 e = dbmail_message_to_string(m);
289 t = store_and_retrieve(m);
290 COMPARE(e,t);
291 g_free(e);
292 g_free(t);
293 //-----------------------------------------
294 m = message_init(multipart_mixed);
295 e = dbmail_message_to_string(m);
296 t = store_and_retrieve(m);
297 COMPARE(e,t);
298 COMPARE(multipart_mixed, t);
299 g_free(e);
300 g_free(t);
301 //-----------------------------------------
302 m = message_init(broken_message);
303 e = dbmail_message_to_string(m);
304 t = store_and_retrieve(m);
305 //COMPARE(e,t);
306 //COMPARE(broken_message, t);
307 g_free(e);
308 g_free(t);
309 //-----------------------------------------
310 m = message_init(encoded_message_latin_1);
311 e = dbmail_message_to_string(m);
312 t = store_and_retrieve(m);
313 COMPARE(e,t);
314 COMPARE(encoded_message_latin_1, t);
315 g_free(e);
316 g_free(t);
317 //-----------------------------------------
318 m = message_init(encoded_message_latin_2);
319 e = dbmail_message_to_string(m);
320 t = store_and_retrieve(m);
321 COMPARE(e,t);
322 COMPARE(encoded_message_latin_2, t);
323 g_free(e);
324 g_free(t);
325 //-----------------------------------------
326 m = message_init(encoded_message_utf8);
327 e = dbmail_message_to_string(m);
328 t = store_and_retrieve(m);
329 COMPARE(e,t);
330 COMPARE(encoded_message_utf8, t);
331 g_free(e);
332 g_free(t);
333 //-----------------------------------------
334 m = message_init(encoded_message_utf8_1);
335 e = dbmail_message_to_string(m);
336 t = store_and_retrieve(m);
337 COMPARE(e,t);
338 COMPARE(encoded_message_utf8_1, t);
339 g_free(e);
340 g_free(t);
341 //-----------------------------------------
342 m = message_init(encoded_message_utf8_2);
343 e = dbmail_message_to_string(m);
344 t = store_and_retrieve(m);
345 COMPARE(e,t);
346 COMPARE(encoded_message_utf8_2, t);
347 g_free(e);
348 g_free(t);
349 //-----------------------------------------
350 m = message_init(encoded_message_koi);
351 e = dbmail_message_to_string(m);
352 t = store_and_retrieve(m);
353 COMPARE(e,t);
354 COMPARE(encoded_message_koi, t);
355 g_free(e);
356 g_free(t);
357 //-----------------------------------------
358 m = message_init(raw_message_koi);
359 e = dbmail_message_to_string(m);
360 t = store_and_retrieve(m);
361 COMPARE(e,t);
362 COMPARE(raw_message_koi, t);
363 g_free(e);
364 g_free(t);
365 //-----------------------------------------
366 m = message_init(multipart_alternative);
367 e = dbmail_message_to_string(m);
368 t = store_and_retrieve(m);
369 COMPARE(e,t);
370 COMPARE(multipart_alternative, t);
371 g_free(e);
372 g_free(t);
373 //-----------------------------------------
374 m = message_init(outlook_multipart);
375 e = dbmail_message_to_string(m);
376 t = store_and_retrieve(m);
377 // COMPARE(e,t);
378 // COMPARE(outlook_multipart, t);
379 g_free(e);
380 g_free(t);
381 //-----------------------------------------
382 m = message_init(multipart_alternative2);
383 e = dbmail_message_to_string(m);
384 t = store_and_retrieve(m);
385 COMPARE(e,t);
386 COMPARE(multipart_alternative2, t);
387 g_free(e);
388 g_free(t);
389 //-----------------------------------------
390 m = message_init(multipart_apple);
391 e = dbmail_message_to_string(m);
392 t = store_and_retrieve(m);
393 COMPARE(e,t);
394 COMPARE(multipart_apple, t);
395 g_free(e);
396 g_free(t);
397 //-----------------------------------------
398 m = message_init(long_quopri_subject);
399 e = dbmail_message_to_string(m);
400 t = store_and_retrieve(m);
401 COMPARE(e,t);
402 COMPARE(long_quopri_subject, t);
403 g_free(e);
404 g_free(t);
405 //-----------------------------------------
406 m = message_init(multipart_message_big);
407 e = dbmail_message_to_string(m);
408 t = store_and_retrieve(m);
409 COMPARE(e,t);
410 COMPARE(multipart_message_big, t);
411 g_free(e);
412 g_free(t);
413 //-----------------------------------------
414 m = message_init(multipart_digest);
415 e = dbmail_message_to_string(m);
416 t = store_and_retrieve(m);
417 //COMPARE(e,t);
418 //COMPARE(multipart_digest, t);
419 g_free(e);
420 g_free(t);
421 //-----------------------------------------
422 m = message_init(multipart_alternative3);
423 e = dbmail_message_to_string(m);
424 t = store_and_retrieve(m);
425 COMPARE(e,t);
426 COMPARE(multipart_alternative3, t);
427 g_free(e);
428 g_free(t);
429 //-----------------------------------------
430 m = message_init(multipart_signed);
431 e = dbmail_message_to_string(m);
432 t = store_and_retrieve(m);
433 COMPARE(e,t);
434 g_free(e);
435 g_free(t);
436 //-----------------------------------------
437 m = message_init(multipart_message_submessage);
438 e = dbmail_message_to_string(m);
439 t = store_and_retrieve(m);
440 COMPARE(e,t);
441 COMPARE(multipart_message_submessage, t);
442 g_free(e);
443 g_free(t);
444 }
445 END_TEST
446
START_TEST(test_dbmail_message_store2)447 START_TEST(test_dbmail_message_store2)
448 {
449 DbmailMessage *m, *n;
450 uint64_t physid;
451 char *t;
452 char *expect;
453
454 m = message_init(broken_message2);
455
456 dbmail_message_set_header(m, "Return-Path", dbmail_message_get_header(m, "From"));
457
458 expect = dbmail_message_to_string(m);
459 fail_unless(m != NULL, "dbmail_message_store2 failed");
460
461 dbmail_message_store(m);
462 physid = dbmail_message_get_physid(m);
463 dbmail_message_free(m);
464
465 n = dbmail_message_new(NULL);
466 dbmail_message_set_physid(n, physid);
467 n = dbmail_message_retrieve(n,physid);
468 fail_unless(n != NULL, "_mime_retrieve failed");
469
470 t = dbmail_message_to_string(n);
471
472 COMPARE(expect,t);
473
474 dbmail_message_free(n);
475 g_free(expect);
476 g_free(t);
477
478 }
479 END_TEST
480
481
482 //DbmailMessage * dbmail_message_retrieve(DbmailMessage *self, uint64_t physid, int filter);
START_TEST(test_dbmail_message_retrieve)483 START_TEST(test_dbmail_message_retrieve)
484 {
485 DbmailMessage *m, *n;
486 uint64_t physid;
487
488 m = dbmail_message_new(NULL);
489 m = dbmail_message_init_with_string(m, multipart_message);
490 fail_unless(m != NULL, "dbmail_message_init_with_string failed");
491
492 dbmail_message_set_header(m,
493 "References",
494 "<20050326155326.1afb0377@ibook.linuks.mine.nu> <20050326181954.GB17389@khazad-dum.debian.net> <20050326193756.77747928@ibook.linuks.mine.nu> ");
495 dbmail_message_store(m);
496
497 physid = dbmail_message_get_physid(m);
498 fail_unless(physid > 0, "dbmail_message_get_physid failed");
499
500 n = dbmail_message_new(NULL);
501 n = dbmail_message_retrieve(n,physid);
502 fail_unless(n != NULL, "dbmail_message_retrieve failed");
503 fail_unless(n->content != NULL, "dbmail_message_retrieve failed");
504
505 dbmail_message_free(m);
506 dbmail_message_free(n);
507
508 }
509 END_TEST
510 //DbmailMessage * dbmail_message_init_with_string(DbmailMessage *self, const GString *content);
START_TEST(test_dbmail_message_init_with_string)511 START_TEST(test_dbmail_message_init_with_string)
512 {
513 DbmailMessage *m;
514 GList *t;
515
516 m = message_init(multipart_message);
517
518 t = dbmail_message_get_header_repeated(m, "Received");
519 fail_unless(g_list_length(t)==3,"Too few or too many headers in tuple [%d]\n",
520 g_list_length(t));
521 dbmail_message_free(m);
522 }
523 END_TEST
524
START_TEST(test_dbmail_message_get_internal_date)525 START_TEST(test_dbmail_message_get_internal_date)
526 {
527 DbmailMessage *m;
528
529 m = dbmail_message_new(NULL);
530 m = dbmail_message_init_with_string(m, rfc822);
531 // From_ contains: Wed Sep 14 16:47:48 2005
532 const char *expect = "2005-09-14 16:47:48";
533 const char *expect03 = "2003-09-14 16:47:48";
534 const char *expect75 = "1975-09-14 16:47:48";
535 const char *expect10 = "2010-05-28 18:10:18";
536 char *result;
537
538 /* baseline */
539 result = dbmail_message_get_internal_date(m, 0);
540 fail_unless(MATCH(expect,result),"dbmail_message_get_internal_date failed exp [%s] got [%s]", expect, result);
541 g_free(result);
542
543 /* should be the same */
544 result = dbmail_message_get_internal_date(m, 2007);
545 fail_unless(MATCH(expect,result),"dbmail_message_get_internal_date failed exp [%s] got [%s]", expect, result);
546 g_free(result);
547
548 /* capped to 2004, which should also be the same */
549 result = dbmail_message_get_internal_date(m, 2004);
550 fail_unless(MATCH(expect,result),"dbmail_message_get_internal_date failed exp [%s] got [%s]", expect, result);
551 g_free(result);
552
553 /* capped to 2003, should be different */
554 result = dbmail_message_get_internal_date(m, 2003);
555 fail_unless(MATCH(expect03,result),"dbmail_message_get_internal_date failed exp [%s] got [%s]", expect03, result);
556 g_free(result);
557
558 /* capped to 1975, should be way different */
559 result = dbmail_message_get_internal_date(m, 1975);
560 fail_unless(MATCH(expect75,result),"dbmail_message_get_internal_date failed exp [%s] got [%s]", expect75, result);
561 g_free(result);
562
563 dbmail_message_free(m);
564
565 // test work-around for broken envelope header
566 m = dbmail_message_new(NULL);
567 m = dbmail_message_init_with_string(m, simple_broken_envelope);
568
569 result = dbmail_message_get_internal_date(m, 0);
570 //fail_unless(MATCH(expect10,result),"dbmail_message_get_internal_date failed exp [%s] got [%s]", expect10, result);
571
572 char *before = dbmail_message_to_string(m);
573 char *after = store_and_retrieve(m);
574 COMPARE(before, after);
575 g_free(before);
576 g_free(after);
577 }
578 END_TEST
579
START_TEST(test_dbmail_message_to_string)580 START_TEST(test_dbmail_message_to_string)
581 {
582 char *result;
583 DbmailMessage *m;
584
585 m = message_init(multipart_message);
586 result = dbmail_message_to_string(m);
587 COMPARE(multipart_message, result);
588 g_free(result);
589 dbmail_message_free(m);
590
591 //
592 m = message_init(simple_with_from);
593 result = dbmail_message_to_string(m);
594 COMPARE(simple_with_from, result);
595 g_free(result);
596 dbmail_message_free(m);
597
598 }
599 END_TEST
600
601 //gchar * dbmail_message_hdrs_to_string(DbmailMessage *self);
602
START_TEST(test_dbmail_message_hdrs_to_string)603 START_TEST(test_dbmail_message_hdrs_to_string)
604 {
605 char *result;
606 DbmailMessage *m;
607
608 m = dbmail_message_new(NULL);
609 m = dbmail_message_init_with_string(m, multipart_message);
610
611 result = dbmail_message_hdrs_to_string(m);
612 fail_unless(strlen(result)==676, "dbmail_message_hdrs_to_string failed [%d] != [634]\n[%s]\n", strlen(result), result);
613
614 dbmail_message_free(m);
615 g_free(result);
616 }
617 END_TEST
618
619 //gchar * dbmail_message_body_to_string(DbmailMessage *self);
620
START_TEST(test_dbmail_message_body_to_string)621 START_TEST(test_dbmail_message_body_to_string)
622 {
623 char *result;
624 DbmailMessage *m;
625
626 m = dbmail_message_new(NULL);
627 m = dbmail_message_init_with_string(m,multipart_message);
628 result = dbmail_message_body_to_string(m);
629 fail_unless(strlen(result)==1057, "dbmail_message_body_to_string failed [%d] != [1057]\n[%s]\n", strlen(result),result);
630
631 dbmail_message_free(m);
632 g_free(result);
633
634 m = dbmail_message_new(NULL);
635 m = dbmail_message_init_with_string(m,outlook_multipart);
636 result = dbmail_message_body_to_string(m);
637 fail_unless(strlen(result)==330, "dbmail_message_body_to_string failed [330 != %d:%s]", strlen(result), result);
638
639 dbmail_message_free(m);
640 g_free(result);
641
642
643 }
644 END_TEST
645
646 //void dbmail_message_free(DbmailMessage *self);
START_TEST(test_dbmail_message_free)647 START_TEST(test_dbmail_message_free)
648 {
649 DbmailMessage *m = dbmail_message_new(NULL);
650 dbmail_message_free(m);
651 }
652 END_TEST
653
START_TEST(test_dbmail_message_set_header)654 START_TEST(test_dbmail_message_set_header)
655 {
656 char *res = NULL;
657 DbmailMessage *m;
658 m = dbmail_message_new(NULL);
659 m = dbmail_message_init_with_string(m,multipart_message);
660 dbmail_message_set_header(m, "X-Foobar","Foo Bar");
661 fail_unless(dbmail_message_get_header(m, "X-Foobar")!=NULL, "set_header failed");
662 dbmail_message_free(m);
663 //
664 m = dbmail_message_new(NULL);
665 m = dbmail_message_init_with_string(m, encoded_message_utf8);
666 res = dbmail_message_to_string(m);
667 fail_unless(MATCH(encoded_message_utf8, res), "to_string failed");
668 g_free(res);
669
670 dbmail_message_set_header(m, "X-Foobar", "Test");
671 g_mime_object_remove_header(GMIME_OBJECT(m->content), "X-Foobar");
672 res = dbmail_message_to_string(m);
673 fail_unless(MATCH(encoded_message_utf8, res), "to_string failed \n[%s] != \n[%s]\n", encoded_message_utf8, res);
674 g_free(res);
675 dbmail_message_free(m);
676 //
677
678 m = dbmail_message_new(NULL);
679 m = dbmail_message_init_with_string(m, long_quopri_subject);
680 res = dbmail_message_to_string(m);
681 fail_unless(MATCH(long_quopri_subject, res), "to_string failed");
682 g_free(res);
683
684 dbmail_message_set_header(m, "X-Foo", "Test");
685
686 res = dbmail_message_to_string(m);
687 fail_unless(! MATCH(long_quopri_subject, res), "to_string failed");
688 g_free(res);
689
690 g_mime_object_remove_header(GMIME_OBJECT(m->content), "X-Foo");
691 res = dbmail_message_to_string(m);
692 //FIXME: fail_unless(MATCH(long_quopri_subject, res), "to_string failed \n[%s] != \n[%s]\n", long_quopri_subject, res);
693 g_free(res);
694
695 dbmail_message_free(m);
696 //
697
698 }
699 END_TEST
700
START_TEST(test_dbmail_message_get_header)701 START_TEST(test_dbmail_message_get_header)
702 {
703 char *t;
704 DbmailMessage *h = dbmail_message_new(NULL);
705 DbmailMessage *m = dbmail_message_new(NULL);
706
707 m = dbmail_message_init_with_string(m, multipart_message);
708 t = dbmail_message_hdrs_to_string(m);
709 h = dbmail_message_init_with_string(h, t);
710 g_free(t);
711
712 fail_unless(dbmail_message_get_header(m, "X-Foobar")==NULL, "get_header failed on full message");
713 fail_unless(strcmp(dbmail_message_get_header(m,"Subject"),"multipart/mixed")==0,"get_header failed on full message");
714
715 fail_unless(dbmail_message_get_header(h, "X-Foobar")==NULL, "get_header failed on headers-only message");
716 fail_unless(strcmp(dbmail_message_get_header(h,"Subject"),"multipart/mixed")==0,"get_header failed on headers-only message");
717
718 dbmail_message_free(m);
719 dbmail_message_free(h);
720 }
721 END_TEST
722
START_TEST(test_dbmail_message_encoded)723 START_TEST(test_dbmail_message_encoded)
724 {
725 DbmailMessage *m = dbmail_message_new(NULL);
726 //const char *exp = ":: [ Arrty ] :: [ Roy (L) St�phanie ] <over.there@hotmail.com>";
727 uint64_t id = 0;
728
729 m = dbmail_message_init_with_string(m, encoded_message_koi);
730 fail_unless(strcmp(dbmail_message_get_header(m,"From"),"=?koi8-r?Q?=E1=CE=D4=CF=CE=20=EE=C5=C8=CF=D2=CF=DB=C9=C8=20?=<bad@foo.ru>")==0,
731 "dbmail_message_get_header failed for koi-8 encoded header");
732 dbmail_message_free(m);
733
734 m = dbmail_message_new(NULL);
735 m = dbmail_message_init_with_string(m, utf7_header);
736
737 dbmail_message_store(m);
738 id = dbmail_message_get_physid(m);
739 dbmail_message_free(m);
740
741 m = dbmail_message_new(NULL);
742 m = dbmail_message_retrieve(m, id);
743 dbmail_message_free(m);
744 }
745 END_TEST
746
START_TEST(test_dbmail_message_8bit)747 START_TEST(test_dbmail_message_8bit)
748 {
749 DbmailMessage *m = dbmail_message_new(NULL);
750
751 m = dbmail_message_init_with_string(m, raw_message_koi);
752
753 dbmail_message_store(m);
754 dbmail_message_free(m);
755
756 /* */
757 m = dbmail_message_new(NULL);
758 m = dbmail_message_init_with_string(m, encoded_message_utf8);
759
760 dbmail_message_store(m);
761 dbmail_message_free(m);
762 }
763 END_TEST
764
START_TEST(test_dbmail_message_cache_headers)765 START_TEST(test_dbmail_message_cache_headers)
766 {
767 DbmailMessage *m = dbmail_message_new(NULL);
768 char *s = g_new0(char,20);
769 m = dbmail_message_init_with_string(m,multipart_message);
770 dbmail_message_set_header(m,
771 "References",
772 "<20050326155326.1afb0377@ibook.linuks.mine.nu> <20050326181954.GB17389@khazad-dum.debian.net> <20050326193756.77747928@ibook.linuks.mine.nu> ");
773 dbmail_message_store(m);
774 dbmail_message_free(m);
775
776 sprintf(s,"%.*s",10,"abcdefghijklmnopqrstuvwxyz");
777 fail_unless(MATCH(s,"abcdefghij"),"string truncate failed");
778 g_free(s);
779
780 m = dbmail_message_new(NULL);
781 m = dbmail_message_init_with_string(m,multipart_message);
782 dbmail_message_set_header(m,
783 "Subject",
784 "=?utf-8?Q?[xxxxxxxxxxxxxxxxxx.xx_0000747]:_=C3=84nderungen_an_der_Artikel?= =?utf-8?Q?-Detailseite?="
785 );
786 dbmail_message_store(m);
787 dbmail_message_free(m);
788 }
789 END_TEST
790
START_TEST(test_dbmail_message_get_header_addresses)791 START_TEST(test_dbmail_message_get_header_addresses)
792 {
793 GList * result;
794 DbmailMessage *m;
795
796 m = dbmail_message_new(NULL);
797 m = dbmail_message_init_with_string(m,multipart_message);
798
799 result = dbmail_message_get_header_addresses(m, "Cc");
800 result = g_list_first(result);
801
802 fail_unless(result != NULL, "dbmail_message_get_header_addresses failed");
803 fail_unless(g_list_length(result)==2,"dbmail_message_get_header_addresses failed");
804 fail_unless(strcmp((char *)result->data,"vol@inter7.com")==0, "dbmail_message_get_header_addresses failed");
805 g_list_destroy(result);
806
807 dbmail_message_free(m);
808 }
809 END_TEST
810
START_TEST(test_dbmail_message_get_header_repeated)811 START_TEST(test_dbmail_message_get_header_repeated)
812 {
813 GList *headers;
814 DbmailMessage *m;
815
816 m = dbmail_message_new(NULL);
817 m = dbmail_message_init_with_string(m,multipart_message);
818
819 headers = dbmail_message_get_header_repeated(m, "Received");
820
821 fail_unless(headers != NULL, "dbmail_message_get_header_repeated failed");
822 fail_unless(g_list_length(headers)==3, "dbmail_message_get_header_repeated failed");
823
824 headers = dbmail_message_get_header_repeated(m, "received");
825
826 fail_unless(headers != NULL, "dbmail_message_get_header_repeated failed");
827 fail_unless(g_list_length(headers)==3, "dbmail_message_get_header_repeated failed");
828
829 dbmail_message_free(m);
830 }
831 END_TEST
832
833
START_TEST(test_dbmail_message_construct)834 START_TEST(test_dbmail_message_construct)
835 {
836 const gchar *sender = "foo@bar.org";
837 const gchar *subject = "Some test";
838 const gchar *recipient = "<bar@foo.org> Bar";
839 gchar *body = g_strdup("testing\nține un gând");
840 gchar *expect = g_strdup("From: foo@bar.org\n"
841 "Subject: Some test\n"
842 "To: bar@foo.org\n"
843 "MIME-Version: 1.0\n"
844 "Content-Type: text/plain; charset=utf-8\n"
845 "Content-Transfer-Encoding: base64\n"
846 "\n"
847 "dGVzdGluZwrIm2luZSB1biBnw6Ju");
848 gchar *result;
849
850 DbmailMessage *message = dbmail_message_new(NULL);
851 message = dbmail_message_construct(message,recipient,sender,subject,body);
852 result = dbmail_message_to_string(message);
853 fail_unless(MATCH(expect,result),"dbmail_message_construct failed \nExpect:<<%s>>\nResult:<<%s>>", expect, result);
854 dbmail_message_free(message);
855 g_free(body);
856 g_free(result);
857 g_free(expect);
858
859 body = g_strdup("Mit freundlichen Gr=C3=BC=C3=9Fen");
860 message = dbmail_message_new(NULL);
861 message = dbmail_message_construct(message,recipient,sender,subject,body);
862 //printf ("%s\n", dbmail_message_to_string(message));
863 dbmail_message_free(message);
864 g_free(body);
865 }
866 END_TEST
867
START_TEST(test_encoding)868 START_TEST(test_encoding)
869 {
870 char *raw, *enc, *dec;
871
872 raw = g_strdup( "Kristoffer Bronemyr");
873 enc = g_mime_utils_header_encode_phrase((char *)raw);
874 dec = g_mime_utils_header_decode_phrase((char *)enc);
875 fail_unless(MATCH(raw,dec),"decode/encode failed");
876 g_free(raw);
877 g_free(dec);
878 g_free(enc);
879 }
880 END_TEST
881
START_TEST(test_dbmail_message_get_size)882 START_TEST(test_dbmail_message_get_size)
883 {
884 DbmailMessage *m;
885 size_t i, j;
886
887 /* */
888 m = dbmail_message_new(NULL);
889 m = dbmail_message_init_with_string(m, rfc822);
890
891 i = dbmail_message_get_size(m, FALSE);
892 fail_unless(i==277, "dbmail_message_get_size failed [%d]", i);
893 j = dbmail_message_get_size(m, TRUE);
894 fail_unless(j==289, "dbmail_message_get_size failed [%d]", j);
895
896 dbmail_message_free(m);
897 return;
898
899 /* */
900 m = dbmail_message_new(NULL);
901 m = dbmail_message_init_with_string(m, "From: paul\n\n");
902
903 i = dbmail_message_get_size(m, FALSE);
904 fail_unless(i==12, "dbmail_message_get_size failed [%d]", i);
905 j = dbmail_message_get_size(m, TRUE);
906 fail_unless(j==14, "dbmail_message_get_size failed [%d]", j);
907
908 dbmail_message_free(m);
909
910 }
911 END_TEST
912
913
START_TEST(test_db_get_message_lines)914 START_TEST(test_db_get_message_lines)
915 {
916 DbmailMessage *m;
917 char *result;
918 char *raw;
919 const char *header = "From: foo@bar.org\r\n"
920 "Subject: Some test\r\n"
921 "To: bar@foo.org\r\n"
922 "MIME-Version: 1.0\r\n"
923 "Content-Type: text/plain; charset=utf-8\r\n"
924 "Content-Transfer-Encoding: base64\r\n"
925 "\r\n";
926 const char *body = "CnRlc3RpbmcKCuHh4eHk\r\n";
927 raw = g_strconcat(header, body, NULL);
928
929 m = dbmail_message_new(NULL);
930 m = dbmail_message_init_with_string(m, raw);
931 dbmail_message_store(m);
932
933
934 result = db_get_message_lines(m->msg_idnr, 0);
935 fail_unless(MATCH(result, header));
936 g_free(result);
937
938 result = db_get_message_lines(m->msg_idnr, 1);
939 fail_unless(MATCH(result, raw));
940 g_free(result);
941
942 result = db_get_message_lines(m->msg_idnr, -2);
943 fail_unless(MATCH(result, raw));
944 g_free(result);
945
946 g_free(raw);
947 dbmail_message_free(m);
948 }
949 END_TEST
950
951 /* Fetching subject from database */
952 extern DBParam_T db_params;
953 #define DBPFX db_params.pfx
954
test_db_get_subject(uint64_t physid,char ** subject)955 int test_db_get_subject(uint64_t physid, char **subject)
956 {
957 Connection_T c; ResultSet_T r;
958 volatile int t = DM_EGENERAL;
959
960 c = db_con_get();
961 TRY
962 r = db_query(c, "SELECT subjectfield "
963 "FROM %ssubjectfield WHERE physmessage_id = %" PRIu64 "",
964 DBPFX, physid);
965 if (db_result_next(r)) {
966 int l;
967 const void *blob;
968 blob = db_result_get_blob(r, 0, &l);
969 *subject = g_new0(char, l + 1);
970 strncpy(*subject, blob, l);
971 }
972 t = DM_SUCCESS;
973 CATCH(SQLException)
974 LOG_SQLERROR;
975 FINALLY
976 db_con_close(c);
977 END_TRY;
978
979 return t;
980 }
981
START_TEST(test_dbmail_message_utf8_headers)982 START_TEST(test_dbmail_message_utf8_headers)
983 {
984 DbmailMessage *m;
985 uint64_t physid = 0;
986 const char *s;
987 char *s_dec,*t = NULL;
988 const char *utf8_invalid_fixed = "=?UTF-8?B?0J/RgNC40LPQu9Cw0YjQsNC10Lwg0L3QsCDRgdC10YA/IA==?= =?UTF-8?B?0LrQvtC90LXRhiDRgdGC0YDQvtC60Lg=?=";
989
990 m = dbmail_message_new(NULL);
991 m = dbmail_message_init_with_string(m,utf8_long_header);
992 dbmail_message_store(m);
993 physid = dbmail_message_get_physid(m);
994
995 s = dbmail_message_get_header(m,"Subject");
996 s_dec = g_mime_utils_header_decode_phrase(s);
997 test_db_get_subject(physid,&t);
998
999 fail_unless(MATCH(s_dec,t), "[%" PRIu64 "] utf8 long header failed:\n[%s] !=\n[%s]\n",
1000 physid, s_dec, t);
1001
1002 dbmail_message_free(m);
1003 g_free(s_dec);
1004 //
1005
1006 m = dbmail_message_new(NULL);
1007 m = dbmail_message_init_with_string(m,utf8_invalid);
1008 dbmail_message_store(m);
1009 physid = dbmail_message_get_physid(m);
1010
1011 s_dec = g_mime_utils_header_decode_phrase(utf8_invalid_fixed);
1012 test_db_get_subject(physid,&t);
1013 fail_unless(MATCH(s_dec,t), "utf8 invalid failed:\n[%s] !=\n[%s]\n", s_dec, t);
1014
1015 dbmail_message_free(m);
1016 }
1017 END_TEST
1018
dbmail_message_suite(void)1019 Suite *dbmail_message_suite(void)
1020 {
1021 Suite *s = suite_create("Dbmail Message");
1022 TCase *tc_message = tcase_create("Message");
1023 /* setting timeot for all tests */
1024 tcase_set_timeout(tc_message,600);
1025 suite_add_tcase(s, tc_message);
1026 tcase_add_checked_fixture(tc_message, setup, teardown);
1027 tcase_add_test(tc_message, test_dbmail_message_new);
1028 tcase_add_test(tc_message, test_dbmail_message_set_class);
1029 tcase_add_test(tc_message, test_dbmail_message_get_class);
1030 tcase_add_test(tc_message, test_dbmail_message_get_internal_date);
1031 tcase_add_test(tc_message, test_g_mime_object_get_body);
1032 tcase_add_test(tc_message, test_dbmail_message_store);
1033 tcase_add_test(tc_message, test_dbmail_message_store2);
1034 tcase_add_test(tc_message, test_dbmail_message_retrieve);
1035 tcase_add_test(tc_message, test_dbmail_message_init_with_string);
1036 tcase_add_test(tc_message, test_dbmail_message_to_string);
1037 tcase_add_test(tc_message, test_dbmail_message_hdrs_to_string);
1038 tcase_add_test(tc_message, test_dbmail_message_body_to_string);
1039 tcase_add_test(tc_message, test_dbmail_message_set_header);
1040 tcase_add_test(tc_message, test_dbmail_message_get_header);
1041 tcase_add_test(tc_message, test_dbmail_message_cache_headers);
1042 tcase_add_test(tc_message, test_dbmail_message_free);
1043 tcase_add_test(tc_message, test_dbmail_message_encoded);
1044 tcase_add_test(tc_message, test_dbmail_message_8bit);
1045 tcase_add_test(tc_message, test_dbmail_message_get_header_addresses);
1046 tcase_add_test(tc_message, test_dbmail_message_get_header_repeated);
1047 tcase_add_test(tc_message, test_dbmail_message_construct);
1048 tcase_add_test(tc_message, test_dbmail_message_get_size);
1049 tcase_add_test(tc_message, test_encoding);
1050 tcase_add_test(tc_message, test_db_get_message_lines);
1051 tcase_add_test(tc_message, test_dbmail_message_utf8_headers);
1052 return s;
1053 }
1054
main(void)1055 int main(void)
1056 {
1057 int nf;
1058 g_mime_init(GMIME_ENABLE_RFC2047_WORKAROUNDS);
1059 Suite *s = dbmail_message_suite();
1060 SRunner *sr = srunner_create(s);
1061 srunner_run_all(sr, CK_NORMAL);
1062 nf = srunner_ntests_failed(sr);
1063 srunner_free(sr);
1064 g_mime_shutdown();
1065 return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
1066 }
1067
1068
1069