test/sun/nio/cs/TestStringCoding.java
Print this page
*** 20,30 ****
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* @test
! * @bug 6636323 6636319 7040220 7096080 7183053 8080248
* @summary Test if StringCoding and NIO result have the same de/encoding result
* @modules java.base/sun.nio.cs
* @run main/othervm/timeout=2000 TestStringCoding
* @key randomness
*/
--- 20,30 ----
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* @test
! * @bug 6636323 6636319 7040220 7096080 7183053 8080248 8054307
* @summary Test if StringCoding and NIO result have the same de/encoding result
* @modules java.base/sun.nio.cs
* @run main/othervm/timeout=2000 TestStringCoding
* @key randomness
*/
*** 34,78 ****
import java.nio.charset.*;
public class TestStringCoding {
public static void main(String[] args) throws Throwable {
for (Boolean hasSM: new boolean[] { false, true }) {
! if (hasSM)
System.setSecurityManager(new PermissiveSecurityManger());
for (Charset cs: Charset.availableCharsets().values()) {
if ("ISO-2022-CN".equals(cs.name()) ||
"x-COMPOUND_TEXT".equals(cs.name()) ||
"x-JISAutoDetect".equals(cs.name()))
continue;
System.out.printf("Testing(sm=%b) " + cs.name() + "....", hasSM);
! // full bmp first
! char[] bmpCA = new char[0x10000];
! for (int i = 0; i < 0x10000; i++) {
! bmpCA[i] = (char)i;
! }
! byte[] sbBA = new byte[0x100];
! for (int i = 0; i < 0x100; i++) {
! sbBA[i] = (byte)i;
! }
! test(cs, bmpCA, sbBA);
// "randomed" sizes
Random rnd = new Random();
for (int i = 0; i < 10; i++) {
- int clen = rnd.nextInt(0x10000);
- int blen = rnd.nextInt(0x100);
//System.out.printf(" blen=%d, clen=%d%n", blen, clen);
! test(cs, Arrays.copyOf(bmpCA, clen), Arrays.copyOf(sbBA, blen));
//add a pair of surrogates
! int pos = clen / 2;
! if ((pos + 1) < blen) {
! bmpCA[pos] = '\uD800';
! bmpCA[pos+1] = '\uDC00';
}
! test(cs, Arrays.copyOf(bmpCA, clen), Arrays.copyOf(sbBA, blen));
! }
!
testMixed(cs);
System.out.println("done!");
}
}
}
--- 34,98 ----
import java.nio.charset.*;
public class TestStringCoding {
public static void main(String[] args) throws Throwable {
+ // full bmp first
+ char[] bmp = new char[0x10000];
+ for (int i = 0; i < 0x10000; i++) {
+ bmp[i] = (char)i;
+ }
+ char[] latin = Arrays.copyOf(bmp, 0x100);
+ char[] ascii = Arrays.copyOf(bmp, 0x80);
+
+ byte[] latinBA = new byte[0x100];
+ for (int i = 0; i < 0x100; i++) {
+ latinBA[i] = (byte)i;
+ }
+ byte[] asciiBA = Arrays.copyOf(latinBA, 0x80);
+
for (Boolean hasSM: new boolean[] { false, true }) {
! if (hasSM) {
System.setSecurityManager(new PermissiveSecurityManger());
+ }
for (Charset cs: Charset.availableCharsets().values()) {
if ("ISO-2022-CN".equals(cs.name()) ||
"x-COMPOUND_TEXT".equals(cs.name()) ||
"x-JISAutoDetect".equals(cs.name()))
continue;
System.out.printf("Testing(sm=%b) " + cs.name() + "....", hasSM);
!
! testNewString(cs, testGetBytes(cs, new String(bmp)));
! testNewString(cs, testGetBytes(cs, new String(latin)));
! testNewString(cs, testGetBytes(cs, new String(ascii)));
! testGetBytes(cs, testNewString(cs, latinBA));
! testGetBytes(cs, testNewString(cs, asciiBA));
!
// "randomed" sizes
Random rnd = new Random();
for (int i = 0; i < 10; i++) {
//System.out.printf(" blen=%d, clen=%d%n", blen, clen);
! char[] bmp0 = Arrays.copyOf(bmp, rnd.nextInt(0x10000));
! testNewString(cs, testGetBytes(cs, new String(bmp0)));
//add a pair of surrogates
! int pos = bmp0.length / 2;
! if ((pos + 1) < bmp0.length) {
! bmp0[pos] = '\uD800';
! bmp0[pos+1] = '\uDC00';
! }
! testNewString(cs, testGetBytes(cs, new String(bmp0)));
!
! char[] latin0 = Arrays.copyOf(latin, rnd.nextInt(0x100));
! char[] ascii0 = Arrays.copyOf(ascii, rnd.nextInt(0x80));
! byte[] latinBA0 = Arrays.copyOf(latinBA, rnd.nextInt(0x100));
! byte[] asciiBA0 = Arrays.copyOf(asciiBA, rnd.nextInt(0x80));
! testNewString(cs, testGetBytes(cs, new String(latin0)));
! testNewString(cs, testGetBytes(cs, new String(ascii0)));
! testGetBytes(cs, testNewString(cs, latinBA0));
! testGetBytes(cs, testNewString(cs, asciiBA0));
}
! testSurrogates(cs);
testMixed(cs);
System.out.println("done!");
}
}
}
*** 107,168 ****
throw new RuntimeException("getBytes(csn) failed -> " + cs.name());
}
//getBytes(cs);
bmpBA = bmpStr.getBytes(cs);
! if (!Arrays.equals(bmpBA, baNIO))
throw new RuntimeException("getBytes(cs) failed -> " + cs.name());
//new String(csn);
String strSC = new String(bmpBA, cs.name());
String strNIO = dec.reset().decode(ByteBuffer.wrap(bmpBA)).toString();
if(!strNIO.equals(strSC)) {
throw new RuntimeException("new String(csn) failed -> " + cs.name());
}
-
//new String(cs);
strSC = new String(bmpBA, cs);
! if (!strNIO.equals(strSC))
throw new RuntimeException("new String(cs) failed -> " + cs.name());
}
! static void test(Charset cs, char[] bmpCA, byte[] sbBA) throws Throwable {
! String bmpStr = new String(bmpCA);
! CharsetDecoder dec = cs.newDecoder()
! .onMalformedInput(CodingErrorAction.REPLACE)
! .onUnmappableCharacter(CodingErrorAction.REPLACE);
CharsetEncoder enc = cs.newEncoder()
.onMalformedInput(CodingErrorAction.REPLACE)
.onUnmappableCharacter(CodingErrorAction.REPLACE);
-
//getBytes(csn);
! byte[] baSC = bmpStr.getBytes(cs.name());
! ByteBuffer bf = enc.reset().encode(CharBuffer.wrap(bmpCA));
! byte[] baNIO = new byte[bf.limit()];
! bf.get(baNIO, 0, baNIO.length);
! if (!Arrays.equals(baSC, baNIO))
throw new RuntimeException("getBytes(csn) failed -> " + cs.name());
!
//getBytes(cs);
! baSC = bmpStr.getBytes(cs);
! if (!Arrays.equals(baSC, baNIO))
throw new RuntimeException("getBytes(cs) failed -> " + cs.name());
//new String(csn);
! String strSC = new String(sbBA, cs.name());
! String strNIO = dec.reset().decode(ByteBuffer.wrap(sbBA)).toString();
!
! if(!strNIO.equals(strSC))
throw new RuntimeException("new String(csn) failed -> " + cs.name());
!
//new String(cs);
! strSC = new String(sbBA, cs);
! if (!strNIO.equals(strSC))
! throw new RuntimeException("new String(cs) failed -> " + cs.name());
//encode unmappable surrogates
if (enc instanceof sun.nio.cs.ArrayEncoder &&
cs.contains(Charset.forName("ASCII"))) {
if (cs.name().equals("UTF-8") || // utf8 handles surrogates
cs.name().equals("CESU-8")) // utf8 handles surrogates
return;
--- 127,201 ----
throw new RuntimeException("getBytes(csn) failed -> " + cs.name());
}
//getBytes(cs);
bmpBA = bmpStr.getBytes(cs);
! if (!Arrays.equals(bmpBA, baNIO)) {
throw new RuntimeException("getBytes(cs) failed -> " + cs.name());
+ }
//new String(csn);
String strSC = new String(bmpBA, cs.name());
String strNIO = dec.reset().decode(ByteBuffer.wrap(bmpBA)).toString();
if(!strNIO.equals(strSC)) {
throw new RuntimeException("new String(csn) failed -> " + cs.name());
}
//new String(cs);
strSC = new String(bmpBA, cs);
! if (!strNIO.equals(strSC)) {
throw new RuntimeException("new String(cs) failed -> " + cs.name());
+ }
+ }
+ static byte[] getBytes(CharsetEncoder enc, String str) throws Throwable {
+ ByteBuffer bf = enc.reset().encode(CharBuffer.wrap(str.toCharArray()));
+ byte[] ba = new byte[bf.limit()];
+ bf.get(ba, 0, ba.length);
+ return ba;
}
! static byte[] testGetBytes(Charset cs, String str) throws Throwable {
CharsetEncoder enc = cs.newEncoder()
.onMalformedInput(CodingErrorAction.REPLACE)
.onUnmappableCharacter(CodingErrorAction.REPLACE);
//getBytes(csn);
! byte[] baSC = str.getBytes(cs.name());
! byte[] baNIO = getBytes(enc, str);
! if (!Arrays.equals(baSC, baNIO)) {
throw new RuntimeException("getBytes(csn) failed -> " + cs.name());
! }
//getBytes(cs);
! baSC = str.getBytes(cs);
! if (!Arrays.equals(baSC, baNIO)) {
throw new RuntimeException("getBytes(cs) failed -> " + cs.name());
+ }
+ return baSC;
+ }
+ static String testNewString(Charset cs, byte[] ba) throws Throwable {
+ CharsetDecoder dec = cs.newDecoder()
+ .onMalformedInput(CodingErrorAction.REPLACE)
+ .onUnmappableCharacter(CodingErrorAction.REPLACE);
//new String(csn);
! String strSC = new String(ba, cs.name());
! String strNIO = dec.reset().decode(ByteBuffer.wrap(ba)).toString();
! if(!strNIO.equals(strSC)) {
throw new RuntimeException("new String(csn) failed -> " + cs.name());
! }
//new String(cs);
! strSC = new String(ba, cs);
! if (!strNIO.equals(strSC)) {
! throw new RuntimeException("new String(cs)/bmp failed -> " + cs.name());
! }
! return strSC;
! }
+ static void testSurrogates(Charset cs) throws Throwable {
//encode unmappable surrogates
+ CharsetEncoder enc = cs.newEncoder()
+ .onMalformedInput(CodingErrorAction.REPLACE)
+ .onUnmappableCharacter(CodingErrorAction.REPLACE);
if (enc instanceof sun.nio.cs.ArrayEncoder &&
cs.contains(Charset.forName("ASCII"))) {
if (cs.name().equals("UTF-8") || // utf8 handles surrogates
cs.name().equals("CESU-8")) // utf8 handles surrogates
return;