1 /*
2  *
3  *  test-mime.c
4  *
5  *  January 15, 2017 Yauheni Kaliuta
6  *
7  */
8 #include <cgreen/cgreen.h>
9 #include <stdio.h>
10 
11 #include "../../src/include/prototypes.h"
12 
debug(int lvl,const char * fmt,...)13 void debug(int lvl, const char *fmt, ...)
14 {
15 }
16 
fglog(const char * fmt,...)17 void fglog(const char *fmt, ...)
18 {
19 }
20 
21 int verbose;
22 
Ensure(hdr_enc_encodes_cyrillic)23 Ensure(hdr_enc_encodes_cyrillic)
24 {
25 	char *src = "Subject: tеsт кириллица latinitsa";
26 	char *exp = "Subject: =?utf-8?B?dNC1c9GCINC60LjRgNC40LvQu9C40YbQsA==?= latinitsa\n";
27 	char *res = NULL;
28 
29 	mime_header_enc(&res, src, "utf-8", MIME_B64);
30 
31 	assert_that(res, is_equal_to_string(exp));
32 	free(res);
33 }
34 
Ensure(hdr_enc_encodes_cyrillic2)35 Ensure(hdr_enc_encodes_cyrillic2)
36 {
37 	char *src = "Subject: tеsт кириллица latinitsa, оdna, двeee, триiiiiiii";
38 	char *exp = "Subject: =?utf-8?B?dNC1c9GCINC60LjRgNC40LvQu9C40YbQsA==?= latinitsa,\n =?utf-8?B?0L5kbmEsINC00LJlZWUsINGC0YDQuGlpaWlpaWk=?=\n";
39 	char *res = NULL;
40 
41 	mime_header_enc(&res, src, "utf-8", MIME_B64);
42 
43 	assert_that(res, is_equal_to_string(exp));
44 	free(res);
45 }
46 
Ensure(hdr_enc_does_not_break_utf8)47 Ensure(hdr_enc_does_not_break_utf8)
48 {
49 	char *src = "Subject: Это ваше ФИДО (переиздание)";
50 	char *exp = "Subject: =?utf-8?B?0K3RgtC+INCy0LDRiNC1INCk0JjQlNCeICjQv9C10YDQtdC4?=\n =?utf-8?B?0LfQtNCw0L3QuNC1KQ==?=\n";
51 	char *res = NULL;
52 
53 	mime_header_enc(&res, src, "utf-8", MIME_B64);
54 
55 	assert_that(res, is_equal_to_string(exp));
56 	free(res);
57 }
58 
Ensure(hdr_enc_encodes_long_line)59 Ensure(hdr_enc_encodes_long_line)
60 {
61 	char *src = "Field: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
62 	char *exp = "Field: =?windows-1251?B?YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh?=\n =?windows-1251?B?YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFh?=\n =?windows-1251?B?YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYQ==?=\n";
63 	char *res = NULL;
64 
65 	mime_header_enc(&res, src, "windows-1251", MIME_B64);
66 
67 	assert_that(res, is_equal_to_string(exp));
68 	free(res);
69 }
70 
Ensure(hdr_enc_qp_encodes_cyrillic)71 Ensure(hdr_enc_qp_encodes_cyrillic)
72 {
73 	char *src = "Subject: tеsт кириллица latinitsa, оdna, двeee, триiiiiiii";
74 	char *exp = "Subject: =?utf-8?Q?t=D0=B5s=D1=82=20=D0=BA=D0=B8=D1=80=D0=B8=D0=BB?=\n =?utf-8?Q?=D0=BB=D0=B8=D1=86=D0=B0?= latinitsa, =?utf-8?Q?=D0=BE?=\n =?utf-8?Q?dna,=20=D0=B4=D0=B2eee,=20=D1=82=D1=80=D0=B8iiiiiii?=\n";
75 	char *res = NULL;
76 
77 	mime_header_enc(&res, src, "utf-8", MIME_QP);
78 
79 	assert_that(res, is_equal_to_string(exp));
80 	free(res);
81 }
82 
Ensure(hdr_enc_b64_wraps_reminder)83 Ensure(hdr_enc_b64_wraps_reminder)
84 {
85 	/* =?utf-8?Q?XXXXxxxx?= 20 chars */
86 	char *src = "Subject: aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaa ббббб";
87 	char *exp = "Subject: aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaa =?utf-8?B?0LHQsQ==?=\n =?utf-8?B?0LHQsdCx?=\n";
88 	char *res = NULL;
89 
90 	mime_header_enc(&res, src, "utf-8", MIME_B64);
91 
92 	assert_that(res, is_equal_to_string(exp));
93 	free(res);
94 }
95 
Ensure(hdr_enc_b64_only_splits_plain)96 Ensure(hdr_enc_b64_only_splits_plain)
97 {
98 	char *src = "Subject: aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaa aaaaaa aaaaa aaaaaa aaaaaa";
99 	char *exp = "Subject: aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaa aaaaaaaa aaaaaa aaaaa aaaaaa\n aaaaaa\n";
100 	char *res = NULL;
101 
102 	mime_header_enc(&res, src, "utf-8", MIME_B64);
103 
104 	assert_that(res, is_equal_to_string(exp));
105 	free(res);
106 }
107 
Ensure(body_enc_b64_encodes_cyrillic)108 Ensure(body_enc_b64_encodes_cyrillic)
109 {
110 	Textlist src;
111 	Textlist res;
112 	char *exp = "dNC1c9GCINC60LjRgNC40LvQu9C40YbQsA==\n";
113 
114 	tl_init(&src);
115 	tl_init(&res);
116 	tl_append(&src, "tеsт кириллица");
117 
118 	mime_b64_encode_tl(&src, &res);
119 
120 	assert_that(res.first->line, is_equal_to_string(exp));
121 
122 	tl_clear(&src);
123 	tl_clear(&res);
124 }
125 
126 #define MSG_MAXSUBJ	72
127 #define J "\xe9" /* Cyrillic й cp1251 */
128 static char dres[MSG_MAXSUBJ];
129 
Ensure(hdr_dec_decodes_le28chars_line)130 Ensure(hdr_dec_decodes_le28chars_line)
131 {
132 	char *src = "=?UTF-8?B?0LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC5?=";
133 	char *exp =
134 		J J J J J J J J J J J J J J J J
135 		J J J J J; /* 21 */
136 
137 	mime_header_dec(dres, sizeof(dres), src, "windows-1251",
138 			CHARSET_STDRFC, NULL);
139 
140 	assert_that(dres, is_equal_to_string(exp));
141 }
142 
Ensure(hdr_dec_decodes_ge35chars_line)143 Ensure(hdr_dec_decodes_ge35chars_line)
144 {
145 	char *src =
146 		"=?UTF-8?B?0LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC5?=\n"
147 		" =?UTF-8?B?0LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50Lk=?=";
148 	char *exp =
149 		J J J J J J J J J J J J J J J J
150 		J J J J J J J J J J J J J J J J
151 		J J J J J; /* 37 */
152 
153 	mime_header_dec(dres, sizeof(dres), src, "windows-1251",
154 			CHARSET_STDRFC, NULL);
155 
156 	assert_that(dres, is_equal_to_string(exp));
157 }
158 
Ensure(hdr_dec_decodes_nonmime_at_start)159 Ensure(hdr_dec_decodes_nonmime_at_start)
160 {
161 	char *src = "Re: Re: =?utf-8?B?0LnQudC50LnQuQ==?=";
162 	char *exp = "Re: Re: " J J J J J;
163 
164 	mime_header_dec(dres, sizeof(dres), src, "windows-1251",
165 			CHARSET_STDRFC, NULL);
166 
167 	assert_that(dres, is_equal_to_string(exp));
168 }
169 #undef J
170 
Ensure(hdr_dec_handles_empty)171 Ensure(hdr_dec_handles_empty)
172 {
173 	char *src = "";
174 	char *exp = "";
175 
176 	mime_header_dec(dres, sizeof(dres), src, "ASCII",
177 			CHARSET_STDRFC, NULL);
178 
179 	assert_that(dres, is_equal_to_string(exp));
180 }
181 
Ensure(hdr_dec_preserves_non_mime)182 Ensure(hdr_dec_preserves_non_mime)
183 {
184 	char *src =
185 		"abcdefghijklmnopqrstuvwxyz123456"
186 		"ABCDEFGHIJKLMNOPQRSTUVWXYZ123456"; /* 64 */
187 	char *exp = src;
188 
189 	mime_header_dec(dres, sizeof(dres), src, "ASCII", CHARSET_STDRFC, NULL);
190 
191 	assert_that(dres, is_equal_to_string(exp));
192 }
193 
194 #define MIME_MAX_ENC_LEN 31
195 
Ensure(hdr_dec_skips_long_charset_decoding)196 Ensure(hdr_dec_skips_long_charset_decoding)
197 {
198 	char *src = "=?UTF-8longlonglonglonglonglonglong?B?0LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC50LnQudC5?=";
199         /* cut to 71 + '\0' symbols */
200 	char *exp = "=?UTF-8longlonglonglonglonglonglong?B?0LnQudC50LnQudC50LnQudC50LnQudC50";
201 
202 	mime_header_dec(dres, sizeof(dres), src, "ASCII", CHARSET_STDRFC, NULL);
203 
204 	assert_that(dres, is_equal_to_string(exp));
205 }
206 
Ensure(hdr_dec_decodes_email1)207 Ensure(hdr_dec_decodes_email1)
208 {
209 	char *src = "=?UTF-8?B?0KfQtdGC0LLQtdGA0LjQutC+0LIg0Jou0JIu?= <chetverikov@mann-schroeder.ru>";
210 	char *exp = "Четвериков К.В. <chetverikov@mann-schroeder.ru>";
211 
212 	mime_header_dec(dres, sizeof(dres), src, "UTF-8", CHARSET_STDRFC, NULL);
213 
214 	assert_that(dres, is_equal_to_string(exp));
215 }
216 
Ensure(hdr_dec_decodes_email2)217 Ensure(hdr_dec_decodes_email2)
218 {
219 	char *src = "chetverikov@mann-schroeder.ru (=?UTF-8?B?0KfQtdGC0LLQtdGA0LjQutC+0LIg0Jou0JIu?=)";
220 	char *exp = "chetverikov@mann-schroeder.ru (Четвериков К.В.)";
221 
222 	mime_header_dec(dres, sizeof(dres), src, "UTF-8", CHARSET_STDRFC, NULL);
223 
224 	assert_that(dres, is_equal_to_string(exp));
225 }
226 
create_mime_suite(void)227 static TestSuite *create_mime_suite(void)
228 {
229     TestSuite *suite = create_named_test_suite(
230 	    "MIME suite");
231     add_test(suite, hdr_enc_encodes_cyrillic);
232     add_test(suite, hdr_enc_encodes_cyrillic2);
233     add_test(suite, hdr_enc_does_not_break_utf8);
234     add_test(suite, hdr_enc_encodes_long_line);
235     add_test(suite, hdr_enc_qp_encodes_cyrillic);
236     add_test(suite, hdr_enc_b64_wraps_reminder);
237     add_test(suite, hdr_enc_b64_only_splits_plain);
238     add_test(suite, body_enc_b64_encodes_cyrillic);
239     add_test(suite, hdr_dec_decodes_le28chars_line);
240     add_test(suite, hdr_dec_decodes_ge35chars_line);
241     add_test(suite, hdr_dec_decodes_nonmime_at_start);
242     add_test(suite, hdr_dec_handles_empty);
243     add_test(suite, hdr_dec_preserves_non_mime);
244     add_test(suite, hdr_dec_skips_long_charset_decoding);
245     add_test(suite, hdr_dec_decodes_email1);
246     add_test(suite, hdr_dec_decodes_email2);
247     return suite;
248 }
249 
main(int argc,char ** argv)250 int main(int argc, char **argv)
251 {
252     TestSuite *suite = create_mime_suite();
253 
254     if (argc > 1)
255 	return run_single_test(suite, argv[1], create_text_reporter());
256 
257     return run_test_suite(suite, create_text_reporter());
258 }
259