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.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
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);
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
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
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);
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
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
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
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
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
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
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
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
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
623 final long bytesRead = inBuffer.getMetrics().getBytesTransferred();
624 Assert.assertEquals(0, bytesRead);
625 }
626 }
627
628 }
629