1 /* 2 * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. Oracle designates this 8 * particular file as subject to the "Classpath" exception as provided 9 * by Oracle in the LICENSE file that accompanied this code. 10 * 11 * This code is distributed in the hope that it will be useful, but WITHOUT 12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 * version 2 for more details (a copy is included in the LICENSE file that 15 * accompanied this code). 16 * 17 * You should have received a copy of the GNU General Public License version 18 * 2 along with this work; if not, write to the Free Software Foundation, 19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 * 21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 * or visit www.oracle.com if you need additional information or have any 23 * questions. 24 */ 25 26 /* @test 27 @bug 6636323 6636319 7040220 28 @summary Test if StringCoding and NIO result have the same de/encoding result 29 * @run main/othervm/timeout=2000 TestStringCoding 30 */ 31 32 import java.util.*; 33 import java.nio.*; 34 import java.nio.charset.*; 35 36 public class TestStringCoding { 37 public static void main(String[] args) throws Throwable { 38 39 for (Boolean hasSM: new boolean[] { false, true }) { 40 if (hasSM) 41 System.setSecurityManager(new PermissiveSecurityManger()); 42 for (Charset cs: Charset.availableCharsets().values()) { 43 if ("ISO-2022-CN".equals(cs.name()) || 44 "x-COMPOUND_TEXT".equals(cs.name()) || 45 "x-JISAutoDetect".equals(cs.name())) 46 continue; 47 System.out.printf("Testing(sm=%b) " + cs.name() + "....", hasSM); 48 // full bmp first 49 char[] bmpCA = new char[0x10000]; 50 for (int i = 0; i < 0x10000; i++) { 51 bmpCA[i] = (char)i; 52 } 53 byte[] sbBA = new byte[0x100]; 54 for (int i = 0; i < 0x100; i++) { 55 sbBA[i] = (byte)i; 56 } 57 test(cs, bmpCA, sbBA); 58 // "randomed" sizes 59 Random rnd = new Random(); 60 for (int i = 0; i < 10; i++) { 61 int clen = rnd.nextInt(0x10000); 62 int blen = rnd.nextInt(0x100); 63 //System.out.printf(" blen=%d, clen=%d%n", blen, clen); 64 test(cs, Arrays.copyOf(bmpCA, clen), Arrays.copyOf(sbBA, blen)); 65 //add a pair of surrogates 66 int pos = clen / 2; 67 if ((pos + 1) < blen) { 68 bmpCA[pos] = '\uD800'; 69 bmpCA[pos+1] = '\uDC00'; 70 } 71 test(cs, Arrays.copyOf(bmpCA, clen), Arrays.copyOf(sbBA, blen)); 72 } 73 System.out.println("done!"); 74 } 75 } 76 } 77 78 static void test(Charset cs, char[] bmpCA, byte[] sbBA) throws Throwable { 79 String bmpStr = new String(bmpCA); 80 CharsetDecoder dec = cs.newDecoder() 81 .onMalformedInput(CodingErrorAction.REPLACE) 82 .onUnmappableCharacter(CodingErrorAction.REPLACE); 83 CharsetEncoder enc = cs.newEncoder() 84 .onMalformedInput(CodingErrorAction.REPLACE) 85 .onUnmappableCharacter(CodingErrorAction.REPLACE); 86 87 //getBytes(csn); 88 byte[] baSC = bmpStr.getBytes(cs.name()); 89 ByteBuffer bf = enc.reset().encode(CharBuffer.wrap(bmpCA)); 90 byte[] baNIO = new byte[bf.limit()]; 91 bf.get(baNIO, 0, baNIO.length); 92 if (!Arrays.equals(baSC, baNIO)) 93 throw new RuntimeException("getBytes(csn) failed -> " + cs.name()); 94 95 //getBytes(cs); 96 baSC = bmpStr.getBytes(cs); 97 if (!Arrays.equals(baSC, baNIO)) 98 throw new RuntimeException("getBytes(cs) failed -> " + cs.name()); 99 100 //new String(csn); 101 String strSC = new String(sbBA, cs.name()); 102 String strNIO = dec.reset().decode(ByteBuffer.wrap(sbBA)).toString(); 103 if(!strNIO.equals(strSC)) 104 throw new RuntimeException("new String(csn) failed -> " + cs.name()); 105 106 //new String(cs); 107 strSC = new String(sbBA, cs); 108 if (!strNIO.equals(strSC)) 109 throw new RuntimeException("new String(cs) failed -> " + cs.name()); 110 111 //encode unmappable surrogates 112 if (enc instanceof sun.nio.cs.ArrayEncoder && 113 cs.contains(Charset.forName("ASCII"))) { 114 if (cs.name().equals("UTF-8")) // utf8 handles surrogates 115 return; 116 enc.replaceWith(new byte[] { (byte)'A'}); 117 sun.nio.cs.ArrayEncoder cae = (sun.nio.cs.ArrayEncoder)enc; 118 119 String str = "ab\uD800\uDC00\uD800\uDC00cd"; 120 byte[] ba = new byte[str.length() - 2]; 121 int n = cae.encode(str.toCharArray(), 0, str.length(), ba); 122 if (n != 6 || !"abAAcd".equals(new String(ba, cs.name()))) 123 throw new RuntimeException("encode1(surrogates) failed -> " 124 + cs.name()); 125 126 ba = new byte[str.length()]; 127 n = cae.encode(str.toCharArray(), 0, str.length(), ba); 128 if (n != 6 || !"abAAcd".equals(new String(ba, 0, n, 129 cs.name()))) 130 throw new RuntimeException("encode2(surrogates) failed -> " 131 + cs.name()); 132 str = "ab\uD800B\uDC00Bcd"; 133 ba = new byte[str.length()]; 134 n = cae.encode(str.toCharArray(), 0, str.length(), ba); 135 if (n != 8 || !"abABABcd".equals(new String(ba, 0, n, 136 cs.name()))) 137 throw new RuntimeException("encode3(surrogates) failed -> " 138 + cs.name()); 139 140 ba = new byte[str.length() - 1]; 141 n = cae.encode(str.toCharArray(), 0, str.length(), ba); 142 if (n != 7 || !"abABABc".equals(new String(ba, 0, n, 143 cs.name()))) 144 throw new RuntimeException("encode4(surrogates) failed -> " 145 + cs.name()); 146 } 147 148 } 149 150 static class PermissiveSecurityManger extends SecurityManager { 151 @Override public void checkPermission(java.security.Permission p) {} 152 } 153 }