test/java/io/etc/FailingFlushAndClose.java

Print this page

        

@@ -23,11 +23,11 @@
 
 import java.io.*;
 
 /**
  * @test
- * @bug 7015589
+ * @bug 7015589 8054565
  * @summary Test that buffering streams are considered closed even when the
  *    close or flush from the underlying stream fails.
  */
 
 public class FailingFlushAndClose {

@@ -163,24 +163,25 @@
                 throw new IOException("close failed");
             }
         }
     }
 
-    static void testFailingClose(InputStream in) throws IOException {
+    static InputStream testFailingClose(InputStream in) throws IOException {
         System.out.println(in.getClass());
         in.read(new byte[100]);
         try {
             in.close();
             fail("close did not fail");
         } catch (IOException expected) { }
         try {
             in.read(new byte[100]);
             fail("read did not fail");
         } catch (IOException expected) { }
+        return in;
     }
 
-    static void testFailingClose(OutputStream out) throws IOException {
+    static OutputStream testFailingClose(OutputStream out) throws IOException {
         System.out.println(out.getClass());
         out.write(1);
         try {
             out.close();
             fail("close did not fail");

@@ -188,13 +189,14 @@
         try {
             out.write(1);
             if (!(out instanceof BufferedOutputStream))
                 fail("write did not fail");
         } catch (IOException expected) { }
+        return out;
     }
 
-    static void testFailingFlush(OutputStream out) throws IOException {
+    static OutputStream testFailingFlush(OutputStream out) throws IOException {
         System.out.println(out.getClass());
         out.write(1);
         try {
             out.flush();
             fail("flush did not fail");

@@ -204,39 +206,59 @@
             try {
                 out.close();
                 fail("close did not fail");
             } catch (IOException expected) { }
         }
+        return out;
     }
 
-    static void testFailingClose(Reader r) throws IOException {
+    static void closeAgain(InputStream in) throws IOException {
+        // assert the given stream should already be closed.
+        try {
+            in.close();
+        } catch (IOException expected) {
+            fail("unexpected IOException from subsequent close");
+        }
+    }
+    static void closeAgain(OutputStream out) throws IOException {
+        // assert the given stream should already be closed.
+        try {
+            out.close();
+        } catch (IOException expected) {
+            fail("unexpected IOException from subsequent close");
+        }
+    }
+
+    static Reader testFailingClose(Reader r) throws IOException {
         System.out.println(r.getClass());
         r.read(new char[100]);
         try {
             r.close();
             fail("close did not fail");
         } catch (IOException expected) { }
         try {
             r.read(new char[100]);
             fail("read did not fail");
         } catch (IOException expected) { }
+        return r;
     }
 
-    static void testFailingClose(Writer w) throws IOException {
+    static Writer testFailingClose(Writer w) throws IOException {
         System.out.println(w.getClass());
         w.write("message");
         try {
             w.close();
             fail("close did not fail");
         } catch (IOException expected) { }
         try {
             w.write("another message");
             fail("write did not fail");
         } catch (IOException expected) { }
+        return w;
     }
 
-    static void testFailingFlush(Writer w) throws IOException {
+    static Writer testFailingFlush(Writer w) throws IOException {
         System.out.println(w.getClass());
         w.write("message");
         try {
             w.flush();
             fail("flush did not fail");

@@ -247,22 +269,42 @@
             try {
                 w.close();
                 fail("close did not fail");
             } catch (IOException expected) { }
         }
+        return w;
+    }
+
+    static Reader closeAgain(Reader r) throws IOException {
+        // assert the given stream should already be closed.
+        try {
+            r.close();
+        } catch (IOException expected) {
+            fail("unexpected IOException from subsequent close");
+        }
+        return r;
+    }
+    static Writer closeAgain(Writer w) throws IOException {
+        // assert the given stream should already be closed.
+        try {
+            w.close();
+        } catch (IOException expected) {
+            fail("unexpected IOException from subsequent close");
+        }
+        return w;
     }
 
     public static void main(String[] args) throws IOException {
 
-        testFailingClose(new BufferedInputStream(new FailingCloseInputStream()));
-        testFailingClose(new BufferedOutputStream(new FailingCloseOutputStream()));
+        closeAgain(testFailingClose(new BufferedInputStream(new FailingCloseInputStream())));
+        closeAgain(testFailingClose(new BufferedOutputStream(new FailingCloseOutputStream())));
 
-        testFailingClose(new BufferedReader(new FailingCloseReader()));
-        testFailingClose(new BufferedWriter(new FailingCloseWriter()));
+        closeAgain(testFailingClose(new BufferedReader(new FailingCloseReader())));
+        closeAgain(testFailingClose(new BufferedWriter(new FailingCloseWriter())));
 
-        testFailingFlush(new BufferedOutputStream(new FailingFlushOutputStream()));
-        testFailingFlush(new BufferedWriter(new FailingFlushWriter()));
+        closeAgain(testFailingFlush(new BufferedOutputStream(new FailingFlushOutputStream())));
+        closeAgain(testFailingFlush(new BufferedWriter(new FailingFlushWriter())));
 
         if (failed > 0)
             throw new RuntimeException(failed + " test(s) failed - see log for details");
     }
 }