Experimental test suite for Sozu
- Gradle 4.8 at least
- OpenJDK 1.8
- Docker 1.6.0 at least
- An environment with more than 2GB free disk space
NOTE: You don't have to install gradle to run the tests. This repository provide a gradle wrapper binary: gradlew that contain Gradle.
You must create a local bridge network named "my-net":
docker network create --driver=bridge --subnet=172.18.0.0/16 my-net
Use this subnet in your Sozu config.toml for the backends address.
gradle build or ./gradlew build with the gradle wrapper.
gradle test or ./gradlew test (add --info or --debug) to run the tests suite.
**Run only one test:**s
./gradlew test --tests "<testClass>.<testName>" --info
e.g.: ./gradlew test --tests "SozuContainerTest.testRetryPolicy" --info
This can take additional time to run the test suite the first time because of the download (and buid) of the docker images.
testcontainers doesn't check if the local docker image of your container as the same version as the one on docker hub.
So you have to docker pull <your image> if you work with docker image from docker HUB in your tests.
You can set the path to a local sozu Dockerfile with SOZU_DOCKERFILE env variable to avoid to download the sozu image from dockerhub.
NOTE: To avoid that you can build your container from a local Dockerfile:
This example use the Classpath to store the Dockerfile.
public class MyContainer {
public MyContainer() {
super(
new ImageFromDockerfile()
.withFileFromClasspath("Dockerfile", "path/to/Dockerfile")
);
}
}- Create a new test file in
src/test/java - Put all your config file in
src/test/resourcesto retrieve them from theClasspath - Create a new test
Class - Define the containers you want to run at the start of your test suite as fields of your
Classand add@Ruleon them (that'll be use bytestcontainers). You can still create them in the@Beforeor in your tests method. gradle testor./gradlew testto run the test suite.
public class MyContainer<SELF extends MyContainer<SELF>> extends GenericContainer<SELF> {
public static final String IMAGE = "helloworld";
public static final String DEFAULT_TAG = "latest";
// Get image from dockerHUB
public MyContainer() {
super(IMAGE+ ":" + DEFAULT_TAG);
}
@Override
protected void configure() {
// use with* method to change the docker run command
}
// Build the URL to connect to your container with a mapped port
public URL getBaseUrl(String scheme, int port) throws MalformedURLException {
return new URL(scheme + "://" + getContainerIpAddress() + ":" + getMappedPort(port));
}
}- Create a new
Classfile insrc/main/java - Extend them from GenericContainer:
<SELF extends NodeBackendContainer<SELF>> extends GenericContainer<SELF> - (optional) To modify the docker image you have to do this in the constructor with the method
with*e.g.:withFileFromClasspath - (optional) To modify the
docker runcommand generate by testcontainers you have to do this in@Override protected void configure()
See here for more information
NOTE: Use the getMappedPort(<port>) to get the host port mapped to the exposed port in the container.
public class MyContainerTest {
@Rule
public MyContainer myContainer = new MyContainer();
@Test
public void testConnectionForMyContainer() throws Exception {
URLConnection urlConnection = myContainer.getBaseUrl().openConnection();
BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
String line = reader.readLine();
assertEquals("A message", line);
}
}Sometime libcontainers fail at download the docker images due to a network problem during the first run or when these are not already present in the host.
You can just replay the test suite to fix this.
SozuContainerTest
✘ classMethod
org.testcontainers.containers.ContainerFetchException: Can't get Docker image: org.testcontainers.images.builder.ImageFromDockerfile@1dfc4dc1
SozuContainerTest > classMethod FAILED
org.testcontainers.containers.ContainerFetchException: Can't get Docker image: org.testcontainers.images.builder.ImageFromDockerfile@1dfc4dc1
Caused by:
com.github.dockerjava.api.exception.DockerClientException: Could not build image: The command '/bin/sh -c npm install' returned a non-zero code: 1