blob: 61b1c37e73bd87d8e40ec6955bee225098f34338 [file] [log] [blame]
sherman4645e6c2009-03-23 09:19:23 -07001/*
ohair2283b9d2010-05-25 15:58:33 -07002 * Copyright (c) 2000, 2009, Oracle and/or its affiliates. All rights reserved.
sherman4645e6c2009-03-23 09:19:23 -07003 * 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
ohair2283b9d2010-05-25 15:58:33 -07007 * published by the Free Software Foundation. Oracle designates this
sherman4645e6c2009-03-23 09:19:23 -07008 * particular file as subject to the "Classpath" exception as provided
ohair2283b9d2010-05-25 15:58:33 -07009 * by Oracle in the LICENSE file that accompanied this code.
sherman4645e6c2009-03-23 09:19:23 -070010 *
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 *
ohair2283b9d2010-05-25 15:58:33 -070021 * 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.
sherman4645e6c2009-03-23 09:19:23 -070024 */
25
26/* @test
27 @bug 6636323 6636319
28 @summary Test if StringCoding and NIO result have the same de/encoding result
alanb902fc682010-06-23 20:19:29 +010029 * @run main/othervm/timeout=2000 TestStringCoding
sherman4645e6c2009-03-23 09:19:23 -070030 */
31
32import java.util.*;
33import java.nio.*;
34import java.nio.charset.*;
35
36public 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 enc.replaceWith(new byte[] { (byte)'A'});
115 sun.nio.cs.ArrayEncoder cae = (sun.nio.cs.ArrayEncoder)enc;
116
117 String str = "ab\uD800\uDC00\uD800\uDC00cd";
118 byte[] ba = new byte[str.length() - 2];
119 int n = cae.encode(str.toCharArray(), 0, str.length(), ba);
120 if (n != 6 || !"abAAcd".equals(new String(ba, cs.name())))
121 throw new RuntimeException("encode1(surrogates) failed -> "
122 + cs.name());
123
124 ba = new byte[str.length()];
125 n = cae.encode(str.toCharArray(), 0, str.length(), ba);
126 if (n != 6 || !"abAAcd".equals(new String(ba, 0, n,
127 cs.name())))
128 throw new RuntimeException("encode2(surrogates) failed -> "
129 + cs.name());
130 str = "ab\uD800B\uDC00Bcd";
131 ba = new byte[str.length()];
132 n = cae.encode(str.toCharArray(), 0, str.length(), ba);
133 if (n != 8 || !"abABABcd".equals(new String(ba, 0, n,
134 cs.name())))
135 throw new RuntimeException("encode3(surrogates) failed -> "
136 + cs.name());
137
138 ba = new byte[str.length() - 1];
139 n = cae.encode(str.toCharArray(), 0, str.length(), ba);
140 if (n != 7 || !"abABABc".equals(new String(ba, 0, n,
141 cs.name())))
142 throw new RuntimeException("encode4(surrogates) failed -> "
143 + cs.name());
144 }
145
146 }
147
148 static class PermissiveSecurityManger extends SecurityManager {
149 @Override public void checkPermission(java.security.Permission p) {}
150 }
151}