Fake SFTP Server Lambda

Fake SFTP Server Lambda runs an in-memory SFTP server while your tests are running.

License

License

GroupId

GroupId

com.github.stefanbirkner
ArtifactId

ArtifactId

fake-sftp-server-lambda
Last Version

Last Version

2.0.0
Release Date

Release Date

Type

Type

jar
Description

Description

Fake SFTP Server Lambda
Fake SFTP Server Lambda runs an in-memory SFTP server while your tests are running.
Project URL

Project URL

https://github.com/stefanbirkner/fake-sftp-server-lambda/
Source Code Management

Source Code Management

https://github.com/stefanbirkner/fake-sftp-server-lambda/

Download fake-sftp-server-lambda

How to add to project

<!-- https://jarcasting.com/artifacts/com.github.stefanbirkner/fake-sftp-server-lambda/ -->
<dependency>
    <groupId>com.github.stefanbirkner</groupId>
    <artifactId>fake-sftp-server-lambda</artifactId>
    <version>2.0.0</version>
</dependency>
// https://jarcasting.com/artifacts/com.github.stefanbirkner/fake-sftp-server-lambda/
implementation 'com.github.stefanbirkner:fake-sftp-server-lambda:2.0.0'
// https://jarcasting.com/artifacts/com.github.stefanbirkner/fake-sftp-server-lambda/
implementation ("com.github.stefanbirkner:fake-sftp-server-lambda:2.0.0")
'com.github.stefanbirkner:fake-sftp-server-lambda:jar:2.0.0'
<dependency org="com.github.stefanbirkner" name="fake-sftp-server-lambda" rev="2.0.0">
  <artifact name="fake-sftp-server-lambda" type="jar" />
</dependency>
@Grapes(
@Grab(group='com.github.stefanbirkner', module='fake-sftp-server-lambda', version='2.0.0')
)
libraryDependencies += "com.github.stefanbirkner" % "fake-sftp-server-lambda" % "2.0.0"
[com.github.stefanbirkner/fake-sftp-server-lambda "2.0.0"]

Dependencies

compile (2)

Group / Artifact Type Version
com.github.marschall : memoryfilesystem jar [0.8.0,)
org.apache.sshd : sshd-sftp jar [2.6.0,)

Project Modules

There are no modules declared in this project.

Fake SFTP Server Lambda

Build Status

Fake SFTP Server Lambda runs an in-memory SFTP server while your tests are running. It uses the SFTP server of the Apache SSHD project.

Fake SFTP Server Rule is published under the MIT license. It requires at least Java 8.

For JUnit 4 there is an alternative to Fake SFTP Server Lambda. Its name is Fake SFTP Server Rule.

Installation

Fake SFTP Server Lambda is available from Maven Central.

Fake SFTP Server Lambda uses the SFTP server of the Apache SSHD project. The API of the server changed in version 2.6.0 in a way that required changes in Fake SFTP Server Lambda. Therefore, there are two lines of development. As long as your project does not depend on an older version of Apache SSHD you should use Fake SFTP Server Lambda 2.0.0 which is compatible with Apache SSHD 2.6.0 and later.

<dependency>
  <groupId>com.github.stefanbirkner</groupId>
  <artifactId>fake-sftp-server-lambda</artifactId>
  <version>2.0.0</version>
  <scope>test</scope>
</dependency>

Users whose projects have a dependency to Apache SSHD with a version before 2.6.0 must use Fake SFTP Server Lambda 1.0.1.

<dependency>
  <groupId>com.github.stefanbirkner</groupId>
  <artifactId>fake-sftp-server-lambda</artifactId>
  <version>1.0.1</version>
  <scope>test</scope>
</dependency>

Usage

Fake SFTP Server Lambda is used by wrapping your test code with the method withSftpServer.

import static com.github.stefanbirkner.fakesftpserver.lambda.FakeSftpServer.withSftpServer;

public class TestClass {
  @Test
  public void someTest() throws Exception {
    withSftpServer(server -> {
      //test code
    });
  }
}

withSftpServer starts an SFTP server before executing the test code and shuts down the server afterwards. The test code uses the provided server object to obtain information about the running server or use additional features of Fake SFTP Server Lambda.

