395N/A/*
2362N/A * Copyright (c) 2008, Oracle and/or its affiliates. All rights reserved.
395N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
395N/A *
395N/A * This code is free software; you can redistribute it and/or modify it
395N/A * under the terms of the GNU General Public License version 2 only, as
395N/A * published by the Free Software Foundation.
395N/A *
395N/A * This code is distributed in the hope that it will be useful, but WITHOUT
395N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
395N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
395N/A * version 2 for more details (a copy is included in the LICENSE file that
395N/A * accompanied this code).
395N/A *
395N/A * You should have received a copy of the GNU General Public License version
395N/A * 2 along with this work; if not, write to the Free Software Foundation,
395N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
395N/A *
2362N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
2362N/A * or visit www.oracle.com if you need additional information or have any
2362N/A * questions.
395N/A */
395N/A
395N/A/* @test
395N/A @bug 4508058 6378911
395N/A @summary Check if UTF8 decoder handles BOM correctly
395N/A */
395N/A
395N/Aimport java.io.IOException;
395N/Aimport java.nio.BufferOverflowException;
395N/Aimport java.nio.*;
395N/Aimport java.nio.charset.*;
395N/A
395N/A/* The fix for 6378911 is to backout the change we made for 4508058,
395N/A so this regtest is modified accordingly to leave the beginning
395N/A BOM untouched during decoding.
395N/A */
395N/Apublic class TestUTF8BOM {
395N/A private static ByteBuffer bf = ByteBuffer.allocateDirect(1000);
395N/A private static void testDecode(String expected, byte[] input)
395N/A throws Exception
395N/A {
395N/A String out = new String(input, "utf8");
395N/A if (!out.equals(expected)) {
395N/A failureReport (out, expected);
395N/A throw new Exception("UTF_8 Decoding test failed");
395N/A }
395N/A
395N/A //try directBuffer.
395N/A bf.clear();
395N/A bf.put(input).flip();
395N/A out = Charset.forName("UTF-8")
395N/A .decode(bf)
395N/A .toString();
395N/A if (!out.equals(expected)) {
395N/A failureReport (out, expected);
395N/A throw new Exception("UTF_8 Decoding test failed(directbuffer)");
395N/A }
395N/A }
395N/A
395N/A private static void failureReport(String testStr,
395N/A String expected) {
395N/A
395N/A System.err.println ("Expected Characters:");
395N/A for (int i = 0; i < expected.length() ; i++) {
395N/A System.out.println("expected char[" + i + "] : " +
395N/A Integer.toHexString((int)expected.charAt(i)) +
395N/A " obtained char[" + i + "] : " +
395N/A Integer.toHexString((int)testStr.charAt(i)));
395N/A }
395N/A }
395N/A
395N/A public static void main (String[] args) throws Exception {
395N/A // Test 1: with BOM at beginning
395N/A testDecode("\ufeff\u0092\u0093",
395N/A new byte[] { (byte) 0xef, (byte) 0xbb, (byte) 0xbf,
395N/A (byte) 0xc2, (byte) 0x92,
395N/A (byte) 0xc2, (byte) 0x93 });
395N/A // Test 2: with BOM at middle
395N/A testDecode("\u9200\ufeff\u9300",
395N/A new byte[] { (byte) 0xe9, (byte) 0x88, (byte) 0x80,
395N/A (byte) 0xef, (byte) 0xbb, (byte) 0xbf,
395N/A (byte) 0xe9, (byte) 0x8c, (byte) 0x80 });
395N/A
395N/A // Test 3: with BOM at end
395N/A testDecode("\u9200\u9300\ufeff",
395N/A new byte[] { (byte) 0xe9, (byte) 0x88, (byte) 0x80,
395N/A (byte) 0xe9, (byte) 0x8c, (byte) 0x80,
395N/A (byte) 0xef, (byte) 0xbb, (byte) 0xbf });
395N/A System.err.println ("\nPASSED UTF-8 decode BOM test");
395N/A }
395N/A}