/** * 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 java.io.IOException; import java.util.Arrays; import java.util.List; import org.apache.camel.Exchange; import org.apache.camel.ExchangePattern; import org.apache.camel.Processor; import org.apache.camel.Produce; import org.apache.camel.ProducerTemplate; import org.apache.camel.component.exec.impl.ExecCommandExecutorMock; import org.apache.commons.io.IOUtils; 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.ExecBinding.EXEC_COMMAND_ARGS; import static org.apache.camel.component.exec.ExecBinding.EXEC_COMMAND_EXECUTABLE; import static org.apache.camel.component.exec.ExecBinding.EXEC_COMMAND_TIMEOUT; import static org.apache.camel.component.exec.ExecBinding.EXEC_COMMAND_WORKING_DIR; import static org.apache.commons.io.IOUtils.LINE_SEPARATOR; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; /** * Test the functionality of {@link ExecProducer} */ @ContextConfiguration(locations = {"exec-mock-executor-context.xml"}) public class ExecProducerTest extends AbstractJUnit4SpringContextTests { @Produce(uri = "direct:input") private ProducerTemplate producerTemplate; @Autowired private ExecCommandExecutorMock execCommandExecutorMock; @Test @DirtiesContext public void testWithContextConfiguration() { producerTemplate.sendBody("direct:input", "test"); // the expected string is defined in the route configuration assertEquals("mockedByCommandExecutorMock.exe", execCommandExecutorMock.lastCommandResult.getCommand().getExecutable()); } @Test @DirtiesContext public void testOverrideExecutable() { final String command = "java"; producerTemplate.send(new Processor() { public void process(Exchange exchange) throws Exception { exchange.getIn().setBody("noinput"); exchange.getIn().setHeader(EXEC_COMMAND_EXECUTABLE, command); } }); assertEquals(command, execCommandExecutorMock.lastCommandResult.getCommand().getExecutable()); } /** * Tests that the args are set literally. */ @Test @DirtiesContext public void testOverrideArgs() { final String[] args = {"-version", "classpath:c:/program files/test/"}; producerTemplate.send(new Processor() { public void process(Exchange exchange) throws Exception { exchange.getIn().setBody("noinput"); exchange.getIn().setHeader(EXEC_COMMAND_ARGS, Arrays.asList(args)); } }); List<String> commandArgs = execCommandExecutorMock.lastCommandResult.getCommand().getArgs(); assertEquals(args[0], commandArgs.get(0)); assertEquals(args[1], commandArgs.get(1)); } @Test @DirtiesContext public void testOverrideTimeout() { producerTemplate.send(new Processor() { public void process(Exchange exchange) throws Exception { exchange.getIn().setBody("noinput"); exchange.getIn().setHeader(EXEC_COMMAND_TIMEOUT, "1000"); } }); assertEquals(1000, execCommandExecutorMock.lastCommandResult.getCommand().getTimeout()); } @Test @DirtiesContext public void testInputLines() throws IOException { // String must be convertible to InputStream final String input = "line1" + LINE_SEPARATOR + "line2"; producerTemplate.send(new Processor() { public void process(Exchange exchange) throws Exception { exchange.getIn().setBody(input); } }); assertEquals(input, IOUtils.toString(execCommandExecutorMock.lastCommandResult.getCommand().getInput())); } @Test @DirtiesContext public void testInputLinesNotConvertibleToInputStream() throws IOException { // String must be convertible to InputStream final Integer notConvertibleToInputStreamBody = new Integer(1); Exchange e = producerTemplate.send(new Processor() { public void process(Exchange exchange) throws Exception { exchange.getIn().setBody(notConvertibleToInputStreamBody); } }); ExecResult result = e.getIn().getBody(ExecResult.class); assertNotNull(result); assertNull(result.getCommand().getInput()); } @Test @DirtiesContext public void testNullInBody() throws IOException { // Null body must also be supported Exchange e = producerTemplate.send(new Processor() { public void process(Exchange exchange) throws Exception { exchange.getIn().setBody(null); } }); ExecResult result = e.getIn().getBody(ExecResult.class); assertNotNull(result); assertNull(result.getCommand().getInput()); } @Test @DirtiesContext public void testOverrideWorkingDir() { final String workingDir = "c:/program files/test"; producerTemplate.send(new Processor() { public void process(Exchange exchange) throws Exception { exchange.getIn().setBody(""); exchange.getIn().setHeader(EXEC_COMMAND_WORKING_DIR, workingDir); } }); assertEquals(workingDir, execCommandExecutorMock.lastCommandResult.getCommand().getWorkingDir()); } @Test @DirtiesContext public void testInInOnlyExchange() throws Exception { Exchange exchange = producerTemplate.send(new Processor() { public void process(Exchange exchange) throws Exception { exchange.setPattern(ExchangePattern.InOnly); exchange.getIn().setBody("inonly"); } }); // test the conversion ExecResult result = exchange.getIn().getBody(ExecResult.class); assertNotNull(result); } @Test @DirtiesContext public void testOutCapableExchange() throws Exception { Exchange exchange = producerTemplate.send(new Processor() { public void process(Exchange exchange) throws Exception { exchange.setPattern(ExchangePattern.InOut); exchange.getIn().setBody("inout"); } }); // test the conversion ExecResult result = exchange.getOut().getBody(ExecResult.class); assertNotNull(result); } }