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