source: contrib/MailArchiver/sources/vendor/mime4j/apache-mime4j-0.7-SNAPSHOT-20110327.010440-17/core/src/test/java/org/apache/james/mime4j/stream/MimeEntityTest.java @ 6785

Revision 6785, 28.9 KB checked in by rafaelraymundo, 12 years ago (diff)

Ticket #2946 - Liberado codigo do MailArchiver?. Documentação na subpasta DOCS.

Line 
1/****************************************************************
2 * Licensed to the Apache Software Foundation (ASF) under one   *
3 * or more contributor license agreements.  See the NOTICE file *
4 * distributed with this work for additional information        *
5 * regarding copyright ownership.  The ASF licenses this file   *
6 * to you under the Apache License, Version 2.0 (the            *
7 * "License"); you may not use this file except in compliance   *
8 * with the License.  You may obtain a copy of the License at   *
9 *                                                              *
10 *   http://www.apache.org/licenses/LICENSE-2.0                 *
11 *                                                              *
12 * Unless required by applicable law or agreed to in writing,   *
13 * software distributed under the License is distributed on an  *
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY       *
15 * KIND, either express or implied.  See the License for the    *
16 * specific language governing permissions and limitations      *
17 * under the License.                                           *
18 ****************************************************************/
19
20package org.apache.james.mime4j.stream;
21
22import java.io.ByteArrayInputStream;
23import java.io.IOException;
24
25import junit.framework.TestCase;
26
27import org.apache.commons.io.IOUtils;
28import org.apache.james.mime4j.MimeException;
29import org.apache.james.mime4j.io.BufferedLineReaderInputStream;
30import org.apache.james.mime4j.io.LineNumberInputStream;
31import org.apache.james.mime4j.io.MaxHeaderLengthLimitException;
32import org.apache.james.mime4j.io.MaxHeaderLimitException;
33import org.apache.james.mime4j.io.MaxLineLimitException;
34
35public class MimeEntityTest extends TestCase {
36
37    public void testSimpleEntity() throws Exception {
38        String message =
39            "To: Road Runner <runner@example.org>\r\n" +
40            "From: Wile E. Cayote <wile@example.org>\r\n" +
41            "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" +
42            "Subject: Mail\r\n" +
43            "Content-Type: text/plain\r\n" +
44            "\r\n" +
45            "a very important message";
46        byte[] raw = message.getBytes("US-ASCII");
47        ByteArrayInputStream instream = new ByteArrayInputStream(raw);
48        LineNumberInputStream lineInput = new LineNumberInputStream(instream);
49        BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 12);
50       
51        MimeEntity entity = new MimeEntity(
52                lineInput,
53                rawstream, new DefaultBodyDescriptor());
54       
55       
56        assertEquals(EntityState.T_START_MESSAGE, entity.getState());
57        entity.advance();
58        assertEquals(EntityState.T_START_HEADER, entity.getState());
59        entity.advance();
60        assertEquals(EntityState.T_FIELD, entity.getState());
61        assertEquals("To", entity.getField().getName());
62        assertEquals("Road Runner <runner@example.org>", entity.getField().getBody());
63        entity.advance();
64        assertEquals(EntityState.T_FIELD, entity.getState());
65        assertEquals("From", entity.getField().getName());
66        assertEquals("Wile E. Cayote <wile@example.org>", entity.getField().getBody());
67        entity.advance();
68        assertEquals(EntityState.T_FIELD, entity.getState());
69        assertEquals("Date", entity.getField().getName());
70        assertEquals("Tue, 12 Feb 2008 17:34:09 +0000 (GMT)", entity.getField().getBody());
71        entity.advance();
72        assertEquals(EntityState.T_FIELD, entity.getState());
73        assertEquals("Subject", entity.getField().getName());
74        assertEquals("Mail", entity.getField().getBody());
75        entity.advance();
76        assertEquals(EntityState.T_FIELD, entity.getState());
77        assertEquals("Content-Type", entity.getField().getName());
78        assertEquals("text/plain", entity.getField().getBody());
79        entity.advance();
80        assertEquals(EntityState.T_END_HEADER, entity.getState());
81        try {
82            entity.getField().getName();
83            fail("IllegalStateException should have been thrown");
84        } catch (IllegalStateException expected) {
85        }
86        try {
87            entity.getField().getBody();
88            fail("IllegalStateException should have been thrown");
89        } catch (IllegalStateException expected) {
90        }
91       
92        entity.advance();
93        assertEquals(EntityState.T_BODY, entity.getState());
94        assertEquals("a very important message", IOUtils.toString(entity.getContentStream()));
95        entity.advance();
96        assertEquals(EntityState.T_END_MESSAGE, entity.getState());
97        try {
98            entity.getContentStream();
99            fail("IllegalStateException should have been thrown");
100        } catch (IllegalStateException expected) {
101        }
102        entity.advance();
103        assertEquals(EntityState.T_END_OF_STREAM, entity.getState());
104        try {
105            entity.advance();
106            fail("IllegalStateException should have been thrown");
107        } catch (IllegalStateException expected) {
108        }
109    }
110
111    public void testObsoleteSyntaxEntity() throws Exception {
112        String message =
113            "To         : Road Runner <runner@example.org>\r\n" +
114            "From       : Wile E. Cayote <wile@example.org>\r\n" +
115            "Date       :Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" +
116            "Subject    :Mail\r\n" +
117            "     \r\n" +
118            " with a folded subject \r\n" +
119            "Content-Type: text/plain\r\n" +
120            "\r\n" +
121            "a very important message";
122        byte[] raw = message.getBytes("US-ASCII");
123        ByteArrayInputStream instream = new ByteArrayInputStream(raw);
124        LineNumberInputStream lineInput = new LineNumberInputStream(instream);
125        BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 12);
126       
127        MimeEntity entity = new MimeEntity(
128                lineInput,
129                rawstream, new DefaultBodyDescriptor());
130       
131       
132        assertEquals(EntityState.T_START_MESSAGE, entity.getState());
133        entity.advance();
134        assertEquals(EntityState.T_START_HEADER, entity.getState());
135        entity.advance();
136        assertEquals(EntityState.T_FIELD, entity.getState());
137        assertEquals("To", entity.getField().getName());
138        assertEquals("Road Runner <runner@example.org>", entity.getField().getBody());
139        entity.advance();
140        assertEquals(EntityState.T_FIELD, entity.getState());
141        assertEquals("From", entity.getField().getName());
142        assertEquals("Wile E. Cayote <wile@example.org>", entity.getField().getBody());
143        entity.advance();
144        assertEquals(EntityState.T_FIELD, entity.getState());
145        assertEquals("Date", entity.getField().getName());
146        assertEquals("Tue, 12 Feb 2008 17:34:09 +0000 (GMT)", entity.getField().getBody());
147        entity.advance();
148        assertEquals(EntityState.T_FIELD, entity.getState());
149        assertEquals("Subject", entity.getField().getName());
150        assertEquals("Mail      with a folded subject ", entity.getField().getBody());
151        entity.advance();
152        assertEquals(EntityState.T_FIELD, entity.getState());
153        assertEquals("Content-Type", entity.getField().getName());
154        assertEquals("text/plain", entity.getField().getBody());
155        entity.advance();
156        assertEquals(EntityState.T_END_HEADER, entity.getState());
157        try {
158            entity.getField().getName();
159            fail("IllegalStateException should have been thrown");
160        } catch (IllegalStateException expected) {
161        }
162        try {
163            entity.getField().getBody();
164            fail("IllegalStateException should have been thrown");
165        } catch (IllegalStateException expected) {
166        }
167       
168        entity.advance();
169        assertEquals(EntityState.T_BODY, entity.getState());
170        assertEquals("a very important message", IOUtils.toString(entity.getContentStream()));
171        entity.advance();
172        assertEquals(EntityState.T_END_MESSAGE, entity.getState());
173        try {
174            entity.getContentStream();
175            fail("IllegalStateException should have been thrown");
176        } catch (IllegalStateException expected) {
177        }
178        entity.advance();
179        assertEquals(EntityState.T_END_OF_STREAM, entity.getState());
180        try {
181            entity.advance();
182            fail("IllegalStateException should have been thrown");
183        } catch (IllegalStateException expected) {
184        }
185    }
186
187    public void testMultipartEntity() throws Exception {
188        String message =
189            "To: Road Runner <runner@example.org>\r\n" +
190            "From: Wile E. Cayote <wile@example.org>\r\n" +
191            "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" +
192            "Subject: Mail\r\n" +
193            "Content-Type: multipart/mixed;boundary=1729\r\n" +
194            "\r\n" +
195            "Hello!\r\n" +
196            "--1729\r\n" +
197            "Content-Type: text/plain; charset=US-ASCII\r\n" +
198            "\r\n" +
199            "blah blah blah\r\n" +
200            "--1729\r\n" +
201            "Content-Type: text/plain; charset=US-ASCII\r\n" +
202            "\r\n" +
203            "yada yada yada\r\n" +
204            "--1729--\r\n" +
205            "Goodbye!";
206        byte[] raw = message.getBytes("US-ASCII");
207        ByteArrayInputStream instream = new ByteArrayInputStream(raw);
208        LineNumberInputStream lineInput = new LineNumberInputStream(instream);
209        BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 24);
210       
211        MimeEntity entity = new MimeEntity(
212                lineInput,
213                rawstream, new DefaultBodyDescriptor());
214       
215        assertEquals(EntityState.T_START_MESSAGE, entity.getState());
216        entity.advance();
217        assertEquals(EntityState.T_START_HEADER, entity.getState());
218        entity.advance();
219        assertEquals(EntityState.T_FIELD, entity.getState());
220        assertEquals("To", entity.getField().getName());
221        assertEquals("Road Runner <runner@example.org>", entity.getField().getBody());
222        entity.advance();
223        assertEquals(EntityState.T_FIELD, entity.getState());
224        assertEquals("From", entity.getField().getName());
225        assertEquals("Wile E. Cayote <wile@example.org>", entity.getField().getBody());
226        entity.advance();
227        assertEquals(EntityState.T_FIELD, entity.getState());
228        assertEquals("Date", entity.getField().getName());
229        assertEquals("Tue, 12 Feb 2008 17:34:09 +0000 (GMT)", entity.getField().getBody());
230        entity.advance();
231        assertEquals(EntityState.T_FIELD, entity.getState());
232        assertEquals("Subject", entity.getField().getName());
233        assertEquals("Mail", entity.getField().getBody());
234        entity.advance();
235        assertEquals(EntityState.T_FIELD, entity.getState());
236        assertEquals("Content-Type", entity.getField().getName());
237        assertEquals("multipart/mixed;boundary=1729", entity.getField().getBody());
238        entity.advance();
239        assertEquals(EntityState.T_END_HEADER, entity.getState());
240        entity.advance();
241        assertEquals(EntityState.T_START_MULTIPART, entity.getState());
242        entity.advance();
243        assertEquals(EntityState.T_PREAMBLE, entity.getState());
244        assertEquals("Hello!", IOUtils.toString(entity.getContentStream()));
245       
246        EntityStateMachine p1 = entity.advance();
247        assertNotNull(p1);
248       
249        assertEquals(EntityState.T_START_BODYPART, p1.getState());
250        p1.advance();
251        assertEquals(EntityState.T_START_HEADER, p1.getState());
252        p1.advance();
253        assertEquals(EntityState.T_FIELD, p1.getState());
254        assertEquals("Content-Type", p1.getField().getName());
255        assertEquals("text/plain; charset=US-ASCII", p1.getField().getBody());
256        p1.advance();
257        assertEquals(EntityState.T_END_HEADER, p1.getState());
258        p1.advance();
259        assertEquals(EntityState.T_BODY, p1.getState());
260        assertEquals("blah blah blah", IOUtils.toString(p1.getContentStream()));
261        p1.advance();
262        assertEquals(EntityState.T_END_BODYPART, p1.getState());
263        p1.advance();
264        assertEquals(EntityState.T_END_OF_STREAM, p1.getState());
265
266        EntityStateMachine p2 = entity.advance();
267        assertNotNull(p2);
268       
269        assertEquals(EntityState.T_START_BODYPART, p2.getState());
270        p2.advance();
271        assertEquals(EntityState.T_START_HEADER, p2.getState());
272        p2.advance();
273        assertEquals(EntityState.T_FIELD, p2.getState());
274        assertEquals("Content-Type", p2.getField().getName());
275        assertEquals("text/plain; charset=US-ASCII", p2.getField().getBody());
276        p2.advance();
277        assertEquals(EntityState.T_END_HEADER, p2.getState());
278        p2.advance();
279        assertEquals(EntityState.T_BODY, p2.getState());
280        assertEquals("yada yada yada", IOUtils.toString(p2.getContentStream()));
281        p2.advance();
282        assertEquals(EntityState.T_END_BODYPART, p2.getState());
283        p2.advance();
284        assertEquals(EntityState.T_END_OF_STREAM, p2.getState());
285
286        entity.advance();
287        assertEquals(EntityState.T_EPILOGUE, entity.getState());
288        assertEquals("Goodbye!", IOUtils.toString(entity.getContentStream()));
289        entity.advance();
290        assertEquals(EntityState.T_END_MULTIPART, entity.getState());
291        entity.advance();
292        assertEquals(EntityState.T_END_MESSAGE, entity.getState());
293        entity.advance();
294        assertEquals(EntityState.T_END_OF_STREAM, entity.getState());
295    }
296   
297    public void testRawEntity() throws Exception {
298        String message =
299            "To: Road Runner <runner@example.org>\r\n" +
300            "From: Wile E. Cayote <wile@example.org>\r\n" +
301            "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" +
302            "Subject: Mail\r\n" +
303            "Content-Type: multipart/mixed;boundary=1729\r\n" +
304            "\r\n" +
305            "Hello!\r\n" +
306            "--1729\r\n" +
307            "Content-Type: text/plain; charset=US-ASCII\r\n" +
308            "\r\n" +
309            "blah blah blah\r\n" +
310            "--1729\r\n" +
311            "Content-Type: text/plain; charset=US-ASCII\r\n" +
312            "\r\n" +
313            "yada yada yada\r\n" +
314            "--1729--\r\n" +
315            "Goodbye!";
316        byte[] raw = message.getBytes("US-ASCII");
317        ByteArrayInputStream instream = new ByteArrayInputStream(raw);
318        LineNumberInputStream lineInput = new LineNumberInputStream(instream);
319        BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 24);
320       
321        MimeEntity entity = new MimeEntity(
322                lineInput,
323                rawstream, new DefaultBodyDescriptor());
324       
325        entity.setRecursionMode(RecursionMode.M_RAW);
326       
327        assertEquals(EntityState.T_START_MESSAGE, entity.getState());
328        entity.advance();
329        assertEquals(EntityState.T_START_HEADER, entity.getState());
330        entity.advance();
331        assertEquals(EntityState.T_FIELD, entity.getState());
332        assertEquals("To", entity.getField().getName());
333        assertEquals("Road Runner <runner@example.org>", entity.getField().getBody());
334        entity.advance();
335        assertEquals(EntityState.T_FIELD, entity.getState());
336        assertEquals("From", entity.getField().getName());
337        assertEquals("Wile E. Cayote <wile@example.org>", entity.getField().getBody());
338        entity.advance();
339        assertEquals(EntityState.T_FIELD, entity.getState());
340        assertEquals("Date", entity.getField().getName());
341        assertEquals("Tue, 12 Feb 2008 17:34:09 +0000 (GMT)", entity.getField().getBody());
342        entity.advance();
343        assertEquals(EntityState.T_FIELD, entity.getState());
344        assertEquals("Subject", entity.getField().getName());
345        assertEquals("Mail", entity.getField().getBody());
346        entity.advance();
347        assertEquals(EntityState.T_FIELD, entity.getState());
348        assertEquals("Content-Type", entity.getField().getName());
349        assertEquals("multipart/mixed;boundary=1729", entity.getField().getBody());
350        entity.advance();
351        assertEquals(EntityState.T_END_HEADER, entity.getState());
352        entity.advance();
353        assertEquals(EntityState.T_START_MULTIPART, entity.getState());
354       
355        entity.advance();
356        assertEquals(EntityState.T_PREAMBLE, entity.getState());
357        assertEquals("Hello!", IOUtils.toString(entity.getContentStream()));
358       
359        EntityStateMachine p1 = entity.advance();
360        assertNotNull(p1);
361       
362        assertEquals(EntityState.T_RAW_ENTITY, p1.getState());
363        assertNull(p1.getBodyDescriptor());
364        assertNull(p1.getField());
365        assertEquals(
366                "Content-Type: text/plain; charset=US-ASCII\r\n" +
367                "\r\n" +
368                "blah blah blah", IOUtils.toString(p1.getContentStream()));
369        p1.advance();
370        assertEquals(EntityState.T_END_OF_STREAM, p1.getState());
371
372        EntityStateMachine p2 = entity.advance();
373        assertNotNull(p2);
374       
375        assertEquals(EntityState.T_RAW_ENTITY, p2.getState());
376        assertNull(p2.getBodyDescriptor());
377        assertNull(p2.getField());
378        assertEquals(
379                "Content-Type: text/plain; charset=US-ASCII\r\n" +
380                "\r\n" +
381                "yada yada yada", IOUtils.toString(p2.getContentStream()));
382        p2.advance();
383        assertEquals(EntityState.T_END_OF_STREAM, p2.getState());
384
385        entity.advance();
386        assertEquals(EntityState.T_EPILOGUE, entity.getState());
387        assertEquals("Goodbye!", IOUtils.toString(entity.getContentStream()));
388        entity.advance();
389        assertEquals(EntityState.T_END_MULTIPART, entity.getState());
390        entity.advance();
391        assertEquals(EntityState.T_END_MESSAGE, entity.getState());
392        entity.advance();
393        assertEquals(EntityState.T_END_OF_STREAM, entity.getState());
394    }
395
396    public void testMaxLineLimitCheck() throws Exception {
397        MimeEntityConfig config = new MimeEntityConfig();
398        config.setMaxLineLen(50);
399
400        String message =
401            "To: Road Runner <runner@example.org>\r\n" +
402            "From: Wile E. Cayote <wile@example.org>\r\n" +
403            "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" +
404            "Subject: Mail\r\n" +
405            "DoS: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\r\n" +
406            "Content-Type: text/plain\r\n" +
407            "\r\n" +
408            "a very important message";
409        byte[] raw = message.getBytes("US-ASCII");
410        ByteArrayInputStream instream = new ByteArrayInputStream(raw);
411        LineNumberInputStream lineInput = new LineNumberInputStream(instream);
412        BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 12, config.getMaxLineLen());
413       
414        MimeEntity entity = new MimeEntity(
415                lineInput,
416                rawstream,
417                new DefaultBodyDescriptor(),
418                EntityState.T_START_MESSAGE,
419                EntityState.T_END_MESSAGE,
420                config);
421       
422        assertEquals(EntityState.T_START_MESSAGE, entity.getState());
423        entity.advance(); // advances to T_START_HEADER
424        assertEquals(EntityState.T_START_HEADER, entity.getState());
425        entity.advance(); // reads To: into field buffer, From: into line buffer
426        assertEquals(EntityState.T_FIELD, entity.getState());
427        entity.advance(); // reads Date: into line buffer
428        assertEquals(EntityState.T_FIELD, entity.getState());
429        entity.advance(); // reads Subject: into line buffer
430        assertEquals(EntityState.T_FIELD, entity.getState());
431        try {
432            entity.advance(); // reads DoS: into line buffer
433            fail("MimeException caused by MaxLineLimitException should have been thrown");
434        } catch (MimeException expected) {
435            assertTrue(expected.getCause() instanceof MaxLineLimitException);
436        }
437    }
438   
439    public void testMaxHeaderLimitCheckFoldedLines() throws Exception {
440        String message =
441            "To: Road Runner <runner@example.org>\r\n" +
442            "From: Wile E. Cayote <wile@example.org>\r\n" +
443            "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" +
444            "Subject: Mail\r\n" +
445            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
446            "    xxxxxxxxxxxxxxxxxxxxx\r\n" +
447            "    xxxxxxxxxxxxxxxxxxxxx\r\n" +
448            "    xxxxxxxxxxxxxxxxxxxxx\r\n" +
449            "    xxxxxxxxxxxxxxxxxxxxx\r\n" +
450            "    xxxxxxxxxxxxxxxxxxxxx\r\n" +
451            "    xxxxxxxxxxxxxxxxxxxxx\r\n" +
452            "    xxxxxxxxxxxxxxxxxxxxx\r\n" +
453            "    xxxxxxxxxxxxxxxxxxxxx\r\n" +
454            "    xxxxxxxxxxxxxxxxxxxxx\r\n" +
455            "    xxxxxxxxxxxxxxxxxxxxx\r\n" +
456            "    xxxxxxxxxxxxxxxxxxxxx\r\n" +
457            "Content-Type: text/plain\r\n" +
458            "\r\n" +
459            "a very important message";
460        byte[] raw = message.getBytes("US-ASCII");
461        ByteArrayInputStream instream = new ByteArrayInputStream(raw);
462        LineNumberInputStream lineInput = new LineNumberInputStream(instream);
463        BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 12);
464       
465        MimeEntityConfig config = new MimeEntityConfig();
466        config.setMaxLineLen(100);
467        config.setMaxHeaderLen(200);
468        MimeEntity entity = new MimeEntity(
469                lineInput,
470                rawstream,
471                new DefaultBodyDescriptor(),
472                EntityState.T_START_MESSAGE,
473                EntityState.T_END_MESSAGE,
474                config);
475       
476        assertEquals(EntityState.T_START_MESSAGE, entity.getState());
477        entity.advance();
478        assertEquals(EntityState.T_START_HEADER, entity.getState());
479        entity.advance();
480        assertEquals(EntityState.T_FIELD, entity.getState());
481        entity.advance();
482        assertEquals(EntityState.T_FIELD, entity.getState());
483        entity.advance();
484        assertEquals(EntityState.T_FIELD, entity.getState());
485        entity.advance();
486        assertEquals(EntityState.T_FIELD, entity.getState());
487        try {
488            entity.advance();
489            fail("MimeException caused by MaxLineLimitException should have been thrown");
490        } catch (MaxHeaderLengthLimitException expected) {
491        }
492    }
493
494    public void testMaxHeaderLengthMayExceedMaxLineLength() throws Exception {
495        MimeEntityConfig config = new MimeEntityConfig();
496        config.setMaxLineLen(50);
497        config.setMaxHeaderLen(130);
498
499        String message =
500            "To: Road Runner <runner@example.org>\r\n" +
501            "From: Wile E. Cayote <wile@example.org>\r\n" +
502            "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" +
503            "Subject: Mail\r\n" +
504            "X-LongHeader: xxxxxxxxxxxxxxxxxxxxxxx\r\n" +
505            "    xxxxxxxxxxxxxxxxxxxxxxx\r\n" +
506            "    xxxxxxxxxxxxxxxxxxxxxxx\r\n" +
507            "    xxxxxxxxxxxxxxxxxxxxxxx\r\n" +
508            "Content-Type: text/plain\r\n" +
509            "\r\n" +
510            "a very important message";
511        byte[] raw = message.getBytes("US-ASCII");
512        ByteArrayInputStream instream = new ByteArrayInputStream(raw);
513        LineNumberInputStream lineInput = new LineNumberInputStream(instream);
514        BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 12, config.getMaxLineLen());
515       
516        MimeEntity entity = new MimeEntity(
517                lineInput,
518                rawstream,
519                new DefaultBodyDescriptor(),
520                EntityState.T_START_MESSAGE,
521                EntityState.T_END_MESSAGE,
522                config);
523       
524        assertEquals(EntityState.T_START_MESSAGE, entity.getState());
525        entity.advance();
526        assertEquals(EntityState.T_START_HEADER, entity.getState());
527        for (int i = 0; i < 6; i++) {
528            entity.advance();
529            assertEquals(EntityState.T_FIELD, entity.getState());
530        }
531        entity.advance();
532        assertEquals(EntityState.T_END_HEADER, entity.getState());
533    }
534   
535    public void testMaxHeaderCount() throws Exception {
536        String message =
537            "To: Road Runner <runner@example.org>\r\n" +
538            "From: Wile E. Cayote <wile@example.org>\r\n" +
539            "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" +
540            "Subject: Mail\r\n" +
541            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
542            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
543            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
544            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
545            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
546            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
547            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
548            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
549            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
550            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
551            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
552            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
553            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
554            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
555            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
556            "DoS: xxxxxxxxxxxxxxxxxxxxx\r\n" +
557            "Content-Type: text/plain\r\n" +
558            "\r\n" +
559            "a very important message";
560        byte[] raw = message.getBytes("US-ASCII");
561        ByteArrayInputStream instream = new ByteArrayInputStream(raw);
562        LineNumberInputStream lineInput = new LineNumberInputStream(instream);
563        BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 12);
564       
565        MimeEntityConfig config = new MimeEntityConfig();
566        config.setMaxHeaderCount(20);
567        MimeEntity entity = new MimeEntity(
568                lineInput,
569                rawstream,
570                new DefaultBodyDescriptor(),
571                EntityState.T_START_MESSAGE,
572                EntityState.T_END_MESSAGE,
573                config);
574       
575        assertEquals(EntityState.T_START_MESSAGE, entity.getState());
576        entity.advance();
577        assertEquals(EntityState.T_START_HEADER, entity.getState());
578       
579        for (int i = 0; i < 20; i++) {
580            entity.advance();
581            assertEquals(EntityState.T_FIELD, entity.getState());
582        }
583        try {
584            entity.advance();
585            fail("MaxHeaderLimitException should have been thrown");
586        } catch (MaxHeaderLimitException expected) {
587        }
588    }
589
590    public void testMaxContentLimitCheck() throws Exception {
591        String message =
592            "To: Road Runner <runner@example.org>\r\n" +
593            "From: Wile E. Cayote <wile@example.org>\r\n" +
594            "Date: Tue, 12 Feb 2008 17:34:09 +0000 (GMT)\r\n" +
595            "Subject: Mail\r\n" +
596            "Content-Type: text/plain\r\n" +
597            "\r\n" +
598            "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" +
599            "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" +
600            "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" +
601            "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" +
602            "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" +
603            "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" +
604            "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" +
605            "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" +
606            "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n" +
607            "DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS DoS\r\n";
608        byte[] raw = message.getBytes("US-ASCII");
609        ByteArrayInputStream instream = new ByteArrayInputStream(raw);
610        LineNumberInputStream lineInput = new LineNumberInputStream(instream);
611        BufferedLineReaderInputStream rawstream = new BufferedLineReaderInputStream(lineInput, 12);
612       
613        MimeEntityConfig config = new MimeEntityConfig();
614        config.setMaxContentLen(100);
615        MimeEntity entity = new MimeEntity(
616                lineInput,
617                rawstream,
618                new DefaultBodyDescriptor(),
619                EntityState.T_START_MESSAGE,
620                EntityState.T_END_MESSAGE,
621                config);
622       
623        assertEquals(EntityState.T_START_MESSAGE, entity.getState());
624        entity.advance();
625        assertEquals(EntityState.T_START_HEADER, entity.getState());
626        entity.advance();
627        assertEquals(EntityState.T_FIELD, entity.getState());
628        entity.advance();
629        assertEquals(EntityState.T_FIELD, entity.getState());
630        entity.advance();
631        assertEquals(EntityState.T_FIELD, entity.getState());
632        entity.advance();
633        assertEquals(EntityState.T_FIELD, entity.getState());
634        entity.advance();
635        assertEquals(EntityState.T_FIELD, entity.getState());
636        entity.advance();
637        assertEquals(EntityState.T_END_HEADER, entity.getState());
638        entity.advance();
639        assertEquals(EntityState.T_BODY, entity.getState());
640        try {
641            IOUtils.toByteArray(entity.getContentStream());
642            fail("IOException should have been thrown");
643        } catch (IOException expected) {
644        }
645    }
646   
647}
Note: See TracBrowser for help on using the repository browser.