1 /*
   2  * Copyright (c) 2006, 2016, 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.
   8  *
   9  * This code is distributed in the hope that it will be useful, but WITHOUT
  10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  12  * version 2 for more details (a copy is included in the LICENSE file that
  13  * accompanied this code).
  14  *
  15  * You should have received a copy of the GNU General Public License version
  16  * 2 along with this work; if not, write to the Free Software Foundation,
  17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  18  *
  19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  20  * or visit www.oracle.com if you need additional information or have any
  21  * questions.
  22  */
  23 
  24 /*
  25  * @test
  26  * @bug 4625418
  27  * @summary Tests XML <a href="http://download.java.net/jdk6/docs/technotes/guides/intl/encoding.doc.html">encoding</a>
  28  * @author Sergey Malenkov
  29  * @run main/timeout=360 Test4625418
  30  */
  31 
  32 import java.beans.ExceptionListener;
  33 import java.beans.XMLDecoder;
  34 import java.beans.XMLEncoder;
  35 import java.io.ByteArrayInputStream;
  36 import java.io.ByteArrayOutputStream;
  37 import java.io.InputStream;
  38 import java.nio.charset.IllegalCharsetNameException;
  39 import java.nio.charset.UnsupportedCharsetException;
  40 
  41 public final class Test4625418 implements ExceptionListener {
  42 
  43     private static final String[] encodings = {
  44         "ASCII",
  45         "Big5",
  46         //"Big5-HKSCS",
  47         //"Big5_HKSCS",
  48         "Big5_Solaris",
  49         //"Cp037",
  50         "Cp1006",
  51         //"Cp1025",
  52         //"Cp1026",
  53         "Cp1046",
  54         "Cp1047",
  55         "Cp1097",
  56         "Cp1098",
  57         //"Cp1112",
  58         //"Cp1122",
  59         //"Cp1123",
  60         "Cp1124",
  61         //"Cp1140",
  62         //"Cp1141",
  63         //"Cp1142",
  64         //"Cp1143",
  65         //"Cp1144",
  66         //"Cp1145",
  67         //"Cp1146",
  68         //"Cp1147",
  69         //"Cp1148",
  70         //"Cp1149",
  71         "Cp1250",
  72         "Cp1251",
  73         "Cp1252",
  74         "Cp1253",
  75         "Cp1254",
  76         "Cp1255",
  77         "Cp1256",
  78         "Cp1257",
  79         "Cp1258",
  80         //"Cp1381",
  81         //"Cp1383",
  82         //"Cp273",
  83         //"Cp277",
  84         //"Cp278",
  85         //"Cp280",
  86         //"Cp284",
  87         //"Cp285",
  88         //"Cp297",
  89         //"Cp33722",
  90         //"Cp420",
  91         //"Cp424",
  92         "Cp437",
  93         //"Cp500",
  94         //"Cp50220",
  95         //"Cp50221",
  96         "Cp737",
  97         "Cp775",
  98         //"Cp834",
  99         //"Cp838",
 100         "Cp850",
 101         "Cp852",
 102         "Cp855",
 103         "Cp856",
 104         "Cp857",
 105         "Cp858",
 106         "Cp860",
 107         "Cp861",
 108         "Cp862",
 109         "Cp863",
 110         "Cp864",
 111         "Cp865",
 112         "Cp866",
 113         "Cp868",
 114         "Cp869",
 115         //"Cp870",
 116         //"Cp871",
 117         "Cp874",
 118         //"Cp875",
 119         //"Cp918",
 120         "Cp921",
 121         "Cp922",
 122         //"Cp930",
 123         "Cp933",
 124         //"Cp935",
 125         //"Cp937",
 126         //"Cp939",
 127         //"Cp942",
 128         //"Cp942C",
 129         "Cp943",
 130         //"Cp943C",
 131         "Cp948",
 132         "Cp949",
 133         //"Cp949C",
 134         "Cp950",
 135         "Cp964",
 136         //"Cp970",
 137         //"EUC-JP",
 138         "EUC-KR",
 139         "EUC_CN",
 140         //"EUC_JP",
 141         //"EUC_JP_LINUX",
 142         //"EUC_JP_Solaris",
 143         "EUC_KR",
 144         //"EUC_TW",
 145         "GB18030",
 146         "GB2312",
 147         "GBK",
 148         //"IBM-Thai",
 149         "IBM00858",
 150         //"IBM01140",
 151         //"IBM01141",
 152         //"IBM01142",
 153         //"IBM01143",
 154         //"IBM01144",
 155         //"IBM01145",
 156         //"IBM01146",
 157         //"IBM01147",
 158         //"IBM01148",
 159         //"IBM01149",
 160         //"IBM037",
 161         //"IBM1026",
 162         "IBM1047",
 163         //"IBM273",
 164         //"IBM277",
 165         //"IBM278",
 166         //"IBM280",
 167         //"IBM284",
 168         //"IBM285",
 169         //"IBM297",
 170         //"IBM420",
 171         //"IBM424",
 172         "IBM437",
 173         //"IBM500",
 174         "IBM775",
 175         "IBM850",
 176         "IBM852",
 177         "IBM855",
 178         "IBM857",
 179         "IBM860",
 180         "IBM861",
 181         "IBM862",
 182         "IBM863",
 183         "IBM864",
 184         "IBM865",
 185         "IBM866",
 186         "IBM868",
 187         "IBM869",
 188         //"IBM870",
 189         //"IBM871",
 190         //"IBM918",
 191         //"ISCII91",
 192         //"ISO-2022-CN",
 193         "ISO-2022-JP",
 194         "ISO-2022-KR",
 195         "ISO-8859-1",
 196         "ISO-8859-13",
 197         "ISO-8859-15",
 198         "ISO-8859-2",
 199         "ISO-8859-3",
 200         "ISO-8859-4",
 201         "ISO-8859-5",
 202         "ISO-8859-6",
 203         "ISO-8859-7",
 204         "ISO-8859-8",
 205         "ISO-8859-9",
 206         //"ISO2022CN",
 207         "ISO2022JP",
 208         "ISO2022KR",
 209         //"ISO2022_CN_CNS",
 210         //"ISO2022_CN_GB",
 211         "ISO8859_1",
 212         "ISO8859_13",
 213         "ISO8859_15",
 214         "ISO8859_2",
 215         "ISO8859_3",
 216         "ISO8859_4",
 217         "ISO8859_5",
 218         "ISO8859_6",
 219         "ISO8859_7",
 220         "ISO8859_8",
 221         "ISO8859_9",
 222         //"JISAutoDetect",
 223         //"JIS_X0201",
 224         //"JIS_X0212-1990",
 225         "KOI8-R",
 226         "KOI8-U",
 227         "KOI8_R",
 228         "KOI8_U",
 229         "MS874",
 230         //"MS932",
 231         //"MS936",
 232         "MS949",
 233         "MS950",
 234         //"MS950_HKSCS",
 235         "MacArabic",
 236         "MacCentralEurope",
 237         "MacCroatian",
 238         "MacCyrillic",
 239         //"MacDingbat",
 240         "MacGreek",
 241         "MacHebrew",
 242         "MacIceland",
 243         "MacRoman",
 244         "MacRomania",
 245         //"MacSymbol",
 246         "MacThai",
 247         "MacTurkish",
 248         "MacUkraine",
 249         //"PCK",
 250         //"SJIS",
 251         //"Shift_JIS",
 252         "TIS-620",
 253         "TIS620",
 254         "US-ASCII",
 255         "UTF-16",
 256         "UTF-16BE",
 257         "UTF-16LE",
 258         "UTF-32",
 259         "UTF-32BE",
 260         "UTF-32LE",
 261         "UTF-8",
 262         "UTF8",
 263         "UTF_32",
 264         "UTF_32BE",
 265         //"UTF_32BE_BOM",
 266         "UTF_32LE",
 267         //"UTF_32LE_BOM",
 268         "UnicodeBig",
 269         "UnicodeBigUnmarked",
 270         "UnicodeLittle",
 271         "UnicodeLittleUnmarked",
 272         "windows-1250",
 273         "windows-1251",
 274         "windows-1252",
 275         "windows-1253",
 276         "windows-1254",
 277         "windows-1255",
 278         "windows-1256",
 279         "windows-1257",
 280         "windows-1258",
 281         //"windows-31j",
 282         //"x-Big5_Solaris",
 283         //"x-EUC-TW",
 284         "x-IBM1006",
 285         //"x-IBM1025",
 286         "x-IBM1046",
 287         "x-IBM1097",
 288         "x-IBM1098",
 289         //"x-IBM1112",
 290         //"x-IBM1122",
 291         //"x-IBM1123",
 292         "x-IBM1124",
 293         //"x-IBM1381",
 294         //"x-IBM1383",
 295         //"x-IBM33722",
 296         "x-IBM737",
 297         //"x-IBM834",
 298         "x-IBM856",
 299         "x-IBM874",
 300         //"x-IBM875",
 301         "x-IBM921",
 302         "x-IBM922",
 303         //"x-IBM930",
 304         "x-IBM933",
 305         //"x-IBM935",
 306         //"x-IBM937",
 307         //"x-IBM939",
 308         //"x-IBM942",
 309         //"x-IBM942C",
 310         "x-IBM943",
 311         //"x-IBM943C",
 312         "x-IBM948",
 313         "x-IBM949",
 314         //"x-IBM949C",
 315         "x-IBM950",
 316         "x-IBM964",
 317         //"x-IBM970",
 318         //"x-ISCII91",
 319         //"x-ISO2022-CN-CNS",
 320         //"x-ISO2022-CN-GB",
 321         //"x-JIS0208",
 322         //"x-JISAutoDetect",
 323         "x-Johab",
 324         //"x-MS950-HKSCS",
 325         "x-MacArabic",
 326         "x-MacCentralEurope",
 327         "x-MacCroatian",
 328         "x-MacCyrillic",
 329         //"x-MacDingbat",
 330         "x-MacGreek",
 331         "x-MacHebrew",
 332         "x-MacIceland",
 333         "x-MacRoman",
 334         "x-MacRomania",
 335         //"x-MacSymbol",
 336         "x-MacThai",
 337         "x-MacTurkish",
 338         "x-MacUkraine",
 339         //"x-PCK",
 340         "x-UTF-16LE-BOM",
 341         //"x-UTF-32BE-BOM",
 342         //"x-UTF-32LE-BOM",
 343         //"x-euc-jp-linux",
 344         //"x-eucJP-Open",
 345         "x-iso-8859-11",
 346         "x-mswin-936",
 347         //"x-windows-50220",
 348         //"x-windows-50221",
 349         "x-windows-874",
 350         "x-windows-949",
 351         "x-windows-950",
 352         //"x-windows-iso2022jp",
 353     };
 354 
 355     public static void main(final String[] args) {
 356         final String string = createString(0x10000);
 357         for (String encoding : encodings) {
 358             System.out.println("Test encoding: " + encoding);
 359             new Test4625418(encoding).test(string);
 360         }
 361     }
 362 
 363     private static String createString(int length) {
 364         StringBuilder sb = new StringBuilder(length);
 365         while (0 < length--)
 366             sb.append((char) length);
 367 
 368         return sb.toString();
 369     }
 370 
 371     private final String encoding;
 372 
 373     private Test4625418(final String encoding) {
 374         this.encoding = encoding;
 375     }
 376 
 377     private void test(String string) {
 378         try {
 379             ByteArrayOutputStream output = new ByteArrayOutputStream();
 380             XMLEncoder encoder = new XMLEncoder(output, this.encoding, true, 0);
 381             encoder.setExceptionListener(this);
 382             encoder.writeObject(string);
 383             encoder.close();
 384 
 385             InputStream input = new ByteArrayInputStream(output.toByteArray());
 386             XMLDecoder decoder = new XMLDecoder(input);
 387             decoder.setExceptionListener(this);
 388             Object object = decoder.readObject();
 389             decoder.close();
 390 
 391             if (!string.equals(object)) {
 392                 throw new Error(this.encoding + " - can't read properly");
 393             }
 394         }
 395         catch (IllegalCharsetNameException exception) {
 396             throw new Error(this.encoding + " - illegal charset name", exception);
 397         }
 398         catch (UnsupportedCharsetException exception) {
 399             throw new Error(this.encoding + " - unsupported charset", exception);
 400         }
 401         catch (UnsupportedOperationException exception) {
 402             throw new Error(this.encoding + " - unsupported encoder", exception);
 403         }
 404     }
 405 
 406     public void exceptionThrown(Exception exception) {
 407         throw new Error(this.encoding + " - internal", exception);
 408     }
 409 }