By default the SFTP server listens on an auto-allocated port. During the test this port can be obtained by server.getPort(). It can be changed by calling setPort(int). The server is restarted whenever this method is called.

withSftpServer(server -> {
  server.setPort(1234);
  ...
});

You can interact with the SFTP server by using the SFTP protocol with password authentication. By default the server accepts every pair of username and password, but you can restrict it to specific pairs.

withSftpServer(server -> {
  server.addUser("username", "password");
  ...
});

Testing code that reads files

If you test code that reads files from an SFTP server then you need a server that provides these files. The server object has a shortcut for putting files to the server.

@Test
public void testTextFile() throws Exception {
  withSftpServer(server -> {
    server.putFile("/directory/file.txt", "content of file", UTF_8);
    //code that reads the file using the SFTP protocol
  });
}

@Test
public void testBinaryFile() throws Exception {
  withSftpServer(server -> {
    byte[] content = createContent();
    server.putFile("/directory/file.bin", content);
    //code that reads the file using the SFTP protocol
  });
}

Test data that is provided as an input stream can be put directly from that input stream. This is very handy if your test data is available as a resource.

@Test
public void testFileFromInputStream() throws Exception {
  withSftpServer(server -> {
    InputStream is = getClass().getResourceAsStream("data.bin");
    server.putFile("/directory/file.bin", is);
    //code that reads the file using the SFTP protocol
  });
}

If you need an empty directory then you can use the method createDirectory(String).

@Test
public void testDirectory() throws Exception {
  withSftpServer(server -> {
    server.createDirectory("/a/directory");
    //code that reads from or writes to that directory
  });
}

You may create multiple directories at once with createDirectories(String...).

@Test
public void testDirectories() throws Exception {
  withSftpServer(server -> {
    server.createDirectories(
      "/a/directory",
      "/another/directory"
    );
    //code that reads from or writes to that directories
  });
}

Testing code that writes files

If you test code that writes files to an SFTP server then you need to verify the upload. The server object provides a shortcut for getting the file's content from the server.

@Test
public void testTextFile() throws Exception {
  withSftpServer(server -> {
    //code that uploads the file using the SFTP protocol
    String fileContent = server.getFileContent("/directory/file.txt", UTF_8);
    //verify file content
  });
}

@Test
public void testBinaryFile() throws Exception {
  withSftpServer(server -> {
    //code that uploads the file using the SFTP protocol
    byte[] fileContent = server.getFileContent("/directory/file.bin");
    //verify file content
  });
}

Testing existence of files

If you want to check whether a file was created or deleted then you can verify that it exists or not.

@Test
public void testFile() throws Exception {
  withSftpServer(server -> {
    //code that uploads or deletes the file
    boolean exists = server.existsFile("/directory/file.txt");
    //check value of exists variable
  });
}

The method returns true iff the file exists and it is not a directory.

Delete all files

If you want to reuse the SFTP server then you can delete all files and directories on the SFTP server. (This is rarely necessary because the method withSftpServer takes care that it starts and ends with a clean SFTP server.)

server.deleteAllFilesAndDirectories()

Contributing

You have three options if you have a feature request, found a bug or simply have a question about Fake SFTP Server Lambda.

Development Guide

Fake SFTP Server Lambda is build with Maven. If you want to contribute code then

  • Please write a test for your change.
  • Ensure that you didn't break the build by running mvn verify -Dgpg.skip.
  • Fork the repo and create a pull request. (See Understanding the GitHub Flow)

The basic coding style is described in the EditorConfig file .editorconfig.

Fake SFTP Server Lambda supports Travis CI for continuous integration. Your pull request will be automatically build by Travis CI.

Release Guide

  • Select a new version according to the Semantic Versioning 2.0.0 Standard.
  • Set the new version in pom.xml and in the Installation section of this readme.
  • Commit the modified pom.xml and README.md.
  • Run mvn clean deploy with JDK 8.
  • Add a tag for the release: git tag fake-sftp-server-lambda-X.X.X

Versions

Version
2.0.0
1.0.1
1.0.0