[ http://issues.apache.org/jira/browse/HARMONY-148?page=all ]

Tim Ellison reassigned HARMONY-148:
-----------------------------------

    Assign To: Tim Ellison

> java.nio.charset.CharsetDecoder: decode(in,out,endOfInput) method doesn't 
> preserve replace string for successive decode invocation while "out" doesn't 
> have engouh space for replace string.
> --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
>          Key: HARMONY-148
>          URL: http://issues.apache.org/jira/browse/HARMONY-148
>      Project: Harmony
>         Type: Bug
>   Components: Classlib
>     Reporter: Richard Liang
>     Assignee: Tim Ellison
>     Priority: Minor
>  Attachments: CharsetDecoder_patch_148.txt
>
> Consider following senario:
> During the invocation of method 
> java.nio.charset.CharsetDecoder.decode(in,out,false), method "decodeLoop" 
> returns malformed CoderResult, and the action is set as 
> "CodingErrorAction.REPLACE". So replace action should be taken, but "out" 
> doesn't hold enough space for the replace string. Therefore, 
> CoderResult.OVERFLOW should be returned. Harmony does return OVERFLOW 
> currently, but the replace string won't put into new allocated output any 
> more. In other words, the replace string is missing from the view of "stream 
> decoding". Therefore, replace string should be preserved for successive 
> decode(in,out,endOfInput) invacation.
> Both RI5.0 and Harmony fails on the following test case. However, according 
> to the spec, we think it is a defect of RI5.0.
> ================================== Test Case======================
> /*
>        * Test the method decode(ByteBuffer) .
>        */
>       public void testDecode_ReplaceOverflow() throws Exception {
>               String replaceString = "a";
>               Charset cs = Charset.forName("UTF-8");
>               MockMalformedDecoder decoder = new MockMalformedDecoder(cs);
>               decoder.onMalformedInput(CodingErrorAction.REPLACE);
>               decoder.replaceWith(replaceString);
>               CharBuffer out = CharBuffer.allocate(1);
>               // MockMalformedDecoder treats the second byte '0x38' as 
> malformed, 
>               // but "out" doesn't have enough space for replace string.
>               ByteBuffer in = ByteBuffer.wrap(new 
> byte[]{0x45,0x38,0x45,0x45});
>               CoderResult result = decoder.decode(in,out,false);
>               assertTrue(result.isOverflow());
>               
>               // allocate enough space for "out"
>               out = CharBuffer.allocate(10);
>               // replace string should be put into "out" firstly,
>               // and then decode "in". 
>               result =decoder.decode(in,out,true);
>               out.flip();
>               assertTrue(result.isUnderflow());
>               assertEquals("abb",out.toString());
>       }
>       /*
>        * Mock decoder. It treats byte whose value is less than "0x40" as 
> malformed.
>        */
>       static class MockMalformedDecoder extends 
> java.nio.charset.CharsetDecoder {
>               public MockMalformedDecoder(Charset cs) {
>                       super(cs, 1, 10);
>               }
>               /*
>                * It treats byte whose value is less than "0x40" as malformed.
>                * Otherwise, it's decoded as 'b'.
>                */
>               protected CoderResult decodeLoop(ByteBuffer in, CharBuffer out) 
> {
>                       System.out.println("Using MockMalformedDecoder");
>                       while (in.hasRemaining()) {
>                               byte b = in.get();
>                               if(b < 0x40){
>                                       return 
> CoderResult.malformedForLength(1);
>                               }
>                               if(!out.hasRemaining()){
>                                       return CoderResult.OVERFLOW;
>                               }
>                               out.put((char)'b');
>                       }
>                       return CoderResult.UNDERFLOW;
>               }
>       }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
   http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see:
   http://www.atlassian.com/software/jira

Reply via email to