test/jdk/sun/nio/cs/TestStringCoding.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. --- 1,7 ---- /* ! * Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation.
*** 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 */ --- 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 8021560 * @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 */
*** 32,41 **** --- 32,44 ---- import java.util.*; import java.nio.*; import java.nio.charset.*; public class TestStringCoding { + + private static Random r = new Random(); + public static void main(String[] args) throws Throwable { // full bmp first char[] bmp = new char[0x10000]; for (int i = 0; i < 0x10000; i++) {
*** 53,66 **** --- 56,74 ---- for (Boolean hasSM: new boolean[] { false, true }) { if (hasSM) { System.setSecurityManager(new PermissiveSecurityManger()); } for (Charset cs: Charset.availableCharsets().values()) { + + if (!cs.name().contains("Big5-HKSCS")) + continue; + 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)));
*** 116,193 **** Collections.shuffle(cps); char[] bmpCA = new char[cps.size()]; for (int i = 0; i < cps.size(); i++) bmpCA[i] = (char)(int)cps.get(i); String bmpStr = new String(bmpCA); ! //getBytes(csn); ! byte[] bmpBA = 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(bmpBA, baNIO)) { ! 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 --- 124,307 ---- Collections.shuffle(cps); char[] bmpCA = new char[cps.size()]; for (int i = 0; i < cps.size(); i++) bmpCA[i] = (char)(int)cps.get(i); String bmpStr = new String(bmpCA); ! // test getBytes() ! byte[] bmpBA = testGetBytes(cs, bmpStr); ! // test new String() ! testNewString(cs, bmpBA); } 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 assertEquals(int len1, int len2, String msg) { + if (len1 != len2) + throw new RuntimeException("FAILED: " + msg); + } + + static void assertEquals(byte[] a, int afrom, int ato, + byte[] b, int bfrom, int bto, + String msg) { + if (!Arrays.equals(a, afrom, ato, b, bfrom, bto)) { + throw new RuntimeException("FAILED: " + msg); + } + } + + static void assertEquals(ByteBuffer bb, int pos, byte[] b, int from, int to, + byte[] buf, String msg) { + bb.flip().position(pos); + int len = bb.remaining(); + bb.get(buf, 0, len); + if (!Arrays.equals(buf, 0, len, b, from, to)) { + throw new RuntimeException("FAILED: " + msg); + } + } + static byte[] testGetBytes(Charset cs, String str) throws Throwable { CharsetEncoder enc = cs.newEncoder() .onMalformedInput(CodingErrorAction.REPLACE) ! .onUnmappableCharacter(CodingErrorAction.REPLACE) ! .reset(); ! //getBytes(csn); ! String csn = cs.name(); ! byte[] baSC = str.getBytes(csn); byte[] baNIO = getBytes(enc, str); ! assertEquals(baSC, 0, baSC.length, baNIO, 0, baNIO.length, "getBytes(csn)"); ! //getBytes(cs); baSC = str.getBytes(cs); ! assertEquals(baSC, 0, baSC.length, baNIO, 0, baNIO.length, "getBytes(cs)"); ! ! byte[] buf = new byte[baNIO.length + 100]; ! int shortenLen = Math.max(0, baNIO.length - 10); ! int slen = str.length(); ! ! // getBytes(int, int ByteBuffer, cs); ! ByteBuffer bb = ByteBuffer.wrap(buf); ! int n = str.getBytes(0, slen, bb, cs); ! int bn = bb.position(); ! assertEquals(n, slen, "getBytes(bb cs)"); ! assertEquals(buf, 0, bn, baNIO, 0, baNIO.length, "getBytes(bb, cs)"); ! ! bb.clear().position(3); ! n = str.getBytes(0, slen, bb, cs); ! bn = bb.position(); ! assertEquals(n, slen, "getBytes(bb/3, cs)"); ! assertEquals(buf, 3, bn, baNIO, 0, baNIO.length, "getBytes(bb/3, cs)"); ! ! bb.clear().limit(shortenLen); ! n = str.getBytes(0, slen, bb, cs); ! bn = bb.position(); ! assertEquals(buf, 0, bn, baNIO, 0, bn, "getBytes(bb, cs)/shortenLen"); ! ! System.out.printf ("testGetBytes.loop: str.len=%d, buf.len=%d, baNIO.len=%d%n", ! slen, buf.length, baNIO.length); ! ! int off = 0; ! int m = 0; ! bb.clear(); ! while (off < slen) { ! int nn = slen - off; ! if (m++ < 10 && nn > 10) { ! nn = r.nextInt(nn); ! } ! n = str.getBytes(off, off + nn, bb, cs); ! off += n; ! System.out.printf (" ---> off=%d, slen=%d, bb.rem=%d, n=%d, nn=%d m=%d%n", off, slen, bb.remaining(), n, nn, m); ! } ! ! bb.flip(); ! // assertEquals(buf, 0, bn, baNIO, 0, bn, "getBytes(bb, cs)/loop"); ! ! if (!new String(bb, cs).equals(new String(baNIO, cs))) { ! bb.rewind(); ! String s1 = new String(bb, cs); ! String s2 = new String(baNIO, cs); ! ! System.out.printf(" bb.str.len=%d, nio.str.len=%d%n", s1.length(), s2.length()); ! for (int i = 0 ;i < s1.length(); i++) { ! if (s1.charAt(i) != s2.charAt(i)) { ! System.out.printf(" [%d] %x %x%n", i, s1.charAt(i) & 0xffff, s2.charAt(i) & 0xffff); ! } ! } ! ! ! throw new RuntimeException("getBytes(bb, cs)/loop"); ! //new RuntimeException("getBytes(bb, cs)/loop").printStackTrace(); } + + // getBytes(int, int, ByteBuffer/direct, cs); + bb = ByteBuffer.allocateDirect(buf.length); + n = str.getBytes(0, slen, bb, cs); + assertEquals(n, slen, "getBytes(bb cs)"); + assertEquals(bb, 0, baNIO, 0, baNIO.length, buf, "getBytes(bb, cs)"); + + bb.clear().position(3); + n = str.getBytes(0, slen, bb, cs); + assertEquals(n, slen, "getBytes(bb, cs)"); + assertEquals(bb, 3, baNIO, 0, baNIO.length, buf, "getBytes(bb/3, cs)"); + + bb.clear().limit(shortenLen); + n = str.getBytes(0, slen, bb, cs); + bn = bb.position(); + assertEquals(bb, 0, baNIO, 0, bn, buf, "getBytes(bb, cs)/shortenLen"); + return baSC; } static String testNewString(Charset cs, byte[] ba) throws Throwable { CharsetDecoder dec = cs.newDecoder() .onMalformedInput(CodingErrorAction.REPLACE) .onUnmappableCharacter(CodingErrorAction.REPLACE); + + String csn = cs.name(); + //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 -> " + csn); } //new String(cs); strSC = new String(ba, cs); if (!strNIO.equals(strSC)) { ! throw new RuntimeException("new String(cs) failed -> " + csn); ! } ! ! //new String(bytebuffer, cs); ! ByteBuffer bb = ByteBuffer.allocate(ba.length + 10); ! bb.put(ba); ! bb.flip(); ! if (!strNIO.equals(new String(bb, cs))) { ! throw new RuntimeException("new String(bb, cs) failed -> " + csn); ! } ! ! bb.clear().position(3).put(ba).flip(); ! if (!strNIO.equals(new String(bb.position(3), cs))) { ! throw new RuntimeException("new String(cs)/pos=3 failed -> " + csn); ! } ! ! //new String(bytebuffer/direct, cs); ! bb = ByteBuffer.allocateDirect(ba.length + 10); ! bb.put(ba); ! bb.flip(); ! if (!strNIO.equals(new String(bb, cs))) { ! throw new RuntimeException("new String(cs)/bmp failed -> " + csn); } + + bb.clear().position(3).put(ba).flip(); + if (!strNIO.equals(new String(bb.position(3), cs))) { + throw new RuntimeException("new String(cs)/pos=3 failed -> " + csn); + } + return strSC; } static void testSurrogates(Charset cs) throws Throwable { //encode unmappable surrogates