From 74657a18c2b573e52df96135d57e21d0a7e1af37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Berg=20Glasius?= Date: Fri, 1 Nov 2024 10:56:05 +0100 Subject: [PATCH 1/5] Add convenience methods to interact with container * Exec in Container * Place files in container * Mount directories in container * Download files from container --- .../grails/plugin/geb/ContainerGebSpec.groovy | 47 +++++++++++++++++-- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy b/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy index a40abbdb..781ff6a8 100644 --- a/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy +++ b/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy @@ -21,9 +21,16 @@ import org.openqa.selenium.chrome.ChromeOptions import org.openqa.selenium.remote.RemoteWebDriver import org.testcontainers.Testcontainers import org.testcontainers.containers.BrowserWebDriverContainer +import org.testcontainers.containers.Container +import org.testcontainers.containers.ContainerState +import org.testcontainers.containers.ExecConfig import org.testcontainers.containers.PortForwardingContainer +import org.testcontainers.images.builder.Transferable +import org.testcontainers.utility.MountableFile +import org.testcontainers.utility.ThrowingFunction import spock.lang.Shared +import java.nio.charset.Charset import java.time.Duration /** @@ -59,14 +66,14 @@ class ContainerGebSpec extends GebSpec { throw new IllegalStateException('Test class must be annotated with @Integration for serverPort to be injected') } webDriverContainer = new BrowserWebDriverContainer() + Testcontainers.exposeHostPorts(serverPort) webDriverContainer.tap { addExposedPort(serverPort) withAccessToHost(true) start() } - Testcontainers.exposeHostPorts(serverPort) if (hostName != DEFAULT_HOSTNAME) { - webDriverContainer.execInContainer('/bin/sh', '-c', "echo '$hostIp\t$hostName' | sudo tee -a /etc/hosts") + execInContainer('/bin/sh', '-c', "echo '$hostIp\t$hostName' | sudo tee -a /etc/hosts") } browser.driver = new RemoteWebDriver(webDriverContainer.seleniumAddress, new ChromeOptions()) browser.driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30)) @@ -91,7 +98,7 @@ class ContainerGebSpec extends GebSpec { String getProtocol() { return DEFAULT_PROTOCOL } - + /** * Returns the hostname that the browser will use to access the server under test. *

Defaults to {@code host.testcontainers.internal}. @@ -102,6 +109,40 @@ class ContainerGebSpec extends GebSpec { return DEFAULT_HOSTNAME } + // Convenience methods to interact with the container + + Container.ExecResult execInContainer(String... command) { + return webDriverContainer.execInContainer(command) + } + + Container.ExecResult execInContainer(Charset outputCharset, String... command) { + return webDriverContainer.execInContainer(outputCharset, command) + } + + Container.ExecResult execInContainer(ExecConfig execConfig) { + return webDriverContainer.execInContainer(execConfig) + } + + Container.ExecResult execInContainer(Charset outputCharset, ExecConfig execConfig) { + return webDriverContainer.execInContainer(outputCharset, execConfig) + } + + void copyFileToContainer(MountableFile mountableFile, String containerPath) { + webDriverContainer.copyFileToContainer(mountableFile, containerPath) + } + + void copyFileToContainer(Transferable transferable, String containerPath) { + webDriverContainer.copyFileToContainer(transferable, containerPath) + } + + void copyFileFromContainer(String containerPath, String destinationPath) throws IOException, InterruptedException { + webDriverContainer.copyFileFromContainer(containerPath, destinationPath) + } + + String getLogs() { + return webDriverContainer.getLogs() + } + private static String getHostIp() { PortForwardingContainer.INSTANCE.network.get().ipAddress } From 73aae22ced39a0ba17eef69690e48b46a503306f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Berg=20Glasius?= Date: Mon, 4 Nov 2024 10:59:46 +0100 Subject: [PATCH 2/5] Clean up post-review --- .../groovy/grails/plugin/geb/ContainerGebSpec.groovy | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy b/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy index 781ff6a8..91ad2886 100644 --- a/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy +++ b/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy @@ -22,12 +22,10 @@ import org.openqa.selenium.remote.RemoteWebDriver import org.testcontainers.Testcontainers import org.testcontainers.containers.BrowserWebDriverContainer import org.testcontainers.containers.Container -import org.testcontainers.containers.ContainerState import org.testcontainers.containers.ExecConfig import org.testcontainers.containers.PortForwardingContainer import org.testcontainers.images.builder.Transferable import org.testcontainers.utility.MountableFile -import org.testcontainers.utility.ThrowingFunction import spock.lang.Shared import java.nio.charset.Charset @@ -98,7 +96,7 @@ class ContainerGebSpec extends GebSpec { String getProtocol() { return DEFAULT_PROTOCOL } - + /** * Returns the hostname that the browser will use to access the server under test. *

Defaults to {@code host.testcontainers.internal}. @@ -138,7 +136,7 @@ class ContainerGebSpec extends GebSpec { void copyFileFromContainer(String containerPath, String destinationPath) throws IOException, InterruptedException { webDriverContainer.copyFileFromContainer(containerPath, destinationPath) } - + String getLogs() { return webDriverContainer.getLogs() } From 6b716aaa4bbf5a2dff522a2ff84ff5429bc4b4c0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Berg=20Glasius?= Date: Mon, 4 Nov 2024 13:32:56 +0100 Subject: [PATCH 3/5] Removed convenience methods and added direct access to BrowserWebDriverContainer via getContainer() instead. --- .../grails/plugin/geb/ContainerGebSpec.groovy | 42 ++++--------------- 1 file changed, 8 insertions(+), 34 deletions(-) diff --git a/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy b/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy index 91ad2886..82f7b397 100644 --- a/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy +++ b/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy @@ -71,7 +71,7 @@ class ContainerGebSpec extends GebSpec { start() } if (hostName != DEFAULT_HOSTNAME) { - execInContainer('/bin/sh', '-c', "echo '$hostIp\t$hostName' | sudo tee -a /etc/hosts") + webDriverContainer.execInContainer('/bin/sh', '-c', "echo '$hostIp\t$hostName' | sudo tee -a /etc/hosts") } browser.driver = new RemoteWebDriver(webDriverContainer.seleniumAddress, new ChromeOptions()) browser.driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(30)) @@ -87,6 +87,13 @@ class ContainerGebSpec extends GebSpec { webDriverContainer?.stop() } + /** + * Get access to container running the web-driver, for convenience to execInContainer, copyFileToContainer etc. + */ + BrowserWebDriverContainer getContainer() { + return webDriverContainer + } + /** * Returns the protocol that the browser will use to access the server under test. *

Defaults to {@code http}. @@ -107,39 +114,6 @@ class ContainerGebSpec extends GebSpec { return DEFAULT_HOSTNAME } - // Convenience methods to interact with the container - - Container.ExecResult execInContainer(String... command) { - return webDriverContainer.execInContainer(command) - } - - Container.ExecResult execInContainer(Charset outputCharset, String... command) { - return webDriverContainer.execInContainer(outputCharset, command) - } - - Container.ExecResult execInContainer(ExecConfig execConfig) { - return webDriverContainer.execInContainer(execConfig) - } - - Container.ExecResult execInContainer(Charset outputCharset, ExecConfig execConfig) { - return webDriverContainer.execInContainer(outputCharset, execConfig) - } - - void copyFileToContainer(MountableFile mountableFile, String containerPath) { - webDriverContainer.copyFileToContainer(mountableFile, containerPath) - } - - void copyFileToContainer(Transferable transferable, String containerPath) { - webDriverContainer.copyFileToContainer(transferable, containerPath) - } - - void copyFileFromContainer(String containerPath, String destinationPath) throws IOException, InterruptedException { - webDriverContainer.copyFileFromContainer(containerPath, destinationPath) - } - - String getLogs() { - return webDriverContainer.getLogs() - } private static String getHostIp() { PortForwardingContainer.INSTANCE.network.get().ipAddress From 68aec2e5d5ee54614e424782fd510bbc56889720 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Berg=20Glasius?= Date: Mon, 4 Nov 2024 13:44:39 +0100 Subject: [PATCH 4/5] Added references with @see to javadoc --- .../groovy/grails/plugin/geb/ContainerGebSpec.groovy | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy b/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy index 82f7b397..07c833ef 100644 --- a/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy +++ b/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy @@ -89,6 +89,11 @@ class ContainerGebSpec extends GebSpec { /** * Get access to container running the web-driver, for convenience to execInContainer, copyFileToContainer etc. + * + * @see org.testcontainers.containers.ContainerState#execInContainer(java.lang.String ...) + * @see org.testcontainers.containers.ContainerState#copyFileToContainer(org.testcontainers.utility.MountableFile, java.lang.String) + * @see org.testcontainers.containers.ContainerState#copyFileFromContainer(java.lang.String, java.lang.String) + * @see org.testcontainers.containers.ContainerState */ BrowserWebDriverContainer getContainer() { return webDriverContainer From 9f1c22514aa09ae3fa6e2b3dad209d66534569b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Berg=20Glasius?= Date: Mon, 4 Nov 2024 14:13:00 +0100 Subject: [PATCH 5/5] White space and unused imports fixed --- .../groovy/grails/plugin/geb/ContainerGebSpec.groovy | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy b/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy index 07c833ef..66cac627 100644 --- a/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy +++ b/src/testFixtures/groovy/grails/plugin/geb/ContainerGebSpec.groovy @@ -21,14 +21,9 @@ import org.openqa.selenium.chrome.ChromeOptions import org.openqa.selenium.remote.RemoteWebDriver import org.testcontainers.Testcontainers import org.testcontainers.containers.BrowserWebDriverContainer -import org.testcontainers.containers.Container -import org.testcontainers.containers.ExecConfig import org.testcontainers.containers.PortForwardingContainer -import org.testcontainers.images.builder.Transferable -import org.testcontainers.utility.MountableFile import spock.lang.Shared -import java.nio.charset.Charset import java.time.Duration /** @@ -92,13 +87,13 @@ class ContainerGebSpec extends GebSpec { * * @see org.testcontainers.containers.ContainerState#execInContainer(java.lang.String ...) * @see org.testcontainers.containers.ContainerState#copyFileToContainer(org.testcontainers.utility.MountableFile, java.lang.String) - * @see org.testcontainers.containers.ContainerState#copyFileFromContainer(java.lang.String, java.lang.String) + * @see org.testcontainers.containers.ContainerState#copyFileFromContainer(java.lang.String, java.lang.String) * @see org.testcontainers.containers.ContainerState */ BrowserWebDriverContainer getContainer() { return webDriverContainer } - + /** * Returns the protocol that the browser will use to access the server under test. *

Defaults to {@code http}. @@ -119,7 +114,6 @@ class ContainerGebSpec extends GebSpec { return DEFAULT_HOSTNAME } - private static String getHostIp() { PortForwardingContainer.INSTANCE.network.get().ipAddress }