8023130: (process) ProcessBuilder#inheritIO does not work on Windows
Reviewed-by: alanb, martin
Contributed-by: ivan.gerasimov@oracle.com
--- a/jdk/src/windows/native/java/lang/ProcessImpl_md.c Fri Sep 20 17:11:32 2013 -0700
+++ b/jdk/src/windows/native/java/lang/ProcessImpl_md.c Mon Sep 23 04:05:42 2013 +0100
@@ -308,7 +308,11 @@
if (success) {
PROCESS_INFORMATION pi;
- DWORD processFlag = CREATE_NO_WINDOW | CREATE_UNICODE_ENVIRONMENT;
+ DWORD processFlag = CREATE_UNICODE_ENVIRONMENT;
+
+ /* Suppress popping-up of a console window for non-console applications */
+ if (GetConsoleWindow() == NULL)
+ processFlag |= CREATE_NO_WINDOW;
si.dwFlags = STARTF_USESTDHANDLES;
if (!CreateProcessW(
--- a/jdk/test/java/lang/ProcessBuilder/Basic.java Fri Sep 20 17:11:32 2013 -0700
+++ b/jdk/test/java/lang/ProcessBuilder/Basic.java Mon Sep 23 04:05:42 2013 +0100
@@ -298,11 +298,15 @@
System.exit(5);
System.err.print("standard error");
System.out.print("standard output");
- } else if (action.equals("testInheritIO")) {
+ } else if (action.equals("testInheritIO")
+ || action.equals("testRedirectInherit")) {
List<String> childArgs = new ArrayList<String>(javaChildArgs);
childArgs.add("testIO");
ProcessBuilder pb = new ProcessBuilder(childArgs);
- pb.inheritIO();
+ if (action.equals("testInheritIO"))
+ pb.inheritIO();
+ else
+ redirectIO(pb, INHERIT, INHERIT, INHERIT);
ProcessResults r = run(pb);
if (! r.out().equals(""))
System.exit(7);
@@ -1019,10 +1023,10 @@
// Note that this requires __FOUR__ nested JVMs involved in one test,
// if you count the harness JVM.
//----------------------------------------------------------------
- {
+ for (String testName : new String[] { "testInheritIO", "testRedirectInherit" } ) {
redirectIO(pb, PIPE, PIPE, PIPE);
List<String> command = pb.command();
- command.set(command.size() - 1, "testInheritIO");
+ command.set(command.size() - 1, testName);
Process p = pb.start();
new PrintStream(p.getOutputStream()).print("standard input");
p.getOutputStream().close();
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/ProcessBuilder/InheritIO/InheritIO.java Mon Sep 23 04:05:42 2013 +0100
@@ -0,0 +1,47 @@
+/*
+ * Copyright (c) 2013, 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.
+ */
+
+import static java.lang.ProcessBuilder.Redirect.*;
+
+class InheritIO {
+
+ public static class TestInheritIO {
+ public static void main(String args[]) throws Throwable {
+ int err = new ProcessBuilder(args).inheritIO().start().waitFor();
+ System.err.print("exit value: " + err);
+ System.exit(err);
+ }
+ }
+
+ public static class TestRedirectInherit {
+ public static void main(String args[]) throws Throwable {
+ int err = new ProcessBuilder(args)
+ .redirectInput(INHERIT)
+ .redirectOutput(INHERIT)
+ .redirectError(INHERIT)
+ .start().waitFor();
+ System.err.print("exit value: " + err);
+ System.exit(err);
+ }
+ }
+}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/java/lang/ProcessBuilder/InheritIO/InheritIO.sh Mon Sep 23 04:05:42 2013 +0100
@@ -0,0 +1,81 @@
+#
+# Copyright (c) 2013, 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 8023130
+# @summary (process) ProcessBuilder#inheritIO does not work on Windows
+# @run shell InheritIO.sh
+
+if [ "x${TESTSRC}" = "x" ]; then
+ echo "TESTSRC not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+if [ "x${TESTJAVA}" = "x" ]; then
+ echo "TESTJAVA not set. Test cannot execute. Failed."
+ exit 1
+fi
+
+
+JAVA="${TESTJAVA}/bin/java"
+JAVAC="${TESTJAVA}/bin/javac"
+
+cp -f ${TESTSRC}/InheritIO.java .
+
+# compile the class ourselves, so this can run as a standalone test
+
+${JAVAC} InheritIO.java
+RES="$?"
+if [ ${RES} != 0 ]; then
+ echo 'FAIL: Cannot compile InheritIO.java'
+ exit ${RES}
+fi
+
+
+for TEST_NAME in TestInheritIO TestRedirectInherit
+do
+ ${JAVA} ${TESTVMOPTS} -classpath . \
+ 'InheritIO$'${TEST_NAME} printf message > stdout.txt 2> stderr.txt
+
+ RES="$?"
+ if [ ${RES} != 0 ]; then
+ echo 'FAIL: InheritIO$'${TEST_NAME}' failed with '${RES}
+ exit ${RES}
+ fi
+
+ OUT_EXPECTED='message'
+ OUT_RECEIVED=`cat stdout.txt`
+ if [ "x${OUT_RECEIVED}" != "x${OUT_EXPECTED}" ]; then
+ echo "FAIL: unexpected '${OUT_RECEIVED}' in stdout"
+ exit 1
+ fi
+
+ ERR_EXPECTED='exit value: 0'
+ ERR_RECEIVED=`cat stderr.txt`
+ if [ "x${ERR_RECEIVED}" != "x${ERR_EXPECTED}" ]; then
+ echo "FAIL: unexpected '${ERR_RECEIVED}' in stderr"
+ exit 1
+ fi
+done
+
+echo 'PASS: InheritIO works as expected'