1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.hc.core5.http.impl.io;
29
30 import java.io.ByteArrayInputStream;
31 import java.io.ByteArrayOutputStream;
32 import java.io.IOException;
33 import java.io.InputStream;
34 import java.nio.charset.StandardCharsets;
35
36 import org.apache.hc.core5.http.ConnectionClosedException;
37 import org.apache.hc.core5.http.StreamClosedException;
38 import org.apache.hc.core5.http.io.SessionInputBuffer;
39 import org.junit.Assert;
40 import org.junit.Test;
41
42 public class TestContentLengthInputStream {
43
44 @Test
45 public void testBasics() throws IOException {
46 final String s = "1234567890123456";
47 final ByteArrayInputStream inputStream = new ByteArrayInputStream(s.getBytes(StandardCharsets.ISO_8859_1));
48 final SessionInputBuffer inBuffer = new SessionInputBufferImpl(16);
49 final InputStream in = new ContentLengthInputStream(inBuffer, inputStream, 10L);
50 final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
51
52 final byte[] buffer = new byte[50];
53 int len = in.read(buffer, 0, 2);
54 outputStream.write(buffer, 0, len);
55 len = in.read(buffer);
56 outputStream.write(buffer, 0, len);
57
58 final String result = new String(outputStream.toByteArray(), StandardCharsets.ISO_8859_1);
59 Assert.assertEquals(result, "1234567890");
60 in.close();
61 }
62
63 @Test
64 public void testSkip() throws IOException {
65 final ByteArrayInputStream inputStream1 = new ByteArrayInputStream(new byte[20]);
66 final SessionInputBuffer inBuffer1 = new SessionInputBufferImpl(16);
67 final InputStream in1 = new ContentLengthInputStream(inBuffer1, inputStream1, 10L);
68 Assert.assertEquals(10, in1.skip(10));
69 Assert.assertTrue(in1.read() == -1);
70 in1.close();
71
72 final ByteArrayInputStream inputStream2 = new ByteArrayInputStream(new byte[20]);
73 final SessionInputBuffer inBuffer2 = new SessionInputBufferImpl(16);
74 final InputStream in2 = new ContentLengthInputStream(inBuffer2, inputStream2, 10L);
75 in2.read();
76 Assert.assertEquals(9, in2.skip(10));
77 Assert.assertTrue(in2.read() == -1);
78 in2.close();
79
80 final ByteArrayInputStream inputStream3 = new ByteArrayInputStream(new byte[20]);
81 final SessionInputBuffer inBuffer3 = new SessionInputBufferImpl(16);
82 final InputStream in3 = new ContentLengthInputStream(inBuffer3, inputStream3, 2L);
83 in3.read();
84 in3.read();
85 Assert.assertTrue(in3.skip(10) <= 0);
86 Assert.assertTrue(in3.skip(-1) == 0);
87 Assert.assertTrue(in3.read() == -1);
88 in3.close();
89
90 final ByteArrayInputStream inputStream4 = new ByteArrayInputStream(new byte[20]);
91 final SessionInputBuffer inBuffer4 = new SessionInputBufferImpl(16);
92 final InputStream in4 = new ContentLengthInputStream(inBuffer4, inputStream4, 10L);
93 Assert.assertEquals(5,in4.skip(5));
94 Assert.assertEquals(5, in4.read(new byte[20]));
95 in4.close();
96 }
97
98 @Test
99 public void testAvailable() throws IOException {
100 final ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[] {1, 2, 3});
101 final SessionInputBuffer inBuffer = new SessionInputBufferImpl(16);
102 final InputStream in = new ContentLengthInputStream(inBuffer, inputStream, 3L);
103 Assert.assertEquals(0, in.available());
104 in.read();
105 Assert.assertEquals(2, in.available());
106 in.close();
107 }
108
109 @Test
110 public void testClose() throws IOException {
111 final String s = "1234567890123456-";
112 final ByteArrayInputStream inputStream = new ByteArrayInputStream(s.getBytes(StandardCharsets.ISO_8859_1));
113 final SessionInputBuffer inBuffer = new SessionInputBufferImpl(16);
114 final InputStream in = new ContentLengthInputStream(inBuffer, inputStream, 16L);
115
116 in.close();
117 in.close();
118 try {
119 in.read();
120 Assert.fail("StreamClosedException expected");
121 } catch (final StreamClosedException expected) {
122 }
123 final byte[] tmp = new byte[10];
124 try {
125 in.read(tmp);
126 Assert.fail("StreamClosedException expected");
127 } catch (final StreamClosedException expected) {
128 }
129 try {
130 in.read(tmp, 0, tmp.length);
131 Assert.fail("StreamClosedException expected");
132 } catch (final StreamClosedException expected) {
133 }
134 Assert.assertEquals('-', inBuffer.read(inputStream));
135 }
136
137 @Test
138 public void testTruncatedContent() throws IOException {
139 final String s = "1234567890123456";
140 final ByteArrayInputStream inputStream = new ByteArrayInputStream(s.getBytes(StandardCharsets.ISO_8859_1));
141 final SessionInputBuffer inBuffer = new SessionInputBufferImpl(16);
142 final InputStream in = new ContentLengthInputStream(inBuffer, inputStream, 32L);
143
144 final byte[] tmp = new byte[32];
145 final int byteRead = in.read(tmp);
146 Assert.assertEquals(16, byteRead);
147 try {
148 in.read(tmp);
149 Assert.fail("ConnectionClosedException should have been closed");
150 } catch (final ConnectionClosedException ex) {
151 }
152 try {
153 in.read();
154 Assert.fail("ConnectionClosedException should have been closed");
155 } catch (final ConnectionClosedException ex) {
156 }
157 try {
158 in.close();
159 Assert.fail("ConnectionClosedException should have been closed");
160 } catch (final ConnectionClosedException ex) {
161 }
162 }
163
164 }
165