blob: 7d3a6d9bfc9dec737af1efe2909927b6f4d0d0dd [file]
/*
* 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
*
* https://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.
*/
package org.apache.commons.exec.issues;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import java.io.File;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecuteResultHandler;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.ExecuteWatchdog;
import org.apache.commons.exec.Executor;
import org.apache.commons.exec.TestUtil;
import org.junit.jupiter.api.Test;
/**
* Test EXEC-44 (https://issues.apache.org/jira/browse/EXEC-44).
*/
class Exec44Test {
private final Executor exec = DefaultExecutor.builder().get();
private final File testDir = new File("src/test/scripts");
private final File foreverTestScript = TestUtil.resolveScriptFileForOS(testDir + "/forever");
/**
*
* Because the ExecuteWatchdog is the only way to destroy asynchronous processes, it should be possible to set it to an infinite timeout, for processes
* which should not time out, but manually destroyed under some circumstances.
*
* @throws Exception the test failed
*/
@Test
void testExec44() throws Exception {
final CommandLine cl = new CommandLine(foreverTestScript);
final DefaultExecuteResultHandler resultHandler = new DefaultExecuteResultHandler();
final ExecuteWatchdog watchdog = new ExecuteWatchdog(ExecuteWatchdog.INFINITE_TIMEOUT);
exec.setWatchdog(watchdog);
exec.execute(cl, resultHandler);
// wait for script to run
Thread.sleep(5000);
assertTrue(watchdog.isWatching(), "The watchdog is watching the process");
// terminate it
watchdog.destroyProcess();
assertTrue(watchdog.killedProcess(), "The watchdog has killed the process");
assertFalse(watchdog.isWatching(), "The watchdog is no longer watching any process");
}
}