/*
*Copyright (c) 2005-2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
*WSO2 Inc. 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.wso2.carbon.esb.file.inbound.transport.test;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.util.AXIOMUtil;
import org.apache.commons.io.FileUtils;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import org.wso2.carbon.automation.engine.annotations.ExecutionEnvironment;
import org.wso2.carbon.automation.engine.annotations.SetEnvironment;
import org.wso2.carbon.automation.extensions.servers.ftpserver.FTPServerManager;
import org.wso2.carbon.integration.common.admin.client.LogViewerClient;
import org.wso2.carbon.logging.view.stub.types.carbon.LogEvent;
import org.wso2.esb.integration.common.utils.ESBIntegrationTest;
import org.wso2.esb.integration.common.utils.Utils;
import java.io.File;
import java.io.IOException;
public class FtpInboundTransportTest extends ESBIntegrationTest {
private FTPServerManager ftpServerManager;
private String FTPUsername;
private String FTPPassword;
private File FTPFolder;
private File inputFolder;
private File outputFolder;
private LogViewerClient logViewerClient;
private String pathToFtpDir;
@BeforeClass(alwaysRun = true)
public void runFTPServerForInboundTest() throws Exception {
// Username password for the FTP server to be started
FTPUsername = "admin";
FTPPassword = "admin";
String inputFolderName = "ftpin";
String outputFolderName = "ftpout";
int FTPPort = 9653;
pathToFtpDir = getClass().getResource(
File.separator + "artifacts" + File.separator + "ESB"
+ File.separator + "synapseconfig" + File.separator
+ "vfsTransport" + File.separator).getPath();
// Local folder of the FTP server root
FTPFolder = new File(pathToFtpDir + "FTP_Location" + File.separator);
// create FTP server root folder if not exists
if (FTPFolder.exists()) {
FileUtils.deleteDirectory(FTPFolder);
}
Assert.assertTrue(FTPFolder.mkdir(), "FTP root file folder not created");
// create 'in' directory under FTP server root
inputFolder = new File(FTPFolder.getAbsolutePath() + File.separator
+ inputFolderName);
if (inputFolder.exists()) {
FileUtils.deleteDirectory(inputFolder);
}
Assert.assertTrue(inputFolder.mkdir(), "FTP data /in folder not created");
// create 'out' directory under FTP server root
outputFolder = new File(FTPFolder.getAbsolutePath() + File.separator
+ outputFolderName);
if (outputFolder.exists()) {
FileUtils.deleteDirectory(outputFolder);
}
Assert.assertTrue(outputFolder.mkdir(), "FTP data /in folder not created");
/* Make the port available */
Utils.shutdownFailsafe(FTPPort);
// start-up FTP server
ftpServerManager = new FTPServerManager(FTPPort,
FTPFolder.getAbsolutePath(), FTPUsername, FTPPassword);
ftpServerManager.startFtpServer();
super.init();
loadESBConfigurationFromClasspath(File.separator + "artifacts"
+ File.separator + "ESB" + File.separator + "synapseconfig"
+ File.separator + "inboundEndpoint" + File.separator
+ "inboundFile.xml");
logViewerClient = new LogViewerClient(contextUrls.getBackEndUrl(),
getSessionCookie());
log.info("Before Class test method completed successfully");
}
@AfterClass(alwaysRun = true)
public void stopFTPServerForInboundTest() throws Exception {
try {
super.cleanup();
} finally {
Thread.sleep(3000);
ftpServerManager.stop();
log.info("FTP Server stopped successfully");
}
}
@SetEnvironment(executionEnvironments = { ExecutionEnvironment.STANDALONE })
@Test(groups = "wso2.esb", description = "Inbound endpoint Reading file in FTP Test Case")
public void testInboundEnpointReadFileinFTP() throws Exception {
addInboundEndpoint(addEndpoint1());
// To check the file getting is read
boolean isFileRead = false;
File sourceFile = new File(pathToFtpDir + File.separator + "test.xml");
File targetFolder = new File(FTPFolder + File.separator + "ftpin");
File targetFile = new File(targetFolder + File.separator + "test.xml");
try {
FileUtils.copyFile(sourceFile, targetFile);
Thread.sleep(2000);
} finally {
deleteFile(targetFile);
}
LogEvent[] logs = logViewerClient.getAllRemoteSystemLogs();
for (LogEvent logEvent : logs) {
String message = logEvent.getMessage();
if (message.contains("<m0:symbol>WSO2</m0:symbol>")) {
isFileRead = true;
}
}
Assert.assertTrue(isFileRead, "The XML file is not getting read");
}
// This test case works locally, but in the Jenkins build, it fails due to a lack of permission issue
// @SetEnvironment(executionEnvironments = { ExecutionEnvironment.STANDALONE })
// @Test(groups = "wso2.esb", dependsOnMethods = "testInboundInvalidFtpUsername", description = "Inbound endpoint move after process in FTP Test Case")
public void testInboundEnpointMoveAfterProcessFTP() throws Exception {
addInboundEndpoint(addEndpoint2());
File sourceFile = new File(pathToFtpDir + File.separator + "test.xml");
File targetFile = new File(FTPFolder + File.separator + "ftpin"
+ File.separator + "test.xml");
File outFile = new File(FTPFolder + File.separator + "ftpout"
+ File.separator + "test.xml");
try {
FileUtils.copyFile(sourceFile, targetFile);
Thread.sleep(2000);
Assert.assertTrue(outFile.exists(),
"Input file is not moved after processing the file");
Assert.assertFalse(targetFile.exists(),
"Input file is exist after processing the input file");
} finally {
deleteFile(targetFile);
deleteFile(outFile);
}
}
@SetEnvironment(executionEnvironments = { ExecutionEnvironment.STANDALONE })
@Test(groups = "wso2.esb", description = "Inbound endpoint invalid FTP username Test Case")
public void testInboundInvalidFtpUsername() throws Exception {
addInboundEndpoint(addEndpoint3());
File sourceFile = new File(pathToFtpDir + File.separator + "test.xml");
File targetFile = new File(FTPFolder + File.separator + "ftpin"
+ File.separator + "test.xml");
File outFile = new File(FTPFolder + File.separator + "ftpout"
+ File.separator + "test.xml");
try {
FileUtils.copyFile(sourceFile, targetFile);
Thread.sleep(2000);
Assert.assertTrue(!outFile.exists());
} finally {
deleteFile(targetFile);
}
}
private OMElement addEndpoint1() throws Exception {
OMElement synapseConfig = null;
synapseConfig = AXIOMUtil
.stringToOM("<inboundEndpoint name=\"testFtpFile1\" onError=\"inFault\" protocol=\"file\"\n"
+ " sequence=\"requestHandlerSeq\" suspend=\"false\" xmlns=\"http://ws.apache.org/ns/synapse\">\"\n"
+ " <parameters>\n"
+ " <parameter name=\"interval\">1000</parameter>\n"
+ " <parameter name=\"transport.vfs.ActionAfterErrors\">NONE</parameter>\n"
+ " <parameter name=\"transport.vfs.Locking\">disable</parameter>\n"
+ " <parameter name=\"transport.vfs.ContentType\">application/xml</parameter>\n"
+ " <parameter name=\"transport.vfs.ActionAfterFailure\">NONE</parameter>\n"
+ " <parameter name=\"transport.vfs.ActionAfterProcess\">NONE</parameter>\n"
+ " <parameter name=\"transport.vfs.FileURI\">ftp://admin:admin@localhost:9653/ftpin/test.xml"
+ "</parameter>\n"
+ " </parameters>\n"
+ "</inboundEndpoint>\n");
return synapseConfig;
}
private OMElement addEndpoint2() throws Exception {
OMElement synapseConfig = null;
synapseConfig = AXIOMUtil
.stringToOM("<inboundEndpoint name=\"testFtpFile2\" onError=\"inFault\" protocol=\"file\"\n"
+ " sequence=\"requestHandlerSeq\" suspend=\"false\" xmlns=\"http://ws.apache.org/ns/synapse\">\"\n"
+ " <parameters>\n"
+ " <parameter name=\"interval\">1000</parameter>\n"
+ " <parameter name=\"transport.vfs.ActionAfterErrors\">NONE</parameter>\n"
+ " <parameter name=\"transport.vfs.Locking\">enable</parameter>\n"
+ " <parameter name=\"transport.vfs.ContentType\">application/xml</parameter>\n"
+ " <parameter name=\"transport.vfs.ActionAfterFailure\">NONE</parameter>\n"
+ " <parameter name=\"transport.vfs.ActionAfterProcess\">MOVE</parameter>\n"
+ "<parameter name=\"transport.vfs.MoveAfterProcess\">ftp://admin:admin@localhost:9653/ftpout"
+ "</parameter>"
+ " <parameter name=\"transport.vfs.FileURI\">ftp://admin:admin@localhost:9653/ftpin"
+ "</parameter>\n"
+ " </parameters>\n"
+ "</inboundEndpoint>\n");
return synapseConfig;
}
private OMElement addEndpoint3() throws Exception {
OMElement synapseConfig = null;
synapseConfig = AXIOMUtil
.stringToOM("<inboundEndpoint name=\"testFtpFile3\" onError=\"inFault\" protocol=\"file\"\n"
+ " sequence=\"requestHandlerSeq\" suspend=\"false\" xmlns=\"http://ws.apache.org/ns/synapse\">\"\n"
+ " <parameters>\n"
+ " <parameter name=\"interval\">1000</parameter>\n"
+ " <parameter name=\"transport.vfs.ActionAfterErrors\">NONE</parameter>\n"
+ " <parameter name=\"transport.vfs.Locking\">enable</parameter>\n"
+ " <parameter name=\"transport.vfs.ContentType\">application/xml</parameter>\n"
+ " <parameter name=\"transport.vfs.ActionAfterFailure\">NONE</parameter>\n"
+ " <parameter name=\"transport.vfs.ActionAfterProcess\">MOVE</parameter>\n"
+ "<parameter name=\"transport.vfs.MoveAfterProcess\">ftp://admin:admin@localhost:9653/ftpout/test.xml"
+ "</parameter>"
+ " <parameter name=\"transport.vfs.FileURI\">ftp://invalid:admin@localhost:9653/ftpin/test.xml"
+ "</parameter>\n"
+ " </parameters>\n"
+ "</inboundEndpoint>\n");
return synapseConfig;
}
private boolean deleteFile(File file) throws IOException {
return file.exists() && file.delete();
}
}