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