/** * 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.camel.component.exec; import org.apache.camel.CamelContext; import org.apache.camel.Component; import org.apache.camel.util.UnsafeUriCharactersEncoder; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.annotation.DirtiesContext; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.AbstractJUnit4SpringContextTests; import static org.apache.camel.component.exec.ExecEndpoint.NO_TIMEOUT; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertSame; import static org.junit.Assert.assertTrue; /** * Test the configuration of {@link ExecEndpoint} */ @ContextConfiguration public class ExecEndpointTest extends AbstractJUnit4SpringContextTests { @Autowired private CamelContext camelContext; @Autowired private ExecBinding customBinding; @Autowired private ExecCommandExecutor customExecutor; private Component component; @Before public void setUp() throws Exception { component = camelContext.getComponent("exec"); } @Test @DirtiesContext public void testValidComponentDescriptor() { assertNotNull("The Camel Exec component can not be resolved", component); } @Test @DirtiesContext public void testCreateEndpointDefaultConf() throws Exception { ExecEndpoint e = createExecEndpoint("exec:test"); assertTrue("The Camel Exec component must create instances of " + ExecEndpoint.class.getSimpleName(), e instanceof ExecEndpoint); assertNull(e.getArgs()); assertNull(e.getWorkingDir()); assertNull(e.getOutFile()); assertEquals(NO_TIMEOUT, e.getTimeout()); assertEquals("test", e.getExecutable()); assertNotNull(e.getBinding()); } @Test @DirtiesContext public void testCreateEndpointDefaultNoTimeout() throws Exception { ExecEndpoint e = createExecEndpoint("exec:test"); assertEquals(ExecEndpoint.NO_TIMEOUT, e.getTimeout()); } @Test @DirtiesContext public void testCreateEndpointCustomBinding() throws Exception { ExecEndpoint e = createExecEndpoint("exec:test?binding=#customBinding"); assertSame("Expected is the custom customBinding reference from the application context", customBinding, e.getBinding()); } @Test @DirtiesContext public void testCreateEndpointCustomCommandExecutor() throws Exception { ExecEndpoint e = createExecEndpoint("exec:test?commandExecutor=#customExecutor"); assertSame("Expected is the custom customExecutor reference from the application context", customExecutor, e.getCommandExecutor()); } @Test @DirtiesContext public void testCreateEndpointWithArgs() throws Exception { String args = "arg1 arg2 arg3"; // Need to properly encode the URI ExecEndpoint e = createExecEndpoint("exec:test?args=" + args.replaceAll(" ", "+")); assertEquals(args, e.getArgs()); } @Test @DirtiesContext public void testCreateEndpointWithArgs2() throws Exception { String args = "arg1 \"arg2 \" arg3"; ExecEndpoint e = createExecEndpoint("exec:test?args=" + UnsafeUriCharactersEncoder.encode(args)); assertEquals(args, e.getArgs()); } @Test @DirtiesContext public void testCreateEndpointWithArgs3() throws Exception { String args = "RAW(arg1+arg2 arg3)"; // Just avoid URI encoding by using the RAW() ExecEndpoint e = createExecEndpoint("exec:test?args=" + args); assertEquals("arg1+arg2 arg3", e.getArgs()); } @Test @DirtiesContext public void testCreateEndpointWithTimeout() throws Exception { long timeout = 1999999L; ExecEndpoint e = createExecEndpoint("exec:test?timeout=" + timeout); assertEquals(timeout, e.getTimeout()); } @Test @DirtiesContext public void testCreateEndpointWithOutFile() throws Exception { String outFile = "output.txt"; ExecEndpoint e = createExecEndpoint("exec:test?outFile=" + outFile); assertEquals(outFile, e.getOutFile()); } @Test @DirtiesContext public void testCreateEndpointWithWorkingDir() throws Exception { String workingDir = "/workingdir"; ExecEndpoint e = createExecEndpoint("exec:test?workingDir=" + workingDir); assertEquals(workingDir, e.getWorkingDir()); } @Test @DirtiesContext public void testCreateEndpointEscapedWorkingDir() throws Exception { String cmd = "temp.exe"; String dir = "\"c:/program files/wokr/temp\""; String uri = "exec:" + cmd + "?workingDir=" + dir; ExecEndpoint endpoint = createExecEndpoint(UnsafeUriCharactersEncoder.encode(uri)); assertEquals(cmd, endpoint.getExecutable()); assertNull(endpoint.getArgs()); assertEquals(dir, endpoint.getWorkingDir()); } @Test @DirtiesContext public void testCreateEndpointEscapedCommand() throws Exception { String executable = "C:/Program Files/test/text.exe"; String uri = "exec:" + executable; ExecEndpoint endpoint = createExecEndpoint(UnsafeUriCharactersEncoder.encode(uri)); assertNull(endpoint.getArgs()); assertNull(endpoint.getWorkingDir()); assertEquals(executable, endpoint.getExecutable()); } @Test @DirtiesContext public void testCreateEndpointComposite() throws Exception { String workingDir = "/workingdir"; String argsEscaped = "arg1 arg2 \"arg 3\""; long timeout = 10000L; String uri = "exec:executable.exe?workingDir=" + workingDir + "&timeout=" + timeout + "&args=" + argsEscaped; ExecEndpoint e = createExecEndpoint(UnsafeUriCharactersEncoder.encode(uri)); assertEquals(workingDir, e.getWorkingDir()); assertEquals(argsEscaped, e.getArgs()); assertEquals(timeout, e.getTimeout()); } @Test @DirtiesContext public void testCreateEndpointComposite2() throws Exception { String workingDir = "/workingdir"; String outFile = "target/outfile.xml"; long timeout = 10000; StringBuilder builder = new StringBuilder(); builder.append("exec:executable.exe").append("?workingDir=" + workingDir).append("&timeout=" + timeout); builder.append("&outFile=" + outFile); builder.append("&commandExecutor=#customExecutor&binding=#customBinding"); ExecEndpoint e = createExecEndpoint(UnsafeUriCharactersEncoder.encode(builder.toString())); assertEquals(workingDir, e.getWorkingDir()); assertEquals(timeout, e.getTimeout()); assertEquals(outFile, e.getOutFile()); assertSame(customBinding, e.getBinding()); assertSame(customExecutor, e.getCommandExecutor()); } private ExecEndpoint createExecEndpoint(String uri) throws Exception { logger.debug("Using Exec endpoint URI " + uri); return (ExecEndpoint)component.createEndpoint(uri); } }