Initial load
diff --git a/test/java/io/PipedInputStream/CloseAndAvailableRC.java b/test/java/io/PipedInputStream/CloseAndAvailableRC.java
new file mode 100644
index 0000000..0965345
--- /dev/null
+++ b/test/java/io/PipedInputStream/CloseAndAvailableRC.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2003 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/* @test
+ * @bug 4499763
+ * @summary Check for race condition between close and available
+ */
+
+import java.io.*;
+
+/*
+ * Note: this is a probabalistic test and will not always fail on
+ * a workspace where the race condition can occur. However it should
+ * never fail on a workspace where the bug has been fixed.
+ */
+public class CloseAndAvailableRC {
+    public static void main(final String[] args) throws Exception {
+        CloseAndAvailableRC rc = new CloseAndAvailableRC();
+        rc.go();
+    }
+
+    private PipedInputStream inPipe = null;
+    private PipedOutputStream outPipe = null;
+    private Thread sink = null;
+    private volatile boolean stop = false;
+    private volatile boolean stopTest = false;
+
+    private void go() throws Exception {
+        for (long i=0; i<2000; i++) {
+            if (stopTest) {
+                cleanup();
+                throw new RuntimeException("Test failed");
+            }
+            resetPipes();
+            System.err.println("Closing...");
+            inPipe.close();
+        }
+        cleanup();
+    }
+
+    // Cleanup old threads
+    private void cleanup() throws Exception {
+        if (sink != null) {
+            stop = true;
+            sink.interrupt();
+            try {
+                sink.join();
+            } catch (InterruptedException e) {
+            }
+            stop = false;
+            // Input Stream will have been closed already
+            outPipe.close();
+        }
+    }
+
+    private void resetPipes() throws Exception {
+        cleanup();
+
+        // Init pipe; Note: output never read
+        inPipe = new PipedInputStream();
+        outPipe = new PipedOutputStream(inPipe);
+
+        // Put stuff in pipe so that available() > 0
+        for (byte b = 0; b < 10; b++)
+            outPipe.write(b);
+
+        sink = new Sink();
+        sink.start();
+    }
+
+    private class Sink extends Thread {
+        public void run() {
+            while (!stop) {
+                try {
+                    final int num = inPipe.available();
+                    if (num < 0) {
+                        // Bug detected; stop the test
+                        stopTest = true;
+                    }
+                } catch (final IOException e) {
+                    System.err.println("Error on available:" + e.getMessage());
+                    e.printStackTrace(System.err);
+                }
+            }
+        }
+    }
+}
diff --git a/test/java/io/PipedInputStream/ClosedWriter.java b/test/java/io/PipedInputStream/ClosedWriter.java
new file mode 100644
index 0000000..3c8edea
--- /dev/null
+++ b/test/java/io/PipedInputStream/ClosedWriter.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 1998 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 4130880
+ * @summary reading inputstream from child process throws
+ *          io exception: Write end dead
+ *
+ */
+
+import java.io.*;
+
+public class ClosedWriter implements Runnable {
+    static PipedInputStream is;
+    static PipedOutputStream os;
+
+    public void run() {
+        try {
+            os.write(0);
+            os.write(0);
+            os.write(0);
+            os.write(0);
+            os.write(0);
+            os.close();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        is = new PipedInputStream();
+        os = new PipedOutputStream();
+        is.connect(os);
+
+        Thread t = new Thread(new ClosedWriter());
+        t.start();
+
+        // this should just exit cleanly but the bug causes an exception
+        // to be thrown on the last read.
+        while (is.read() != -1) {
+        }
+    }
+}
diff --git a/test/java/io/PipedInputStream/Constructors.java b/test/java/io/PipedInputStream/Constructors.java
new file mode 100644
index 0000000..57b98c2
--- /dev/null
+++ b/test/java/io/PipedInputStream/Constructors.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2006 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug 4028462
+ * @summary Test for new constructors that set the pipe size
+ */
+
+import java.io.*;
+public class Constructors extends Thread {
+
+    static PipedOutputStream out;
+    static PipedInputStream  in;
+    static int totalToWrite = (8 * 1024);
+    static int pipeSize = totalToWrite;
+
+    public void run() {
+        try {
+            for (int times = (totalToWrite / pipeSize); times > 0; times--) {
+                System.out.println("Pipe Input stream reading...");
+                int read = in.read(new byte[pipeSize]);
+                System.out.println("read: " + read);
+                if (read < pipeSize) {
+                    throw new Exception("Pipe Size is not set to:" + pipeSize);
+                }
+            }
+        } catch (Throwable e) {
+            System.out.println("Pipe Input stream exception:");
+            e.printStackTrace();
+        } finally {
+            System.out.println("Pipe Input stream done.");
+        }
+    }
+
+    public static void main(String args[]) throws Exception {
+
+        in = new PipedInputStream(pipeSize);
+        out = new PipedOutputStream(in);
+        testPipe();
+
+        out = new PipedOutputStream();
+        in = new PipedInputStream(out, pipeSize);
+        testPipe();
+   }
+
+
+   private static void testPipe() throws Exception {
+        Constructors reader = new Constructors();
+        reader.start();
+
+        try {
+            System.out.println("Pipe Output stream started.");
+            out.write(new byte[totalToWrite]);
+        } catch (Throwable e) {
+            System.out.println("Pipe Output stream exception:");
+            e.printStackTrace();
+        } finally {
+            out.close();
+            System.out.println("Waiting for Pipe Input stream...");
+            reader.join();
+            in.close();
+            System.out.println("Done.");
+        }
+    }
+}
diff --git a/test/java/io/PipedInputStream/FasterWriter.java b/test/java/io/PipedInputStream/FasterWriter.java
new file mode 100644
index 0000000..034c6e8
--- /dev/null
+++ b/test/java/io/PipedInputStream/FasterWriter.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 1998 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/*
+ * @test
+ * @bug 4131126
+ * @summary read throws io exception: Write end dead when there still
+ *          is data available in the pipe.
+ *
+ */
+
+import java.io.*;
+
+public class FasterWriter implements Runnable {
+    static PipedInputStream is;
+    static PipedOutputStream os;
+
+    public void run() {
+        try {
+            os.write(0);
+            os.write(0);
+            os.write(0);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static void main(String[] args) throws Exception {
+        is = new PipedInputStream();
+        os = new PipedOutputStream(is);
+
+        Thread t = new Thread(new FasterWriter());
+        t.start();
+        t.join();
+
+        try {
+            is.read();
+        } catch (IOException e) {
+            throw new Exception("Cannot read remaining data in the pipe");
+        }
+    }
+}
diff --git a/test/java/io/PipedInputStream/WriterLoop.java b/test/java/io/PipedInputStream/WriterLoop.java
new file mode 100644
index 0000000..7356bfa
--- /dev/null
+++ b/test/java/io/PipedInputStream/WriterLoop.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2005 Sun Microsystems, Inc.  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 Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
+ * CA 95054 USA or visit www.sun.com if you need additional information or
+ * have any questions.
+ */
+
+/**
+ * @test
+ * @bug  6219755
+ * @summary Write end loops infinitely when the
+ *          buffer is full and the read end has closed.
+ */
+
+import java.io.*;
+
+public class WriterLoop extends Thread {
+
+    static PipedOutputStream out;
+    static PipedInputStream  in;
+
+    public void run() {
+        try {
+            System.out.println("Writer started.");
+
+            // without the fix, this test will hang at this point,
+            // i.e inside the call to write()
+            out.write(new byte[64*1024]);
+        } catch (Throwable e) {
+
+            // with the fix an IOException is caught
+            System.out.println("Writer exception:");
+            e.printStackTrace();
+        } finally {
+            System.out.println("Writer done.");
+        }
+    }
+
+    public static void main(String args[]) throws Exception {
+        in = new PipedInputStream();
+        out = new PipedOutputStream(in);
+        WriterLoop writer = new WriterLoop();
+        writer.start();
+
+        try {
+            System.out.println("Reader reading...");
+            in.read(new byte[2048]);
+
+            System.out.println("Reader closing stream...");
+            in.close();
+
+            System.out.println("Reader sleeping 3 seconds...");
+            Thread.sleep(3000);
+        } catch (Throwable e) {
+            System.out.println("Reader exception:");
+            e.printStackTrace();
+        } finally {
+            System.out.println("Active threads:");
+            Thread[] threads = new Thread[Thread.activeCount()];
+            Thread.enumerate(threads);
+            for (int i = 0; i < threads.length; i++) {
+                System.out.println("  " + threads[i]);
+            }
+            System.out.println("Waiting for writer...");
+            writer.join();
+            System.out.println("Done.");
+        }
+    }
+}