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