Author: sgoeschl
Date: Fri Jan  8 23:29:56 2016
New Revision: 1723815

URL: http://svn.apache.org/viewvc?rev=1723815&view=rev
Log:
[EXEC-86] Clean up the tests and disable execution of broken tests on Mac OS X

Added:
    commons/proper/exec/trunk/src/test/scripts/issues/exec-57-detached.sh   
(with props)
    commons/proper/exec/trunk/src/test/scripts/issues/exec-57-nohup.sh
      - copied, changed from r1723805, 
commons/proper/exec/trunk/src/test/scripts/invoker.sh
Removed:
    commons/proper/exec/trunk/src/test/scripts/invoker.sh
Modified:
    
commons/proper/exec/trunk/src/main/java/org/apache/commons/exec/PumpStreamHandler.java
    
commons/proper/exec/trunk/src/test/java/org/apache/commons/exec/AbstractExecTest.java
    
commons/proper/exec/trunk/src/test/java/org/apache/commons/exec/issues/Exec57Test.java

Modified: 
commons/proper/exec/trunk/src/main/java/org/apache/commons/exec/PumpStreamHandler.java
URL: 
http://svn.apache.org/viewvc/commons/proper/exec/trunk/src/main/java/org/apache/commons/exec/PumpStreamHandler.java?rev=1723815&r1=1723814&r2=1723815&view=diff
==============================================================================
--- 
commons/proper/exec/trunk/src/main/java/org/apache/commons/exec/PumpStreamHandler.java
 (original)
+++ 
commons/proper/exec/trunk/src/main/java/org/apache/commons/exec/PumpStreamHandler.java
 Fri Jan  8 23:29:56 2016
@@ -18,13 +18,13 @@
 
 package org.apache.commons.exec;
 
+import org.apache.commons.exec.util.DebugUtils;
+
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
 import java.io.PipedOutputStream;
 
