Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import org.spockframework.runtime.extension.AbstractMethodInterceptor
import org.spockframework.runtime.extension.IMethodInvocation
import org.spockframework.runtime.model.FieldInfo
import org.spockframework.runtime.model.SpecInfo
import org.testcontainers.containers.ComposeContainer
import org.testcontainers.containers.DockerComposeContainer
import org.testcontainers.containers.GenericContainer
import org.testcontainers.lifecycle.TestLifecycleAware
Expand All @@ -24,6 +25,9 @@ class TestcontainersMethodInterceptor extends AbstractMethodInterceptor {
def containers = findAllContainers(true)
startContainers(containers, invocation)

def dockerCompose = findAllDockerComposeContainers(true)
startDockerComposeContainers(dockerCompose, invocation)

def compose = findAllComposeContainers(true)
startComposeContainers(compose, invocation)

Expand All @@ -35,6 +39,9 @@ class TestcontainersMethodInterceptor extends AbstractMethodInterceptor {
def containers = findAllContainers(true)
stopContainers(containers, invocation)

def dockerCompose = findAllDockerComposeContainers(true)
stopDockerComposeContainers(dockerCompose, invocation)

def compose = findAllComposeContainers(true)
stopComposeContainers(compose, invocation)

Expand All @@ -46,6 +53,9 @@ class TestcontainersMethodInterceptor extends AbstractMethodInterceptor {
def containers = findAllContainers(false)
startContainers(containers, invocation)

def dockerCompose = findAllDockerComposeContainers(false)
startDockerComposeContainers(dockerCompose, invocation)

def compose = findAllComposeContainers(false)
startComposeContainers(compose, invocation)

Expand All @@ -58,6 +68,9 @@ class TestcontainersMethodInterceptor extends AbstractMethodInterceptor {
def containers = findAllContainers(false)
stopContainers(containers, invocation)

def dockerCompose = findAllDockerComposeContainers(false)
stopDockerComposeContainers(dockerCompose, invocation)

def compose = findAllComposeContainers(false)
stopComposeContainers(compose, invocation)

Expand All @@ -70,12 +83,18 @@ class TestcontainersMethodInterceptor extends AbstractMethodInterceptor {
}
}

private List<FieldInfo> findAllComposeContainers(boolean shared) {
private List<FieldInfo> findAllDockerComposeContainers(boolean shared) {
spec.allFields.findAll { FieldInfo f ->
DockerComposeContainer.isAssignableFrom(f.type) && f.shared == shared
}
}

private List<FieldInfo> findAllComposeContainers(boolean shared) {
spec.allFields.findAll { FieldInfo f ->
ComposeContainer.isAssignableFrom(f.type) && f.shared == shared
}
}

private static void startContainers(List<FieldInfo> containers, IMethodInvocation invocation) {
containers.each { FieldInfo f ->
GenericContainer container = readContainerFromField(f, invocation)
Expand Down Expand Up @@ -105,20 +124,34 @@ class TestcontainersMethodInterceptor extends AbstractMethodInterceptor {
}
}

private static void startComposeContainers(List<FieldInfo> compose, IMethodInvocation invocation) {
private static void startDockerComposeContainers(List<FieldInfo> compose, IMethodInvocation invocation) {
compose.each { FieldInfo f ->
DockerComposeContainer c = f.readValue(invocation.instance) as DockerComposeContainer
c.start()
}
}

private static void stopComposeContainers(List<FieldInfo> compose, IMethodInvocation invocation) {
private static void startComposeContainers(List<FieldInfo> compose, IMethodInvocation invocation) {
compose.each { FieldInfo f ->
ComposeContainer c = f.readValue(invocation.instance) as ComposeContainer
c.start()
}
}

private static void stopDockerComposeContainers(List<FieldInfo> compose, IMethodInvocation invocation) {
compose.each { FieldInfo f ->
DockerComposeContainer c = f.readValue(invocation.instance) as DockerComposeContainer
c.stop()
}
}

private static void stopComposeContainers(List<FieldInfo> compose, IMethodInvocation invocation) {
compose.each { FieldInfo f ->
ComposeContainer c = f.readValue(invocation.instance) as ComposeContainer
c.stop()
}
}


private static GenericContainer readContainerFromField(FieldInfo f, IMethodInvocation invocation) {
f.readValue(invocation.instance) as GenericContainer
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,26 +2,26 @@ package org.testcontainers.spock

import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.HttpClientBuilder
import org.testcontainers.containers.DockerComposeContainer
import org.testcontainers.containers.ComposeContainer
import org.testcontainers.containers.wait.strategy.Wait
import org.testcontainers.utility.DockerImageName
import spock.lang.Specification

@Testcontainers
class ComposeContainerIT extends Specification {

DockerComposeContainer composeContainer = new DockerComposeContainer(
DockerImageName.parse("docker/compose:debian-1.29.2"),
ComposeContainer composeContainer = new ComposeContainer(
DockerImageName.parse("docker:24.0.2"),
new File("src/test/resources/docker-compose.yml"))
.withExposedService("whoami_1", 80, Wait.forHttp("/"))
.withExposedService("whoami-1", 80, Wait.forHttp("/"))

String host

int port

def setup() {
host = composeContainer.getServiceHost("whoami_1", 80)
port = composeContainer.getServicePort("whoami_1", 80)
host = composeContainer.getServiceHost("whoami-1", 80)
port = composeContainer.getServicePort("whoami-1", 80)
}

def "running compose defined container is accessible on configured port"() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package org.testcontainers.spock

import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.HttpClientBuilder
import org.testcontainers.containers.DockerComposeContainer
import org.testcontainers.containers.wait.strategy.Wait
import org.testcontainers.utility.DockerImageName
import spock.lang.Specification

@Testcontainers
class DockerComposeContainerIT extends Specification {

DockerComposeContainer composeContainer = new DockerComposeContainer(
DockerImageName.parse("docker/compose:debian-1.29.2"),
new File("src/test/resources/docker-compose.yml"))
.withExposedService("whoami_1", 80, Wait.forHttp("/"))

String host

int port

def setup() {
host = composeContainer.getServiceHost("whoami_1", 80)
port = composeContainer.getServicePort("whoami_1", 80)
}

def "running compose defined container is accessible on configured port"() {
given: "a http client"
def client = HttpClientBuilder.create().build()

when: "accessing web server"
def response = client.execute(new HttpGet("http://$host:$port"))

then: "docker container is running and returns http status code 200"
response.statusLine.statusCode == 200
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package org.testcontainers.spock

import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.HttpClientBuilder
import org.testcontainers.containers.DockerComposeContainer
import org.testcontainers.containers.ComposeContainer
import org.testcontainers.containers.wait.strategy.Wait
import org.testcontainers.utility.DockerImageName
import spock.lang.Shared
Expand All @@ -12,18 +12,18 @@ import spock.lang.Specification
class SharedComposeContainerIT extends Specification {

@Shared
DockerComposeContainer composeContainer = new DockerComposeContainer(
DockerImageName.parse("docker/compose:debian-1.29.2"),
ComposeContainer composeContainer = new ComposeContainer(
DockerImageName.parse("docker:24.0.2"),
new File("src/test/resources/docker-compose.yml"))
.withExposedService("whoami_1", 80, Wait.forHttp("/"))
.withExposedService("whoami-1", 80, Wait.forHttp("/"))

String host

int port

def setup() {
host = composeContainer.getServiceHost("whoami_1", 80)
port = composeContainer.getServicePort("whoami_1", 80)
host = composeContainer.getServiceHost("whoami-1", 80)
port = composeContainer.getServicePort("whoami-1", 80)
}

def "running compose defined container is accessible on configured port"() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.testcontainers.spock

import org.apache.http.client.methods.HttpGet
import org.apache.http.impl.client.HttpClientBuilder
import org.testcontainers.containers.DockerComposeContainer
import org.testcontainers.containers.wait.strategy.Wait
import org.testcontainers.utility.DockerImageName
import spock.lang.Shared
import spock.lang.Specification

@Testcontainers
class SharedDockerComposeContainerIT extends Specification {

@Shared
DockerComposeContainer composeContainer = new DockerComposeContainer(
DockerImageName.parse("docker/compose:debian-1.29.2"),
new File("src/test/resources/docker-compose.yml"))
.withExposedService("whoami_1", 80, Wait.forHttp("/"))

String host

int port

def setup() {
host = composeContainer.getServiceHost("whoami_1", 80)
port = composeContainer.getServicePort("whoami_1", 80)
}

def "running compose defined container is accessible on configured port"() {
given: "a http client"
def client = HttpClientBuilder.create().build()

when: "accessing web server"
def response = client.execute(new HttpGet("http://$host:$port"))

then: "docker container is running and returns http status code 200"
response.statusLine.statusCode == 200
}
}
Loading