cancel
Showing results for 
Search instead for 
Did you mean: 

SFTP/FTP TestStep

SFTP/FTP TestStep

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 need for Groovy.

 

Thank you.

 

Regards

 

Charles

4 Comments
New 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

 

Staff
Status changed to: Selected for Development

An FTP step will be available in ReadyAPI v2.3.  

 

Thanks,

Mike Giller

Product Owner

Staff
Status changed to: Implemented

There's now an FTP test step available with latest 2.3 release - https://support.smartbear.com/readyapi/docs/general-info/whats-new.html

 

Please try it

 

New Contributor

GillerM, 

 

I see that the FTP test step is for uploads. Is there one for downloads?

 

Thanks