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.io;
21
22 import org.apache.james.mime4j.io.BufferedLineReaderInputStream;
23 import org.apache.james.mime4j.io.LineReaderInputStream;
24 import org.apache.james.mime4j.io.MaxLineLimitException;
25 import org.apache.james.mime4j.util.ByteArrayBuffer;
26
27 import java.io.ByteArrayInputStream;
28 import java.io.ByteArrayOutputStream;
29
30 import junit.framework.TestCase;
31
32 public class BufferedLineReaderInputStreamTest extends TestCase {
33
34 public void testBasicOperations() throws Exception {
35 String text = "ah blahblah";
36 byte[] b1 = text.getBytes("US-ASCII");
37 BufferedLineReaderInputStream instream = new BufferedLineReaderInputStream(new ByteArrayInputStream(b1), 4096);
38
39 assertEquals((byte)'a', instream.read());
40 assertEquals((byte)'h', instream.read());
41 assertEquals((byte)' ', instream.read());
42
43 byte[] tmp1 = new byte[4];
44 assertEquals(4, instream.read(tmp1));
45 assertEquals(4, instream.read(tmp1));
46
47 assertEquals(-1, instream.read(tmp1));
48 assertEquals(-1, instream.read(tmp1));
49 assertEquals(-1, instream.read());
50 assertEquals(-1, instream.read());
51 }
52
53 public void testBasicReadLine() throws Exception {
54
55 String[] teststrs = new String[5];
56 teststrs[0] = "Hello\r\n";
57 teststrs[1] = "This string should be much longer than the size of the input buffer " +
58 "which is only 16 bytes for this test\r\n";
59 StringBuilder sb = new StringBuilder();
60 for (int i = 0; i < 15; i++) {
61 sb.append("123456789 ");
62 }
63 sb.append("and stuff like that\r\n");
64 teststrs[2] = sb.toString();
65 teststrs[3] = "\r\n";
66 teststrs[4] = "And goodbye\r\n";
67
68 ByteArrayOutputStream outstream = new ByteArrayOutputStream();
69
70 for (String teststr : teststrs) {
71 outstream.write(teststr.getBytes("US-ASCII"));
72 }
73 byte[] raw = outstream.toByteArray();
74
75 BufferedLineReaderInputStream instream = new BufferedLineReaderInputStream(new ByteArrayInputStream(raw), 16);
76
77 ByteArrayBuffer linebuf = new ByteArrayBuffer(8);
78 for (String teststr : teststrs) {
79 linebuf.clear();
80 instream.readLine(linebuf);
81 String s = new String(linebuf.toByteArray(), "US-ASCII");
82 assertEquals(teststr, s);
83 }
84 assertEquals(-1, instream.readLine(linebuf));
85 assertEquals(-1, instream.readLine(linebuf));
86 }
87
88 public void testReadEmptyLine() throws Exception {
89
90 String teststr = "\n\n\r\n\r\r\n\n\n\n\n\n";
91 byte[] raw = teststr.getBytes("US-ASCII");
92
93 LineReaderInputStream instream = new BufferedLineReaderInputStream(new ByteArrayInputStream(raw), 4);
94
95 ByteArrayBuffer linebuf = new ByteArrayBuffer(8);
96 linebuf.clear();
97 instream.readLine(linebuf);
98 String s = new String(linebuf.toByteArray(), "US-ASCII");
99 assertEquals("\n", s);
100
101 linebuf.clear();
102 instream.readLine(linebuf);
103 s = new String(linebuf.toByteArray(), "US-ASCII");
104 assertEquals("\n", s);
105
106 linebuf.clear();
107 instream.readLine(linebuf);
108 s = new String(linebuf.toByteArray(), "US-ASCII");
109 assertEquals("\r\n", s);
110
111 linebuf.clear();
112 instream.readLine(linebuf);
113 s = new String(linebuf.toByteArray(), "US-ASCII");
114 assertEquals("\r\r\n", s);
115
116 linebuf.clear();
117 instream.readLine(linebuf);
118 s = new String(linebuf.toByteArray(), "US-ASCII");
119 assertEquals("\n", s);
120
121 linebuf.clear();
122 instream.readLine(linebuf);
123 s = new String(linebuf.toByteArray(), "US-ASCII");
124 assertEquals("\n", s);
125
126 linebuf.clear();
127 instream.readLine(linebuf);
128 s = new String(linebuf.toByteArray(), "US-ASCII");
129 assertEquals("\n", s);
130
131 linebuf.clear();
132 instream.readLine(linebuf);
133 s = new String(linebuf.toByteArray(), "US-ASCII");
134 assertEquals("\n", s);
135
136 linebuf.clear();
137 instream.readLine(linebuf);
138 s = new String(linebuf.toByteArray(), "US-ASCII");
139 assertEquals("\n", s);
140
141 assertEquals(-1, instream.readLine(linebuf));
142 assertEquals(-1, instream.readLine(linebuf));
143 }
144
145 public void testReadEmptyLineMaxLimit() throws Exception {
146
147 String teststr = "1234567890\r\n";
148 byte[] raw = teststr.getBytes("US-ASCII");
149
150 LineReaderInputStream instream1 = new BufferedLineReaderInputStream(
151 new ByteArrayInputStream(raw), 1024, 13);
152 ByteArrayBuffer linebuf = new ByteArrayBuffer(8);
153 linebuf.clear();
154 instream1.readLine(linebuf);
155
156 LineReaderInputStream instream2 = new BufferedLineReaderInputStream(
157 new ByteArrayInputStream(raw), 1024, 12);
158 linebuf.clear();
159 try {
160 instream2.readLine(linebuf);
161 fail("MaxLineLimitException should have been thrown");
162 } catch (MaxLineLimitException ex) {
163 }
164 }
165
166 }