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;