|
ferencd@0
|
1 //
|
|
ferencd@0
|
2 // VMime library (http://www.vmime.org)
|
|
ferencd@0
|
3 // Copyright (C) 2002-2013 Vincent Richard <vincent@vmime.org>
|
|
ferencd@0
|
4 //
|
|
ferencd@0
|
5 // This program is free software; you can redistribute it and/or
|
|
ferencd@0
|
6 // modify it under the terms of the GNU General Public License as
|
|
ferencd@0
|
7 // published by the Free Software Foundation; either version 3 of
|
|
ferencd@0
|
8 // the License, or (at your option) any later version.
|
|
ferencd@0
|
9 //
|
|
ferencd@0
|
10 // This program is distributed in the hope that it will be useful,
|
|
ferencd@0
|
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
ferencd@0
|
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
ferencd@0
|
13 // General Public License for more details.
|
|
ferencd@0
|
14 //
|
|
ferencd@0
|
15 // You should have received a copy of the GNU General Public License along
|
|
ferencd@0
|
16 // with this program; if not, write to the Free Software Foundation, Inc.,
|
|
ferencd@0
|
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
ferencd@0
|
18 //
|
|
ferencd@0
|
19 // Linking this library statically or dynamically with other modules is making
|
|
ferencd@0
|
20 // a combined work based on this library. Thus, the terms and conditions of
|
|
ferencd@0
|
21 // the GNU General Public License cover the whole combination.
|
|
ferencd@0
|
22 //
|
|
ferencd@0
|
23
|
|
ferencd@0
|
24 #include "tests/testUtils.hpp"
|
|
ferencd@0
|
25
|
|
ferencd@0
|
26
|
|
ferencd@0
|
27 VMIME_TEST_SUITE_BEGIN(bodyPartTest)
|
|
ferencd@0
|
28
|
|
ferencd@0
|
29 VMIME_TEST_LIST_BEGIN
|
|
ferencd@0
|
30 VMIME_TEST(testParse)
|
|
ferencd@0
|
31 VMIME_TEST(testGenerate)
|
|
ferencd@0
|
32 VMIME_TEST(testParseGuessBoundary)
|
|
ferencd@0
|
33 VMIME_TEST(testParseGuessBoundaryWithTransportPadding)
|
|
ferencd@0
|
34 VMIME_TEST(testParseMissingLastBoundary)
|
|
ferencd@0
|
35 VMIME_TEST(testPrologEpilog)
|
|
ferencd@0
|
36 VMIME_TEST(testPrologEncoding)
|
|
ferencd@0
|
37 VMIME_TEST(testSuccessiveBoundaries)
|
|
ferencd@0
|
38 VMIME_TEST(testTransportPaddingInBoundary)
|
|
ferencd@0
|
39 VMIME_TEST(testGenerate7bit)
|
|
ferencd@0
|
40 VMIME_TEST(testTextUsageForQPEncoding)
|
|
ferencd@0
|
41 VMIME_TEST(testParseVeryBigMessage)
|
|
ferencd@0
|
42 VMIME_TEST_LIST_END
|
|
ferencd@0
|
43
|
|
ferencd@0
|
44
|
|
ferencd@0
|
45 static const vmime::string extractComponentString
|
|
ferencd@0
|
46 (const vmime::string& buffer, const vmime::component& c)
|
|
ferencd@0
|
47 {
|
|
ferencd@0
|
48 return vmime::string(buffer.begin() + c.getParsedOffset(),
|
|
ferencd@0
|
49 buffer.begin() + c.getParsedOffset() + c.getParsedLength());
|
|
ferencd@0
|
50 }
|
|
ferencd@0
|
51
|
|
ferencd@0
|
52 static const vmime::string extractContents(const vmime::shared_ptr <const vmime::contentHandler> cts)
|
|
ferencd@0
|
53 {
|
|
ferencd@0
|
54 std::ostringstream oss;
|
|
ferencd@0
|
55 vmime::utility::outputStreamAdapter os(oss);
|
|
ferencd@0
|
56
|
|
ferencd@0
|
57 cts->extract(os);
|
|
ferencd@0
|
58
|
|
ferencd@0
|
59 return oss.str();
|
|
ferencd@0
|
60 }
|
|
ferencd@0
|
61
|
|
ferencd@0
|
62
|
|
ferencd@0
|
63 void testParse()
|
|
ferencd@0
|
64 {
|
|
ferencd@0
|
65 vmime::string str1 = "HEADER\r\n\r\nBODY";
|
|
ferencd@0
|
66 vmime::bodyPart p1;
|
|
ferencd@0
|
67 p1.parse(str1);
|
|
ferencd@0
|
68
|
|
ferencd@0
|
69 VASSERT_EQ("1", "HEADER\r\n\r\n", extractComponentString(str1, *p1.getHeader()));
|
|
ferencd@0
|
70 VASSERT_EQ("2", "BODY", extractComponentString(str1, *p1.getBody()));
|
|
ferencd@0
|
71
|
|
ferencd@0
|
72 vmime::string str2 = "HEADER\n\nBODY";
|
|
ferencd@0
|
73 vmime::bodyPart p2;
|
|
ferencd@0
|
74 p2.parse(str2);
|
|
ferencd@0
|
75
|
|
ferencd@0
|
76 VASSERT_EQ("3", "HEADER\n\n", extractComponentString(str2, *p2.getHeader()));
|
|
ferencd@0
|
77 VASSERT_EQ("4", "BODY", extractComponentString(str2, *p2.getBody()));
|
|
ferencd@0
|
78
|
|
ferencd@0
|
79 vmime::string str3 = "HEADER\r\n\nBODY";
|
|
ferencd@0
|
80 vmime::bodyPart p3;
|
|
ferencd@0
|
81 p3.parse(str3);
|
|
ferencd@0
|
82
|
|
ferencd@0
|
83 VASSERT_EQ("5", "HEADER\r\n\n", extractComponentString(str3, *p3.getHeader()));
|
|
ferencd@0
|
84 VASSERT_EQ("6", "BODY", extractComponentString(str3, *p3.getBody()));
|
|
ferencd@0
|
85 }
|
|
ferencd@0
|
86
|
|
ferencd@0
|
87 void testParseMissingLastBoundary()
|
|
ferencd@0
|
88 {
|
|
ferencd@0
|
89 vmime::string str =
|
|
ferencd@0
|
90 "Content-Type: multipart/mixed; boundary=\"MY-BOUNDARY\""
|
|
ferencd@0
|
91 "\r\n\r\n"
|
|
ferencd@0
|
92 "--MY-BOUNDARY\r\nHEADER1\r\n\r\nBODY1\r\n"
|
|
ferencd@0
|
93 "--MY-BOUNDARY\r\nHEADER2\r\n\r\nBODY2";
|
|
ferencd@0
|
94
|
|
ferencd@0
|
95 vmime::bodyPart p;
|
|
ferencd@0
|
96 p.parse(str);
|
|
ferencd@0
|
97
|
|
ferencd@0
|
98 VASSERT_EQ("count", 2, p.getBody()->getPartCount());
|
|
ferencd@0
|
99
|
|
ferencd@0
|
100 VASSERT_EQ("part1-body", "BODY1", extractContents(p.getBody()->getPartAt(0)->getBody()->getContents()));
|
|
ferencd@0
|
101 VASSERT_EQ("part2-body", "BODY2", extractContents(p.getBody()->getPartAt(1)->getBody()->getContents()));
|
|
ferencd@0
|
102 }
|
|
ferencd@0
|
103
|
|
ferencd@0
|
104 void testGenerate()
|
|
ferencd@0
|
105 {
|
|
ferencd@0
|
106 vmime::bodyPart p1;
|
|
ferencd@0
|
107 p1.getHeader()->getField("Foo")->setValue(vmime::string("bar"));
|
|
ferencd@0
|
108 p1.getBody()->setContents(vmime::make_shared <vmime::stringContentHandler>("Baz"));
|
|
ferencd@0
|
109
|
|
ferencd@0
|
110 VASSERT_EQ("1", "Foo: bar\r\n\r\nBaz", p1.generate());
|
|
ferencd@0
|
111 }
|
|
ferencd@0
|
112
|
|
ferencd@0
|
113 void testPrologEpilog()
|
|
ferencd@0
|
114 {
|
|
ferencd@0
|
115 const char testMail[] =
|
|
ferencd@0
|
116 "To: test@vmime.org\r\n"
|
|
ferencd@0
|
117 "From: test@vmime.org\r\n"
|
|
ferencd@0
|
118 "Subject: Prolog and epilog test\r\n"
|
|
ferencd@0
|
119 "Content-Type: multipart/mixed; \r\n"
|
|
ferencd@0
|
120 " boundary=\"=_boundary\"\r\n"
|
|
ferencd@0
|
121 "\r\n"
|
|
ferencd@0
|
122 "Prolog text\r\n"
|
|
ferencd@0
|
123 "--=_boundary\r\n"
|
|
ferencd@0
|
124 "Content-Type: text/plain\r\n"
|
|
ferencd@0
|
125 "\r\n"
|
|
ferencd@0
|
126 "Part1\r\n"
|
|
ferencd@0
|
127 "--=_boundary--\r\n"
|
|
ferencd@0
|
128 "Epilog text";
|
|
ferencd@0
|
129
|
|
ferencd@0
|
130 vmime::bodyPart part;
|
|
ferencd@0
|
131 part.parse(testMail);
|
|
ferencd@0
|
132
|
|
ferencd@0
|
133 VASSERT_EQ("prolog", "Prolog text", part.getBody()->getPrologText());
|
|
ferencd@0
|
134 VASSERT_EQ("epilog", "Epilog text", part.getBody()->getEpilogText());
|
|
ferencd@0
|
135 }
|
|
ferencd@0
|
136
|
|
ferencd@0
|
137 // Test for bug fix: prolog should not be encoded
|
|
ferencd@0
|
138 // http://sourceforge.net/tracker/?func=detail&atid=525568&aid=3174903&group_id=69724
|
|
ferencd@0
|
139 void testPrologEncoding()
|
|
ferencd@0
|
140 {
|
|
ferencd@0
|
141 const char testmail[] =
|
|
ferencd@0
|
142 "To: test@vmime.org\r\n"
|
|
ferencd@0
|
143 "From: test@vmime.org\r\n"
|
|
ferencd@0
|
144 "Subject: Prolog encoding test\r\n"
|
|
ferencd@0
|
145 "Content-Type: multipart/mixed; \r\n"
|
|
ferencd@0
|
146 " boundary=\"=_+ZWjySayKqSf2CyrfnNpaAcO6-G1HpoXdHZ4YyswAWqEY39Q\"\r\n"
|
|
ferencd@0
|
147 "\r\n"
|
|
ferencd@0
|
148 "This is a multi-part message in MIME format. Your mail reader does not\r\n"
|
|
ferencd@0
|
149 "understand MIME message format.\r\n"
|
|
ferencd@0
|
150 "--=_+ZWjySayKqSf2CyrfnNpaAcO6-G1HpoXdHZ4YyswAWqEY39Q\r\n"
|
|
ferencd@0
|
151 "Content-Type: text/html; charset=windows-1251\r\n"
|
|
ferencd@0
|
152 "Content-Transfer-Encoding: quoted-printable\r\n"
|
|
ferencd@0
|
153 "\r\n"
|
|
ferencd@0
|
154 "=DD=F2=EE =F2=E5=EA=F1=F2=EE=E2=E0=FF =F7=E0=F1=F2=FC =F1=EB=EE=E6=ED=EE=E3=\r\n"
|
|
ferencd@0
|
155 "=EE =F1=EE=EE=E1=F9=E5=ED=E8=FF\r\n"
|
|
ferencd@0
|
156 "--=_+ZWjySayKqSf2CyrfnNpaAcO6-G1HpoXdHZ4YyswAWqEY39Q\r\n"
|
|
ferencd@0
|
157 "Content-Type: application/octet-stream; charset=windows-1251\r\n"
|
|
ferencd@0
|
158 "Content-Disposition: attachment; filename=FNS.zip\r\n"
|
|
ferencd@0
|
159 "Content-Transfer-Encoding: base64\r\n"
|
|
ferencd@0
|
160 "\r\n"
|
|
ferencd@0
|
161 "UEsDBB...snap...EEAAAAAA==\r\n"
|
|
ferencd@0
|
162 "--=_+ZWjySayKqSf2CyrfnNpaAcO6-G1HpoXdHZ4YyswAWqEY39Q--\r\n"
|
|
ferencd@0
|
163 "Epilog text";
|
|
ferencd@0
|
164
|
|
ferencd@0
|
165 vmime::shared_ptr<vmime::message> msg = vmime::make_shared<vmime::message>();
|
|
ferencd@0
|
166
|
|
ferencd@0
|
167 std::string istr(testmail);
|
|
ferencd@0
|
168
|
|
ferencd@0
|
169 std::string ostr;
|
|
ferencd@0
|
170 vmime::utility::outputStreamStringAdapter out(ostr);
|
|
ferencd@0
|
171
|
|
ferencd@0
|
172 for (int i = 0 ; i < 10 ; ++i)
|
|
ferencd@0
|
173 {
|
|
ferencd@0
|
174 ostr.clear();
|
|
ferencd@0
|
175
|
|
ferencd@0
|
176 msg->parse(istr);
|
|
ferencd@0
|
177 msg->generate(out);
|
|
ferencd@0
|
178
|
|
ferencd@0
|
179 istr = ostr;
|
|
ferencd@0
|
180 }
|
|
ferencd@0
|
181
|
|
ferencd@0
|
182 VASSERT_EQ("prolog", "This is a multi-part message in MIME format. Your mail reader"
|
|
ferencd@0
|
183 " does not understand MIME message format.", msg->getBody()->getPrologText());
|
|
ferencd@0
|
184 VASSERT_EQ("epilog", "Epilog text", msg->getBody()->getEpilogText());
|
|
ferencd@0
|
185 }
|
|
ferencd@0
|
186
|
|
ferencd@0
|
187 void testSuccessiveBoundaries()
|
|
ferencd@0
|
188 {
|
|
ferencd@0
|
189 vmime::string str =
|
|
ferencd@0
|
190 "Content-Type: multipart/mixed; boundary=\"MY-BOUNDARY\""
|
|
ferencd@0
|
191 "\r\n\r\n"
|
|
ferencd@0
|
192 "--MY-BOUNDARY\r\nHEADER1\r\n\r\nBODY1\r\n"
|
|
ferencd@0
|
193 "--MY-BOUNDARY\r\n"
|
|
ferencd@0
|
194 "--MY-BOUNDARY--\r\n";
|
|
ferencd@0
|
195
|
|
ferencd@0
|
196 vmime::bodyPart p;
|
|
ferencd@0
|
197 p.parse(str);
|
|
ferencd@0
|
198
|
|
ferencd@0
|
199 VASSERT_EQ("count", 2, p.getBody()->getPartCount());
|
|
ferencd@0
|
200
|
|
ferencd@0
|
201 VASSERT_EQ("part1-body", "BODY1", extractContents(p.getBody()->getPartAt(0)->getBody()->getContents()));
|
|
ferencd@0
|
202 VASSERT_EQ("part2-body", "", extractContents(p.getBody()->getPartAt(1)->getBody()->getContents()));
|
|
ferencd@0
|
203 }
|
|
ferencd@0
|
204
|
|
ferencd@0
|
205 void testTransportPaddingInBoundary()
|
|
ferencd@0
|
206 {
|
|
ferencd@0
|
207 vmime::string str =
|
|
ferencd@0
|
208 "Content-Type: multipart/mixed; boundary=\"MY-BOUNDARY\""
|
|
ferencd@0
|
209 "\r\n\r\n"
|
|
ferencd@0
|
210 "-- \t MY-BOUNDARY\r\nHEADER1\r\n\r\nBODY1\r\n"
|
|
ferencd@0
|
211 "--MY-BOUNDARY\r\n"
|
|
ferencd@0
|
212 "-- MY-BOUNDARY--\r\n";
|
|
ferencd@0
|
213
|
|
ferencd@0
|
214 vmime::bodyPart p;
|
|
ferencd@0
|
215 p.parse(str);
|
|
ferencd@0
|
216
|
|
ferencd@0
|
217 VASSERT_EQ("count", 2, p.getBody()->getPartCount());
|
|
ferencd@0
|
218
|
|
ferencd@0
|
219 VASSERT_EQ("part1-body", "BODY1", extractContents(p.getBody()->getPartAt(0)->getBody()->getContents()));
|
|
ferencd@0
|
220 VASSERT_EQ("part2-body", "", extractContents(p.getBody()->getPartAt(1)->getBody()->getContents()));
|
|
ferencd@0
|
221 }
|
|
ferencd@0
|
222
|
|
ferencd@0
|
223 /** Ensure '7bit' encoding is used when body is 7-bit only. */
|
|
ferencd@0
|
224 void testGenerate7bit()
|
|
ferencd@0
|
225 {
|
|
ferencd@0
|
226 vmime::shared_ptr <vmime::plainTextPart> p1 = vmime::make_shared <vmime::plainTextPart>();
|
|
ferencd@0
|
227 p1->setText(vmime::make_shared <vmime::stringContentHandler>("Part1 is US-ASCII only."));
|
|
ferencd@0
|
228
|
|
ferencd@0
|
229 vmime::shared_ptr <vmime::message> msg = vmime::make_shared <vmime::message>();
|
|
ferencd@0
|
230 p1->generateIn(msg, msg);
|
|
ferencd@0
|
231
|
|
ferencd@0
|
232 vmime::shared_ptr <vmime::header> header1 = msg->getBody()->getPartAt(0)->getHeader();
|
|
ferencd@0
|
233 VASSERT_EQ("1", "7bit", header1->ContentTransferEncoding()->getValue()->generate());
|
|
ferencd@0
|
234 }
|
|
ferencd@0
|
235
|
|
ferencd@0
|
236 void testTextUsageForQPEncoding()
|
|
ferencd@0
|
237 {
|
|
ferencd@0
|
238 vmime::shared_ptr <vmime::plainTextPart> part = vmime::make_shared <vmime::plainTextPart>();
|
|
ferencd@0
|
239 part->setText(vmime::make_shared <vmime::stringContentHandler>("Part1-line1\r\nPart1-line2\r\n\x89"));
|
|
ferencd@0
|
240
|
|
ferencd@0
|
241 vmime::shared_ptr <vmime::message> msg = vmime::make_shared <vmime::message>();
|
|
ferencd@0
|
242 part->generateIn(msg, msg);
|
|
ferencd@0
|
243
|
|
ferencd@0
|
244 vmime::shared_ptr <vmime::body> body = msg->getBody()->getPartAt(0)->getBody();
|
|
ferencd@0
|
245 vmime::shared_ptr <vmime::header> header = msg->getBody()->getPartAt(0)->getHeader();
|
|
ferencd@0
|
246
|
|
ferencd@0
|
247 std::ostringstream oss;
|
|
ferencd@0
|
248 vmime::utility::outputStreamAdapter os(oss);
|
|
ferencd@0
|
249 body->generate(os, 80);
|
|
ferencd@0
|
250
|
|
ferencd@0
|
251 VASSERT_EQ("1", "quoted-printable", header->ContentTransferEncoding()->getValue()->generate());
|
|
ferencd@0
|
252
|
|
ferencd@0
|
253 // This should *NOT* be:
|
|
ferencd@0
|
254 // Part1-line1=0D=0APart1-line2=0D=0A=89
|
|
ferencd@0
|
255 VASSERT_EQ("2", "Part1-line1\r\nPart1-line2\r\n=89", oss.str());
|
|
ferencd@0
|
256 }
|
|
ferencd@0
|
257
|
|
ferencd@0
|
258 void testParseGuessBoundary()
|
|
ferencd@0
|
259 {
|
|
ferencd@0
|
260 // Boundary is not specified in "Content-Type" field
|
|
ferencd@0
|
261 // Parser will try to guess it from message contents.
|
|
ferencd@0
|
262
|
|
ferencd@0
|
263 vmime::string str =
|
|
ferencd@0
|
264 "Content-Type: multipart/mixed"
|
|
ferencd@0
|
265 "\r\n\r\n"
|
|
ferencd@0
|
266 "--UNKNOWN-BOUNDARY\r\nHEADER1\r\n\r\nBODY1\r\n"
|
|
ferencd@0
|
267 "--UNKNOWN-BOUNDARY\r\nHEADER2\r\n\r\nBODY2\r\n"
|
|
ferencd@0
|
268 "--UNKNOWN-BOUNDARY--";
|
|
ferencd@0
|
269
|
|
ferencd@0
|
270 vmime::bodyPart p;
|
|
ferencd@0
|
271 p.parse(str);
|
|
ferencd@0
|
272
|
|
ferencd@0
|
273 VASSERT_EQ("count", 2, p.getBody()->getPartCount());
|
|
ferencd@0
|
274
|
|
ferencd@0
|
275 VASSERT_EQ("part1-body", "BODY1", extractContents(p.getBody()->getPartAt(0)->getBody()->getContents()));
|
|
ferencd@0
|
276 VASSERT_EQ("part2-body", "BODY2", extractContents(p.getBody()->getPartAt(1)->getBody()->getContents()));
|
|
ferencd@0
|
277 }
|
|
ferencd@0
|
278
|
|
ferencd@0
|
279 void testParseGuessBoundaryWithTransportPadding()
|
|
ferencd@0
|
280 {
|
|
ferencd@0
|
281 // Boundary is not specified in "Content-Type" field
|
|
ferencd@0
|
282 // Parser will try to guess it from message contents.
|
|
ferencd@0
|
283 // Transport padding white spaces should be ignored.
|
|
ferencd@0
|
284
|
|
ferencd@0
|
285 vmime::string str =
|
|
ferencd@0
|
286 "Content-Type: multipart/mixed"
|
|
ferencd@0
|
287 "\r\n\r\n"
|
|
ferencd@0
|
288 "-- \t UNKNOWN-BOUNDARY\r\nHEADER1\r\n\r\nBODY1\r\n"
|
|
ferencd@0
|
289 "--UNKNOWN-BOUNDARY\r\nHEADER2\r\n\r\nBODY2\r\n"
|
|
ferencd@0
|
290 "--UNKNOWN-BOUNDARY--";
|
|
ferencd@0
|
291
|
|
ferencd@0
|
292 vmime::bodyPart p;
|
|
ferencd@0
|
293 p.parse(str);
|
|
ferencd@0
|
294
|
|
ferencd@0
|
295 VASSERT_EQ("count", 2, p.getBody()->getPartCount());
|
|
ferencd@0
|
296
|
|
ferencd@0
|
297 VASSERT_EQ("part1-body", "BODY1", extractContents(p.getBody()->getPartAt(0)->getBody()->getContents()));
|
|
ferencd@0
|
298 VASSERT_EQ("part2-body", "BODY2", extractContents(p.getBody()->getPartAt(1)->getBody()->getContents()));
|
|
ferencd@0
|
299 }
|
|
ferencd@0
|
300
|
|
ferencd@0
|
301 void testParseVeryBigMessage()
|
|
ferencd@0
|
302 {
|
|
ferencd@0
|
303 // When parsing from a seekable input stream, body contents should not
|
|
ferencd@0
|
304 // be kept in memory in a "stringContentHandler" object. Instead, content
|
|
ferencd@0
|
305 // should be accessible via a "streamContentHandler" object.
|
|
ferencd@0
|
306
|
|
ferencd@0
|
307 static const std::string BODY1_BEGIN = "BEGIN1BEGIN1BEGIN1";
|
|
ferencd@0
|
308 static const std::string BODY1_LINE = "BODY1BODY1BODY1BODY1BODY1BODY1BODY1BODY1BODY1BODY1BODY1BODY1BODY1";
|
|
ferencd@0
|
309 static const std::string BODY1_END = "END1END1";
|
|
ferencd@0
|
310 static const unsigned int BODY1_REPEAT = 35000;
|
|
ferencd@0
|
311 static const unsigned int BODY1_LENGTH =
|
|
ferencd@0
|
312 BODY1_BEGIN.length() + BODY1_LINE.length() * BODY1_REPEAT + BODY1_END.length();
|
|
ferencd@0
|
313
|
|
ferencd@0
|
314 static const std::string BODY2_LINE = "BODY2BODY2BODY2BODY2BODY2BODY2BODY2BODY2BODY2BODY2BODY2BODY2BODY2";
|
|
ferencd@0
|
315 static const unsigned int BODY2_REPEAT = 20000;
|
|
ferencd@0
|
316
|
|
ferencd@0
|
317 std::ostringstream oss;
|
|
ferencd@0
|
318 oss << "Content-Type: multipart/mixed; boundary=\"MY-BOUNDARY\""
|
|
ferencd@0
|
319 << "\r\n\r\n"
|
|
ferencd@0
|
320 << "--MY-BOUNDARY\r\n"
|
|
ferencd@0
|
321 << "HEADER1\r\n"
|
|
ferencd@0
|
322 << "\r\n";
|
|
ferencd@0
|
323
|
|
ferencd@0
|
324 oss << BODY1_BEGIN;
|
|
ferencd@0
|
325
|
|
ferencd@0
|
326 for (unsigned int i = 0 ; i < BODY1_REPEAT ; ++i)
|
|
ferencd@0
|
327 oss << BODY1_LINE;
|
|
ferencd@0
|
328
|
|
ferencd@0
|
329 oss << BODY1_END;
|
|
ferencd@0
|
330
|
|
ferencd@0
|
331 oss << "\r\n"
|
|
ferencd@0
|
332 << "--MY-BOUNDARY\r\n"
|
|
ferencd@0
|
333 << "HEADER2\r\n"
|
|
ferencd@0
|
334 << "\r\n";
|
|
ferencd@0
|
335
|
|
ferencd@0
|
336 for (unsigned int i = 0 ; i < BODY2_REPEAT ; ++i)
|
|
ferencd@0
|
337 oss << BODY2_LINE;
|
|
ferencd@0
|
338
|
|
ferencd@0
|
339 oss << "\r\n"
|
|
ferencd@0
|
340 << "--MY-BOUNDARY--\r\n";
|
|
ferencd@0
|
341
|
|
ferencd@0
|
342 vmime::shared_ptr <vmime::utility::inputStreamStringAdapter> is =
|
|
ferencd@0
|
343 vmime::make_shared <vmime::utility::inputStreamStringAdapter>(oss.str());
|
|
ferencd@0
|
344
|
|
ferencd@0
|
345 vmime::shared_ptr <vmime::message> msg = vmime::make_shared <vmime::message>();
|
|
ferencd@0
|
346 msg->parse(is, oss.str().length());
|
|
ferencd@0
|
347
|
|
ferencd@0
|
348 vmime::shared_ptr <vmime::body> body1 = msg->getBody()->getPartAt(0)->getBody();
|
|
ferencd@0
|
349 vmime::shared_ptr <const vmime::contentHandler> body1Cts = body1->getContents();
|
|
ferencd@0
|
350
|
|
ferencd@0
|
351 vmime::shared_ptr <vmime::body> body2 = msg->getBody()->getPartAt(1)->getBody();
|
|
ferencd@0
|
352 vmime::shared_ptr <const vmime::contentHandler> body2Cts = body2->getContents();
|
|
ferencd@0
|
353
|
|
ferencd@0
|
354 vmime::string body1CtsExtracted;
|
|
ferencd@0
|
355 vmime::utility::outputStreamStringAdapter body1CtsExtractStream(body1CtsExtracted);
|
|
ferencd@0
|
356 body1Cts->extract(body1CtsExtractStream);
|
|
ferencd@0
|
357
|
|
ferencd@0
|
358 VASSERT_EQ("1.1", BODY1_LENGTH, body1Cts->getLength());
|
|
ferencd@0
|
359 VASSERT("1.2", vmime::dynamicCast <const vmime::streamContentHandler>(body1Cts) != NULL);
|
|
ferencd@0
|
360 VASSERT_EQ("1.3", BODY1_LENGTH, body1CtsExtracted.length());
|
|
ferencd@0
|
361 VASSERT_EQ("1.4", BODY1_BEGIN, body1CtsExtracted.substr(0, BODY1_BEGIN.length()));
|
|
ferencd@0
|
362 VASSERT_EQ("1.5", BODY1_END, body1CtsExtracted.substr(BODY1_LENGTH - BODY1_END.length(), BODY1_END.length()));
|
|
ferencd@0
|
363
|
|
ferencd@0
|
364 VASSERT_EQ("2.1", BODY2_LINE.length() * BODY2_REPEAT, body2Cts->getLength());
|
|
ferencd@0
|
365 VASSERT("2.2", vmime::dynamicCast <const vmime::streamContentHandler>(body2Cts) != NULL);
|
|
ferencd@0
|
366 }
|
|
ferencd@0
|
367
|
|
ferencd@0
|
368 VMIME_TEST_SUITE_END
|
|
ferencd@0
|
369
|