blob: 95bd09b857e47047f8170c2f406518e46b0869d7 [file] [log] [blame]
/*
* 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.
*/
package org.apache.commons.exec.issues;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.apache.commons.exec.CommandLine;
import org.apache.commons.exec.DefaultExecutor;
import org.apache.commons.exec.Executor;
import org.apache.commons.exec.OS;
import org.apache.commons.exec.PumpStreamHandler;
import org.apache.commons.exec.TestUtil;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
/**
* Test EXEC-36 see https://issues.apache.org/jira/browse/EXEC-36
*
*/
public class Exec36Test {
private final Executor exec = new DefaultExecutor();
private final File testDir = new File("src/test/scripts");
private final File printArgsScript = TestUtil.resolveScriptForOS(testDir + "/printargs");
private ByteArrayOutputStream baos;
@Before
public void setUp() throws Exception {
// prepare a ready to Executor
this.baos = new ByteArrayOutputStream();
this.exec.setStreamHandler(new PumpStreamHandler(baos, baos));
}
@After
public void tearDown() throws Exception {
this.baos.close();
}
/**
*
* Original example from Kai Hu which only can be tested on Unix
*
* @throws Exception the test failed
*/
@Test
public void testExec36_1() throws Exception {
if (OS.isFamilyUnix()) {
CommandLine cmdl;
/**
* ./script/jrake cruise:publish_installers INSTALLER_VERSION=unstable_2_1 \
* INSTALLER_PATH="/var/lib/ cruise-agent/installers" INSTALLER_DOWNLOAD_SERVER='something' WITHOUT_HELP_DOC=true
*/
final String expected = "./script/jrake\n" +
"cruise:publish_installers\n" +
"INSTALLER_VERSION=unstable_2_1\n" +
"INSTALLER_PATH=\"/var/lib/ cruise-agent/installers\"\n" +
"INSTALLER_DOWNLOAD_SERVER='something'\n" +
"WITHOUT_HELP_DOC=true";
cmdl = new CommandLine(printArgsScript);
cmdl.addArgument("./script/jrake", false);
cmdl.addArgument("cruise:publish_installers", false);
cmdl.addArgument("INSTALLER_VERSION=unstable_2_1", false);
cmdl.addArgument("INSTALLER_PATH=\"/var/lib/ cruise-agent/installers\"", false);
cmdl.addArgument("INSTALLER_DOWNLOAD_SERVER='something'", false);
cmdl.addArgument("WITHOUT_HELP_DOC=true", false);
final int exitValue = exec.execute(cmdl);
final String result = baos.toString().trim();
assertFalse(exec.isFailure(exitValue));
assertEquals(expected, result);
}
else {
System.err.println("The test 'testExec36_1' does not support the following OS : " + System.getProperty("os.name"));
return;
}
}
/**
* Test a complex real example found at
* http://blogs.msdn.com/b/astebner/archive/2005/12/13/503471.aspx
*
* The command line is so weird that it even falls apart under Windows
*
* @throws Exception the test failed
*/
@Test
public void testExec36_2() throws Exception {
String expected;
// the original command line
// dotnetfx.exe /q:a /c:"install.exe /l ""\Documents and Settings\myusername\Local Settings\Temp\netfx.log"" /q"
if (OS.isFamilyWindows()) {
expected = "dotnetfx.exe\n" +
"/q:a\n" +
"/c:\"install.exe /l \"\"\\Documents and Settings\\myusername\\Local Settings\\Temp\\netfx.log\"\" /q\"";
}
else if (OS.isFamilyUnix()) {
expected = "dotnetfx.exe\n" +
"/q:a\n" +
"/c:\"install.exe /l \"\"/Documents and Settings/myusername/Local Settings/Temp/netfx.log\"\" /q\"";
}
else {
System.err.println("The test 'testExec36_3' does not support the following OS : " + System.getProperty("os.name"));
return;
}
CommandLine cmdl;
final File file = new File("/Documents and Settings/myusername/Local Settings/Temp/netfx.log");
final Map<String, File> map = new HashMap<String, File>();
map.put("FILE", file);
cmdl = new CommandLine(printArgsScript);
cmdl.setSubstitutionMap(map);
cmdl.addArgument("dotnetfx.exe", false);
cmdl.addArgument("/q:a", false);
cmdl.addArgument("/c:\"install.exe /l \"\"${FILE}\"\" /q\"", false);
final int exitValue = exec.execute(cmdl);
final String result = baos.toString().trim();
assertFalse(exec.isFailure(exitValue));
if (OS.isFamilyUnix()) {
// the parameters fall literally apart under Windows - need to disable the check for Win32
assertEquals(expected, result);
}
}
/**
* Some complex real-life command line from
* http://blogs.msdn.com/b/astebner/archive/2005/12/13/503471.aspx
*/
@Test
@Ignore
public void _testExec36_4() throws Exception {
CommandLine cmdl;
final String line = "./script/jrake "
+ "cruise:publish_installers "
+ "INSTALLER_VERSION=unstable_2_1 "
+ "INSTALLER_PATH=\"/var/lib/cruise-agent/installers\" "
+ "INSTALLER_DOWNLOAD_SERVER='something'"
+ "WITHOUT_HELP_DOC=true";
cmdl = CommandLine.parse(line);
final String[] args = cmdl.toStrings();
assertEquals("./script/jrake", args[0]);
assertEquals("cruise:publish_installers", args[1]);
assertEquals("INSTALLER_VERSION=unstable_2_1", args[2]);
assertEquals("INSTALLER_PATH=\"/var/lib/cruise-agent/installers\"", args[3]);
assertEquals("INSTALLER_DOWNLOAD_SERVER='something'", args[4]);
assertEquals("WITHOUT_HELP_DOC=true", args[5]);
}
/**
* Some complex real-life command line from
* http://blogs.msdn.com/b/astebner/archive/2005/12/13/503471.aspx
*/
@Test
@Ignore
public void _testExec36_5() {
CommandLine cmdl;
final String line = "dotnetfx.exe"
+ " /q:a "
+ "/c:\"install.exe /l \"\"c:\\Documents and Settings\\myusername\\Local Settings\\Temp\\netfx.log\"\" /q\"";
cmdl = CommandLine.parse(line);
final String[] args = cmdl.toStrings();
assertEquals("dotnetfx.exe", args[0]);
assertEquals("/q:a", args[1]);
assertEquals("/c:\"install.exe /l \"\"c:\\Documents and Settings\\myusername\\Local Settings\\Temp\\netfx.log\"\" /q\"", args[2] );
}
/**
* Test the following command line
*
* C:\CVS_DB\WeightsEngine /f WeightsEngine.mak CFG="WeightsEngine - Win32Release"
*/
@Test
@Ignore
public void _testExec36_6() {
final String commandline = "C:\\CVS_DB\\WeightsEngine /f WeightsEngine.mak CFG=\"WeightsEngine - Win32Release\"";
final CommandLine cmdl = CommandLine.parse(commandline);
final String[] args = cmdl.getArguments();
assertEquals("/f", args[0]);
assertEquals("WeightsEngine.mak", args[1]);
assertEquals("CFG=\"WeightsEngine - Win32Release\"", args[2]);
}
}