< 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 >