/* * Copyright (c) 2011, 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.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.nio.charset.Charset; 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 { testOutputStream(); 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 testWithAutoFlush() throws Throwable { ByteArrayOutputStream out = new ByteArrayOutputStream(); PrintWriter writer = new PrintWriter(out); PrintWriter writer_noAutoFlush = writer.withAutoFlush(false); if (writer == writer_noAutoFlush) { pass(); } else { fail();; } PrintWriter writer_withAutoFlush = writer.withAutoFlush(true); if (writer == writer_withAutoFlush) { pass(); } else { fail();; } PrintWriter writer_withAutoFlush2 = writer_withAutoFlush.withAutoFlush(true); if (writer_withAutoFlush == writer_withAutoFlush2) { pass(); } else { fail();; } } private static void testOutputStream() throws Throwable { try { new PrintWriter((OutputStream)null, (Charset)null); fail(); } catch(NullPointerException e) { pass(); } } private static void test(boolean exists, File file) throws Throwable { /* PrintWriter(File file, String csn) */ try { new PrintWriter(file, UNSUPPORTED_CHARSET); fail(); } catch(FileNotFoundException|UnsupportedEncodingException e) { pass(); } check(exists, file); try { new PrintWriter(file, (String)null); fail(); } catch(FileNotFoundException|NullPointerException e) { pass(); } check(exists, file); try { new PrintWriter(file, (Charset) null); fail(); } catch(FileNotFoundException|NullPointerException e) { pass(); } check(exists, file); /* PrintWriter(String fileName, String csn) */ try { new PrintWriter(file.getName(), UNSUPPORTED_CHARSET); fail(); } catch(FileNotFoundException|UnsupportedEncodingException e) { pass(); } check(exists, file); try { new PrintWriter(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");} }