From 0889d5ca8b94b7a82405f46ff525067bbe9d034b Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Sat, 20 Jan 2018 07:36:18 +0100 Subject: [PATCH 1/3] Improve the usability of GenericContainer --- .../testcontainers/containers/Container.java | 21 ++++++++++++ .../containers/GenericContainer.java | 32 +++++++++++++++++-- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/org/testcontainers/containers/Container.java b/core/src/main/java/org/testcontainers/containers/Container.java index 2d5158e1833..309d63e7844 100644 --- a/core/src/main/java/org/testcontainers/containers/Container.java +++ b/core/src/main/java/org/testcontainers/containers/Container.java @@ -135,6 +135,17 @@ default void addFileSystemBind(final String hostPath, final String containerPath */ SELF waitingFor(@NonNull WaitStrategy waitStrategy); + /** + * Adds a file system binding. + * + * @param hostPath the file system path on the host + * @param containerPath the file system path inside the container + * @return this + */ + default SELF withFileSystemBind(String hostPath, String containerPath) { + return withFileSystemBind(hostPath, containerPath, BindMode.READ_WRITE); + } + /** * Adds a file system binding. * @@ -383,6 +394,7 @@ default Integer getFirstMappedPort() { */ SELF withLogConsumer(Consumer consumer); + @Deprecated Info fetchDockerDaemonInfo() throws IOException; /** @@ -438,8 +450,15 @@ ExecResult execInContainer(Charset outputCharset, String... command) Future getImage(); + /** + * + * @deprecated use getEnvMap + */ + @Deprecated List getEnv(); + Map getEnvMap(); + String[] getCommandParts(); List getBinds(); @@ -452,12 +471,14 @@ ExecResult execInContainer(Charset outputCharset, String... command) DockerClient getDockerClient(); + @Deprecated Info getDockerDaemonInfo(); String getContainerId(); String getContainerName(); + @Deprecated InspectContainerResponse getContainerInfo(); void setExposedPorts(List exposedPorts); diff --git a/core/src/main/java/org/testcontainers/containers/GenericContainer.java b/core/src/main/java/org/testcontainers/containers/GenericContainer.java index 9cd915ffe35..efaa1976f6a 100644 --- a/core/src/main/java/org/testcontainers/containers/GenericContainer.java +++ b/core/src/main/java/org/testcontainers/containers/GenericContainer.java @@ -92,7 +92,7 @@ public class GenericContainer> private Future image; @NonNull - private List env = new ArrayList<>(); + private Map env = new HashMap<>(); @NonNull private String[] commandParts = new String[0]; @@ -396,7 +396,8 @@ private void applyConfiguration(CreateContainerCmd createCommand) { createCommand.withCmd(commandParts); } - String[] envArray = env.stream() + String[] envArray = env.entrySet().stream() + .map(it -> it.getKey() + "=" + it.getValue()) .toArray(String[]::new); createCommand.withEnv(envArray); @@ -533,12 +534,37 @@ public void setCommand(@NonNull String... commandParts) { this.commandParts = commandParts; } + @Override + public Map getEnvMap() { + return env; + } + + /** + * {@inheritDoc} + */ + @Override + public List getEnv() { + return env.entrySet().stream() + .map(it -> it.getKey() + "=" + it.getValue()) + .collect(Collectors.toList()); + } + + @Override + public void setEnv(List env) { + this.env = env.stream() + .map(it -> it.split("=")) + .collect(Collectors.toMap( + it -> it[0], + it -> it[1] + )); + } + /** * {@inheritDoc} */ @Override public void addEnv(String key, String value) { - env.add(key + "=" + value); + env.put(key, value); } /** From 2159f0264b985b5db2e4becfbc6025e10ca7ff1b Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Sat, 20 Jan 2018 07:48:47 +0100 Subject: [PATCH 2/3] Add withEnv with mapper --- .../org/testcontainers/containers/Container.java | 14 ++++++++++++++ .../junit/GenericContainerRuleTest.java | 5 +++-- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/testcontainers/containers/Container.java b/core/src/main/java/org/testcontainers/containers/Container.java index 309d63e7844..ce0704a8534 100644 --- a/core/src/main/java/org/testcontainers/containers/Container.java +++ b/core/src/main/java/org/testcontainers/containers/Container.java @@ -17,8 +17,10 @@ import java.time.Duration; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.concurrent.Future; import java.util.function.Consumer; +import java.util.function.Function; public interface Container> extends LinkableContainer { @@ -182,6 +184,18 @@ default SELF withFileSystemBind(String hostPath, String containerPath) { */ SELF withEnv(String key, String value); + /** + * Add an environment variable to be passed to the container. + * + * @param key environment variable key + * @param mapper environment variable value mapper, accepts old value as an argument + * @return this + */ + default SELF withEnv(String key, Function, String> mapper) { + Optional oldValue = Optional.ofNullable(getEnvMap().get(key)); + return withEnv(key, mapper.apply(oldValue)); + } + /** * Add environment variables to be passed to the container. * diff --git a/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java b/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java index 61dfea7d9d8..677f97d67d9 100644 --- a/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java +++ b/core/src/test/java/org/testcontainers/junit/GenericContainerRuleTest.java @@ -81,9 +81,10 @@ public static void setupContent() throws FileNotFoundException { * dirty way for testing. */ @ClassRule - public static GenericContainer alpineEnvVar = new GenericContainer("alpine:3.2") + public static GenericContainer alpineEnvVar = new GenericContainer<>("alpine:3.2") .withExposedPorts(80) - .withEnv("MAGIC_NUMBER", "42") + .withEnv("MAGIC_NUMBER", "4") + .withEnv("MAGIC_NUMBER", oldValue -> oldValue.orElse("") + "2") .withCommand("/bin/sh", "-c", "while true; do echo \"$MAGIC_NUMBER\" | nc -l -p 80; done"); /** From 72f99af464b7e29f5f330ba8039f91c388ce1c80 Mon Sep 17 00:00:00 2001 From: Sergei Egorov Date: Mon, 22 Jan 2018 08:25:54 +0100 Subject: [PATCH 3/3] Document in CHANGELOG.md, add deprecation comments --- CHANGELOG.md | 3 +++ .../org/testcontainers/containers/Container.java | 12 ++++++++++++ .../testcontainers/containers/GenericContainer.java | 3 +++ 3 files changed, 18 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54f50a67436..2f9e9946c84 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,9 @@ All notable changes to this project will be documented in this file. ### Changed - Added Kafka module ([\#546](https://github.com/testcontainers/testcontainers-java/pull/546)) +- Environment variables are now stored as Map instead of List ([\#550](https://github.com/testcontainers/testcontainers-java/pull/550)) +- Added `withEnv(String name, Function, String> mapper)` with optional previous value ([\#550](https://github.com/testcontainers/testcontainers-java/pull/550)) +- Added `withFileSystemBind` overloaded method with `READ_WRITE` file mode by default ([\#550](https://github.com/testcontainers/testcontainers-java/pull/550)) ## [1.5.1] - 2017-12-19 diff --git a/core/src/main/java/org/testcontainers/containers/Container.java b/core/src/main/java/org/testcontainers/containers/Container.java index ce0704a8534..3b877dfde0d 100644 --- a/core/src/main/java/org/testcontainers/containers/Container.java +++ b/core/src/main/java/org/testcontainers/containers/Container.java @@ -408,6 +408,10 @@ default Integer getFirstMappedPort() { */ SELF withLogConsumer(Consumer consumer); + /** + * + * @deprecated please use {@code org.testcontainers.DockerClientFactory.instance().client().infoCmd().exec()} + */ @Deprecated Info fetchDockerDaemonInfo() throws IOException; @@ -485,6 +489,10 @@ ExecResult execInContainer(Charset outputCharset, String... command) DockerClient getDockerClient(); + /** + * + * @deprecated please use {@code org.testcontainers.DockerClientFactory.instance().client().infoCmd().exec()} + */ @Deprecated Info getDockerDaemonInfo(); @@ -492,6 +500,10 @@ ExecResult execInContainer(Charset outputCharset, String... command) String getContainerName(); + /** + * + * @deprecated please use {@code org.testcontainers.DockerClientFactory.instance().client().inspectContainerCmd(container.getContainerId()).exec()} + */ @Deprecated InspectContainerResponse getContainerInfo(); diff --git a/core/src/main/java/org/testcontainers/containers/GenericContainer.java b/core/src/main/java/org/testcontainers/containers/GenericContainer.java index efaa1976f6a..932c00e4c9a 100644 --- a/core/src/main/java/org/testcontainers/containers/GenericContainer.java +++ b/core/src/main/java/org/testcontainers/containers/GenericContainer.java @@ -912,6 +912,9 @@ public SELF withLogConsumer(Consumer consumer) { return self(); } + /** + * {@inheritDoc} + */ @Override public synchronized Info fetchDockerDaemonInfo() throws IOException {