/*
* Copyright (c) MuleSoft, Inc. All rights reserved. http://www.mulesoft.com
* The software in this package is published under the terms of the CPAL v1.0
* license, a copy of which has been included with this distribution in the
* LICENSE.txt file.
*/
package org.mule.test.infrastructure.process.rules;
import org.mule.runtime.core.util.FileUtils;
import org.mule.tck.junit4.rule.DynamicPort;
import org.mule.tck.junit4.rule.SystemProperty;
import org.mule.test.infrastructure.server.ftp.EmbeddedFtpServer;
import java.io.File;
import org.junit.rules.ExternalResource;
import org.junit.rules.TestRule;
import org.junit.runner.Description;
import org.junit.runners.model.Statement;
/**
* A {@link TestRule} which starts an {@link EmbeddedFtpServer}.
* <p>
* It automatically allocates a dynamic port and exposes the selected port on a system property under a configurable key.
*
* @since 4.0
*/
public class FtpServer extends ExternalResource {
private final File baseDir;
protected final DynamicPort dynamicPort;
private final SystemProperty dynamicPortSystemProperty;
private EmbeddedFtpServer server = null;
/**
* Creates a new instance
*
* @param ftpServerPortName the name of the system property on which the port will be exposed
* @param baseDir the base dir for the FTP server
*/
public FtpServer(String ftpServerPortName, File baseDir) {
this.baseDir = baseDir;
dynamicPort = new DynamicPort(ftpServerPortName + "_PORT");
dynamicPortSystemProperty = new SystemProperty(ftpServerPortName, String.valueOf(dynamicPort.getNumber()));
}
@Override
public Statement apply(Statement base, Description description) {
base = dynamicPort.apply(base, description);
base = dynamicPortSystemProperty.apply(base, description);
return super.apply(base, description);
}
public void start() throws Exception {
try {
createFtpServerBaseDir();
server = createServer();
server.start();
} catch (Throwable e) {
throw new RuntimeException(e);
}
}
public void stop() {
stopServer();
deleteFtpServerBaseDir();
}
protected EmbeddedFtpServer createServer() throws Exception {
return new EmbeddedFtpServer(dynamicPort.getNumber());
}
private void stopServer() {
if (server != null) {
try {
server.stop();
} catch (Exception e) {
throw new RuntimeException("Could not stop FTP server", e);
}
}
}
private void createFtpServerBaseDir() {
deleteFtpServerBaseDir();
baseDir.mkdirs();
}
private void deleteFtpServerBaseDir() {
FileUtils.deleteTree(baseDir);
}
/**
* @return the port number on which the ftp server is listening
*/
public int getPort() {
return dynamicPort.getNumber();
}
}