-import org.apache.commons.exec.util.DebugUtils;
-
 /**
  * Copies standard output and error of sub-processes to standard output and 
error
  * of the parent process. If output or error stream are set to null, any 
feedback
@@ -290,7 +290,7 @@ public class PumpStreamHandler implement
                     final long timeToWait = timeout + STOP_TIMEOUT_ADDITION;
                     final long startTime = System.currentTimeMillis();
                     thread.join(timeToWait);
-                    if (!(System.currentTimeMillis() < startTime + 
timeToWait)) {
+                    if (System.currentTimeMillis() > startTime + timeToWait) {
                         final String msg = "The stop timeout of " + timeout + 
" ms was exceeded";
                         caught = new ExecuteException(msg, 
Executor.INVALID_EXITVALUE);
                     }

Modified: 
commons/proper/exec/trunk/src/test/java/org/apache/commons/exec/AbstractExecTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/exec/trunk/src/test/java/org/apache/commons/exec/AbstractExecTest.java?rev=1723815&r1=1723814&r2=1723815&view=diff
==============================================================================
--- 
commons/proper/exec/trunk/src/test/java/org/apache/commons/exec/AbstractExecTest.java
 (original)
+++ 
commons/proper/exec/trunk/src/test/java/org/apache/commons/exec/AbstractExecTest.java
 Fri Jan  8 23:29:56 2016
@@ -38,13 +38,23 @@ public abstract class AbstractExecTest {
         return result;
     }
 
+    /**
+     * Get the name of the currently executed test.
+     */
     protected String getName() {
         return name.getMethodName();
     }
 
     protected String testNotSupportedForCurrentOperatingSystem() {
-        final String msg = String.format("The test '%s' does not support the 
following OS : %s", name.getMethodName(), OS_NAME);
+        final String msg = String.format("The test '%s' is not possible for OS 
: %s", name.getMethodName(), OS_NAME);
         System.out.println(msg);
         return msg;
     }
+
+    protected String testIsBrokenForCurrentOperatingSystem() {
+        final String msg = String.format("The test '%s' is broken for OS : 
%s", name.getMethodName(), OS_NAME);
+        System.err.println(msg);
+        return msg;
+    }
+
 }

Modified: 
commons/proper/exec/trunk/src/test/java/org/apache/commons/exec/issues/Exec57Test.java
URL: 
http://svn.apache.org/viewvc/commons/proper/exec/trunk/src/test/java/org/apache/commons/exec/issues/Exec57Test.java?rev=1723815&r1=1723814&r2=1723815&view=diff
==============================================================================
--- 
commons/proper/exec/trunk/src/test/java/org/apache/commons/exec/issues/Exec57Test.java
 (original)
+++ 
commons/proper/exec/trunk/src/test/java/org/apache/commons/exec/issues/Exec57Test.java
 Fri Jan  8 23:29:56 2016
@@ -17,68 +17,74 @@
 
 package org.apache.commons.exec.issues;
 
-import static org.junit.Assert.fail;
-
-import java.io.File;
-import java.io.IOException;
 
+import org.apache.commons.exec.AbstractExecTest;
 import org.apache.commons.exec.CommandLine;
 import org.apache.commons.exec.DefaultExecutor;
-import org.apache.commons.exec.ExecuteException;
 import org.apache.commons.exec.OS;
 import org.apache.commons.exec.PumpStreamHandler;
 import org.junit.Test;
 
+import java.io.IOException;
+
 /**
  * Test EXEC-57 (https://issues.apache.org/jira/browse/EXEC-57).
  *
  * @version $Id$
  */
-public class Exec57Test {
-
-    private final File testDir = new File("src/test/scripts");
-
+public class Exec57Test extends AbstractExecTest {
 
     /**
-     *
      * DefaultExecutor.execute() does not return even if child process 
terminated - in this
      * case the child process hangs because the grand children is connected to 
stdout & stderr
      * and is still running. As work-around a stop timeout is used for the 
PumpStreamHandler
      * to ensure that the caller does not block forever but if the stop 
timeout is exceeded
-     * an ExecuteException is thrown to notify the caller.
+     * an ExecuteException is thrown to notify the caller. But this case the 
threads are still
+     * around causing a resource leak.
      *
-     * @throws Exception the test failed
+     * @TODO [EXEC-57] Broken for Mac OS X
      */
-    @Test
-    public void testExec_57() throws IOException {
+    @Test(timeout = TEST_TIMEOUT)
+    public void testExecutionOfBackgroundProcess() throws IOException {
 
-        if (!OS.isFamilyUnix()) {
-            System.err.println("The test 
'testSyncInvocationOfBackgroundProcess' does not support the following OS : " + 
System.getProperty("os.name"));
+        if (OS.isFamilyMac()) {
+            testIsBrokenForCurrentOperatingSystem();
             return;
         }
 
-        final CommandLine cmdLine = new 
CommandLine("sh").addArgument("-c").addArgument(testDir + "/invoker.sh", false);
+        if (!OS.isFamilyUnix()) {
+            testNotSupportedForCurrentOperatingSystem();
+            return;
+        }
 
+        final CommandLine cmdLine = new 
CommandLine("sh").addArgument("-c").addArgument("./src/test/scripts/issues/exec-57-nohup.sh",
 false);
         final DefaultExecutor executor = new DefaultExecutor();
         final PumpStreamHandler pumpStreamHandler = new 
PumpStreamHandler(System.out, System.err);
 
-        // Without this timeout current thread will be blocked
-        // even if command we'll invoke will terminate immediately.
-        pumpStreamHandler.setStopTimeout(2000);
         executor.setStreamHandler(pumpStreamHandler);
-        final long startTime = System.currentTimeMillis();
 
-        System.out.println("Executing " + cmdLine);
+        executor.execute(cmdLine);
+    }
 
-        try {
-            executor.execute(cmdLine);
-        }
-        catch (final ExecuteException e) {
-            final long duration = System.currentTimeMillis() - startTime;
-            System.out.println("Process completed in " + duration +" millis; 
above is its output");
+    /**
+     * The same approach using a completely detached process works nicely on 
Mac OS X.
+     *
+     * @throws IOException
+     */
+    @Test(timeout = TEST_TIMEOUT)
+    public void testExecutionOfDetachedProcess() throws IOException {
+
+        if (!OS.isFamilyUnix()) {
+            testNotSupportedForCurrentOperatingSystem();
             return;
         }
 
-        fail("Expecting an ExecuteException");
+        final CommandLine cmdLine = new 
CommandLine("sh").addArgument("-c").addArgument("./src/test/scripts/issues/exec-57-detached.sh",
 false);
+        final DefaultExecutor executor = new DefaultExecutor();
+        final PumpStreamHandler pumpStreamHandler = new 
PumpStreamHandler(System.out, System.err);
+
+        executor.setStreamHandler(pumpStreamHandler);
+
+        executor.execute(cmdLine);
     }
 }

Added: commons/proper/exec/trunk/src/test/scripts/issues/exec-57-detached.sh
URL: 
http://svn.apache.org/viewvc/commons/proper/exec/trunk/src/test/scripts/issues/exec-57-detached.sh?rev=1723815&view=auto
==============================================================================
--- commons/proper/exec/trunk/src/test/scripts/issues/exec-57-detached.sh 
(added)
+++ commons/proper/exec/trunk/src/test/scripts/issues/exec-57-detached.sh Fri 
Jan  8 23:29:56 2016
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Create a background process where the child is completely detached
+
+echo "invoker.sh -- going to start daemon process"
+cd ./target
+nohup sleep 60 1>/dev/null 2>/dev/null 0</dev/null &
+echo "invoker.sh -- daemon process was started"

Propchange: 
commons/proper/exec/trunk/src/test/scripts/issues/exec-57-detached.sh
------------------------------------------------------------------------------
    svn:executable = *

Copied: commons/proper/exec/trunk/src/test/scripts/issues/exec-57-nohup.sh 
(from r1723805, commons/proper/exec/trunk/src/test/scripts/invoker.sh)
URL: 
http://svn.apache.org/viewvc/commons/proper/exec/trunk/src/test/scripts/issues/exec-57-nohup.sh?p2=commons/proper/exec/trunk/src/test/scripts/issues/exec-57-nohup.sh&p1=commons/proper/exec/trunk/src/test/scripts/invoker.sh&r1=1723805&r2=1723815&rev=1723815&view=diff
==============================================================================
--- commons/proper/exec/trunk/src/test/scripts/invoker.sh (original)
+++ commons/proper/exec/trunk/src/test/scripts/issues/exec-57-nohup.sh Fri Jan  
8 23:29:56 2016
@@ -17,7 +17,9 @@
 # limitations under the License.
 #
 
+# Create a background process where the parent is consuming stdin/stdout
+
 echo "invoker.sh -- going to start daemon process"
-cd ../../../target
-nohup sleep 10 &
-echo "invoker.sh --  daemon process was started"
\ No newline at end of file
+cd ./target
+nohup sleep 60 &
+echo "invoker.sh -- daemon process was started"


Reply via email to