blob: bd1c0f6e162a797eef0db3285cd2a2534dd3ff63 [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.camel.component.exec.impl;
import java.io.File;
import java.io.InputStream;
import org.apache.camel.Exchange;
import org.apache.camel.Processor;
import org.apache.camel.Produce;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.component.exec.ExecResult;
import org.apache.camel.test.junit4.CamelTestSupport;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.junit.Ignore;
import org.junit.Test;
import static org.apache.camel.component.exec.ExecTestUtils.buildJavaExecutablePath;
/**
* The tests are ignored by default, because they are OS-specific. On demand
* they can be run manually to validate the documentation examples for that OS.
*/
public class ExecDocumentationExamplesTest extends CamelTestSupport {
private static final String ANT_BUILD_FILE_NAME = "CamelExecTestAntBuildFile.xml";
private static final String ANT_OUT_FILE_NAME = "CamelExecOutFile.txt";
private static final String ANT_BUILD_FILE_CONTENT = buildAntFileContent();
private static final String TEST_MSG = "Hello Camel Exec!";
@Produce(uri = "direct:javaVersion")
protected ProducerTemplate templateJavaVersion;
@Produce(uri = "direct:javaVersionWorkingDir")
protected ProducerTemplate templateJavaVersionWorkingDir;
@Produce(uri = "direct:execAnt")
protected ProducerTemplate templateExecAnt;
@Produce(uri = "direct:execAntWithOutFile")
protected ProducerTemplate templateExecAntWithOutFile;
@Produce(uri = "direct:wordCount")
protected ProducerTemplate templateWordCount;
@Test
@Ignore
public void testExecLinuxWordCount() throws Exception {
// use type conversion here
ExecResult body = templateWordCount.requestBody((Object)"test", ExecResult.class);
assertNotNull(body);
}
/**
* The test assumes, that java is in the system path
*/
@Test
@Ignore
public void testJavaVersion() throws Exception {
ExecResult body = templateJavaVersion.requestBody((Object)"test", ExecResult.class);
InputStream out = body.getStdout();
InputStream err = body.getStderr();
// Strange that Sun Java 1.5 writes the -version in the syserr
assertNull(out);
assertNotNull(err);
String outString = IOUtils.toString(err);
log.info("Received stdout: " + outString);
assertTrue(outString.contains("java version"));
}
@Test
@Ignore
public void testWinJavaVersionWorkingDir() throws Exception {
ExecResult body = templateJavaVersionWorkingDir.requestBody((Object)"test", ExecResult.class);
InputStream out = body.getStdout();
InputStream err = body.getStderr();
// Strange that Sun Java 1.5 writes the -version in the syserr
assertNull(out);
assertNotNull(err);
String outerr = IOUtils.toString(err);
log.info("Received stderr: " + outerr);
assertTrue(outerr.contains("java version"));
}
/**
* The test assumes that Apache ant is installed
*/
@Test
@Ignore
public void testExecWinAnt() throws Exception {
File f = new File(ANT_BUILD_FILE_NAME);
f.createNewFile();
FileUtils.writeStringToFile(f, ANT_BUILD_FILE_CONTENT);
assertTrue("You must create a sample build file!", f.exists());
ExecResult body = templateExecAnt.requestBody((Object)"test", ExecResult.class);
String stdout = IOUtils.toString(body.getStdout());
assertNull(body.getStderr());
assertTrue("The ant script should print" + TEST_MSG, stdout.contains(TEST_MSG));
f.delete();
}
/**
* The test assumes that Apache ant is installed
*/
@Test
@Ignore
public void testExecWinAntWithOutFile() throws Exception {
File f = new File(ANT_BUILD_FILE_NAME);
f.createNewFile();
FileUtils.writeStringToFile(f, ANT_BUILD_FILE_CONTENT);
assertTrue("You must create a sample build file!", f.exists());
// use type conversion here
InputStream body = templateExecAntWithOutFile.requestBody((Object)"test", InputStream.class);
String bodyString = IOUtils.toString(body);
assertTrue("The ant script should print" + TEST_MSG, bodyString.contains(TEST_MSG));
f.delete();
}
@Override
protected RouteBuilder createRouteBuilder() {
return new RouteBuilder() {
public void configure() {
// word count
from("direct:wordCount").to("exec:wc?args=--words /usr/share/dict/words").process(new Processor() {
public void process(Exchange exchange) throws Exception {
// By default, the body is ExecResult instance
assertIsInstanceOf(ExecResult.class, exchange.getIn().getBody());
// Use the Camel Exec String type converter to
// convert the ExecResult to String
// In this case, the stdout is considered as output
String wordCountOutput = exchange.getIn().getBody(String.class);
// do something with the output
log.info(wordCountOutput);
}
});
// example 1 in the component docs
from("direct:javaVersion").to("exec:java?args=-version -server");
// example 2 in the component docs
from("direct:javaVersionWorkingDir").to("exec:" + buildJavaExecutablePath() + "?args=-version -Duser.name=Camel&workingDir=C:/temp");
// advanced, test ant
from("direct:execAnt").to("exec:ant.bat?args=-f " + ANT_BUILD_FILE_NAME);
// advanced, test ant with out file
from("direct:execAntWithOutFile").to("exec:ant.bat?args=-f " + ANT_BUILD_FILE_NAME + " -l " + ANT_OUT_FILE_NAME + "&outFile=" + ANT_OUT_FILE_NAME)
.process(new Processor() {
public void process(Exchange exchange) throws Exception {
InputStream outFile = exchange.getIn().getBody(InputStream.class);
// do something with the out file here
log.info(IOUtils.toString(outFile));
}
});
}
};
}
private static String buildAntFileContent() {
StringBuilder builder = new StringBuilder();
builder.append("<project name=\"TestExec\" default=\"test\" basedir=\".\">");
builder.append("<target name=\"test\">");
builder.append("<echo message=\"" + TEST_MSG + "\"/>");
builder.append("</target>");
builder.append("</project>");
return builder.toString();
}
}