test/sun/nio/cs/TestStringCoding.java
Print this page
@@ -20,11 +20,11 @@
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/* @test
- * @bug 6636323 6636319 7040220 7096080 7183053 8080248
+ * @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,45 +34,65 @@
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)
+ 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);
+
+ 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++) {
- 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));
+ char[] bmp0 = Arrays.copyOf(bmp, rnd.nextInt(0x10000));
+ testNewString(cs, testGetBytes(cs, new String(bmp0)));
//add a pair of surrogates
- int pos = clen / 2;
- if ((pos + 1) < blen) {
- bmpCA[pos] = '\uD800';
- bmpCA[pos+1] = '\uDC00';
+ 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));
}
- test(cs, Arrays.copyOf(bmpCA, clen), Arrays.copyOf(sbBA, blen));
- }
-
+ testSurrogates(cs);
testMixed(cs);
System.out.println("done!");
}
}
}
@@ -107,62 +127,75 @@
throw new RuntimeException("getBytes(csn) failed -> " + cs.name());
}
//getBytes(cs);
bmpBA = bmpStr.getBytes(cs);
- if (!Arrays.equals(bmpBA, baNIO))
+ 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))
+ 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 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);
+ static byte[] testGetBytes(Charset cs, String str) throws Throwable {
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))
+ 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 = bmpStr.getBytes(cs);
- if (!Arrays.equals(baSC, baNIO))
+ 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(sbBA, cs.name());
- String strNIO = dec.reset().decode(ByteBuffer.wrap(sbBA)).toString();
-
- if(!strNIO.equals(strSC))
+ 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(sbBA, cs);
- if (!strNIO.equals(strSC))
- throw new RuntimeException("new String(cs) failed -> " + cs.name());
+ 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;