Skip to content

Commit

Permalink
Migrated Docker based integration tests to TestContainers
Browse files Browse the repository at this point in the history
  • Loading branch information
ok2c committed Oct 12, 2024
1 parent f4f2671 commit 7c20952
Show file tree
Hide file tree
Showing 17 changed files with 746 additions and 658 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/maven.yml
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,4 @@ jobs:
distribution: 'temurin'
java-version: ${{ matrix.java }}
- name: Build with Maven
run: mvn -V --file pom.xml --no-transfer-progress -DtrimStackTrace=false -P-use-toolchains
run: mvn -V --file pom.xml --no-transfer-progress -DtrimStackTrace=false -P-use-toolchains,docker
33 changes: 0 additions & 33 deletions httpcore5-testing/docker-compose.yml

This file was deleted.

31 changes: 0 additions & 31 deletions httpcore5-testing/docker/BUILDING.txt

This file was deleted.

34 changes: 0 additions & 34 deletions httpcore5-testing/docker/apache-httpd/Dockerfile

This file was deleted.

17 changes: 0 additions & 17 deletions httpcore5-testing/docker/httpbin/Dockerfile

This file was deleted.

30 changes: 0 additions & 30 deletions httpcore5-testing/docker/nginx/Dockerfile

This file was deleted.

48 changes: 10 additions & 38 deletions httpcore5-testing/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,16 @@
<artifactId>mockito-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>junit-jupiter</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<profiles>
Expand All @@ -127,44 +137,6 @@
</executions>
</plugin>

<plugin>
<groupId>io.fabric8</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.45.0</version>
<executions>
<execution>
<id>start-httpbin</id>
<phase>pre-integration-test</phase>
<goals>
<goal>start</goal>
</goals>
<configuration>
<images>
<image>
<name>kennethreitz/httpbin</name>
<alias>httpbin</alias>
<run>
<log>
<color>MAGENTA</color>
</log>
<ports>
<port>8082:80</port>
</ports>
</run>
</image>
</images>
</configuration>
</execution>
<execution>
<id>stop-test-servers</id>
<phase>post-integration-test</phase>
<goals>
<goal>stop</goal>
</goals>
</execution>
</executions>
</plugin>

</plugins>
</build>
</profile>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
*/
package org.apache.hc.core5.testing.compatibility;

import org.testcontainers.containers.GenericContainer;
import org.testcontainers.images.builder.ImageFromDockerfile;
import org.testcontainers.utility.DockerImageName;

public final class ContainerImages {

public static final String AAA = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
public static final String BBB = "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb";
public static final String CCC = "ccccccccccccccccccccccccccccccccccccccccccccccccc";
public static final String PUSHY = "I am being very pushy";

public static int HTTP_PORT = 80;

public static GenericContainer<?> httpBin() {
return new GenericContainer<>(DockerImageName.parse("kennethreitz/httpbin:latest"))
.withExposedPorts(HTTP_PORT);
}

public static GenericContainer<?> apacheHttpD() {
return new GenericContainer<>(new ImageFromDockerfile()
.withFileFromClasspath("httpd-vhosts.conf", "docker/httpd/httpd-vhosts.conf")
.withFileFromString("pushy", PUSHY)
.withFileFromString("aaa", AAA)
.withFileFromString("bbb", BBB)
.withFileFromString("ccc", CCC)
.withDockerfileFromBuilder(builder ->
builder
.from("httpd:2.4")
.env("var_dir", "/var/httpd")
.env("www_dir", "${var_dir}/www")
.run("mkdir -p ${var_dir}")
.run("sed -i -E 's/^\\s*#\\s*(LoadModule\\s+http2_module\\s+modules\\/mod_http2.so)/\\1/' conf/httpd.conf")
.run("sed -i -E 's/^\\s*ServerAdmin.*$/ServerAdmin [email protected]/' conf/httpd.conf")
.run("sed -i -E 's/^\\s*#\\s*(Include\\s+conf\\/extra\\/httpd-vhosts.conf)/\\1/' conf/httpd.conf")
.copy("httpd-vhosts.conf", "/usr/local/apache2/conf/extra/httpd-vhosts.conf")
.copy("pushy", "${www_dir}/")
.copy("aaa", "${www_dir}/")
.copy("bbb", "${www_dir}/")
.copy("ccc", "${www_dir}/")
.build()))
.withExposedPorts(HTTP_PORT);
}

public static GenericContainer<?> ngnix() {
return new GenericContainer<>(new ImageFromDockerfile()
.withFileFromClasspath("default.conf", "docker/ngnix/default.conf")
.withFileFromString("pushy", PUSHY)
.withFileFromString("aaa", AAA)
.withFileFromString("bbb", BBB)
.withFileFromString("ccc", CCC)
.withDockerfileFromBuilder(builder ->
builder
.from("nginx:1.22")
.env("var_dir", "/var/nginx")
.env("www_dir", "${var_dir}/www")
.run("mkdir -p ${var_dir}")
.copy("default.conf", "/etc/nginx/conf.d/default.conf")
.copy("pushy", "${www_dir}/")
.copy("aaa", "${www_dir}/")
.copy("bbb", "${www_dir}/")
.copy("ccc", "${www_dir}/")
.build()))
.withExposedPorts(HTTP_PORT);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*
*/
package org.apache.hc.core5.testing.compatibility;

import org.apache.hc.core5.http.HttpRequest;
import org.apache.hc.core5.http.HttpResponse;
import org.apache.hc.core5.http.message.RequestLine;
import org.apache.hc.core5.http.message.StatusLine;

public final class Result<T> {

public final HttpRequest request;
public final HttpResponse response;
public final T content;
public final Exception exception;

public enum Status { OK, NOK }

public Result(final HttpRequest request, final Exception exception) {
this.request = request;
this.response = null;
this.content = null;
this.exception = exception;
}

public Result(final HttpRequest request, final HttpResponse response, final T content) {
this.request = request;
this.response = response;
this.content = content;
this.exception = null;
}

public Status getStatus() {
return exception != null ? Status.NOK : Status.OK;
}

public boolean isOK() {
return exception == null;
}

@Override
public String toString() {
final StringBuilder buf = new StringBuilder();
buf.append(new RequestLine(request));
buf.append(" -> ");
if (exception != null) {
buf.append("NOK: ").append(exception);
} else {
if (response != null) {
buf.append("OK: ").append(new StatusLine(response));
}
}
return buf.toString();
}

}
Loading

0 comments on commit 7c20952

Please sign in to comment.