View Javadoc
1   /*
2    * ====================================================================
3    * Licensed to the Apache Software Foundation (ASF) under one
4    * or more contributor license agreements.  See the NOTICE file
5    * distributed with this work for additional information
6    * regarding copyright ownership.  The ASF licenses this file
7    * to you under the Apache License, Version 2.0 (the
8    * "License"); you may not use this file except in compliance
9    * with the License.  You may obtain a copy of the License at
10   *
11   *   http://www.apache.org/licenses/LICENSE-2.0
12   *
13   * Unless required by applicable law or agreed to in writing,
14   * software distributed under the License is distributed on an
15   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16   * KIND, either express or implied.  See the License for the
17   * specific language governing permissions and limitations
18   * under the License.
19   * ====================================================================
20   *
21   * This software consists of voluntary contributions made by many
22   * individuals on behalf of the Apache Software Foundation.  For more
23   * information on the Apache Software Foundation, please see
24   * <http://www.apache.org/>.
25   *
26   */
27  
28  package org.apache.http.impl.io;
29  
30  import java.io.ByteArrayOutputStream;
31  import java.nio.charset.CharacterCodingException;
32  import java.nio.charset.CharsetDecoder;
33  import java.nio.charset.CharsetEncoder;
34  import java.nio.charset.CodingErrorAction;
35  
36  import org.apache.http.Consts;
37  import org.apache.http.MessageConstraintException;
38  import org.apache.http.config.MessageConstraints;
39  import org.apache.http.impl.SessionInputBufferMock;
40  import org.apache.http.impl.SessionOutputBufferMock;
41  import org.apache.http.io.HttpTransportMetrics;
42  import org.apache.http.util.CharArrayBuffer;
43  import org.junit.Assert;
44  import org.junit.Test;
45  import org.mockito.Matchers;
46  import org.mockito.Mockito;
47  
48  public class TestSessionInOutBuffers {
49  
50      @Test
51      public void testBasicBufferProperties() throws Exception {
52          final SessionInputBufferMock.html#SessionInputBufferMock">SessionInputBufferMock inBuffer = new SessionInputBufferMock(new byte[] { 1, 2 , 3});
53          Assert.assertEquals(SessionInputBufferMock.BUFFER_SIZE, inBuffer.capacity());
54          Assert.assertEquals(SessionInputBufferMock.BUFFER_SIZE, inBuffer.available());
55          Assert.assertEquals(0, inBuffer.length());
56          inBuffer.read();
57          Assert.assertEquals(SessionInputBufferMock.BUFFER_SIZE - 2, inBuffer.available());
58          Assert.assertEquals(2, inBuffer.length());
59  
60          final SessionOutputBufferMockhtml#SessionOutputBufferMock">SessionOutputBufferMock outbuffer = new SessionOutputBufferMock();
61          Assert.assertEquals(SessionOutputBufferMock.BUFFER_SIZE, outbuffer.capacity());
62          Assert.assertEquals(SessionOutputBufferMock.BUFFER_SIZE, outbuffer.available());
63          Assert.assertEquals(0, outbuffer.length());
64          outbuffer.write(new byte[] {1, 2, 3});
65          Assert.assertEquals(SessionOutputBufferMock.BUFFER_SIZE - 3, outbuffer.available());
66          Assert.assertEquals(3, outbuffer.length());
67      }
68  
69      @Test
70      public void testBasicReadWriteLine() throws Exception {
71  
72          final String[] teststrs = new String[5];
73          teststrs[0] = "Hello";
74          teststrs[1] = "This string should be much longer than the size of the output buffer " +
75                  "which is only 16 bytes for this test";
76          final StringBuilder buffer = new StringBuilder();
77          for (int i = 0; i < 15; i++) {
78              buffer.append("123456789 ");
79          }
80          buffer.append("and stuff like that");
81          teststrs[2] = buffer.toString();
82          teststrs[3] = "";
83          teststrs[4] = "And goodbye";
84  
85          final CharArrayBuffer chbuffer = new CharArrayBuffer(16);
86          final SessionOutputBufferMockhtml#SessionOutputBufferMock">SessionOutputBufferMock outbuffer = new SessionOutputBufferMock();
87          for (final String teststr : teststrs) {
88              chbuffer.clear();
89              chbuffer.append(teststr);
90              outbuffer.writeLine(chbuffer);
91          }
92          //these write operations should have no effect
93          outbuffer.writeLine((String)null);
94          outbuffer.writeLine((CharArrayBuffer)null);
95          outbuffer.flush();
96  
97          HttpTransportMetrics tmetrics = outbuffer.getMetrics();
98          final long bytesWritten = tmetrics.getBytesTransferred();
99          long expected = 0;
100         for (final String teststr : teststrs) {
101             expected += (teststr.length() + 2/*CRLF*/);
102         }
103         Assert.assertEquals(expected, bytesWritten);
104 
105         final SessionInputBufferMock.html#SessionInputBufferMock">SessionInputBufferMock inBuffer = new SessionInputBufferMock(
106                 outbuffer.getData());
107 
108         for (final String teststr : teststrs) {
109             Assert.assertEquals(teststr, inBuffer.readLine());
110         }
111 
112         Assert.assertNull(inBuffer.readLine());
113         Assert.assertNull(inBuffer.readLine());
114         tmetrics = inBuffer.getMetrics();
115         final long bytesRead = tmetrics.getBytesTransferred();
116         Assert.assertEquals(expected, bytesRead);
117     }
118 
119     @Test
120     public void testComplexReadWriteLine() throws Exception {
121         final SessionOutputBufferMockhtml#SessionOutputBufferMock">SessionOutputBufferMock outbuffer = new SessionOutputBufferMock();
122         outbuffer.write(new byte[] {'a', '\n'});
123         outbuffer.write(new byte[] {'\r', '\n'});
124         outbuffer.write(new byte[] {'\r', '\r', '\n'});
125         outbuffer.write(new byte[] {'\n'});
126         //these write operations should have no effect
127         outbuffer.write(null);
128         outbuffer.write(null, 0, 12);
129 
130         outbuffer.flush();
131 
132         long bytesWritten = outbuffer.getMetrics().getBytesTransferred();
133         Assert.assertEquals(8, bytesWritten);
134 
135         final StringBuilder buffer = new StringBuilder();
136         for (int i = 0; i < 14; i++) {
137             buffer.append("a");
138         }
139         final String s1 = buffer.toString();
140         buffer.append("\r\n");
141         outbuffer.write(buffer.toString().getBytes(Consts.ASCII));
142         outbuffer.flush();
143         bytesWritten = outbuffer.getMetrics().getBytesTransferred();
144         Assert.assertEquals(8 + 14 +2, bytesWritten);
145 
146         buffer.setLength(0);
147         for (int i = 0; i < 15; i++) {
148             buffer.append("a");
149         }
150         final String s2 = buffer.toString();
151         buffer.append("\r\n");
152         outbuffer.write(buffer.toString().getBytes(Consts.ASCII));
153         outbuffer.flush();
154         bytesWritten = outbuffer.getMetrics().getBytesTransferred();
155         Assert.assertEquals(8 + 14 + 2 + 15 + 2 , bytesWritten);
156 
157         buffer.setLength(0);
158         for (int i = 0; i < 16; i++) {
159             buffer.append("a");
160         }
161         final String s3 = buffer.toString();
162         buffer.append("\r\n");
163         outbuffer.write(buffer.toString().getBytes(Consts.ASCII));
164         outbuffer.flush();
165         bytesWritten = outbuffer.getMetrics().getBytesTransferred();
166         Assert.assertEquals(8 + 14 + 2 + 15 + 2 + 16 + 2, bytesWritten);
167 
168         outbuffer.write(new byte[] {'a'});
169         outbuffer.flush();
170         bytesWritten = outbuffer.getMetrics().getBytesTransferred();
171         Assert.assertEquals(8 + 14 + 2 + 15 + 2 + 16 + 2 + 1, bytesWritten);
172 
173         final SessionInputBufferMock.html#SessionInputBufferMock">SessionInputBufferMock inBuffer = new SessionInputBufferMock(
174                 outbuffer.getData());
175 
176         Assert.assertEquals("a", inBuffer.readLine());
177         Assert.assertEquals("", inBuffer.readLine());
178         Assert.assertEquals("\r", inBuffer.readLine());
179         Assert.assertEquals("", inBuffer.readLine());
180         Assert.assertEquals(s1, inBuffer.readLine());
181         Assert.assertEquals(s2, inBuffer.readLine());
182         Assert.assertEquals(s3, inBuffer.readLine());
183         Assert.assertEquals("a", inBuffer.readLine());
184         Assert.assertNull(inBuffer.readLine());
185         Assert.assertNull(inBuffer.readLine());
186         final long bytesRead = inBuffer.getMetrics().getBytesTransferred();
187         Assert.assertEquals(bytesWritten, bytesRead);
188     }
189 
190     @Test
191     public void testBasicReadWriteLineLargeBuffer() throws Exception {
192 
193         final String[] teststrs = new String[5];
194         teststrs[0] = "Hello";
195         teststrs[1] = "This string should be much longer than the size of the output buffer " +
196                 "which is only 16 bytes for this test";
197         final StringBuilder buffer = new StringBuilder();
198         for (int i = 0; i < 15; i++) {
199             buffer.append("123456789 ");
200         }
201         buffer.append("and stuff like that");
202         teststrs[2] = buffer.toString();
203         teststrs[3] = "";
204         teststrs[4] = "And goodbye";
205 
206         final CharArrayBuffer chbuffer = new CharArrayBuffer(16);
207         final SessionOutputBufferMockhtml#SessionOutputBufferMock">SessionOutputBufferMock outbuffer = new SessionOutputBufferMock();
208         for (final String teststr : teststrs) {
209             chbuffer.clear();
210             chbuffer.append(teststr);
211             outbuffer.writeLine(chbuffer);
212         }
213         //these write operations should have no effect
214         outbuffer.writeLine((String)null);
215         outbuffer.writeLine((CharArrayBuffer)null);
216         outbuffer.flush();
217 
218         final long bytesWritten = outbuffer.getMetrics().getBytesTransferred();
219         long expected = 0;
220         for (final String teststr : teststrs) {
221             expected += (teststr.length() + 2/*CRLF*/);
222         }
223         Assert.assertEquals(expected, bytesWritten);
224 
225         final SessionInputBufferMock.html#SessionInputBufferMock">SessionInputBufferMock inBuffer = new SessionInputBufferMock(
226                 outbuffer.getData(), 1024);
227 
228         for (final String teststr : teststrs) {
229             Assert.assertEquals(teststr, inBuffer.readLine());
230         }
231         Assert.assertNull(inBuffer.readLine());
232         Assert.assertNull(inBuffer.readLine());
233         final long bytesRead = inBuffer.getMetrics().getBytesTransferred();
234         Assert.assertEquals(expected, bytesRead);
235     }
236 
237     @Test
238     public void testReadWriteBytes() throws Exception {
239         // make the buffer larger than that of outbuffer
240         final byte[] out = new byte[40];
241         for (int i = 0; i < out.length; i++) {
242             out[i] = (byte)('0' + i);
243         }
244         final SessionOutputBufferMockhtml#SessionOutputBufferMock">SessionOutputBufferMock outbuffer = new SessionOutputBufferMock();
245         int off = 0;
246         int remaining = out.length;
247         while (remaining > 0) {
248             int chunk = 10;
249             if (chunk > remaining) {
250                 chunk = remaining;
251             }
252             outbuffer.write(out, off, chunk);
253             off += chunk;
254             remaining -= chunk;
255         }
256         outbuffer.flush();
257         final long bytesWritten = outbuffer.getMetrics().getBytesTransferred();
258         Assert.assertEquals(out.length, bytesWritten);
259 
260         final byte[] tmp = outbuffer.getData();
261         Assert.assertEquals(out.length, tmp.length);
262         for (int i = 0; i < out.length; i++) {
263             Assert.assertEquals(out[i], tmp[i]);
264         }
265 
266         final SessionInputBufferMock.html#SessionInputBufferMock">SessionInputBufferMock inBuffer = new SessionInputBufferMock(tmp);
267 
268         // these read operations will have no effect
269         Assert.assertEquals(0, inBuffer.read(null, 0, 10));
270         Assert.assertEquals(0, inBuffer.read(null));
271         long bytesRead = inBuffer.getMetrics().getBytesTransferred();
272         Assert.assertEquals(0, bytesRead);
273 
274         final byte[] in = new byte[40];
275         off = 0;
276         remaining = in.length;
277         while (remaining > 0) {
278             int chunk = 10;
279             if (chunk > remaining) {
280                 chunk = remaining;
281             }
282             final int readLen = inBuffer.read(in, off, chunk);
283             if (readLen == -1) {
284                 break;
285             }
286             off += readLen;
287             remaining -= readLen;
288         }
289         for (int i = 0; i < out.length; i++) {
290             Assert.assertEquals(out[i], in[i]);
291         }
292         Assert.assertEquals(-1, inBuffer.read(tmp));
293         Assert.assertEquals(-1, inBuffer.read(tmp));
294         bytesRead = inBuffer.getMetrics().getBytesTransferred();
295         Assert.assertEquals(out.length, bytesRead);
296     }
297 
298     @Test
299     public void testReadWriteByte() throws Exception {
300         // make the buffer larger than that of outbuffer
301         final byte[] out = new byte[40];
302         for (int i = 0; i < out.length; i++) {
303             out[i] = (byte)(120 + i);
304         }
305         final SessionOutputBufferMockhtml#SessionOutputBufferMock">SessionOutputBufferMock outbuffer = new SessionOutputBufferMock();
306         for (final byte element : out) {
307             outbuffer.write(element);
308         }
309         outbuffer.flush();
310         final long bytesWritten = outbuffer.getMetrics().getBytesTransferred();
311         Assert.assertEquals(out.length, bytesWritten);
312 
313         final byte[] tmp = outbuffer.getData();
314         Assert.assertEquals(out.length, tmp.length);
315         for (int i = 0; i < out.length; i++) {
316             Assert.assertEquals(out[i], tmp[i]);
317         }
318 
319         final SessionInputBufferMock.html#SessionInputBufferMock">SessionInputBufferMock inBuffer = new SessionInputBufferMock(tmp);
320         final byte[] in = new byte[40];
321         for (int i = 0; i < in.length; i++) {
322             in[i] = (byte)inBuffer.read();
323         }
324         for (int i = 0; i < out.length; i++) {
325             Assert.assertEquals(out[i], in[i]);
326         }
327         Assert.assertEquals(-1, inBuffer.read());
328         Assert.assertEquals(-1, inBuffer.read());
329         final long bytesRead = inBuffer.getMetrics().getBytesTransferred();
330         Assert.assertEquals(out.length, bytesRead);
331     }
332 
333     @Test
334     public void testWriteSmallFragmentBuffering() throws Exception {
335         final ByteArrayOutputStream outStream = Mockito.spy(new ByteArrayOutputStream());
336         final SessionOutputBufferMockhtml#SessionOutputBufferMock">SessionOutputBufferMock outbuffer = new SessionOutputBufferMock(outStream, 16, 16, null);
337         outbuffer.write(1);
338         outbuffer.write(2);
339         outbuffer.write(new byte[] {1, 2});
340         outbuffer.write(new byte[]{3, 4});
341         outbuffer.flush();
342         Mockito.verify(outStream, Mockito.times(1)).write(
343                 Matchers.<byte[]>any(), Matchers.anyInt(), Matchers.anyInt());
344         Mockito.verify(outStream, Mockito.never()).write(Matchers.anyInt());
345     }
346 
347     @Test
348     public void testWriteSmallFragmentNoBuffering() throws Exception {
349         final ByteArrayOutputStream outStream = Mockito.spy(new ByteArrayOutputStream());
350         final SessionOutputBufferMockhtml#SessionOutputBufferMock">SessionOutputBufferMock outbuffer = new SessionOutputBufferMock(outStream, 16, 0, null);
351         outbuffer.write(1);
352         outbuffer.write(2);
353         outbuffer.write(new byte[] {1, 2});
354         outbuffer.write(new byte[]{3, 4});
355         Mockito.verify(outStream, Mockito.times(2)).write(
356                 Matchers.<byte []>any(), Matchers.anyInt(), Matchers.anyInt());
357         Mockito.verify(outStream, Mockito.times(2)).write(Matchers.anyInt());
358     }
359 
360     @Test
361     public void testLineLimit() throws Exception {
362         final String s = "a very looooooooooooooooooooooooooooooooooooooooooong line\r\n";
363         final byte[] tmp = s.getBytes(Consts.ASCII);
364         // no limit
365         final SessionInputBufferMockhtml#SessionInputBufferMock">SessionInputBufferMock inBuffer1 = new SessionInputBufferMock(tmp, 5,
366                 MessageConstraints.DEFAULT);
367         Assert.assertNotNull(inBuffer1.readLine());
368         final long bytesRead = inBuffer1.getMetrics().getBytesTransferred();
369         Assert.assertEquals(60, bytesRead);
370 
371         // 15 char limit
372         final SessionInputBufferMockhtml#SessionInputBufferMock">SessionInputBufferMock inBuffer2 = new SessionInputBufferMock(tmp, 5,
373                 MessageConstraints.lineLen(15));
374         try {
375             inBuffer2.readLine();
376             Assert.fail("MessageConstraintException expected");
377         } catch (final MessageConstraintException ex) {
378         }
379     }
380 
381     @Test
382     public void testLineLimit2() throws Exception {
383         final String s = "just a line\r\n";
384         final byte[] tmp = s.getBytes(Consts.ASCII);
385         // no limit
386         final SessionInputBufferMockhtml#SessionInputBufferMock">SessionInputBufferMock inBuffer1 = new SessionInputBufferMock(tmp, 25,
387                 MessageConstraints.DEFAULT);
388         Assert.assertNotNull(inBuffer1.readLine());
389         final long bytesRead = inBuffer1.getMetrics().getBytesTransferred();
390         Assert.assertEquals(13, bytesRead);
391 
392         // 10 char limit
393         final SessionInputBufferMockhtml#SessionInputBufferMock">SessionInputBufferMock inBuffer2 = new SessionInputBufferMock(tmp, 25,
394                 MessageConstraints.lineLen(10));
395         try {
396             inBuffer2.readLine();
397             Assert.fail("MessageConstraintException expected");
398         } catch (final MessageConstraintException ex) {
399         }
400     }
401 
402     @Test //HTTPCORE-472
403     public void testLineLimit3() throws Exception {
404         final String s = "012345678\r\nblaaaaaaaaaaaaaaaaaah";
405         final byte[] tmp = s.getBytes(Consts.ASCII);
406         final SessionInputBufferMockhtml#SessionInputBufferMock">SessionInputBufferMock inBuffer1 = new SessionInputBufferMock(tmp, 10,
407                 MessageConstraints.lineLen(20));
408         Assert.assertEquals("012345678", inBuffer1.readLine());
409     }
410 
411     @Test
412     public void testReadLineFringeCase1() throws Exception {
413         final String s = "abc\r\n";
414         final byte[] tmp = s.getBytes(Consts.ASCII);
415         final SessionInputBufferMockhtml#SessionInputBufferMock">SessionInputBufferMock inBuffer1 = new SessionInputBufferMock(tmp, 128);
416         Assert.assertEquals('a', inBuffer1.read());
417         Assert.assertEquals('b', inBuffer1.read());
418         Assert.assertEquals('c', inBuffer1.read());
419         Assert.assertEquals('\r', inBuffer1.read());
420         Assert.assertEquals("", inBuffer1.readLine());
421     }
422 
423     static final int SWISS_GERMAN_HELLO [] = {
424         0x47, 0x72, 0xFC, 0x65, 0x7A, 0x69, 0x5F, 0x7A, 0xE4, 0x6D, 0xE4
425     };
426 
427     static final int RUSSIAN_HELLO [] = {
428         0x412, 0x441, 0x435, 0x43C, 0x5F, 0x43F, 0x440, 0x438,
429         0x432, 0x435, 0x442
430     };
431 
432     private static String constructString(final int [] unicodeChars) {
433         final StringBuilder buffer = new StringBuilder();
434         if (unicodeChars != null) {
435             for (final int unicodeChar : unicodeChars) {
436                 buffer.append((char)unicodeChar);
437             }
438         }
439         return buffer.toString();
440     }
441 
442     @Test
443     public void testMultibyteCodedReadWriteLine() throws Exception {
444         final String s1 = constructString(SWISS_GERMAN_HELLO);
445         final String s2 = constructString(RUSSIAN_HELLO);
446         final String s3 = "Like hello and stuff";
447 
448         final SessionOutputBufferMockhtml#SessionOutputBufferMock">SessionOutputBufferMock outbuffer = new SessionOutputBufferMock(Consts.UTF_8);
449 
450         final CharArrayBuffer chbuffer = new CharArrayBuffer(16);
451         for (int i = 0; i < 10; i++) {
452             chbuffer.clear();
453             chbuffer.append(s1);
454             outbuffer.writeLine(chbuffer);
455             chbuffer.clear();
456             chbuffer.append(s2);
457             outbuffer.writeLine(chbuffer);
458             chbuffer.clear();
459             chbuffer.append(s3);
460             outbuffer.writeLine(chbuffer);
461         }
462         outbuffer.flush();
463         final long bytesWritten = outbuffer.getMetrics().getBytesTransferred();
464         final long expected = ((s1.getBytes(Consts.UTF_8).length + 2)+
465                 (s2.getBytes(Consts.UTF_8).length + 2) +
466                 (s3.getBytes(Consts.UTF_8).length + 2)) * 10;
467         Assert.assertEquals(expected, bytesWritten);
468 
469         final SessionInputBufferMock.html#SessionInputBufferMock">SessionInputBufferMock inBuffer = new SessionInputBufferMock(
470                 outbuffer.getData(), Consts.UTF_8);
471 
472         for (int i = 0; i < 10; i++) {
473             Assert.assertEquals(s1, inBuffer.readLine());
474             Assert.assertEquals(s2, inBuffer.readLine());
475             Assert.assertEquals(s3, inBuffer.readLine());
476         }
477         Assert.assertNull(inBuffer.readLine());
478         Assert.assertNull(inBuffer.readLine());
479         final long bytesRead = inBuffer.getMetrics().getBytesTransferred();
480         Assert.assertEquals(expected, bytesRead);
481     }
482 
483     @Test
484     public void testMultibyteCodedReadWriteLongLine() throws Exception {
485         final String s1 = constructString(SWISS_GERMAN_HELLO);
486         final String s2 = constructString(RUSSIAN_HELLO);
487         final String s3 = "Like hello and stuff";
488         final StringBuilder buf = new StringBuilder();
489         for (int i = 0; i < 1024; i++) {
490             buf.append(s1).append(s2).append(s3);
491         }
492         final String s = buf.toString();
493 
494         final SessionOutputBufferMockhtml#SessionOutputBufferMock">SessionOutputBufferMock outbuffer = new SessionOutputBufferMock(Consts.UTF_8);
495 
496         final CharArrayBuffer chbuffer = new CharArrayBuffer(16);
497         chbuffer.append(s);
498         outbuffer.writeLine(chbuffer);
499         outbuffer.flush();
500 
501         final SessionInputBufferMock.html#SessionInputBufferMock">SessionInputBufferMock inBuffer = new SessionInputBufferMock(
502                 outbuffer.getData(), Consts.UTF_8);
503 
504         Assert.assertEquals(s, inBuffer.readLine());
505     }
506 
507     @Test
508     public void testNonAsciiReadWriteLine() throws Exception {
509         final String s1 = constructString(SWISS_GERMAN_HELLO);
510 
511         final SessionOutputBufferMockhtml#SessionOutputBufferMock">SessionOutputBufferMock outbuffer = new SessionOutputBufferMock(Consts.ISO_8859_1);
512 
513         final CharArrayBuffer chbuffer = new CharArrayBuffer(16);
514         for (int i = 0; i < 5; i++) {
515             chbuffer.clear();
516             chbuffer.append(s1);
517             outbuffer.writeLine(chbuffer);
518         }
519         for (int i = 0; i < 5; i++) {
520             outbuffer.writeLine(s1);
521         }
522         chbuffer.clear();
523         outbuffer.writeLine(chbuffer);
524         outbuffer.flush();
525         final long bytesWritten = outbuffer.getMetrics().getBytesTransferred();
526         final long expected = ((s1.toString().getBytes(Consts.ISO_8859_1).length + 2)) * 10 + 2;
527         Assert.assertEquals(expected, bytesWritten);
528 
529         final SessionInputBufferMock.html#SessionInputBufferMock">SessionInputBufferMock inBuffer = new SessionInputBufferMock(
530                 outbuffer.getData(), Consts.ISO_8859_1);
531 
532         final CharArrayBuffer buf = new CharArrayBuffer(64);
533         for (int i = 0; i < 10; i++) {
534             buf.clear();
535             final int readLen = inBuffer.readLine(buf);
536             Assert.assertEquals(readLen, SWISS_GERMAN_HELLO.length);
537             Assert.assertEquals(s1, buf.toString());
538         }
539         buf.clear();
540         Assert.assertEquals("", inBuffer.readLine());
541         Assert.assertNull(inBuffer.readLine());
542         Assert.assertNull(inBuffer.readLine());
543         final long bytesRead = inBuffer.getMetrics().getBytesTransferred();
544         Assert.assertEquals(expected, bytesRead);
545     }
546 
547     @Test(expected=CharacterCodingException.class)
548     public void testUnmappableInputActionReport() throws Exception {
549         final String s = "This text contains a circumflex \u0302 !!!";
550         final CharsetEncoder encoder = Consts.ISO_8859_1.newEncoder();
551         encoder.onMalformedInput(CodingErrorAction.IGNORE);
552         encoder.onUnmappableCharacter(CodingErrorAction.REPORT);
553         final SessionOutputBufferMockck.html#SessionOutputBufferMock">SessionOutputBufferMock outbuf = new SessionOutputBufferMock(encoder);
554         outbuf.writeLine(s);
555     }
556 
557     @Test
558     public void testUnmappableInputActionReplace() throws Exception {
559         final String s = "This text contains a circumflex \u0302 !!!";
560         final CharsetEncoder encoder = Consts.ISO_8859_1.newEncoder();
561         encoder.onMalformedInput(CodingErrorAction.IGNORE);
562         encoder.onUnmappableCharacter(CodingErrorAction.REPLACE);
563         final SessionOutputBufferMockck.html#SessionOutputBufferMock">SessionOutputBufferMock outbuf = new SessionOutputBufferMock(encoder);
564         outbuf.writeLine(s);
565         outbuf.flush();
566         final String result = new String(outbuf.getData(), "ISO-8859-1");
567         Assert.assertEquals("This text contains a circumflex ? !!!\r\n", result);
568     }
569 
570     @Test
571     public void testUnmappableInputActionIgnore() throws Exception {
572         final String s = "This text contains a circumflex \u0302 !!!";
573         final CharsetEncoder encoder = Consts.ISO_8859_1.newEncoder();
574         encoder.onMalformedInput(CodingErrorAction.IGNORE);
575         encoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
576         final SessionOutputBufferMockck.html#SessionOutputBufferMock">SessionOutputBufferMock outbuf = new SessionOutputBufferMock(encoder);
577         outbuf.writeLine(s);
578         outbuf.flush();
579         final String result = new String(outbuf.getData(), "ISO-8859-1");
580         Assert.assertEquals("This text contains a circumflex  !!!\r\n", result);
581     }
582 
583     @Test(expected=CharacterCodingException.class)
584     public void testMalformedInputActionReport() throws Exception {
585         final byte[] tmp = constructString(SWISS_GERMAN_HELLO).getBytes(Consts.ISO_8859_1);
586         final CharsetDecoder decoder = Consts.UTF_8.newDecoder();
587         decoder.onMalformedInput(CodingErrorAction.REPORT);
588         decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
589         final SessionInputBufferMock.html#SessionInputBufferMock">SessionInputBufferMock inBuffer = new SessionInputBufferMock(tmp, decoder);
590         inBuffer.readLine();
591     }
592 
593     @Test
594     public void testMalformedInputActionReplace() throws Exception {
595         final byte[] tmp = constructString(SWISS_GERMAN_HELLO).getBytes(Consts.ISO_8859_1);
596         final CharsetDecoder decoder = Consts.UTF_8.newDecoder();
597         decoder.onMalformedInput(CodingErrorAction.REPLACE);
598         decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
599         final SessionInputBufferMock.html#SessionInputBufferMock">SessionInputBufferMock inBuffer = new SessionInputBufferMock(tmp, decoder);
600         final String s = inBuffer.readLine();
601         Assert.assertEquals("Gr\ufffdezi_z\ufffdm\ufffd", s);
602     }
603 
604     @Test
605     public void testMalformedInputActionIgnore() throws Exception {
606         final byte[] tmp = constructString(SWISS_GERMAN_HELLO).getBytes(Consts.ISO_8859_1);
607         final CharsetDecoder decoder = Consts.UTF_8.newDecoder();
608         decoder.onMalformedInput(CodingErrorAction.IGNORE);
609         decoder.onUnmappableCharacter(CodingErrorAction.IGNORE);
610         final SessionInputBufferMock.html#SessionInputBufferMock">SessionInputBufferMock inBuffer = new SessionInputBufferMock(tmp, decoder);
611         final String s = inBuffer.readLine();
612         Assert.assertEquals("Grezi_zm", s);
613     }
614 
615     @Test
616     public void testInvalidCharArrayBuffer() throws Exception {
617         final SessionInputBufferMock.html#SessionInputBufferMock">SessionInputBufferMock inBuffer = new SessionInputBufferMock(new byte[] {});
618         try {
619             inBuffer.readLine(null);
620             Assert.fail("IllegalArgumentException should have been thrown");
621         } catch (final IllegalArgumentException ex) {
622             //expected
623             final long bytesRead = inBuffer.getMetrics().getBytesTransferred();
624             Assert.assertEquals(0, bytesRead);
625         }
626     }
627 
628 }
629