1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.james.mime4j.parser;
21
22 import java.io.ByteArrayInputStream;
23 import java.io.IOException;
24 import java.io.InputStream;
25 import java.io.Reader;
26
27 import org.apache.commons.io.IOUtils;
28 import org.apache.james.mime4j.ExampleMail;
29 import org.apache.james.mime4j.MimeException;
30 import org.apache.james.mime4j.parser.MimeTokenStream;
31
32 import junit.framework.TestCase;
33
34 public class MimeTokenStreamReaderTest extends TestCase {
35
36 MimeTokenStream parser;
37
38 @Override
39 protected void setUp() throws Exception {
40 super.setUp();
41 parser = new MimeTokenStream();
42 }
43
44 @Override
45 protected void tearDown() throws Exception {
46 super.tearDown();
47 }
48
49 public void testShouldReadSimpleBody() throws Exception {
50 byte[] bytes = ExampleMail.RFC822_SIMPLE_BYTES;
51 String body = ExampleMail.RFC822_SIMPLE_BODY;
52 checkSimpleMail(bytes, body, 4);
53 }
54
55 public void testShouldReadOnePartMimeASCIIBody() throws Exception {
56 byte[] bytes = ExampleMail.ONE_PART_MIME_ASCII_BYTES;
57 String body = ExampleMail.ONE_PART_MIME_ASCII_BODY;
58 checkSimpleMail(bytes, body, 11);
59 }
60
61 public void testShouldReadOnePartMime8859Body() throws Exception {
62 byte[] bytes = ExampleMail.ONE_PART_MIME_8859_BYTES;
63 String body = ExampleMail.ONE_PART_MIME_8859_BODY;
64 checkSimpleMail(bytes, body, 13);
65 }
66
67 public void testShouldReadOnePartMimeBase64ASCIIBody() throws Exception {
68 byte[] bytes = ExampleMail.ONE_PART_MIME_BASE64_ASCII_BYTES;
69 String body = ExampleMail.ONE_PART_MIME_BASE64_ASCII_BODY;
70 checkSimpleMail(bytes, body, 11);
71 }
72
73 public void testShouldReadOnePartMimeBase64Latin1Body() throws Exception {
74 byte[] bytes = ExampleMail.ONE_PART_MIME_BASE64_LATIN1_BYTES;
75 String body = ExampleMail.ONE_PART_MIME_BASE64_LATIN1_BODY;
76 checkSimpleMail(bytes, body, 11);
77 }
78
79 public void testShouldReadOnePartMimeQuotedPrintable() throws Exception {
80 byte[] bytes = ExampleMail.ONE_PART_MIME_QUOTED_PRINTABLE_ASCII_BYTES;
81 String body = ExampleMail.ONE_PART_MIME_QUOTED_PRINTABLE_ASCII_BODY;
82 checkSimpleMail(bytes, body, 11);
83 }
84
85 public void testShouldReadPartBodies() throws IOException, MimeException {
86 InputStream in = new ByteArrayInputStream(ExampleMail.MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_BYTES);
87 parser.parse(in);
88 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_START_HEADER),MimeTokenStream.stateToString(parser.next()));
89 for (int i=0;i<5;i++) {
90 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_FIELD),MimeTokenStream.stateToString(parser.next()));
91 }
92 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_END_HEADER),MimeTokenStream.stateToString(parser.next()));
93 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_START_MULTIPART),MimeTokenStream.stateToString(parser.next()));
94 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_PREAMBLE),MimeTokenStream.stateToString(parser.next()));
95 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_START_BODYPART),MimeTokenStream.stateToString(parser.next()));
96 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_START_HEADER),MimeTokenStream.stateToString(parser.next()));
97 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_FIELD),MimeTokenStream.stateToString(parser.next()));
98 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_FIELD),MimeTokenStream.stateToString(parser.next()));
99 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_END_HEADER),MimeTokenStream.stateToString(parser.next()));
100 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_BODY),MimeTokenStream.stateToString(parser.next()));
101 checkBody(ExampleMail.MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_7BIT);
102 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_END_BODYPART),MimeTokenStream.stateToString(parser.next()));
103 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_START_BODYPART),MimeTokenStream.stateToString(parser.next()));
104 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_START_HEADER),MimeTokenStream.stateToString(parser.next()));
105 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_FIELD),MimeTokenStream.stateToString(parser.next()));
106 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_FIELD),MimeTokenStream.stateToString(parser.next()));
107 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_END_HEADER),MimeTokenStream.stateToString(parser.next()));
108 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_BODY),MimeTokenStream.stateToString(parser.next()));
109 checkBody(ExampleMail.MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_QUOTED_PRINTABLE);
110 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_END_BODYPART),MimeTokenStream.stateToString(parser.next()));
111 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_START_BODYPART),MimeTokenStream.stateToString(parser.next()));
112 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_START_HEADER),MimeTokenStream.stateToString(parser.next()));
113 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_FIELD),MimeTokenStream.stateToString(parser.next()));
114 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_FIELD),MimeTokenStream.stateToString(parser.next()));
115 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_END_HEADER),MimeTokenStream.stateToString(parser.next()));
116 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_BODY),MimeTokenStream.stateToString(parser.next()));
117 checkBody(ExampleMail.MIME_MIXED_MULTIPART_VARIOUS_ENCODINGS_BASE64);
118 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_END_BODYPART),MimeTokenStream.stateToString(parser.next()));
119
120
121 }
122
123 private void checkSimpleMail(byte[] bytes, String body, int fields) throws IOException, MimeException {
124 InputStream in = new ByteArrayInputStream(bytes);
125 parser.parse(in);
126 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_START_HEADER),MimeTokenStream.stateToString(parser.next()));
127 for (int i=0;i<fields;i++) {
128 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_FIELD),MimeTokenStream.stateToString(parser.next()));
129 }
130 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_END_HEADER),MimeTokenStream.stateToString(parser.next()));
131 assertEquals(MimeTokenStream.stateToString(MimeTokenStream.T_BODY),MimeTokenStream.stateToString(parser.next()));
132 checkBody(body);
133 }
134
135 private void checkBody(String body) throws IOException {
136 Reader reader = parser.getReader();
137 assertNotNull(reader);
138 assertEquals(body, IOUtils.toString(reader));
139 }
140 }