You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by py...@apache.org on 2006/10/13 19:32:02 UTC
svn commit: r463746 - in
/incubator/harmony/enhanced/classlib/trunk/modules/luni/src:
main/java/java/io/ test/java/org/apache/harmony/luni/tests/java/io/
test/java/tests/api/java/io/
Author: pyang
Date: Fri Oct 13 10:32:01 2006
New Revision: 463746
URL: http://svn.apache.org/viewvc?view=rev&rev=463746
Log:
Fix InputStreamReader's bug, remove duplicated test case of InputStreamReaderTest
Modified:
incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/InputStreamReader.java
incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/org/apache/harmony/luni/tests/java/io/InputStreamReaderTest.java
incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/InputStreamReaderTest.java
Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/InputStreamReader.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/InputStreamReader.java?view=diff&rev=463746&r1=463745&r2=463746
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/InputStreamReader.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/main/java/java/io/InputStreamReader.java Fri Oct 13 10:32:01 2006
@@ -22,7 +22,10 @@
import java.nio.CharBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CoderResult;
import java.nio.charset.CodingErrorAction;
+import java.nio.charset.MalformedInputException;
+import java.nio.charset.UnmappableCharacterException;
import java.security.AccessController;
import java.util.HashMap;
@@ -64,7 +67,9 @@
this.in = in;
String encoding = AccessController
.doPrivileged(new PriviAction<String>("file.encoding", "ISO8859_1")); //$NON-NLS-1$//$NON-NLS-2$
- decoder = Charset.forName(encoding).newDecoder();
+ decoder = Charset.forName(encoding).newDecoder().onMalformedInput(
+ CodingErrorAction.REPLACE).onUnmappableCharacter(
+ CodingErrorAction.REPLACE);
chars.limit(0);
}
@@ -129,7 +134,9 @@
public InputStreamReader(InputStream in, Charset charset) {
super(in);
this.in = in;
- decoder = charset.newDecoder();
+ decoder = charset.newDecoder().onMalformedInput(
+ CodingErrorAction.REPLACE).onUnmappableCharacter(
+ CodingErrorAction.REPLACE);
chars.limit(0);
}
@@ -171,7 +178,8 @@
/*
* helper for getEncoding()
*/
- static class HistoricalNamesUtil {
+ @SuppressWarnings("nls")
+ static class HistoricalNamesUtil {
private static HashMap<String, String> historicalNames = new HashMap<String, String>();
static {
historicalNames.put("Big5-HKSCS", "Big5_HKSCS");
@@ -440,7 +448,19 @@
} else {
bytes.limit(read);
}
- decoder.decode(bytes, chars, endOfInput);
+ CoderResult result = decoder.decode(bytes, chars, endOfInput);
+ if(result.isMalformed()){
+ throw new MalformedInputException(result.length());
+ }else if(result.isUnmappable()){
+ throw new UnmappableCharacterException(result.length());
+ }
+ if(endOfInput){
+ // FIXME: should flush at first, but seems ICU has a bug that
+ // it will throw IAE if some malform/unmappable bytes found during
+ // decoding
+ // result = decoder.flush(chars);
+ decoder.reset();
+ }
bytes.clear();
} while (read > 0 && chars.position() == 0);
chars.flip();
Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/org/apache/harmony/luni/tests/java/io/InputStreamReaderTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/org/apache/harmony/luni/tests/java/io/InputStreamReaderTest.java?view=diff&rev=463746&r1=463745&r2=463746
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/org/apache/harmony/luni/tests/java/io/InputStreamReaderTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/org/apache/harmony/luni/tests/java/io/InputStreamReaderTest.java Fri Oct 13 10:32:01 2006
@@ -18,7 +18,6 @@
import java.io.ByteArrayInputStream;
import java.io.IOException;
-import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
@@ -37,28 +36,7 @@
/**
* @tests java.io.InputStreamReader#read()
*/
- public void testRead() throws IOException {
- // Regression for HARMONY-166
- InputStream in;
- InputStreamReader reader;
-
- in = new LimitedByteArrayInputStream(0);
- reader = new InputStreamReader(in, "UTF-16BE");
- assertEquals("Incorrect byte UTF-16BE", '\u6172', reader.read());
-
- in = new LimitedByteArrayInputStream(0);
- reader = new InputStreamReader(in, "UTF-16LE");
- assertEquals("Incorrect byte UTF-16BE", '\u7261', reader.read());
-
- in = new LimitedByteArrayInputStream(1);
- reader = new InputStreamReader(in, "UTF-16");
- assertEquals("Incorrect byte UTF-16BE", '\u7261', reader.read());
-
- in = new LimitedByteArrayInputStream(2);
- reader = new InputStreamReader(in, "ISO2022JP");
- assertEquals("Incorrect byte ISO2022JP 1", '\u4e5d', reader.read());
- assertEquals("Incorrect byte ISO2022JP 2", '\u7b2c', reader.read());
- }
+
public void testGetEncoding_NotHistorical() {
InputStreamReader in = null;
@@ -72,55 +50,4 @@
}
- static class LimitedByteArrayInputStream extends ByteArrayInputStream {
-
- // A ByteArrayInputStream that only returns a single byte per read
- byte[] bytes;
-
- int count;
-
- public LimitedByteArrayInputStream(int type) {
- super(new byte[0]);
- switch (type) {
- case 0:
- bytes = new byte[] { 0x61, 0x72 };
- break;
- case 1:
- bytes = new byte[] { (byte) 0xff, (byte) 0xfe, 0x61, 0x72 };
- break;
- case 2:
- bytes = new byte[] { '\u001b', '$', 'B', '6', 'e', 'B',
- 'h', '\u001b', '(', 'B' };
- break;
- }
- count = bytes.length;
- }
-
- @Override
- public int read() {
- if (count == 0) {
- return -1;
- }
- count--;
- return bytes[bytes.length - count];
- }
-
- @Override
- public int read(byte[] buffer, int offset, int length) {
- if (count == 0) {
- return -1;
- }
- if (length == 0) {
- return 0;
- }
- buffer[offset] = bytes[bytes.length - count];
- count--;
- return 1;
- }
-
- @Override
- public int available() {
- return count;
- }
- }
}
Modified: incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/InputStreamReaderTest.java
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/InputStreamReaderTest.java?view=diff&rev=463746&r1=463745&r2=463746
==============================================================================
--- incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/InputStreamReaderTest.java (original)
+++ incubator/harmony/enhanced/classlib/trunk/modules/luni/src/test/java/tests/api/java/io/InputStreamReaderTest.java Fri Oct 13 10:32:01 2006
@@ -25,8 +25,11 @@
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
+import java.nio.ByteBuffer;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
+import java.nio.charset.CodingErrorAction;
+import java.nio.charset.MalformedInputException;
import java.util.Arrays;
import junit.framework.TestCase;
@@ -49,6 +52,7 @@
public String fileString = "Test_All_Tests\nTest_java_io_BufferedInputStream\nTest_java_io_BufferedOutputStream\nTest_java_io_ByteArrayInputStream\nTest_java_io_ByteArrayOutputStream\nTest_java_io_DataInputStream\n";
static class LimitedByteArrayInputStream extends ByteArrayInputStream {
+
// A ByteArrayInputStream that only returns a single byte per read
byte[] bytes;
@@ -158,9 +162,39 @@
* Regression for Harmony-411
*/
public void testRead1() throws IOException {
+ // if the decoder is constructed by InputStreamReader itself, the decoder's
+ // default error action is REPLACE
InputStreamReader isr = new InputStreamReader(new ByteArrayInputStream(
new byte[] { -32, -96 }), "UTF-8");
assertEquals("read() return incorrect value", 65533, isr.read());
+
+ InputStreamReader isr2 = new InputStreamReader(new ByteArrayInputStream(
+ new byte[] { -32, -96 }), Charset.forName("UTF-8"));
+ assertEquals("read() return incorrect value", 65533, isr2.read());
+
+ // if the decoder is passed in, keep its status intacted
+ CharsetDecoder decoder = Charset.forName("UTF-8").newDecoder();
+ decoder.onMalformedInput(CodingErrorAction.REPORT);
+ InputStreamReader isr3 = new InputStreamReader(new ByteArrayInputStream(
+ new byte[] { -32, -96 }), decoder);
+ try{
+ isr3.read();
+ fail("Should throw MalformedInputException");
+ }catch(MalformedInputException e){
+ //expected
+ }
+
+ CharsetDecoder decoder2 = Charset.forName("UTF-8").newDecoder();
+ decoder2.onMalformedInput(CodingErrorAction.IGNORE);
+ InputStreamReader isr4 = new InputStreamReader(new ByteArrayInputStream(
+ new byte[] { -32, -96 }), decoder2);
+ assertEquals("read() return incorrect value", -1, isr4.read());
+
+ CharsetDecoder decoder3 = Charset.forName("UTF-8").newDecoder();
+ decoder3.onMalformedInput(CodingErrorAction.REPLACE);
+ InputStreamReader isr5 = new InputStreamReader(new ByteArrayInputStream(
+ new byte[] { -32, -96 }), decoder3);
+ assertEquals("read() return incorrect value", 65533, isr5.read());
}
/*
@@ -344,7 +378,7 @@
fail();
} catch (NullPointerException e) {
}
- InputStreamReader reader2 = new InputStreamReader(in, decoder);
+ InputStreamReader reader2 = new InputStreamReader(in, decoder);
assertEquals(Charset.forName(reader2.getEncoding()), decoder.charset());
reader2.close();
}
@@ -452,7 +486,7 @@
/**
* @tests java.io.InputStreamReader#read()
*/
- public void test_read() {
+ public void test_read() throws IOException{
// Test for method int java.io.InputStreamReader.read()
try {
int c = is.read();
@@ -465,55 +499,32 @@
} catch (IOException e) {
fail("Exception during read test : " + e.getMessage());
}
-
- try {
- LimitedByteArrayInputStream in = new LimitedByteArrayInputStream(0);
- InputStreamReader reader = new InputStreamReader(in, "UTF-16BE");
- assertTrue("Incorrect byte UTF-16BE", reader.read() == '\u6172');
- } catch (UnsupportedEncodingException e) {
- // Can't test without the converter
- System.out.println(e);
- } catch (IOException e) {
- fail("UTF-16BE unexpected 1: " + e);
- }
- try {
- LimitedByteArrayInputStream in = new LimitedByteArrayInputStream(0);
- InputStreamReader reader = new InputStreamReader(in, "UTF-16LE");
- assertTrue("Incorrect byte UTF-16BE", reader.read() == '\u7261');
- } catch (UnsupportedEncodingException e) {
- // Can't test without the converter
- } catch (IOException e) {
- fail("UTF-16BE unexpected 2: " + e);
- }
- try {
- LimitedByteArrayInputStream in = new LimitedByteArrayInputStream(1);
- InputStreamReader reader = new InputStreamReader(in, "UTF-16");
- assertTrue("Incorrect byte UTF-16BE", reader.read() == '\u7261');
- } catch (UnsupportedEncodingException e) {
- // Can't test without the converter
- } catch (IOException e) {
- fail("UTF-16BE unexpected 3: " + e);
- }
-
- try {
- LimitedByteArrayInputStream in = new LimitedByteArrayInputStream(2);
- InputStreamReader reader = new InputStreamReader(in, "ISO2022JP");
- int ch = reader.read();
- assertTrue("Incorrect byte ISO2022JP 1: " + ch, ch == '\u4e5d');
- ch = reader.read();
- assertTrue("Incorrect byte ISO2022JP 2: " + ch, ch == '\u7b2c');
- } catch (UnsupportedEncodingException e) {
- // Can't test without the converter
- System.out.println(e);
- } catch (IOException e) {
- fail("ISO2022JP unexpected: " + e);
- }
-
+
+ // Regression for HARMONY-166
+ InputStream in;
+ InputStreamReader reader;
+
+ in = new LimitedByteArrayInputStream(0);
+ reader = new InputStreamReader(in, "UTF-16BE");
+ assertEquals("Incorrect byte UTF-16BE", '\u6172', reader.read());
+
+ in = new LimitedByteArrayInputStream(0);
+ reader = new InputStreamReader(in, "UTF-16LE");
+ assertEquals("Incorrect byte UTF-16BE", '\u7261', reader.read());
+
+ in = new LimitedByteArrayInputStream(1);
+ reader = new InputStreamReader(in, "UTF-16");
+ assertEquals("Incorrect byte UTF-16BE", '\u7261', reader.read());
+
+ in = new LimitedByteArrayInputStream(2);
+ reader = new InputStreamReader(in, "ISO2022JP");
+ assertEquals("Incorrect byte ISO2022JP 1", '\u4e5d', reader.read());
+ assertEquals("Incorrect byte ISO2022JP 2", '\u7b2c', reader.read());
}
/**
- * @tests java.io.InputStreamReader#read(char[], int, int)
- */
+ * @tests java.io.InputStreamReader#read(char[], int, int)
+ */
public void test_read$CII() {
// Test for method int java.io.InputStreamReader.read(char [], int, int)
try {
@@ -541,4 +552,6 @@
fail("Exception during ready test : " + e.getMessage());
}
}
+
+
}