< prev index next >

test/jdk/java/io/DataOutputStream/WriteUTF.java

Print this page

        

*** 1,7 **** /* ! * Copyright (c) 1999, 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) 1999, 2019, 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,40 **** * or visit www.oracle.com if you need additional information or have any * questions. */ /* @test ! @bug 4260284 ! @summary Test if DataOutputStream will overcount written field. ! */ ! import java.io.*; public class WriteUTF { ! public static void main(String[] args) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF("Hello, World!"); // 15 dos.flush(); if (baos.size() != dos.size()) throw new RuntimeException("Miscounted bytes in DataOutputStream."); } } --- 20,75 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ /* @test ! * @bug 4260284 8219196 ! * @summary Test if DataOutputStream will overcount written field. ! * @run testng WriteUTF ! */ ! ! import java.io.ByteArrayOutputStream; ! import java.io.DataOutputStream; ! import java.io.IOException; ! import java.io.UTFDataFormatException; ! import org.testng.annotations.Test; public class WriteUTF { ! @Test ! public static void overcountWrittenField() throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream dos = new DataOutputStream(baos); dos.writeUTF("Hello, World!"); // 15 dos.flush(); if (baos.size() != dos.size()) throw new RuntimeException("Miscounted bytes in DataOutputStream."); } + + private static void writeUTF(int size) throws IOException { + StringBuilder sb = new StringBuilder(size); + // this character gives 3 bytes when encoded using UTF-8 + char c = 0x0800; + for (int i = 0; i < size; ++i) { + sb.append(c); + } + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + DataOutputStream dos = new DataOutputStream(bos); + String s = sb.toString(); + // throws ArrayIndexOutOfBoundsException instead of expected + // UTFDataFormatException + dos.writeUTF(s); + } + + @Test(expectedExceptions = UTFDataFormatException.class) + public void utfDataFormatException() throws IOException { + writeUTF(1 << 16); + } + + // Without 8219196 fix, throws ArrayIndexOutOfBoundsException instead of + // expected UTFDataFormatException. Disabled because it requires 4GB of + // heap (-Xmx4g) to run without throwing an OutOfMemoryError. + @Test(expectedExceptions = UTFDataFormatException.class, enabled = false) + public void arrayIndexOutOfBoundsException() throws IOException { + writeUTF(Integer.MAX_VALUE / 3 + 1); + } }
< prev index next >