/* * BioJava development code * * This code may be freely distributed and modified under the * terms of the GNU Lesser General Public Licence. This should * be distributed with the code. If you do not have a copy, * see: * * http://www.gnu.org/copyleft/lesser.html * * Copyright for this code is held jointly by the individual * authors. These should be listed in @author doc comments. * * For more information on the BioJava project and its aims, * or to join the biojava-l mailing list, visit the home page * at: * * http://www.biojava.org/ * */ /* * ExternalProcessTest.java */ package org.biojava.utils.process; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; import java.util.Properties; import junit.extensions.RepeatedTest; import junit.framework.TestCase; import junit.framework.TestSuite; /** * Test class for {@link org.biojava.utils.process.ExternalProcess}. * @author Martin Szugat * @version $Revision: 4023 $ */ public class ExternalProcessTest extends TestCase { /** * Input for the more command. */ private static final String INPUT_MORE = "test"; /** * Object to execute external processes. */ private static ExternalProcess ep = null; /** * OS-specific string for the more command. */ private static String commandMore = null; static { if (System.getProperty("os.name").toLowerCase().startsWith("windows")) { commandMore = "cmd /C more"; } else { commandMore = "cat"; } ep = new ExternalProcess(); } /** * Main entry point. Runs a repeated test to stress the thread allocation * and freeing of the ExternalProcess class. * @param args command line arguments. */ public static void main(String[] args) { TestSuite suite = new TestSuite(); suite.addTest(new TestSuite(ExternalProcessTest.class)); junit.textui.TestRunner.run(new RepeatedTest(suite, 5000)); } /** * Initializes the test. * @param name test name */ public ExternalProcessTest(String name) { super(name); } /** * Test the input/output handling, using input/output streams and not * readers/writers. * @throws IOException if execution fails. * @throws InterruptedException if execution fails. */ public void testExecuteStreams() throws IOException, InterruptedException { ByteArrayInputStream input = new ByteArrayInputStream( INPUT_MORE.getBytes()); ByteArrayOutputStream output = new ByteArrayOutputStream(); ByteArrayOutputStream error = new ByteArrayOutputStream(); ep.setCommands(commandMore); ep.setInputHandler(new SimpleInputHandler(input, "in")); ep.setOutputHandler(new SimpleOutputHandler(output, "out")); ep.setErrorHandler(new SimpleOutputHandler(error, "err")); int exitCode = ep.execute(); assertTrue(exitCode == 0); assertEquals(INPUT_MORE, output.toString().trim()); assertEquals("", error.toString()); } /** * Test the input/output handling. * @throws IOException if execution fails. * @throws InterruptedException if execution fails. */ public void testExecuteMore() throws IOException, InterruptedException { StringWriter outputString = new StringWriter(); StringWriter errorString = new StringWriter(); StringReader inputString = new StringReader(INPUT_MORE); ep.setCommands(commandMore); ep.setOutputHandler(new WriterOutputHandler(outputString, "out")); ep.setErrorHandler(new WriterOutputHandler(errorString, "err")); ep.setInputHandler(new ReaderInputHandler(inputString, "in")); int exitCode = ep.execute(); assertTrue(exitCode == 0); assertEquals(INPUT_MORE, outputString.toString().trim()); assertEquals("", errorString.toString()); } /** * Tests the static execute method. * @throws Exception if execution fails. */ public void testStaticExecute() throws Exception { StringWriter outputString = new StringWriter(); StringWriter errorString = new StringWriter(); int exitCode = ExternalProcess.execute(commandMore, INPUT_MORE, outputString, errorString); assertTrue(exitCode == 0); assertEquals(INPUT_MORE, outputString.toString().trim()); assertEquals("", errorString.toString()); } /** * Tests the {@link ExternalProcess#resolveCommands(String, Properties)} * method. */ public void testResolveCommands() { Properties props = new Properties(); props.put("TEST", "test"); String commands = "do %TEST% it"; commands = ExternalProcess.resolveCommands(commands, props); assertEquals("do test it", commands); } /** * Tests the {@link ExternalProcess#joinCommands(Object[])} method. */ public void testJoinCommands() { String[] commandList = new String[] {"do", "test", "it"}; String commands = ExternalProcess.joinCommands(commandList); assertEquals("do test it", commands); } }