Author: sgoeschl Date: Tue Jul 14 15:23:55 2009 New Revision: 793939 URL: http://svn.apache.org/viewvc?rev=793939&view=rev Log: [EXEC-41] Added regression test for EXEC-41 but did not apply the patch since it does not pass the test
Added: commons/proper/exec/trunk/src/test/scripts/exec41.bat commons/proper/exec/trunk/src/test/scripts/exec41.sh (with props) Modified: commons/proper/exec/trunk/src/test/java/org/apache/commons/exec/DefaultExecutorTest.java Modified: commons/proper/exec/trunk/src/test/java/org/apache/commons/exec/DefaultExecutorTest.java URL: http://svn.apache.org/viewvc/commons/proper/exec/trunk/src/test/java/org/apache/commons/exec/DefaultExecutorTest.java?rev=793939&r1=793938&r2=793939&view=diff ============================================================================== --- commons/proper/exec/trunk/src/test/java/org/apache/commons/exec/DefaultExecutorTest.java (original) +++ commons/proper/exec/trunk/src/test/java/org/apache/commons/exec/DefaultExecutorTest.java Tue Jul 14 15:23:55 2009 @@ -38,6 +38,7 @@ private File foreverTestScript = TestUtil.resolveScriptForOS(testDir + "/forever"); private File nonExistingTestScript = TestUtil.resolveScriptForOS(testDir + "/grmpffffff"); private File redirectScript = TestUtil.resolveScriptForOS(testDir + "/redirect"); + private File exec41Script = TestUtil.resolveScriptForOS(testDir + "/exec41"); // Get suitable exit codes for the OS private static final int SUCCESS_STATUS; // test script successful exit code @@ -425,4 +426,51 @@ assertFalse(exec.isFailure(exitValue)); assertTrue(outfile.exists()); } + + /** + * Test the patch for EXEC-41 (https://issues.apache.org/jira/browse/EXEC-41). + * + * When a process runs longer than allowed by a configured watchdog's + * timeout, the watchdog tries to destroy it and then DefaultExecutor + * tries to clean up by joining with all installed pump stream threads. + * Problem is, that sometimes the native process doesn't die and thus + * streams aren't closed and the stream threads do not complete. + * + * The patch provides setAlwaysWaitForStreamThreads(boolean) method + * in PumpStreamHandler. By default, alwaysWaitForStreamThreads is set + * to true to preserve the current behavior. If set to false, and + * process is killed by watchdog, DefaultExecutor's call into + * ErrorStreamHandler.stop will NOT join the stream threads and + * DefaultExecutor will NOT attempt to close the streams, so the + * executor's thread won't get stuck. + */ + public void testExec41() throws Exception { + + CommandLine cmdLine = new CommandLine(exec41Script); + cmdLine.addArgument("10"); // sleep 10 secs + DefaultExecutor executor = new DefaultExecutor(); + ExecuteWatchdog watchdog = new ExecuteWatchdog(2*1000); // allow process no more than 2 secs + executor.setWatchdog(watchdog); + //ByteArrayOutputStream baos = new ByteArrayOutputStream(); + //executor.setStreamHandler(new PumpStreamHandler(baos)); + + long startTime = System.currentTimeMillis(); + + try { + executor.execute(cmdLine); + } catch (ExecuteException e) { + System.out.println(e); + } + + long duration = System.currentTimeMillis() - startTime; + + System.out.println("Process completed in " + duration +" millis; below is its output"); + // System.out.println(baos); + if (watchdog.killedProcess()) { + System.out.println("Process timed out and was killed."); + } + + assertTrue("The process was not killed by the watchdog", watchdog.killedProcess()); + // assertTrue("The process was not properly killed because it took " + duration + " ms to execute", duration < 5*1000); + } } Added: commons/proper/exec/trunk/src/test/scripts/exec41.bat URL: http://svn.apache.org/viewvc/commons/proper/exec/trunk/src/test/scripts/exec41.bat?rev=793939&view=auto ============================================================================== --- commons/proper/exec/trunk/src/test/scripts/exec41.bat (added) +++ commons/proper/exec/trunk/src/test/scripts/exec41.bat Tue Jul 14 15:23:55 2009 @@ -0,0 +1,21 @@ +...@echo OFF + +REM Little batch file to run nearly foerver +REM see http://malektips.com/dos0017.html +REM +REM Licensed to the Apache Software Foundation (ASF) under one or more +REM contributor license agreements. See the NOTICE file distributed with +REM this work for additional information regarding copyright ownership. +REM The ASF licenses this file to You under the Apache License, Version 2.0 +REM (the "License"); you may not use this file except in compliance with +REM the License. You may obtain a copy of the License at +REM +REM http://www.apache.org/licenses/LICENSE-2.0 +REM +REM Unless required by applicable law or agreed to in writing, software +REM distributed under the License is distributed on an "AS IS" BASIS, +REM WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +REM See the License for the specific language governing permissions and +REM limitations under the License. + +ping -n %1 -w 1000 127.0.0.1 \ No newline at end of file Added: commons/proper/exec/trunk/src/test/scripts/exec41.sh URL: http://svn.apache.org/viewvc/commons/proper/exec/trunk/src/test/scripts/exec41.sh?rev=793939&view=auto ============================================================================== --- commons/proper/exec/trunk/src/test/scripts/exec41.sh (added) +++ commons/proper/exec/trunk/src/test/scripts/exec41.sh Tue Jul 14 15:23:55 2009 @@ -0,0 +1,20 @@ +#!/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. +# + +ping -c $1 127.0.0.1 Propchange: commons/proper/exec/trunk/src/test/scripts/exec41.sh ------------------------------------------------------------------------------ svn:executable = *