diff --git a/modules/spock/src/main/groovy/org/testcontainers/spock/TestcontainersMethodInterceptor.groovy b/modules/spock/src/main/groovy/org/testcontainers/spock/TestcontainersMethodInterceptor.groovy index 2399a0a6e32..cbef0a87bb2 100644 --- a/modules/spock/src/main/groovy/org/testcontainers/spock/TestcontainersMethodInterceptor.groovy +++ b/modules/spock/src/main/groovy/org/testcontainers/spock/TestcontainersMethodInterceptor.groovy @@ -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 @@ -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) @@ -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) @@ -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) @@ -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) @@ -70,12 +83,18 @@ class TestcontainersMethodInterceptor extends AbstractMethodInterceptor { } } - private List findAllComposeContainers(boolean shared) { + private List findAllDockerComposeContainers(boolean shared) { spec.allFields.findAll { FieldInfo f -> DockerComposeContainer.isAssignableFrom(f.type) && f.shared == shared } } + private List findAllComposeContainers(boolean shared) { + spec.allFields.findAll { FieldInfo f -> + ComposeContainer.isAssignableFrom(f.type) && f.shared == shared + } + } + private static void startContainers(List containers, IMethodInvocation invocation) { containers.each { FieldInfo f -> GenericContainer container = readContainerFromField(f, invocation) @@ -105,20 +124,34 @@ class TestcontainersMethodInterceptor extends AbstractMethodInterceptor { } } - private static void startComposeContainers(List compose, IMethodInvocation invocation) { + private static void startDockerComposeContainers(List compose, IMethodInvocation invocation) { compose.each { FieldInfo f -> DockerComposeContainer c = f.readValue(invocation.instance) as DockerComposeContainer c.start() } } - private static void stopComposeContainers(List compose, IMethodInvocation invocation) { + private static void startComposeContainers(List compose, IMethodInvocation invocation) { + compose.each { FieldInfo f -> + ComposeContainer c = f.readValue(invocation.instance) as ComposeContainer + c.start() + } + } + + private static void stopDockerComposeContainers(List compose, IMethodInvocation invocation) { compose.each { FieldInfo f -> DockerComposeContainer c = f.readValue(invocation.instance) as DockerComposeContainer c.stop() } } + private static void stopComposeContainers(List 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 diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/ComposeContainerIT.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/ComposeContainerIT.groovy index ff473aea1de..a190f1ea3b6 100644 --- a/modules/spock/src/test/groovy/org/testcontainers/spock/ComposeContainerIT.groovy +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/ComposeContainerIT.groovy @@ -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.Specification @@ -10,18 +10,18 @@ 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"() { diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/DockerComposeContainerIT.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/DockerComposeContainerIT.groovy new file mode 100644 index 00000000000..bd27c18f7ab --- /dev/null +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/DockerComposeContainerIT.groovy @@ -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 + } +} diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/SharedComposeContainerIT.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/SharedComposeContainerIT.groovy index 953d476b160..020005f923f 100644 --- a/modules/spock/src/test/groovy/org/testcontainers/spock/SharedComposeContainerIT.groovy +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/SharedComposeContainerIT.groovy @@ -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 @@ -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"() { diff --git a/modules/spock/src/test/groovy/org/testcontainers/spock/SharedDockerComposeContainerIT.groovy b/modules/spock/src/test/groovy/org/testcontainers/spock/SharedDockerComposeContainerIT.groovy new file mode 100644 index 00000000000..600be07f9f1 --- /dev/null +++ b/modules/spock/src/test/groovy/org/testcontainers/spock/SharedDockerComposeContainerIT.groovy @@ -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 + } +}