--- /dev/null Thu Dec 23 15:18:54 2010 +++ new/test/java/util/Formatter/FailingConstructors.java Thu Dec 23 15:18:52 2010 @@ -0,0 +1,133 @@ +/* + * Copyright (c) 2010, 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. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 7000511 + * @summary PrintStream, PrintWriter, Formatter, Scanner leave files open when + * exception thrown + */ + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.Formatter; + +public class FailingConstructors { + static final String fileName = "FailingConstructorsTest"; + static final String UNSUPPORTED_CHARSET = "unknownCharset"; + static final String FILE_CONTENTS = "This is a small file!"; + + private static void realMain(String[] args) throws Throwable { + test(false, new File(fileName)); + + /* create the file and write its contents */ + File file = File.createTempFile(fileName, null); + file.deleteOnExit(); + FileOutputStream fos = new FileOutputStream(file); + fos.write(FILE_CONTENTS.getBytes()); + fos.close(); + + test(true, file); + file.delete(); + } + + private static void test(boolean exists, File file) throws Throwable { + /* Formatter(File file, String csn) */ + try { + new Formatter(file, UNSUPPORTED_CHARSET); + fail(); + } catch(FileNotFoundException|UnsupportedEncodingException e) { + pass(); + } + + check(exists, file); + + try { + new Formatter(file, null); + fail(); + } catch(FileNotFoundException|NullPointerException e) { + pass(); + } + + check(exists, file); + + /* Formatter(String fileName, String csn) */ + try { + new Formatter(file.getName(), UNSUPPORTED_CHARSET); + fail(); + } catch(FileNotFoundException|UnsupportedEncodingException e) { + pass(); + } + + check(exists, file); + + try { + new Formatter(file.getName(), null); + fail(); + } catch(FileNotFoundException|NullPointerException e) { + pass(); + } + + check(exists, file); + } + + private static void check(boolean exists, File file) { + if (exists) { + /* the file should be unchanged */ + verifyContents(file); + } else { + /* the file should not have been created */ + if (file.exists()) { fail(file + " should not have been created"); } + } + } + + private static void verifyContents(File file) { + try (FileInputStream fis = new FileInputStream(file)) { + byte[] contents = FILE_CONTENTS.getBytes(); + int read, count = 0; + while ((read = fis.read()) != -1) { + if (read != contents[count++]) { + fail("file contents have been altered"); + return; + } + } + } catch (IOException ioe) { + unexpected(ioe); + } + } + + //--------------------- Infrastructure --------------------------- + static volatile int passed = 0, failed = 0; + static void pass() {passed++;} + static void fail() {failed++; Thread.dumpStack();} + static void fail(String message) {System.out.println(message); fail(); } + static void unexpected(Throwable t) {failed++; t.printStackTrace();} + public static void main(String[] args) throws Throwable { + try {realMain(args);} catch (Throwable t) {unexpected(t);} + System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed); + if (failed > 0) throw new AssertionError("Some tests failed");} +}