Hi I would like to suggest the development of a FTP/SFTP TestStep where I can FTP a generated DataSink file. That will assist me greatly in automating an entire end to end process without the...
SFTP/FTP TestStep
verycoolgreg
9 years agoNew Contributor
Hello Charles,
I can definitely second your request as I had run into the same situation where I had to do an FTP upload.
While we're waiting on the Smartbear to implement it, I have found a solution that you can use meanwhile.
You could also make a Groovy file and add it to the /ext folder so that the FTP function globally available for the entire project.
import org.apache.commons.net.ftp.*
import java.io.InputStream
import java.io.ByteArrayInputStream
String ftphost = context.expand( '${#Project#ftphost}' )
//String ftphost = //"va-dev-dmstable.alterian.com"
String ftpuser = context.expand( '${#Project#username}' )
String ftppwd = context.expand( '${#Project#password}' )
int ftpport = 21
def newDropFolderCategoryName = context.expand( '${DM FTP Drop Folders - Create Drop Folder Category#newDropFolderCategoryName}' )
def newImportDropFolderName = context.expand( '${DM FTP Drop Folders - Create Drop Folder Category#newImportDropFolderName}' )
String ftpDir = "/${newDropFolderCategoryName}/${newImportDropFolderName}"
int TENSECONDS = 10*1000
int THIRTYSECONDS = 30*1000
//Declare FTP client
FTPClient ftp = new FTPClient()
try
{
ftp.setConnectTimeout(TENSECONDS)
ftp.setDefaultTimeout(TENSECONDS)
ftp.connect(ftphost, ftpport)
//30 seconds to log on. Also 30 seconds to change to working directory.
ftp.setSoTimeout(THIRTYSECONDS)
def reply = ftp.getReplyCode()
if (!FTPReply.isPositiveCompletion(reply))
{
throw new Exception("Unable to connect to FTP server")
}
if (!ftp.login(ftpuser, ftppwd))
{
throw new Exception("Unable to login to FTP server")
}
if (!ftp.changeWorkingDirectory(ftpDir))
{
throw new Exception("Unable to change working directory on FTP server")
}
//Change the timeout here for a large file transfer that will take over 30 seconds
//ftp.setSoTimeout(THIRTYSECONDS);
ftp.setFileType(FTPClient.ASCII_FILE_TYPE)
ftp.enterLocalPassiveMode()
// String filetxt = "Some String file content"
// InputStream is = new ByteArrayInputStream(filetxt.getBytes('US-ASCII'))
String filename = "C:\\QA_Automation_Branch\\DataFiles\\email_list_test_file_15_records_FTP.csv";
is = new FileInputStream(filename);
try
{
if (!ftp.storeFile("email_list_test_file_15_records_FTP.csv", is))
{
throw new Exception("Unable to write file to FTP server")
}
//Make sure to always close the inputStream
}
finally
{
is.close()
}
}
catch(Exception e)
{
//handle exceptions here by logging or auditing
}
finally
{
//if the IO is timed out or force disconnected, exceptions may be thrown when trying to logout/disconnect
try
{
//10 seconds to log off. Also 10 seconds to disconnect.
ftp.setSoTimeout(TENSECONDS);
ftp.logout();
//depending on the state of the server the .logout() may throw an exception,
//we want to ensure complete disconnect.
}
catch(Exception innerException)
{
//You potentially just want to log that there was a logout exception.
}
finally
{
//Make sure to always disconnect. If not, there is a chance you will leave hanging sockects
ftp.disconnect();
}
}
return true