--- old/test/jdk/sun/nio/cs/TestStringCoding.java 2018-03-22 14:00:53.789559298 -0700 +++ new/test/jdk/sun/nio/cs/TestStringCoding.java 2018-03-22 14:00:53.420525859 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. + * 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 @@ -22,7 +22,7 @@ */ /* @test - * @bug 6636323 6636319 7040220 7096080 7183053 8080248 8054307 + * @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 @@ -34,6 +34,9 @@ import java.nio.charset.*; public class TestStringCoding { + + private static Random r = new Random(); + public static void main(String[] args) throws Throwable { // full bmp first @@ -55,10 +58,15 @@ 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))); @@ -118,32 +126,10 @@ 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()); - } + // test getBytes() + byte[] bmpBA = testGetBytes(cs, bmpStr); + // test new String() + testNewString(cs, bmpBA); } static byte[] getBytes(CharsetEncoder enc, String str) throws Throwable { @@ -153,21 +139,119 @@ 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); + .onUnmappableCharacter(CodingErrorAction.REPLACE) + .reset(); + //getBytes(csn); - byte[] baSC = str.getBytes(cs.name()); + String csn = cs.name(); + byte[] baSC = str.getBytes(csn); byte[] baNIO = getBytes(enc, str); - if (!Arrays.equals(baSC, baNIO)) { - throw new RuntimeException("getBytes(csn) failed -> " + cs.name()); - } + assertEquals(baSC, 0, baSC.length, baNIO, 0, baNIO.length, "getBytes(csn)"); + //getBytes(cs); baSC = str.getBytes(cs); - if (!Arrays.equals(baSC, baNIO)) { - throw new RuntimeException("getBytes(cs) failed -> " + cs.name()); + 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; } @@ -175,17 +259,47 @@ 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 -> " + cs.name()); + 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)/bmp failed -> " + cs.name()); + 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; }