From c69bfb0592a1e1ef697cdaa15a9650e54940b9ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 29 Apr 2020 22:23:29 -0500 Subject: [PATCH 01/24] Add gcloud module Based on google cloud sdk docker image. This module provides: * DatastoreEmulatorContainer * FirestoreEmulatorContainer * PubSubEmulatorContainer `SpannerEmulatorContainer` is also provided but is based on its own docker image. See gh-2633 --- modules/gcloud/build.gradle | 11 +++ .../DatastoreEmulatorContainer.java | 29 +++++++ .../FirestoreEmulatorContainer.java | 31 +++++++ .../containers/GCloudGenericContainer.java | 56 +++++++++++++ .../containers/PubSubEmulatorContainer.java | 30 +++++++ .../containers/SpannerEmulatorContainer.java | 25 ++++++ .../DatastoreEmulatorContainerTest.java | 35 ++++++++ .../FirestoreEmulatorContainerTest.java | 48 +++++++++++ .../PubSubEmulatorContainerTest.java | 72 +++++++++++++++++ .../SpannerEmulatorContainerTest.java | 80 +++++++++++++++++++ 10 files changed, 417 insertions(+) create mode 100644 modules/gcloud/build.gradle create mode 100644 modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java create mode 100644 modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java create mode 100644 modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java create mode 100644 modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java create mode 100644 modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java create mode 100644 modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java create mode 100644 modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java create mode 100644 modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java create mode 100644 modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java diff --git a/modules/gcloud/build.gradle b/modules/gcloud/build.gradle new file mode 100644 index 00000000000..a5737648a4b --- /dev/null +++ b/modules/gcloud/build.gradle @@ -0,0 +1,11 @@ +description = "Testcontainers :: GCloud" + +dependencies { + compile project(':testcontainers') + + testCompile 'com.google.cloud:google-cloud-datastore:1.102.4' + testCompile 'com.google.cloud:google-cloud-firestore:1.33.0' + testCompile 'com.google.cloud:google-cloud-pubsub:1.105.0' + testCompile 'com.google.cloud:google-cloud-spanner:1.50.0' + testCompile 'org.assertj:assertj-core:3.15.0' +} diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java new file mode 100644 index 00000000000..6da212d1cc0 --- /dev/null +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java @@ -0,0 +1,29 @@ +package org.testcontainers.containers; + +import org.testcontainers.containers.wait.strategy.Wait; + +/** + * A Datastore container that relies in google cloud sdk. The container provides + * additional instructions to install the components needed in the alpine images. + * + * Default port is 8081. + * + * @author Eddú Meléndez + */ +public class DatastoreEmulatorContainer extends GCloudGenericContainer { + + private static final String DATASTORE_EMULATOR_START_COMMAND = "gcloud beta emulators datastore start --project dummy-project --host-port 0.0.0.0:8081"; + + private static final String[] CMDS = {"apk --update add openjdk8-jre", + "gcloud components install beta cloud-datastore-emulator --quiet"}; + + public DatastoreEmulatorContainer(String image) { + super(image, DATASTORE_EMULATOR_START_COMMAND, CMDS); + withExposedPorts(8081); + setWaitStrategy(Wait.forHttp("/").forStatusCode(200)); + } + + public DatastoreEmulatorContainer() { + this(DEFAULT_GCLOUD_IMAGE); + } +} diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java new file mode 100644 index 00000000000..03253dbd617 --- /dev/null +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java @@ -0,0 +1,31 @@ +package org.testcontainers.containers; + +import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; + +/** + * A Firestore container that relies in google cloud sdk. The container provides + * additional instructions to install the components needed in the alpine images. + * + * Default port is 8080. + * + * @author Eddú Meléndez + */ +public class FirestoreEmulatorContainer extends GCloudGenericContainer { + + private static final String FIRESTORE_EMULATOR_START_COMMAND = "gcloud beta emulators firestore start --host-port 0.0.0.0:8080"; + + private static final String[] CMDS = {"apk --update add openjdk8-jre", + "gcloud components install beta cloud-firestore-emulator --quiet"}; + + public FirestoreEmulatorContainer(String image) { + super(image, FIRESTORE_EMULATOR_START_COMMAND, CMDS); + withExposedPorts(8080); + setWaitStrategy(new LogMessageWaitStrategy() + .withRegEx("(?s).*running.*$")); + } + + public FirestoreEmulatorContainer() { + this(DEFAULT_GCLOUD_IMAGE); + } + +} diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java new file mode 100644 index 00000000000..904083dc1f0 --- /dev/null +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java @@ -0,0 +1,56 @@ +package org.testcontainers.containers; + +import java.util.Arrays; + +import com.github.dockerjava.api.command.InspectContainerResponse; +import org.testcontainers.images.builder.ImageFromDockerfile; +import org.testcontainers.images.builder.dockerfile.DockerfileBuilder; + +/** + * @author Eddú Meléndez + */ +public class GCloudGenericContainer> extends GenericContainer { + + public static final String DEFAULT_GCLOUD_IMAGE = "google/cloud-sdk:291.0.0-alpine"; + + public GCloudGenericContainer(String image) { + super(image); + } + + public GCloudGenericContainer(String image, String mainCmd, String[] prerequisiteCmds) { + super(buildImage(image, mainCmd, prerequisiteCmds)); + } + + @Override + protected void containerIsStarted(InspectContainerResponse containerInfo) { + // withAdditionalCmds(); + } + +// public void withAdditionalCmds() { +// try { +// if (cmds != null) { +// execInContainer(cmds); +// } +// } catch (IOException | InterruptedException e) { +// logger().error("Failed to execute {}. Exception message: {}", cmds, e.getMessage()); +// } +// } + + private static ImageFromDockerfile buildImage(String image, String mainCmd, String[] prerequisiteCmds) { + return new ImageFromDockerfile() + .withDockerfileFromBuilder(builder -> { + DockerfileBuilder from = builder + .from(image); + if (prerequisiteCmds != null) { + from.run(parseCmds(prerequisiteCmds)); + } + from.cmd(mainCmd); + from.build(); + }); + } + + private static String parseCmds(String... cmds) { + return String.join(" && \n", Arrays.asList(cmds)); + } + +} diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java new file mode 100644 index 00000000000..7cd73fe0329 --- /dev/null +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java @@ -0,0 +1,30 @@ +package org.testcontainers.containers; + +import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; + +/** + * A PubSub container that relies in google cloud sdk. The container provides + * additional instructions to install the components needed in the alpine images. + * + * Default port is 8085. + * + * @author Eddú Meléndez + */ +public class PubSubEmulatorContainer extends GCloudGenericContainer { + + private static final String PUBSUB_EMULATOR_START_COMMAND = "gcloud beta emulators pubsub start --host-port 0.0.0.0:8085"; + + private static final String[] CMDS = {"apk --update add openjdk7-jre", + "gcloud components install beta pubsub-emulator --quiet"}; + + public PubSubEmulatorContainer(String image) { + super(image, PUBSUB_EMULATOR_START_COMMAND, CMDS); + withExposedPorts(8085); + setWaitStrategy(new LogMessageWaitStrategy() + .withRegEx("(?s).*started.*$")); + } + + public PubSubEmulatorContainer() { + this(DEFAULT_GCLOUD_IMAGE); + } +} diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java new file mode 100644 index 00000000000..c8569f8b2a9 --- /dev/null +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java @@ -0,0 +1,25 @@ +package org.testcontainers.containers; + +import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; + +/** + * A Spanner container. Default ports: 9010 for GRPC and 9020 for HTTP. + * + * @author Eddú Meléndez + */ +public class SpannerEmulatorContainer extends GCloudGenericContainer { + + private static final int GRPC_PORT = 9010; + private static final int HTTP_PORT = 9020; + + public SpannerEmulatorContainer(String image) { + super(image); + withExposedPorts(GRPC_PORT, HTTP_PORT); + setWaitStrategy(new LogMessageWaitStrategy() + .withRegEx(".*Cloud Spanner emulator running\\..*")); + } + + public SpannerEmulatorContainer() { + this("gcr.io/cloud-spanner-emulator/emulator:0.7.28"); + } +} diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java new file mode 100644 index 00000000000..da7f725b6a4 --- /dev/null +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java @@ -0,0 +1,35 @@ +package org.testcontainers.containers; + +import com.google.cloud.NoCredentials; +import com.google.cloud.ServiceOptions; +import com.google.cloud.datastore.Datastore; +import com.google.cloud.datastore.DatastoreOptions; +import com.google.cloud.datastore.Entity; +import com.google.cloud.datastore.Key; +import org.junit.Rule; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DatastoreEmulatorContainerTest { + + @Rule + public DatastoreEmulatorContainer emulator = new DatastoreEmulatorContainer(); + + @Test + public void testSimple() { + DatastoreOptions options = DatastoreOptions.newBuilder() + .setHost(emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8081)) + .setCredentials(NoCredentials.getInstance()) + .setRetrySettings(ServiceOptions.getNoRetrySettings()) + .build(); + Datastore datastore = options.getService(); + + Key key = datastore.newKeyFactory().setKind("Task").newKey("sample"); + Entity entity = Entity.newBuilder(key).set("description", "my description").build(); + datastore.put(entity); + + assertThat(datastore.get(key).getString("description")).isEqualTo("my description"); + } + +} diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java new file mode 100644 index 00000000000..d6f2741c677 --- /dev/null +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java @@ -0,0 +1,48 @@ +package org.testcontainers.containers; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ExecutionException; + +import com.google.api.core.ApiFuture; +import com.google.cloud.NoCredentials; +import com.google.cloud.firestore.CollectionReference; +import com.google.cloud.firestore.DocumentReference; +import com.google.cloud.firestore.Firestore; +import com.google.cloud.firestore.FirestoreOptions; +import com.google.cloud.firestore.QuerySnapshot; +import com.google.cloud.firestore.WriteResult; +import org.junit.Rule; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class FirestoreEmulatorContainerTest { + + @Rule + public FirestoreEmulatorContainer emulator = new FirestoreEmulatorContainer(); + + @Test + public void testSimple() throws ExecutionException, InterruptedException { + FirestoreOptions options = FirestoreOptions.getDefaultInstance().toBuilder() + .setHost(emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8080)) + .setCredentials(NoCredentials.getInstance()) + .build(); + Firestore firestore = options.getService(); + + CollectionReference users = firestore.collection("users"); + DocumentReference docRef = users.document("alovelace"); + Map data = new HashMap<>(); + data.put("first", "Ada"); + data.put("last", "Lovelace"); + ApiFuture result = docRef.set(data); + + System.out.println(result.get().getUpdateTime()); + + ApiFuture query = users.get(); + QuerySnapshot querySnapshot = query.get(); + + assertThat(querySnapshot.getDocuments().get(0).getData()).containsEntry("first", "Ada"); + } + +} diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java new file mode 100644 index 00000000000..9804ee9f1a9 --- /dev/null +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java @@ -0,0 +1,72 @@ +package org.testcontainers.containers; + +import java.io.IOException; + +import com.google.api.core.ApiFuture; +import com.google.api.core.ApiFutureCallback; +import com.google.api.core.ApiFutures; +import com.google.api.gax.core.CredentialsProvider; +import com.google.api.gax.core.NoCredentialsProvider; +import com.google.api.gax.grpc.GrpcTransportChannel; +import com.google.api.gax.rpc.FixedTransportChannelProvider; +import com.google.api.gax.rpc.TransportChannelProvider; +import com.google.cloud.pubsub.v1.Publisher; +import com.google.cloud.pubsub.v1.TopicAdminClient; +import com.google.cloud.pubsub.v1.TopicAdminSettings; +import com.google.common.util.concurrent.MoreExecutors; +import com.google.protobuf.ByteString; +import com.google.pubsub.v1.PubsubMessage; +import com.google.pubsub.v1.Topic; +import io.grpc.ManagedChannel; +import io.grpc.ManagedChannelBuilder; +import org.junit.Rule; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class PubSubEmulatorContainerTest { + + @Rule + public PubSubEmulatorContainer emulator = new PubSubEmulatorContainer(); + + @Test + public void testSimple() throws IOException { + String hostport = emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8085); + ManagedChannel channel = ManagedChannelBuilder.forTarget(hostport).usePlaintext().build(); + try { + TransportChannelProvider channelProvider = + FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel)); + CredentialsProvider credentialsProvider = NoCredentialsProvider.create(); + + TopicAdminClient topicClient = + TopicAdminClient.create( + TopicAdminSettings.newBuilder() + .setTransportChannelProvider(channelProvider) + .setCredentialsProvider(credentialsProvider) + .build()); + Topic topic = Topic.newBuilder().setName("projects/my-project-id/topics/my-topic-id").build(); + topicClient.createTopic(topic); + + Publisher publisher = Publisher.newBuilder(topic.getName()).build(); + PubsubMessage message = PubsubMessage.newBuilder().setData(ByteString.copyFromUtf8("test message")).build(); + ApiFuture future = publisher.publish(message); + ApiFutures.addCallback(future, new ApiFutureCallback() { + @Override + public void onFailure(Throwable t) { + + } + + @Override + public void onSuccess(String result) { + assertThat(result).isNotNull(); + } + }, MoreExecutors.directExecutor()); + } finally { + channel.shutdown(); + } + + + assertThat(emulator.getMappedPort(8085)).isNotNull(); + } + +} diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java new file mode 100644 index 00000000000..b3819e37649 --- /dev/null +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java @@ -0,0 +1,80 @@ +package org.testcontainers.containers; + +import java.util.Arrays; +import java.util.concurrent.ExecutionException; + +import com.google.cloud.NoCredentials; +import com.google.cloud.spanner.Database; +import com.google.cloud.spanner.DatabaseAdminClient; +import com.google.cloud.spanner.DatabaseClient; +import com.google.cloud.spanner.DatabaseId; +import com.google.cloud.spanner.Instance; +import com.google.cloud.spanner.InstanceAdminClient; +import com.google.cloud.spanner.InstanceConfigId; +import com.google.cloud.spanner.InstanceId; +import com.google.cloud.spanner.InstanceInfo; +import com.google.cloud.spanner.ResultSet; +import com.google.cloud.spanner.Spanner; +import com.google.cloud.spanner.SpannerOptions; +import com.google.cloud.spanner.Statement; +import org.junit.Rule; +import org.junit.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +public class SpannerEmulatorContainerTest { + + @Rule + public SpannerEmulatorContainer emulator = new SpannerEmulatorContainer(); + + private static final String PROJECT_NAME = "test-project"; + private static final String INSTANCE_NAME = "test-instance"; + private static final String DATABASE_NAME = "test-database"; + + @Test + public void testSimple() throws ExecutionException, InterruptedException { + SpannerOptions options = SpannerOptions.newBuilder() + .setEmulatorHost(emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(9010)) + .setCredentials(NoCredentials.getInstance()) + .build(); + + Spanner spanner = options.getService(); + + InstanceId instanceId = createInstance(spanner); + + createDatabase(spanner); + + DatabaseId databaseId = DatabaseId.of(instanceId, DATABASE_NAME); + DatabaseClient dbClient = spanner.getDatabaseClient(databaseId); + dbClient.readWriteTransaction() + .run(tx -> { + String sql1 = "Delete from TestTable where 1=1"; + tx.executeUpdate(Statement.of(sql1)); + String sql = "INSERT INTO TestTable (Key, Value) VALUES (1, 'Java'), (2, 'Go')"; + tx.executeUpdate(Statement.of(sql)); + return null; + }); + + ResultSet resultSet = dbClient.readOnlyTransaction() + .executeQuery(Statement.of("select * from TestTable order by Key")); + resultSet.next(); + assertThat(resultSet.getLong(0)).isEqualTo(1); + assertThat(resultSet.getString(1)).isEqualTo("Java"); + } + + private void createDatabase(Spanner spanner) throws InterruptedException, ExecutionException { + DatabaseAdminClient dbAdminClient = spanner.getDatabaseAdminClient(); + Database database = dbAdminClient.createDatabase(INSTANCE_NAME, DATABASE_NAME, Arrays.asList("CREATE TABLE TestTable (Key INT64, Value STRING(MAX)) PRIMARY KEY (Key)")).get(); + System.out.println(">>>" + database.getState()); + } + + private InstanceId createInstance(Spanner spanner) throws InterruptedException, ExecutionException { + InstanceConfigId instanceConfig = InstanceConfigId.of(PROJECT_NAME, "emulator-config"); + InstanceId instanceId = InstanceId.of(PROJECT_NAME, INSTANCE_NAME); + InstanceAdminClient insAdminClient = spanner.getInstanceAdminClient(); + Instance instance = insAdminClient.createInstance(InstanceInfo.newBuilder(instanceId).setInstanceConfigId(instanceConfig).build()).get(); + System.out.println(">>>" + instance.getState()); + return instanceId; + } + +} From 67b0ddd03f63ce59fe8fc47d14f30830ac49616d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sat, 9 May 2020 02:03:17 -0500 Subject: [PATCH 02/24] Add docs --- docs/modules/gcloud.md | 51 ++++++++++++++++++++++++++++++++++++++++++ mkdocs.yml | 1 + 2 files changed, 52 insertions(+) create mode 100644 docs/modules/gcloud.md diff --git a/docs/modules/gcloud.md b/docs/modules/gcloud.md new file mode 100644 index 00000000000..3d0d9be9774 --- /dev/null +++ b/docs/modules/gcloud.md @@ -0,0 +1,51 @@ +# GCloud Module + +Testcontainers module for the Google's [Cloud SDK](https://cloud.google.com/sdk/). + +Currently, the module supports `datastore`, `firestore`, `pubsub` and `spanner` emulators. In order to use it, you should use the following classes: + +* DatastoreEmulatorContainer +* FirestoreEmulatorContainer +* PubSubEmulatorContainer +* SpannerEmulatorContainer + +## Usage example + +Running GCloud as a stand-in for Google Firestore during a test: + +```java +@Rule +public DatastoreEmulatorContainer emulator = new DatastoreEmulatorContainer(); + +@Test +public void someTestMethod() { + DatastoreOptions options = DatastoreOptions.newBuilder() + .setHost(emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8081)) + .setCredentials(NoCredentials.getInstance()) + .setRetrySettings(ServiceOptions.getNoRetrySettings()) + .build(); + Datastore datastore = options.getService(); + + Key key = datastore.newKeyFactory().setKind("Task").newKey("sample"); + Entity entity = Entity.newBuilder(key).set("description", "my description").build(); + datastore.put(entity); + + assertThat(datastore.get(key).getString("description")).isEqualTo("my description"); +``` + +## Adding this module to your project dependencies + +Add the following dependency to your `pom.xml`/`build.gradle` file: + +```groovy tab='Gradle' +testCompile "org.testcontainers:gcloud:{{latest_version}}" +``` + +```xml tab='Maven' + + org.testcontainers + gcloud + {{latest_version}} + test + +``` diff --git a/mkdocs.yml b/mkdocs.yml index b8372e81ed8..dfff99bb302 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -60,6 +60,7 @@ nav: - modules/databases/presto.md - modules/docker_compose.md - modules/elasticsearch.md + - modules/gcloud.md - modules/kafka.md - modules/localstack.md - modules/mockserver.md From b05704ae7c151953ff7b3404ca13911beea5d045 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sat, 9 May 2020 04:45:47 -0500 Subject: [PATCH 03/24] Add support to perform additional commands in the container --- .../containers/GCloudGenericContainer.java | 30 ++++++++++++------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java index 904083dc1f0..842e7a95554 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java @@ -1,6 +1,9 @@ package org.testcontainers.containers; +import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; +import java.util.List; import com.github.dockerjava.api.command.InspectContainerResponse; import org.testcontainers.images.builder.ImageFromDockerfile; @@ -13,6 +16,8 @@ public class GCloudGenericContainer> e public static final String DEFAULT_GCLOUD_IMAGE = "google/cloud-sdk:291.0.0-alpine"; + private List commands = new ArrayList<>(); + public GCloudGenericContainer(String image) { super(image); } @@ -23,18 +28,23 @@ public GCloudGenericContainer(String image, String mainCmd, String[] prerequisit @Override protected void containerIsStarted(InspectContainerResponse containerInfo) { - // withAdditionalCmds(); + runAdditionalCommands(); + } + + private void runAdditionalCommands() { + this.commands.forEach(cmd -> { + try { + execInContainer(cmd); + } catch (IOException | InterruptedException e) { + logger().error("Failed to execute {}. Exception message: {}", cmd, e.getMessage()); + } + }); } -// public void withAdditionalCmds() { -// try { -// if (cmds != null) { -// execInContainer(cmds); -// } -// } catch (IOException | InterruptedException e) { -// logger().error("Failed to execute {}. Exception message: {}", cmds, e.getMessage()); -// } -// } + public SELF withAdditionalCommands(String... cmds) { + this.commands.addAll(Arrays.asList(cmds)); + return self(); + } private static ImageFromDockerfile buildImage(String image, String mainCmd, String[] prerequisiteCmds) { return new ImageFromDockerfile() From 927cc6d7b12eb4e10ac9cf238bc3e98ee1d7f350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 13 May 2020 22:08:33 -0500 Subject: [PATCH 04/24] Build images using CMD --- .../DatastoreEmulatorContainer.java | 14 +++++++---- .../FirestoreEmulatorContainer.java | 18 +++++++++++---- .../containers/GCloudGenericContainer.java | 23 ------------------- .../containers/PubSubEmulatorContainer.java | 18 +++++++++++---- 4 files changed, 36 insertions(+), 37 deletions(-) diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java index 6da212d1cc0..9479da64f46 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java @@ -1,5 +1,7 @@ package org.testcontainers.containers; +import java.util.Arrays; + import org.testcontainers.containers.wait.strategy.Wait; /** @@ -12,15 +14,19 @@ */ public class DatastoreEmulatorContainer extends GCloudGenericContainer { - private static final String DATASTORE_EMULATOR_START_COMMAND = "gcloud beta emulators datastore start --project dummy-project --host-port 0.0.0.0:8081"; - private static final String[] CMDS = {"apk --update add openjdk8-jre", - "gcloud components install beta cloud-datastore-emulator --quiet"}; + "gcloud components install beta cloud-datastore-emulator --quiet", + "gcloud beta emulators datastore start --project dummy-project --host-port 0.0.0.0:8081"}; public DatastoreEmulatorContainer(String image) { - super(image, DATASTORE_EMULATOR_START_COMMAND, CMDS); + super(image); withExposedPorts(8081); setWaitStrategy(Wait.forHttp("/").forStatusCode(200)); + withCommand("/bin/sh", "-c", parseCmds(CMDS)); + } + + private static String parseCmds(String... cmds) { + return String.join(" && ", Arrays.asList(cmds)); } public DatastoreEmulatorContainer() { diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java index 03253dbd617..db4a750ece3 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java @@ -1,5 +1,8 @@ package org.testcontainers.containers; +import java.time.Duration; +import java.util.Arrays; + import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; /** @@ -12,16 +15,21 @@ */ public class FirestoreEmulatorContainer extends GCloudGenericContainer { - private static final String FIRESTORE_EMULATOR_START_COMMAND = "gcloud beta emulators firestore start --host-port 0.0.0.0:8080"; - private static final String[] CMDS = {"apk --update add openjdk8-jre", - "gcloud components install beta cloud-firestore-emulator --quiet"}; + "gcloud components install beta cloud-firestore-emulator --quiet", + "gcloud beta emulators firestore start --host-port 0.0.0.0:8080"}; public FirestoreEmulatorContainer(String image) { - super(image, FIRESTORE_EMULATOR_START_COMMAND, CMDS); + super(image); withExposedPorts(8080); setWaitStrategy(new LogMessageWaitStrategy() - .withRegEx("(?s).*running.*$")); + .withRegEx("(?s).*running.*$") + .withStartupTimeout(Duration.ofSeconds(120))); + withCommand("/bin/sh", "-c", parseCmds(CMDS)); + } + + private static String parseCmds(String... cmds) { + return String.join(" && ", Arrays.asList(cmds)); } public FirestoreEmulatorContainer() { diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java index 842e7a95554..67f213ea226 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java @@ -6,8 +6,6 @@ import java.util.List; import com.github.dockerjava.api.command.InspectContainerResponse; -import org.testcontainers.images.builder.ImageFromDockerfile; -import org.testcontainers.images.builder.dockerfile.DockerfileBuilder; /** * @author Eddú Meléndez @@ -22,10 +20,6 @@ public GCloudGenericContainer(String image) { super(image); } - public GCloudGenericContainer(String image, String mainCmd, String[] prerequisiteCmds) { - super(buildImage(image, mainCmd, prerequisiteCmds)); - } - @Override protected void containerIsStarted(InspectContainerResponse containerInfo) { runAdditionalCommands(); @@ -46,21 +40,4 @@ public SELF withAdditionalCommands(String... cmds) { return self(); } - private static ImageFromDockerfile buildImage(String image, String mainCmd, String[] prerequisiteCmds) { - return new ImageFromDockerfile() - .withDockerfileFromBuilder(builder -> { - DockerfileBuilder from = builder - .from(image); - if (prerequisiteCmds != null) { - from.run(parseCmds(prerequisiteCmds)); - } - from.cmd(mainCmd); - from.build(); - }); - } - - private static String parseCmds(String... cmds) { - return String.join(" && \n", Arrays.asList(cmds)); - } - } diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java index 7cd73fe0329..54619ebc42b 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java @@ -1,5 +1,8 @@ package org.testcontainers.containers; +import java.time.Duration; +import java.util.Arrays; + import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; /** @@ -12,16 +15,21 @@ */ public class PubSubEmulatorContainer extends GCloudGenericContainer { - private static final String PUBSUB_EMULATOR_START_COMMAND = "gcloud beta emulators pubsub start --host-port 0.0.0.0:8085"; - private static final String[] CMDS = {"apk --update add openjdk7-jre", - "gcloud components install beta pubsub-emulator --quiet"}; + "gcloud components install beta pubsub-emulator --quiet", + "gcloud beta emulators pubsub start --host-port 0.0.0.0:8085"}; public PubSubEmulatorContainer(String image) { - super(image, PUBSUB_EMULATOR_START_COMMAND, CMDS); + super(image); withExposedPorts(8085); setWaitStrategy(new LogMessageWaitStrategy() - .withRegEx("(?s).*started.*$")); + .withRegEx("(?s).*started.*$") + .withStartupTimeout(Duration.ofSeconds(120))); + withCommand("/bin/sh", "-c", parseCmds(CMDS)); + } + + private static String parseCmds(String... cmds) { + return String.join(" && ", Arrays.asList(cmds)); } public PubSubEmulatorContainer() { From 3eae24fff1f3726ef0086452f03eedcb6922dac0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sun, 24 May 2020 23:41:21 -0500 Subject: [PATCH 05/24] Remove port assertion --- .../testcontainers/containers/PubSubEmulatorContainerTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java index 9804ee9f1a9..4d052830b8f 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java @@ -64,9 +64,6 @@ public void onSuccess(String result) { } finally { channel.shutdown(); } - - - assertThat(emulator.getMappedPort(8085)).isNotNull(); } } From cdc415eeef8a229fc5c006c1db5497c982128d64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sun, 24 May 2020 23:41:38 -0500 Subject: [PATCH 06/24] Add incubating module note --- docs/modules/gcloud.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/modules/gcloud.md b/docs/modules/gcloud.md index 3d0d9be9774..a68ea9dced5 100644 --- a/docs/modules/gcloud.md +++ b/docs/modules/gcloud.md @@ -1,5 +1,8 @@ # GCloud Module +!!! note + This module is INCUBATING. While it is ready for use and operational in the current version of Testcontainers, it is possible that it may receive breaking changes in the future. See [our contributing guidelines](/contributing/#incubating-modules) for more information on our incubating modules policy. + Testcontainers module for the Google's [Cloud SDK](https://cloud.google.com/sdk/). Currently, the module supports `datastore`, `firestore`, `pubsub` and `spanner` emulators. In order to use it, you should use the following classes: From ae437762da096cb0f89fc82ae3df5ff351436209 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sun, 24 May 2020 23:47:26 -0500 Subject: [PATCH 07/24] Use codeinclude macro --- docs/modules/gcloud.md | 28 ++++++------------- .../DatastoreEmulatorContainerTest.java | 4 +++ 2 files changed, 13 insertions(+), 19 deletions(-) diff --git a/docs/modules/gcloud.md b/docs/modules/gcloud.md index a68ea9dced5..476f6b5714a 100644 --- a/docs/modules/gcloud.md +++ b/docs/modules/gcloud.md @@ -16,25 +16,15 @@ Currently, the module supports `datastore`, `firestore`, `pubsub` and `spanner` Running GCloud as a stand-in for Google Firestore during a test: -```java -@Rule -public DatastoreEmulatorContainer emulator = new DatastoreEmulatorContainer(); - -@Test -public void someTestMethod() { - DatastoreOptions options = DatastoreOptions.newBuilder() - .setHost(emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8081)) - .setCredentials(NoCredentials.getInstance()) - .setRetrySettings(ServiceOptions.getNoRetrySettings()) - .build(); - Datastore datastore = options.getService(); - - Key key = datastore.newKeyFactory().setKind("Task").newKey("sample"); - Entity entity = Entity.newBuilder(key).set("description", "my description").build(); - datastore.put(entity); - - assertThat(datastore.get(key).getString("description")).isEqualTo("my description"); -``` + +[Creating a Datastore container](../../../modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java) inside_block:creatingDatastoreEmulatorContainer + + +And how to start it: + + +[Starting a Datastore container](../../../modules/mongodb/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java) inside_block:startingDatastoreEmulatorContainer + ## Adding this module to your project dependencies diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java index da7f725b6a4..c5f4869d861 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java @@ -14,8 +14,11 @@ public class DatastoreEmulatorContainerTest { @Rule + // creatingDatastoreEmulatorContainer { public DatastoreEmulatorContainer emulator = new DatastoreEmulatorContainer(); + // } + // startingDatastoreEmulatorContainer { @Test public void testSimple() { DatastoreOptions options = DatastoreOptions.newBuilder() @@ -31,5 +34,6 @@ public void testSimple() { assertThat(datastore.get(key).getString("description")).isEqualTo("my description"); } + // } } From 1ff7c3d290b42a0757409c60943ae1e648609c4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 25 May 2020 00:11:23 -0500 Subject: [PATCH 08/24] spaces instead of tabs --- .../DatastoreEmulatorContainer.java | 30 +++---- .../FirestoreEmulatorContainer.java | 40 ++++----- .../containers/GCloudGenericContainer.java | 54 ++++++------ .../containers/PubSubEmulatorContainer.java | 34 ++++---- .../containers/SpannerEmulatorContainer.java | 22 ++--- .../DatastoreEmulatorContainerTest.java | 44 +++++----- .../FirestoreEmulatorContainerTest.java | 50 +++++------ .../PubSubEmulatorContainerTest.java | 68 +++++++-------- .../SpannerEmulatorContainerTest.java | 86 +++++++++---------- 9 files changed, 214 insertions(+), 214 deletions(-) diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java index 9479da64f46..7d0253639b1 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java @@ -14,22 +14,22 @@ */ public class DatastoreEmulatorContainer extends GCloudGenericContainer { - private static final String[] CMDS = {"apk --update add openjdk8-jre", - "gcloud components install beta cloud-datastore-emulator --quiet", - "gcloud beta emulators datastore start --project dummy-project --host-port 0.0.0.0:8081"}; + private static final String[] CMDS = {"apk --update add openjdk8-jre", + "gcloud components install beta cloud-datastore-emulator --quiet", + "gcloud beta emulators datastore start --project dummy-project --host-port 0.0.0.0:8081"}; - public DatastoreEmulatorContainer(String image) { - super(image); - withExposedPorts(8081); - setWaitStrategy(Wait.forHttp("/").forStatusCode(200)); - withCommand("/bin/sh", "-c", parseCmds(CMDS)); - } + public DatastoreEmulatorContainer(String image) { + super(image); + withExposedPorts(8081); + setWaitStrategy(Wait.forHttp("/").forStatusCode(200)); + withCommand("/bin/sh", "-c", parseCmds(CMDS)); + } - private static String parseCmds(String... cmds) { - return String.join(" && ", Arrays.asList(cmds)); - } + private static String parseCmds(String... cmds) { + return String.join(" && ", Arrays.asList(cmds)); + } - public DatastoreEmulatorContainer() { - this(DEFAULT_GCLOUD_IMAGE); - } + public DatastoreEmulatorContainer() { + this(DEFAULT_GCLOUD_IMAGE); + } } diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java index db4a750ece3..e285cca6544 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java @@ -15,25 +15,25 @@ */ public class FirestoreEmulatorContainer extends GCloudGenericContainer { - private static final String[] CMDS = {"apk --update add openjdk8-jre", - "gcloud components install beta cloud-firestore-emulator --quiet", - "gcloud beta emulators firestore start --host-port 0.0.0.0:8080"}; - - public FirestoreEmulatorContainer(String image) { - super(image); - withExposedPorts(8080); - setWaitStrategy(new LogMessageWaitStrategy() - .withRegEx("(?s).*running.*$") - .withStartupTimeout(Duration.ofSeconds(120))); - withCommand("/bin/sh", "-c", parseCmds(CMDS)); - } - - private static String parseCmds(String... cmds) { - return String.join(" && ", Arrays.asList(cmds)); - } - - public FirestoreEmulatorContainer() { - this(DEFAULT_GCLOUD_IMAGE); - } + private static final String[] CMDS = {"apk --update add openjdk8-jre", + "gcloud components install beta cloud-firestore-emulator --quiet", + "gcloud beta emulators firestore start --host-port 0.0.0.0:8080"}; + + public FirestoreEmulatorContainer(String image) { + super(image); + withExposedPorts(8080); + setWaitStrategy(new LogMessageWaitStrategy() + .withRegEx("(?s).*running.*$") + .withStartupTimeout(Duration.ofSeconds(120))); + withCommand("/bin/sh", "-c", parseCmds(CMDS)); + } + + private static String parseCmds(String... cmds) { + return String.join(" && ", Arrays.asList(cmds)); + } + + public FirestoreEmulatorContainer() { + this(DEFAULT_GCLOUD_IMAGE); + } } diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java index 67f213ea226..6bd0f567392 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java @@ -12,32 +12,32 @@ */ public class GCloudGenericContainer> extends GenericContainer { - public static final String DEFAULT_GCLOUD_IMAGE = "google/cloud-sdk:291.0.0-alpine"; - - private List commands = new ArrayList<>(); - - public GCloudGenericContainer(String image) { - super(image); - } - - @Override - protected void containerIsStarted(InspectContainerResponse containerInfo) { - runAdditionalCommands(); - } - - private void runAdditionalCommands() { - this.commands.forEach(cmd -> { - try { - execInContainer(cmd); - } catch (IOException | InterruptedException e) { - logger().error("Failed to execute {}. Exception message: {}", cmd, e.getMessage()); - } - }); - } - - public SELF withAdditionalCommands(String... cmds) { - this.commands.addAll(Arrays.asList(cmds)); - return self(); - } + public static final String DEFAULT_GCLOUD_IMAGE = "google/cloud-sdk:291.0.0-alpine"; + + private List commands = new ArrayList<>(); + + public GCloudGenericContainer(String image) { + super(image); + } + + @Override + protected void containerIsStarted(InspectContainerResponse containerInfo) { + runAdditionalCommands(); + } + + private void runAdditionalCommands() { + this.commands.forEach(cmd -> { + try { + execInContainer(cmd); + } catch (IOException | InterruptedException e) { + logger().error("Failed to execute {}. Exception message: {}", cmd, e.getMessage()); + } + }); + } + + public SELF withAdditionalCommands(String... cmds) { + this.commands.addAll(Arrays.asList(cmds)); + return self(); + } } diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java index 54619ebc42b..aa4e7f18b49 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java @@ -15,24 +15,24 @@ */ public class PubSubEmulatorContainer extends GCloudGenericContainer { - private static final String[] CMDS = {"apk --update add openjdk7-jre", - "gcloud components install beta pubsub-emulator --quiet", - "gcloud beta emulators pubsub start --host-port 0.0.0.0:8085"}; + private static final String[] CMDS = {"apk --update add openjdk7-jre", + "gcloud components install beta pubsub-emulator --quiet", + "gcloud beta emulators pubsub start --host-port 0.0.0.0:8085"}; - public PubSubEmulatorContainer(String image) { - super(image); - withExposedPorts(8085); - setWaitStrategy(new LogMessageWaitStrategy() - .withRegEx("(?s).*started.*$") - .withStartupTimeout(Duration.ofSeconds(120))); - withCommand("/bin/sh", "-c", parseCmds(CMDS)); - } + public PubSubEmulatorContainer(String image) { + super(image); + withExposedPorts(8085); + setWaitStrategy(new LogMessageWaitStrategy() + .withRegEx("(?s).*started.*$") + .withStartupTimeout(Duration.ofSeconds(120))); + withCommand("/bin/sh", "-c", parseCmds(CMDS)); + } - private static String parseCmds(String... cmds) { - return String.join(" && ", Arrays.asList(cmds)); - } + private static String parseCmds(String... cmds) { + return String.join(" && ", Arrays.asList(cmds)); + } - public PubSubEmulatorContainer() { - this(DEFAULT_GCLOUD_IMAGE); - } + public PubSubEmulatorContainer() { + this(DEFAULT_GCLOUD_IMAGE); + } } diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java index c8569f8b2a9..94029fd44a2 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java @@ -9,17 +9,17 @@ */ public class SpannerEmulatorContainer extends GCloudGenericContainer { - private static final int GRPC_PORT = 9010; - private static final int HTTP_PORT = 9020; + private static final int GRPC_PORT = 9010; + private static final int HTTP_PORT = 9020; - public SpannerEmulatorContainer(String image) { - super(image); - withExposedPorts(GRPC_PORT, HTTP_PORT); - setWaitStrategy(new LogMessageWaitStrategy() - .withRegEx(".*Cloud Spanner emulator running\\..*")); - } + public SpannerEmulatorContainer(String image) { + super(image); + withExposedPorts(GRPC_PORT, HTTP_PORT); + setWaitStrategy(new LogMessageWaitStrategy() + .withRegEx(".*Cloud Spanner emulator running\\..*")); + } - public SpannerEmulatorContainer() { - this("gcr.io/cloud-spanner-emulator/emulator:0.7.28"); - } + public SpannerEmulatorContainer() { + this("gcr.io/cloud-spanner-emulator/emulator:0.7.28"); + } } diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java index c5f4869d861..1886eb12a02 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java @@ -13,27 +13,27 @@ public class DatastoreEmulatorContainerTest { - @Rule - // creatingDatastoreEmulatorContainer { - public DatastoreEmulatorContainer emulator = new DatastoreEmulatorContainer(); - // } - - // startingDatastoreEmulatorContainer { - @Test - public void testSimple() { - DatastoreOptions options = DatastoreOptions.newBuilder() - .setHost(emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8081)) - .setCredentials(NoCredentials.getInstance()) - .setRetrySettings(ServiceOptions.getNoRetrySettings()) - .build(); - Datastore datastore = options.getService(); - - Key key = datastore.newKeyFactory().setKind("Task").newKey("sample"); - Entity entity = Entity.newBuilder(key).set("description", "my description").build(); - datastore.put(entity); - - assertThat(datastore.get(key).getString("description")).isEqualTo("my description"); - } - // } + @Rule + // creatingDatastoreEmulatorContainer { + public DatastoreEmulatorContainer emulator = new DatastoreEmulatorContainer(); + // } + + // startingDatastoreEmulatorContainer { + @Test + public void testSimple() { + DatastoreOptions options = DatastoreOptions.newBuilder() + .setHost(emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8081)) + .setCredentials(NoCredentials.getInstance()) + .setRetrySettings(ServiceOptions.getNoRetrySettings()) + .build(); + Datastore datastore = options.getService(); + + Key key = datastore.newKeyFactory().setKind("Task").newKey("sample"); + Entity entity = Entity.newBuilder(key).set("description", "my description").build(); + datastore.put(entity); + + assertThat(datastore.get(key).getString("description")).isEqualTo("my description"); + } + // } } diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java index d6f2741c677..f3fbe04fe96 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java @@ -19,30 +19,30 @@ public class FirestoreEmulatorContainerTest { - @Rule - public FirestoreEmulatorContainer emulator = new FirestoreEmulatorContainer(); - - @Test - public void testSimple() throws ExecutionException, InterruptedException { - FirestoreOptions options = FirestoreOptions.getDefaultInstance().toBuilder() - .setHost(emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8080)) - .setCredentials(NoCredentials.getInstance()) - .build(); - Firestore firestore = options.getService(); - - CollectionReference users = firestore.collection("users"); - DocumentReference docRef = users.document("alovelace"); - Map data = new HashMap<>(); - data.put("first", "Ada"); - data.put("last", "Lovelace"); - ApiFuture result = docRef.set(data); - - System.out.println(result.get().getUpdateTime()); - - ApiFuture query = users.get(); - QuerySnapshot querySnapshot = query.get(); - - assertThat(querySnapshot.getDocuments().get(0).getData()).containsEntry("first", "Ada"); - } + @Rule + public FirestoreEmulatorContainer emulator = new FirestoreEmulatorContainer(); + + @Test + public void testSimple() throws ExecutionException, InterruptedException { + FirestoreOptions options = FirestoreOptions.getDefaultInstance().toBuilder() + .setHost(emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8080)) + .setCredentials(NoCredentials.getInstance()) + .build(); + Firestore firestore = options.getService(); + + CollectionReference users = firestore.collection("users"); + DocumentReference docRef = users.document("alovelace"); + Map data = new HashMap<>(); + data.put("first", "Ada"); + data.put("last", "Lovelace"); + ApiFuture result = docRef.set(data); + + System.out.println(result.get().getUpdateTime()); + + ApiFuture query = users.get(); + QuerySnapshot querySnapshot = query.get(); + + assertThat(querySnapshot.getDocuments().get(0).getData()).containsEntry("first", "Ada"); + } } diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java index 4d052830b8f..cf96b5b3364 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java @@ -26,44 +26,44 @@ public class PubSubEmulatorContainerTest { - @Rule - public PubSubEmulatorContainer emulator = new PubSubEmulatorContainer(); + @Rule + public PubSubEmulatorContainer emulator = new PubSubEmulatorContainer(); - @Test - public void testSimple() throws IOException { - String hostport = emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8085); - ManagedChannel channel = ManagedChannelBuilder.forTarget(hostport).usePlaintext().build(); - try { - TransportChannelProvider channelProvider = - FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel)); - CredentialsProvider credentialsProvider = NoCredentialsProvider.create(); + @Test + public void testSimple() throws IOException { + String hostport = emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8085); + ManagedChannel channel = ManagedChannelBuilder.forTarget(hostport).usePlaintext().build(); + try { + TransportChannelProvider channelProvider = + FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel)); + CredentialsProvider credentialsProvider = NoCredentialsProvider.create(); - TopicAdminClient topicClient = - TopicAdminClient.create( - TopicAdminSettings.newBuilder() - .setTransportChannelProvider(channelProvider) - .setCredentialsProvider(credentialsProvider) - .build()); - Topic topic = Topic.newBuilder().setName("projects/my-project-id/topics/my-topic-id").build(); - topicClient.createTopic(topic); + TopicAdminClient topicClient = + TopicAdminClient.create( + TopicAdminSettings.newBuilder() + .setTransportChannelProvider(channelProvider) + .setCredentialsProvider(credentialsProvider) + .build()); + Topic topic = Topic.newBuilder().setName("projects/my-project-id/topics/my-topic-id").build(); + topicClient.createTopic(topic); - Publisher publisher = Publisher.newBuilder(topic.getName()).build(); - PubsubMessage message = PubsubMessage.newBuilder().setData(ByteString.copyFromUtf8("test message")).build(); - ApiFuture future = publisher.publish(message); - ApiFutures.addCallback(future, new ApiFutureCallback() { - @Override - public void onFailure(Throwable t) { + Publisher publisher = Publisher.newBuilder(topic.getName()).build(); + PubsubMessage message = PubsubMessage.newBuilder().setData(ByteString.copyFromUtf8("test message")).build(); + ApiFuture future = publisher.publish(message); + ApiFutures.addCallback(future, new ApiFutureCallback() { + @Override + public void onFailure(Throwable t) { - } + } - @Override - public void onSuccess(String result) { - assertThat(result).isNotNull(); - } - }, MoreExecutors.directExecutor()); - } finally { - channel.shutdown(); - } - } + @Override + public void onSuccess(String result) { + assertThat(result).isNotNull(); + } + }, MoreExecutors.directExecutor()); + } finally { + channel.shutdown(); + } + } } diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java index b3819e37649..27ce656e40b 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java @@ -24,57 +24,57 @@ public class SpannerEmulatorContainerTest { - @Rule - public SpannerEmulatorContainer emulator = new SpannerEmulatorContainer(); + @Rule + public SpannerEmulatorContainer emulator = new SpannerEmulatorContainer(); - private static final String PROJECT_NAME = "test-project"; - private static final String INSTANCE_NAME = "test-instance"; - private static final String DATABASE_NAME = "test-database"; + private static final String PROJECT_NAME = "test-project"; + private static final String INSTANCE_NAME = "test-instance"; + private static final String DATABASE_NAME = "test-database"; - @Test - public void testSimple() throws ExecutionException, InterruptedException { - SpannerOptions options = SpannerOptions.newBuilder() - .setEmulatorHost(emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(9010)) - .setCredentials(NoCredentials.getInstance()) - .build(); + @Test + public void testSimple() throws ExecutionException, InterruptedException { + SpannerOptions options = SpannerOptions.newBuilder() + .setEmulatorHost(emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(9010)) + .setCredentials(NoCredentials.getInstance()) + .build(); - Spanner spanner = options.getService(); + Spanner spanner = options.getService(); - InstanceId instanceId = createInstance(spanner); + InstanceId instanceId = createInstance(spanner); - createDatabase(spanner); + createDatabase(spanner); - DatabaseId databaseId = DatabaseId.of(instanceId, DATABASE_NAME); - DatabaseClient dbClient = spanner.getDatabaseClient(databaseId); - dbClient.readWriteTransaction() - .run(tx -> { - String sql1 = "Delete from TestTable where 1=1"; - tx.executeUpdate(Statement.of(sql1)); - String sql = "INSERT INTO TestTable (Key, Value) VALUES (1, 'Java'), (2, 'Go')"; - tx.executeUpdate(Statement.of(sql)); - return null; - }); + DatabaseId databaseId = DatabaseId.of(instanceId, DATABASE_NAME); + DatabaseClient dbClient = spanner.getDatabaseClient(databaseId); + dbClient.readWriteTransaction() + .run(tx -> { + String sql1 = "Delete from TestTable where 1=1"; + tx.executeUpdate(Statement.of(sql1)); + String sql = "INSERT INTO TestTable (Key, Value) VALUES (1, 'Java'), (2, 'Go')"; + tx.executeUpdate(Statement.of(sql)); + return null; + }); - ResultSet resultSet = dbClient.readOnlyTransaction() - .executeQuery(Statement.of("select * from TestTable order by Key")); - resultSet.next(); - assertThat(resultSet.getLong(0)).isEqualTo(1); - assertThat(resultSet.getString(1)).isEqualTo("Java"); - } + ResultSet resultSet = dbClient.readOnlyTransaction() + .executeQuery(Statement.of("select * from TestTable order by Key")); + resultSet.next(); + assertThat(resultSet.getLong(0)).isEqualTo(1); + assertThat(resultSet.getString(1)).isEqualTo("Java"); + } - private void createDatabase(Spanner spanner) throws InterruptedException, ExecutionException { - DatabaseAdminClient dbAdminClient = spanner.getDatabaseAdminClient(); - Database database = dbAdminClient.createDatabase(INSTANCE_NAME, DATABASE_NAME, Arrays.asList("CREATE TABLE TestTable (Key INT64, Value STRING(MAX)) PRIMARY KEY (Key)")).get(); - System.out.println(">>>" + database.getState()); - } + private void createDatabase(Spanner spanner) throws InterruptedException, ExecutionException { + DatabaseAdminClient dbAdminClient = spanner.getDatabaseAdminClient(); + Database database = dbAdminClient.createDatabase(INSTANCE_NAME, DATABASE_NAME, Arrays.asList("CREATE TABLE TestTable (Key INT64, Value STRING(MAX)) PRIMARY KEY (Key)")).get(); + System.out.println(">>>" + database.getState()); + } - private InstanceId createInstance(Spanner spanner) throws InterruptedException, ExecutionException { - InstanceConfigId instanceConfig = InstanceConfigId.of(PROJECT_NAME, "emulator-config"); - InstanceId instanceId = InstanceId.of(PROJECT_NAME, INSTANCE_NAME); - InstanceAdminClient insAdminClient = spanner.getInstanceAdminClient(); - Instance instance = insAdminClient.createInstance(InstanceInfo.newBuilder(instanceId).setInstanceConfigId(instanceConfig).build()).get(); - System.out.println(">>>" + instance.getState()); - return instanceId; - } + private InstanceId createInstance(Spanner spanner) throws InterruptedException, ExecutionException { + InstanceConfigId instanceConfig = InstanceConfigId.of(PROJECT_NAME, "emulator-config"); + InstanceId instanceId = InstanceId.of(PROJECT_NAME, INSTANCE_NAME); + InstanceAdminClient insAdminClient = spanner.getInstanceAdminClient(); + Instance instance = insAdminClient.createInstance(InstanceInfo.newBuilder(instanceId).setInstanceConfigId(instanceConfig).build()).get(); + System.out.println(">>>" + instance.getState()); + return instanceId; + } } From fe7a55ee6f718380ca72850be35de49c29264567 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sat, 15 Aug 2020 23:13:11 -0500 Subject: [PATCH 09/24] Polish tests --- .../containers/PubSubEmulatorContainerTest.java | 17 ++++++++++------- .../SpannerEmulatorContainerTest.java | 4 ++-- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java index cf96b5b3364..2a398a20e6c 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java @@ -1,11 +1,11 @@ package org.testcontainers.containers; import java.io.IOException; +import java.util.concurrent.ExecutionException; import com.google.api.core.ApiFuture; import com.google.api.core.ApiFutureCallback; import com.google.api.core.ApiFutures; -import com.google.api.gax.core.CredentialsProvider; import com.google.api.gax.core.NoCredentialsProvider; import com.google.api.gax.grpc.GrpcTransportChannel; import com.google.api.gax.rpc.FixedTransportChannelProvider; @@ -30,24 +30,26 @@ public class PubSubEmulatorContainerTest { public PubSubEmulatorContainer emulator = new PubSubEmulatorContainer(); @Test - public void testSimple() throws IOException { + public void testSimple() throws IOException, ExecutionException, InterruptedException { String hostport = emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8085); ManagedChannel channel = ManagedChannelBuilder.forTarget(hostport).usePlaintext().build(); try { TransportChannelProvider channelProvider = FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel)); - CredentialsProvider credentialsProvider = NoCredentialsProvider.create(); + NoCredentialsProvider credentialsProvider = NoCredentialsProvider.create(); - TopicAdminClient topicClient = + TopicAdminClient topicAdminClient = TopicAdminClient.create( TopicAdminSettings.newBuilder() .setTransportChannelProvider(channelProvider) .setCredentialsProvider(credentialsProvider) .build()); - Topic topic = Topic.newBuilder().setName("projects/my-project-id/topics/my-topic-id").build(); - topicClient.createTopic(topic); + Topic topic = topicAdminClient.createTopic("projects/my-project-id/topics/my-topic-id"); - Publisher publisher = Publisher.newBuilder(topic.getName()).build(); + Publisher publisher = Publisher.newBuilder(topic.getName()) + .setChannelProvider(channelProvider) + .setCredentialsProvider(credentialsProvider) + .build(); PubsubMessage message = PubsubMessage.newBuilder().setData(ByteString.copyFromUtf8("test message")).build(); ApiFuture future = publisher.publish(message); ApiFutures.addCallback(future, new ApiFutureCallback() { @@ -61,6 +63,7 @@ public void onSuccess(String result) { assertThat(result).isNotNull(); } }, MoreExecutors.directExecutor()); + future.get(); } finally { channel.shutdown(); } diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java index 27ce656e40b..75215bcd8cc 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java @@ -36,6 +36,7 @@ public void testSimple() throws ExecutionException, InterruptedException { SpannerOptions options = SpannerOptions.newBuilder() .setEmulatorHost(emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(9010)) .setCredentials(NoCredentials.getInstance()) + .setProjectId(PROJECT_NAME) .build(); Spanner spanner = options.getService(); @@ -72,8 +73,7 @@ private InstanceId createInstance(Spanner spanner) throws InterruptedException, InstanceConfigId instanceConfig = InstanceConfigId.of(PROJECT_NAME, "emulator-config"); InstanceId instanceId = InstanceId.of(PROJECT_NAME, INSTANCE_NAME); InstanceAdminClient insAdminClient = spanner.getInstanceAdminClient(); - Instance instance = insAdminClient.createInstance(InstanceInfo.newBuilder(instanceId).setInstanceConfigId(instanceConfig).build()).get(); - System.out.println(">>>" + instance.getState()); + Instance instance = insAdminClient.createInstance(InstanceInfo.newBuilder(instanceId).setNodeCount(1).setDisplayName("Test instance").setInstanceConfigId(instanceConfig).build()).get(); return instanceId; } From 1542b170b332ee97a752c49619b363fd5655e122 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sat, 15 Aug 2020 23:13:47 -0500 Subject: [PATCH 10/24] Update base image and polish commands --- .../testcontainers/containers/DatastoreEmulatorContainer.java | 4 +--- .../testcontainers/containers/FirestoreEmulatorContainer.java | 4 +--- .../org/testcontainers/containers/GCloudGenericContainer.java | 2 +- .../testcontainers/containers/PubSubEmulatorContainer.java | 4 +--- .../testcontainers/containers/SpannerEmulatorContainer.java | 2 +- 5 files changed, 5 insertions(+), 11 deletions(-) diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java index 7d0253639b1..a08c18c0d96 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java @@ -14,9 +14,7 @@ */ public class DatastoreEmulatorContainer extends GCloudGenericContainer { - private static final String[] CMDS = {"apk --update add openjdk8-jre", - "gcloud components install beta cloud-datastore-emulator --quiet", - "gcloud beta emulators datastore start --project dummy-project --host-port 0.0.0.0:8081"}; + private static final String CMDS = "gcloud beta emulators datastore start --project dummy-project --host-port 0.0.0.0:8081"; public DatastoreEmulatorContainer(String image) { super(image); diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java index e285cca6544..b0d50d0191d 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java @@ -15,9 +15,7 @@ */ public class FirestoreEmulatorContainer extends GCloudGenericContainer { - private static final String[] CMDS = {"apk --update add openjdk8-jre", - "gcloud components install beta cloud-firestore-emulator --quiet", - "gcloud beta emulators firestore start --host-port 0.0.0.0:8080"}; + private static final String CMDS = "gcloud beta emulators firestore start --host-port 0.0.0.0:8080"; public FirestoreEmulatorContainer(String image) { super(image); diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java index 6bd0f567392..881f6a45b73 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java @@ -12,7 +12,7 @@ */ public class GCloudGenericContainer> extends GenericContainer { - public static final String DEFAULT_GCLOUD_IMAGE = "google/cloud-sdk:291.0.0-alpine"; + public static final String DEFAULT_GCLOUD_IMAGE = "google/cloud-sdk:305.0.0"; private List commands = new ArrayList<>(); diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java index aa4e7f18b49..7bb2f63065a 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java @@ -15,9 +15,7 @@ */ public class PubSubEmulatorContainer extends GCloudGenericContainer { - private static final String[] CMDS = {"apk --update add openjdk7-jre", - "gcloud components install beta pubsub-emulator --quiet", - "gcloud beta emulators pubsub start --host-port 0.0.0.0:8085"}; + private static final String CMDS = "gcloud beta emulators pubsub start --host-port 0.0.0.0:8085"; public PubSubEmulatorContainer(String image) { super(image); diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java index 94029fd44a2..777796189fd 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java @@ -20,6 +20,6 @@ public SpannerEmulatorContainer(String image) { } public SpannerEmulatorContainer() { - this("gcr.io/cloud-spanner-emulator/emulator:0.7.28"); + this("gcr.io/cloud-spanner-emulator/emulator:1.0.0"); } } From 6991cef38b10e16561c1fdd901ef2a1c51e05f7d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sun, 16 Aug 2020 10:59:36 -0500 Subject: [PATCH 11/24] Fix datastore test --- .../containers/DatastoreEmulatorContainerTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java index 1886eb12a02..40209d42009 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java @@ -25,6 +25,7 @@ public void testSimple() { .setHost(emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8081)) .setCredentials(NoCredentials.getInstance()) .setRetrySettings(ServiceOptions.getNoRetrySettings()) + .setProjectId("test-project") .build(); Datastore datastore = options.getService(); From 84d1172a305030ea62b241627b90d51b50c26aa1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 17 Aug 2020 20:54:17 -0500 Subject: [PATCH 12/24] Polish Spanner test --- .../testcontainers/containers/SpannerEmulatorContainerTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java index 75215bcd8cc..12a8813d691 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java @@ -66,7 +66,6 @@ public void testSimple() throws ExecutionException, InterruptedException { private void createDatabase(Spanner spanner) throws InterruptedException, ExecutionException { DatabaseAdminClient dbAdminClient = spanner.getDatabaseAdminClient(); Database database = dbAdminClient.createDatabase(INSTANCE_NAME, DATABASE_NAME, Arrays.asList("CREATE TABLE TestTable (Key INT64, Value STRING(MAX)) PRIMARY KEY (Key)")).get(); - System.out.println(">>>" + database.getState()); } private InstanceId createInstance(Spanner spanner) throws InterruptedException, ExecutionException { From 0d3ea39615d3d3004296911803da3c9de67afefa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 17 Aug 2020 20:55:12 -0500 Subject: [PATCH 13/24] Fix docs --- docs/modules/gcloud.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/modules/gcloud.md b/docs/modules/gcloud.md index 476f6b5714a..83e60783cb4 100644 --- a/docs/modules/gcloud.md +++ b/docs/modules/gcloud.md @@ -5,7 +5,7 @@ Testcontainers module for the Google's [Cloud SDK](https://cloud.google.com/sdk/). -Currently, the module supports `datastore`, `firestore`, `pubsub` and `spanner` emulators. In order to use it, you should use the following classes: +Currently, the module supports `Datastore`, `Firestore`, `Pub/Sub` and `Spanner` emulators. In order to use it, you should use the following classes: * DatastoreEmulatorContainer * FirestoreEmulatorContainer @@ -14,7 +14,7 @@ Currently, the module supports `datastore`, `firestore`, `pubsub` and `spanner` ## Usage example -Running GCloud as a stand-in for Google Firestore during a test: +Running GCloud as a stand-in for Google Datastore during a test: [Creating a Datastore container](../../../modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java) inside_block:creatingDatastoreEmulatorContainer From a5fdcb7713b7840eb3ad0ac449eff1087ac8937c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 18 Aug 2020 18:20:58 -0500 Subject: [PATCH 14/24] Update base image --- .../org/testcontainers/containers/GCloudGenericContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java index 881f6a45b73..e67cbb4e510 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java @@ -12,7 +12,7 @@ */ public class GCloudGenericContainer> extends GenericContainer { - public static final String DEFAULT_GCLOUD_IMAGE = "google/cloud-sdk:305.0.0"; + public static final String DEFAULT_GCLOUD_IMAGE = "gcr.io/google.com/cloudsdktool/cloud-sdk:306.0.0"; private List commands = new ArrayList<>(); From 548e6bf246b11234a8799b11c6bcf6be9af970d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 18 Aug 2020 18:21:45 -0500 Subject: [PATCH 15/24] Remove startupTimeout --- .../testcontainers/containers/FirestoreEmulatorContainer.java | 3 +-- .../org/testcontainers/containers/PubSubEmulatorContainer.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java index b0d50d0191d..159df4763ac 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java @@ -21,8 +21,7 @@ public FirestoreEmulatorContainer(String image) { super(image); withExposedPorts(8080); setWaitStrategy(new LogMessageWaitStrategy() - .withRegEx("(?s).*running.*$") - .withStartupTimeout(Duration.ofSeconds(120))); + .withRegEx("(?s).*running.*$")); withCommand("/bin/sh", "-c", parseCmds(CMDS)); } diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java index 7bb2f63065a..56b482b2523 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java @@ -21,8 +21,7 @@ public PubSubEmulatorContainer(String image) { super(image); withExposedPorts(8085); setWaitStrategy(new LogMessageWaitStrategy() - .withRegEx("(?s).*started.*$") - .withStartupTimeout(Duration.ofSeconds(120))); + .withRegEx("(?s).*started.*$")); withCommand("/bin/sh", "-c", parseCmds(CMDS)); } From 802228f41b12e94ffc3acfba07362434fe461f6f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 18 Aug 2020 18:22:33 -0500 Subject: [PATCH 16/24] Set projectId --- .../containers/FirestoreEmulatorContainerTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java index f3fbe04fe96..76112ee4904 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java @@ -27,6 +27,7 @@ public void testSimple() throws ExecutionException, InterruptedException { FirestoreOptions options = FirestoreOptions.getDefaultInstance().toBuilder() .setHost(emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8080)) .setCredentials(NoCredentials.getInstance()) + .setProjectId("test-project") .build(); Firestore firestore = options.getService(); @@ -36,8 +37,7 @@ public void testSimple() throws ExecutionException, InterruptedException { data.put("first", "Ada"); data.put("last", "Lovelace"); ApiFuture result = docRef.set(data); - - System.out.println(result.get().getUpdateTime()); + result.get(); ApiFuture query = users.get(); QuerySnapshot querySnapshot = query.get(); From 465e487bae5cf456964b9678c8d2f99560eaf32c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 18 Aug 2020 18:23:21 -0500 Subject: [PATCH 17/24] Rename project-id --- .../testcontainers/containers/DatastoreEmulatorContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java index a08c18c0d96..22f867ca574 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java @@ -14,7 +14,7 @@ */ public class DatastoreEmulatorContainer extends GCloudGenericContainer { - private static final String CMDS = "gcloud beta emulators datastore start --project dummy-project --host-port 0.0.0.0:8081"; + private static final String CMDS = "gcloud beta emulators datastore start --project test-project --host-port 0.0.0.0:8081"; public DatastoreEmulatorContainer(String image) { super(image); From 810962944ea4c575878e5e7fb05d9059975dee28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 18 Aug 2020 18:25:55 -0500 Subject: [PATCH 18/24] Polish --- .../containers/DatastoreEmulatorContainer.java | 13 +++---------- .../containers/FirestoreEmulatorContainer.java | 14 +++----------- .../containers/PubSubEmulatorContainer.java | 14 +++----------- 3 files changed, 9 insertions(+), 32 deletions(-) diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java index 22f867ca574..a9c7da9c196 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java @@ -1,12 +1,9 @@ package org.testcontainers.containers; -import java.util.Arrays; - import org.testcontainers.containers.wait.strategy.Wait; /** - * A Datastore container that relies in google cloud sdk. The container provides - * additional instructions to install the components needed in the alpine images. + * A Datastore container that relies in google cloud sdk. * * Default port is 8081. * @@ -14,17 +11,13 @@ */ public class DatastoreEmulatorContainer extends GCloudGenericContainer { - private static final String CMDS = "gcloud beta emulators datastore start --project test-project --host-port 0.0.0.0:8081"; + private static final String CMD = "gcloud beta emulators datastore start --project test-project --host-port 0.0.0.0:8081"; public DatastoreEmulatorContainer(String image) { super(image); withExposedPorts(8081); setWaitStrategy(Wait.forHttp("/").forStatusCode(200)); - withCommand("/bin/sh", "-c", parseCmds(CMDS)); - } - - private static String parseCmds(String... cmds) { - return String.join(" && ", Arrays.asList(cmds)); + withCommand("/bin/sh", "-c", CMD); } public DatastoreEmulatorContainer() { diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java index 159df4763ac..a4331e2d239 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java @@ -1,13 +1,9 @@ package org.testcontainers.containers; -import java.time.Duration; -import java.util.Arrays; - import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; /** - * A Firestore container that relies in google cloud sdk. The container provides - * additional instructions to install the components needed in the alpine images. + * A Firestore container that relies in google cloud sdk. * * Default port is 8080. * @@ -15,18 +11,14 @@ */ public class FirestoreEmulatorContainer extends GCloudGenericContainer { - private static final String CMDS = "gcloud beta emulators firestore start --host-port 0.0.0.0:8080"; + private static final String CMD = "gcloud beta emulators firestore start --host-port 0.0.0.0:8080"; public FirestoreEmulatorContainer(String image) { super(image); withExposedPorts(8080); setWaitStrategy(new LogMessageWaitStrategy() .withRegEx("(?s).*running.*$")); - withCommand("/bin/sh", "-c", parseCmds(CMDS)); - } - - private static String parseCmds(String... cmds) { - return String.join(" && ", Arrays.asList(cmds)); + withCommand("/bin/sh", "-c", CMD); } public FirestoreEmulatorContainer() { diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java index 56b482b2523..e2011f5d85f 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java @@ -1,13 +1,9 @@ package org.testcontainers.containers; -import java.time.Duration; -import java.util.Arrays; - import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; /** - * A PubSub container that relies in google cloud sdk. The container provides - * additional instructions to install the components needed in the alpine images. + * A PubSub container that relies in google cloud sdk. * * Default port is 8085. * @@ -15,18 +11,14 @@ */ public class PubSubEmulatorContainer extends GCloudGenericContainer { - private static final String CMDS = "gcloud beta emulators pubsub start --host-port 0.0.0.0:8085"; + private static final String CMD = "gcloud beta emulators pubsub start --host-port 0.0.0.0:8085"; public PubSubEmulatorContainer(String image) { super(image); withExposedPorts(8085); setWaitStrategy(new LogMessageWaitStrategy() .withRegEx("(?s).*started.*$")); - withCommand("/bin/sh", "-c", parseCmds(CMDS)); - } - - private static String parseCmds(String... cmds) { - return String.join(" && ", Arrays.asList(cmds)); + withCommand("/bin/sh", "-c", CMD); } public PubSubEmulatorContainer() { From 70befd341ed151663e1f1ed63ac114ced7a75145 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Tue, 18 Aug 2020 18:58:15 -0500 Subject: [PATCH 19/24] Polish --- .../containers/GCloudGenericContainer.java | 24 ------------------- 1 file changed, 24 deletions(-) diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java index e67cbb4e510..fa59df21604 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java @@ -1,12 +1,8 @@ package org.testcontainers.containers; -import java.io.IOException; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; -import com.github.dockerjava.api.command.InspectContainerResponse; - /** * @author Eddú Meléndez */ @@ -20,24 +16,4 @@ public GCloudGenericContainer(String image) { super(image); } - @Override - protected void containerIsStarted(InspectContainerResponse containerInfo) { - runAdditionalCommands(); - } - - private void runAdditionalCommands() { - this.commands.forEach(cmd -> { - try { - execInContainer(cmd); - } catch (IOException | InterruptedException e) { - logger().error("Failed to execute {}. Exception message: {}", cmd, e.getMessage()); - } - }); - } - - public SELF withAdditionalCommands(String... cmds) { - this.commands.addAll(Arrays.asList(cmds)); - return self(); - } - } From ac133f0a4ab4177b2e16a2197f9eb960325981d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sat, 29 Aug 2020 18:27:37 -0500 Subject: [PATCH 20/24] Fix docs --- docs/modules/gcloud.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/modules/gcloud.md b/docs/modules/gcloud.md index 83e60783cb4..3400ad881a9 100644 --- a/docs/modules/gcloud.md +++ b/docs/modules/gcloud.md @@ -17,13 +17,13 @@ Currently, the module supports `Datastore`, `Firestore`, `Pub/Sub` and `Spanner` Running GCloud as a stand-in for Google Datastore during a test: -[Creating a Datastore container](../../../modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java) inside_block:creatingDatastoreEmulatorContainer +[Creating a Datastore container](../../modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java) inside_block:creatingDatastoreEmulatorContainer And how to start it: -[Starting a Datastore container](../../../modules/mongodb/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java) inside_block:startingDatastoreEmulatorContainer +[Starting a Datastore container](../../modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java) inside_block:startingDatastoreEmulatorContainer ## Adding this module to your project dependencies From 40dac6517084953eb91c0011718216ae4252a22e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 31 Aug 2020 00:52:49 -0500 Subject: [PATCH 21/24] Add subscriber in pubsub sample --- .../PubSubEmulatorContainerTest.java | 115 +++++++++++------- 1 file changed, 72 insertions(+), 43 deletions(-) diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java index 2a398a20e6c..2cb5946d526 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java @@ -1,22 +1,26 @@ package org.testcontainers.containers; import java.io.IOException; -import java.util.concurrent.ExecutionException; -import com.google.api.core.ApiFuture; -import com.google.api.core.ApiFutureCallback; -import com.google.api.core.ApiFutures; import com.google.api.gax.core.NoCredentialsProvider; import com.google.api.gax.grpc.GrpcTransportChannel; import com.google.api.gax.rpc.FixedTransportChannelProvider; import com.google.api.gax.rpc.TransportChannelProvider; import com.google.cloud.pubsub.v1.Publisher; +import com.google.cloud.pubsub.v1.SubscriptionAdminClient; +import com.google.cloud.pubsub.v1.SubscriptionAdminSettings; import com.google.cloud.pubsub.v1.TopicAdminClient; import com.google.cloud.pubsub.v1.TopicAdminSettings; -import com.google.common.util.concurrent.MoreExecutors; +import com.google.cloud.pubsub.v1.stub.GrpcSubscriberStub; +import com.google.cloud.pubsub.v1.stub.SubscriberStub; +import com.google.cloud.pubsub.v1.stub.SubscriberStubSettings; import com.google.protobuf.ByteString; +import com.google.pubsub.v1.ProjectSubscriptionName; import com.google.pubsub.v1.PubsubMessage; -import com.google.pubsub.v1.Topic; +import com.google.pubsub.v1.PullRequest; +import com.google.pubsub.v1.PullResponse; +import com.google.pubsub.v1.PushConfig; +import com.google.pubsub.v1.TopicName; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import org.junit.Rule; @@ -26,47 +30,72 @@ public class PubSubEmulatorContainerTest { - @Rule - public PubSubEmulatorContainer emulator = new PubSubEmulatorContainer(); + public static final String PROJECT_ID = "my-project-id"; - @Test - public void testSimple() throws IOException, ExecutionException, InterruptedException { - String hostport = emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8085); - ManagedChannel channel = ManagedChannelBuilder.forTarget(hostport).usePlaintext().build(); - try { - TransportChannelProvider channelProvider = - FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel)); - NoCredentialsProvider credentialsProvider = NoCredentialsProvider.create(); + @Rule + public PubSubEmulatorContainer emulator = new PubSubEmulatorContainer(); - TopicAdminClient topicAdminClient = - TopicAdminClient.create( - TopicAdminSettings.newBuilder() - .setTransportChannelProvider(channelProvider) - .setCredentialsProvider(credentialsProvider) - .build()); - Topic topic = topicAdminClient.createTopic("projects/my-project-id/topics/my-topic-id"); + @Test + public void testSimple() throws IOException { + String hostport = emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8085); + ManagedChannel channel = ManagedChannelBuilder.forTarget(hostport).usePlaintext().build(); + try { + TransportChannelProvider channelProvider = + FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel)); + NoCredentialsProvider credentialsProvider = NoCredentialsProvider.create(); - Publisher publisher = Publisher.newBuilder(topic.getName()) - .setChannelProvider(channelProvider) - .setCredentialsProvider(credentialsProvider) - .build(); - PubsubMessage message = PubsubMessage.newBuilder().setData(ByteString.copyFromUtf8("test message")).build(); - ApiFuture future = publisher.publish(message); - ApiFutures.addCallback(future, new ApiFutureCallback() { - @Override - public void onFailure(Throwable t) { + String topicId = "my-topic-id"; + createTopic(topicId, channelProvider, credentialsProvider); - } + String subscriptionId = "my-subscription-id"; + createSubscription(subscriptionId, topicId, channelProvider, credentialsProvider); - @Override - public void onSuccess(String result) { - assertThat(result).isNotNull(); - } - }, MoreExecutors.directExecutor()); - future.get(); - } finally { - channel.shutdown(); - } - } + Publisher publisher = Publisher.newBuilder(TopicName.of(PROJECT_ID, topicId)) + .setChannelProvider(channelProvider) + .setCredentialsProvider(credentialsProvider) + .build(); + PubsubMessage message = PubsubMessage.newBuilder().setData(ByteString.copyFromUtf8("test message")).build(); + publisher.publish(message); + + SubscriberStubSettings subscriberStubSettings = + SubscriberStubSettings.newBuilder() + .setTransportChannelProvider(channelProvider) + .setCredentialsProvider(credentialsProvider) + .build(); + try (SubscriberStub subscriber = GrpcSubscriberStub.create(subscriberStubSettings)) { + PullRequest pullRequest = PullRequest.newBuilder() + .setMaxMessages(1) + .setSubscription(ProjectSubscriptionName.format(PROJECT_ID, subscriptionId)) + .build(); + PullResponse pullResponse = subscriber.pullCallable().call(pullRequest); + + assertThat(pullResponse.getReceivedMessagesList()).hasSize(1); + assertThat(pullResponse.getReceivedMessages(0).getMessage().getData().toStringUtf8()).isEqualTo("test message"); + } + } finally { + channel.shutdown(); + } + } + + private void createTopic(String topicId, TransportChannelProvider channelProvider, NoCredentialsProvider credentialsProvider) throws IOException { + TopicAdminSettings topicAdminSettings = TopicAdminSettings.newBuilder() + .setTransportChannelProvider(channelProvider) + .setCredentialsProvider(credentialsProvider) + .build(); + try (TopicAdminClient topicAdminClient = TopicAdminClient.create(topicAdminSettings)) { + TopicName topicName = TopicName.of(PROJECT_ID, topicId); + topicAdminClient.createTopic(topicName); + } + } + + private void createSubscription(String subscriptionId, String topicId, TransportChannelProvider channelProvider, NoCredentialsProvider credentialsProvider) throws IOException { + SubscriptionAdminSettings subscriptionAdminSettings = SubscriptionAdminSettings.newBuilder() + .setTransportChannelProvider(channelProvider) + .setCredentialsProvider(credentialsProvider) + .build(); + SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create(subscriptionAdminSettings); + ProjectSubscriptionName subscriptionName = ProjectSubscriptionName.of(PROJECT_ID, subscriptionId); + subscriptionAdminClient.createSubscription(subscriptionName, TopicName.of(PROJECT_ID, topicId), PushConfig.getDefaultInstance(), 10); + } } From 56839982da1197513585dca224dc0beb92bd844e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Wed, 7 Oct 2020 21:26:05 -0500 Subject: [PATCH 22/24] Update with master changes --- .../DatastoreEmulatorContainer.java | 15 +++++++++------ .../FirestoreEmulatorContainer.java | 16 +++++++++------- .../containers/GCloudGenericContainer.java | 19 ------------------- .../containers/PubSubEmulatorContainer.java | 15 +++++++++------ .../containers/SpannerEmulatorContainer.java | 15 +++++++++------ .../DatastoreEmulatorContainerTest.java | 3 ++- .../FirestoreEmulatorContainerTest.java | 3 ++- .../PubSubEmulatorContainerTest.java | 3 ++- .../SpannerEmulatorContainerTest.java | 3 ++- 9 files changed, 44 insertions(+), 48 deletions(-) delete mode 100644 modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java index a9c7da9c196..85b07b94591 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/DatastoreEmulatorContainer.java @@ -1,6 +1,7 @@ package org.testcontainers.containers; import org.testcontainers.containers.wait.strategy.Wait; +import org.testcontainers.utility.DockerImageName; /** * A Datastore container that relies in google cloud sdk. @@ -9,18 +10,20 @@ * * @author Eddú Meléndez */ -public class DatastoreEmulatorContainer extends GCloudGenericContainer { +public class DatastoreEmulatorContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("gcr.io/google.com/cloudsdktool/cloud-sdk"); private static final String CMD = "gcloud beta emulators datastore start --project test-project --host-port 0.0.0.0:8081"; - public DatastoreEmulatorContainer(String image) { - super(image); + public DatastoreEmulatorContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + withExposedPorts(8081); setWaitStrategy(Wait.forHttp("/").forStatusCode(200)); withCommand("/bin/sh", "-c", CMD); } - public DatastoreEmulatorContainer() { - this(DEFAULT_GCLOUD_IMAGE); - } } diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java index a4331e2d239..41442f0f531 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/FirestoreEmulatorContainer.java @@ -1,6 +1,7 @@ package org.testcontainers.containers; import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; +import org.testcontainers.utility.DockerImageName; /** * A Firestore container that relies in google cloud sdk. @@ -9,20 +10,21 @@ * * @author Eddú Meléndez */ -public class FirestoreEmulatorContainer extends GCloudGenericContainer { +public class FirestoreEmulatorContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("gcr.io/google.com/cloudsdktool/cloud-sdk"); private static final String CMD = "gcloud beta emulators firestore start --host-port 0.0.0.0:8080"; - public FirestoreEmulatorContainer(String image) { - super(image); + public FirestoreEmulatorContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + withExposedPorts(8080); setWaitStrategy(new LogMessageWaitStrategy() .withRegEx("(?s).*running.*$")); withCommand("/bin/sh", "-c", CMD); } - public FirestoreEmulatorContainer() { - this(DEFAULT_GCLOUD_IMAGE); - } - } diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java deleted file mode 100644 index fa59df21604..00000000000 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/GCloudGenericContainer.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.testcontainers.containers; - -import java.util.ArrayList; -import java.util.List; - -/** - * @author Eddú Meléndez - */ -public class GCloudGenericContainer> extends GenericContainer { - - public static final String DEFAULT_GCLOUD_IMAGE = "gcr.io/google.com/cloudsdktool/cloud-sdk:306.0.0"; - - private List commands = new ArrayList<>(); - - public GCloudGenericContainer(String image) { - super(image); - } - -} diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java index e2011f5d85f..c92145b3d3a 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/PubSubEmulatorContainer.java @@ -1,6 +1,7 @@ package org.testcontainers.containers; import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; +import org.testcontainers.utility.DockerImageName; /** * A PubSub container that relies in google cloud sdk. @@ -9,19 +10,21 @@ * * @author Eddú Meléndez */ -public class PubSubEmulatorContainer extends GCloudGenericContainer { +public class PubSubEmulatorContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("gcr.io/google.com/cloudsdktool/cloud-sdk"); private static final String CMD = "gcloud beta emulators pubsub start --host-port 0.0.0.0:8085"; - public PubSubEmulatorContainer(String image) { - super(image); + public PubSubEmulatorContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + withExposedPorts(8085); setWaitStrategy(new LogMessageWaitStrategy() .withRegEx("(?s).*started.*$")); withCommand("/bin/sh", "-c", CMD); } - public PubSubEmulatorContainer() { - this(DEFAULT_GCLOUD_IMAGE); - } } diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java index 777796189fd..5f2a203d911 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/SpannerEmulatorContainer.java @@ -1,25 +1,28 @@ package org.testcontainers.containers; import org.testcontainers.containers.wait.strategy.LogMessageWaitStrategy; +import org.testcontainers.utility.DockerImageName; /** * A Spanner container. Default ports: 9010 for GRPC and 9020 for HTTP. * * @author Eddú Meléndez */ -public class SpannerEmulatorContainer extends GCloudGenericContainer { +public class SpannerEmulatorContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("gcr.io/cloud-spanner-emulator/emulator"); private static final int GRPC_PORT = 9010; private static final int HTTP_PORT = 9020; - public SpannerEmulatorContainer(String image) { - super(image); + public SpannerEmulatorContainer(final DockerImageName dockerImageName) { + super(dockerImageName); + + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + withExposedPorts(GRPC_PORT, HTTP_PORT); setWaitStrategy(new LogMessageWaitStrategy() .withRegEx(".*Cloud Spanner emulator running\\..*")); } - public SpannerEmulatorContainer() { - this("gcr.io/cloud-spanner-emulator/emulator:1.0.0"); - } } diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java index 40209d42009..3cc3d6c6734 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java @@ -8,6 +8,7 @@ import com.google.cloud.datastore.Key; import org.junit.Rule; import org.junit.Test; +import org.testcontainers.utility.DockerImageName; import static org.assertj.core.api.Assertions.assertThat; @@ -15,7 +16,7 @@ public class DatastoreEmulatorContainerTest { @Rule // creatingDatastoreEmulatorContainer { - public DatastoreEmulatorContainer emulator = new DatastoreEmulatorContainer(); + public DatastoreEmulatorContainer emulator = new DatastoreEmulatorContainer(DockerImageName.parse("gcr.io/google.com/cloudsdktool/cloud-sdk:313.0.0")); // } // startingDatastoreEmulatorContainer { diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java index 76112ee4904..2f23ff40483 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/FirestoreEmulatorContainerTest.java @@ -14,13 +14,14 @@ import com.google.cloud.firestore.WriteResult; import org.junit.Rule; import org.junit.Test; +import org.testcontainers.utility.DockerImageName; import static org.assertj.core.api.Assertions.assertThat; public class FirestoreEmulatorContainerTest { @Rule - public FirestoreEmulatorContainer emulator = new FirestoreEmulatorContainer(); + public FirestoreEmulatorContainer emulator = new FirestoreEmulatorContainer(DockerImageName.parse("gcr.io/google.com/cloudsdktool/cloud-sdk:313.0.0")); @Test public void testSimple() throws ExecutionException, InterruptedException { diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java index 2cb5946d526..4355684e084 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java @@ -25,6 +25,7 @@ import io.grpc.ManagedChannelBuilder; import org.junit.Rule; import org.junit.Test; +import org.testcontainers.utility.DockerImageName; import static org.assertj.core.api.Assertions.assertThat; @@ -33,7 +34,7 @@ public class PubSubEmulatorContainerTest { public static final String PROJECT_ID = "my-project-id"; @Rule - public PubSubEmulatorContainer emulator = new PubSubEmulatorContainer(); + public PubSubEmulatorContainer emulator = new PubSubEmulatorContainer(DockerImageName.parse("gcr.io/google.com/cloudsdktool/cloud-sdk:313.0.0")); @Test public void testSimple() throws IOException { diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java index 12a8813d691..9093530236a 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/SpannerEmulatorContainerTest.java @@ -19,13 +19,14 @@ import com.google.cloud.spanner.Statement; import org.junit.Rule; import org.junit.Test; +import org.testcontainers.utility.DockerImageName; import static org.assertj.core.api.Assertions.assertThat; public class SpannerEmulatorContainerTest { @Rule - public SpannerEmulatorContainer emulator = new SpannerEmulatorContainer(); + public SpannerEmulatorContainer emulator = new SpannerEmulatorContainer(DockerImageName.parse("gcr.io/cloud-spanner-emulator/emulator:1.1.0")); private static final String PROJECT_NAME = "test-project"; private static final String INSTANCE_NAME = "test-instance"; From 4d50670537c526bef905349e1e25aa3759b7a8b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez=20Gonzales?= Date: Sun, 11 Oct 2020 01:44:08 -0500 Subject: [PATCH 23/24] Update modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java Co-authored-by: Richard North --- .../containers/DatastoreEmulatorContainerTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java index 3cc3d6c6734..f8285e4c691 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/DatastoreEmulatorContainerTest.java @@ -16,7 +16,9 @@ public class DatastoreEmulatorContainerTest { @Rule // creatingDatastoreEmulatorContainer { - public DatastoreEmulatorContainer emulator = new DatastoreEmulatorContainer(DockerImageName.parse("gcr.io/google.com/cloudsdktool/cloud-sdk:313.0.0")); + public DatastoreEmulatorContainer emulator = new DatastoreEmulatorContainer( + DockerImageName.parse("gcr.io/google.com/cloudsdktool/cloud-sdk:313.0.0") + ); // } // startingDatastoreEmulatorContainer { From fb43494dadd8aba74cdc28feaf39696b60507d82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Sun, 11 Oct 2020 01:45:40 -0500 Subject: [PATCH 24/24] To spaces --- .../PubSubEmulatorContainerTest.java | 116 +++++++++--------- 1 file changed, 58 insertions(+), 58 deletions(-) diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java index 4355684e084..0c5ec888de5 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/PubSubEmulatorContainerTest.java @@ -31,72 +31,72 @@ public class PubSubEmulatorContainerTest { - public static final String PROJECT_ID = "my-project-id"; + public static final String PROJECT_ID = "my-project-id"; - @Rule - public PubSubEmulatorContainer emulator = new PubSubEmulatorContainer(DockerImageName.parse("gcr.io/google.com/cloudsdktool/cloud-sdk:313.0.0")); + @Rule + public PubSubEmulatorContainer emulator = new PubSubEmulatorContainer(DockerImageName.parse("gcr.io/google.com/cloudsdktool/cloud-sdk:313.0.0")); - @Test - public void testSimple() throws IOException { - String hostport = emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8085); - ManagedChannel channel = ManagedChannelBuilder.forTarget(hostport).usePlaintext().build(); - try { - TransportChannelProvider channelProvider = - FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel)); - NoCredentialsProvider credentialsProvider = NoCredentialsProvider.create(); + @Test + public void testSimple() throws IOException { + String hostport = emulator.getContainerIpAddress() + ":" + emulator.getMappedPort(8085); + ManagedChannel channel = ManagedChannelBuilder.forTarget(hostport).usePlaintext().build(); + try { + TransportChannelProvider channelProvider = + FixedTransportChannelProvider.create(GrpcTransportChannel.create(channel)); + NoCredentialsProvider credentialsProvider = NoCredentialsProvider.create(); - String topicId = "my-topic-id"; - createTopic(topicId, channelProvider, credentialsProvider); + String topicId = "my-topic-id"; + createTopic(topicId, channelProvider, credentialsProvider); - String subscriptionId = "my-subscription-id"; - createSubscription(subscriptionId, topicId, channelProvider, credentialsProvider); + String subscriptionId = "my-subscription-id"; + createSubscription(subscriptionId, topicId, channelProvider, credentialsProvider); - Publisher publisher = Publisher.newBuilder(TopicName.of(PROJECT_ID, topicId)) - .setChannelProvider(channelProvider) - .setCredentialsProvider(credentialsProvider) - .build(); - PubsubMessage message = PubsubMessage.newBuilder().setData(ByteString.copyFromUtf8("test message")).build(); - publisher.publish(message); + Publisher publisher = Publisher.newBuilder(TopicName.of(PROJECT_ID, topicId)) + .setChannelProvider(channelProvider) + .setCredentialsProvider(credentialsProvider) + .build(); + PubsubMessage message = PubsubMessage.newBuilder().setData(ByteString.copyFromUtf8("test message")).build(); + publisher.publish(message); - SubscriberStubSettings subscriberStubSettings = - SubscriberStubSettings.newBuilder() - .setTransportChannelProvider(channelProvider) - .setCredentialsProvider(credentialsProvider) - .build(); - try (SubscriberStub subscriber = GrpcSubscriberStub.create(subscriberStubSettings)) { - PullRequest pullRequest = PullRequest.newBuilder() - .setMaxMessages(1) - .setSubscription(ProjectSubscriptionName.format(PROJECT_ID, subscriptionId)) - .build(); - PullResponse pullResponse = subscriber.pullCallable().call(pullRequest); + SubscriberStubSettings subscriberStubSettings = + SubscriberStubSettings.newBuilder() + .setTransportChannelProvider(channelProvider) + .setCredentialsProvider(credentialsProvider) + .build(); + try (SubscriberStub subscriber = GrpcSubscriberStub.create(subscriberStubSettings)) { + PullRequest pullRequest = PullRequest.newBuilder() + .setMaxMessages(1) + .setSubscription(ProjectSubscriptionName.format(PROJECT_ID, subscriptionId)) + .build(); + PullResponse pullResponse = subscriber.pullCallable().call(pullRequest); - assertThat(pullResponse.getReceivedMessagesList()).hasSize(1); - assertThat(pullResponse.getReceivedMessages(0).getMessage().getData().toStringUtf8()).isEqualTo("test message"); - } - } finally { - channel.shutdown(); - } - } + assertThat(pullResponse.getReceivedMessagesList()).hasSize(1); + assertThat(pullResponse.getReceivedMessages(0).getMessage().getData().toStringUtf8()).isEqualTo("test message"); + } + } finally { + channel.shutdown(); + } + } - private void createTopic(String topicId, TransportChannelProvider channelProvider, NoCredentialsProvider credentialsProvider) throws IOException { - TopicAdminSettings topicAdminSettings = TopicAdminSettings.newBuilder() - .setTransportChannelProvider(channelProvider) - .setCredentialsProvider(credentialsProvider) - .build(); - try (TopicAdminClient topicAdminClient = TopicAdminClient.create(topicAdminSettings)) { - TopicName topicName = TopicName.of(PROJECT_ID, topicId); - topicAdminClient.createTopic(topicName); - } - } + private void createTopic(String topicId, TransportChannelProvider channelProvider, NoCredentialsProvider credentialsProvider) throws IOException { + TopicAdminSettings topicAdminSettings = TopicAdminSettings.newBuilder() + .setTransportChannelProvider(channelProvider) + .setCredentialsProvider(credentialsProvider) + .build(); + try (TopicAdminClient topicAdminClient = TopicAdminClient.create(topicAdminSettings)) { + TopicName topicName = TopicName.of(PROJECT_ID, topicId); + topicAdminClient.createTopic(topicName); + } + } - private void createSubscription(String subscriptionId, String topicId, TransportChannelProvider channelProvider, NoCredentialsProvider credentialsProvider) throws IOException { - SubscriptionAdminSettings subscriptionAdminSettings = SubscriptionAdminSettings.newBuilder() - .setTransportChannelProvider(channelProvider) - .setCredentialsProvider(credentialsProvider) - .build(); - SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create(subscriptionAdminSettings); - ProjectSubscriptionName subscriptionName = ProjectSubscriptionName.of(PROJECT_ID, subscriptionId); - subscriptionAdminClient.createSubscription(subscriptionName, TopicName.of(PROJECT_ID, topicId), PushConfig.getDefaultInstance(), 10); - } + private void createSubscription(String subscriptionId, String topicId, TransportChannelProvider channelProvider, NoCredentialsProvider credentialsProvider) throws IOException { + SubscriptionAdminSettings subscriptionAdminSettings = SubscriptionAdminSettings.newBuilder() + .setTransportChannelProvider(channelProvider) + .setCredentialsProvider(credentialsProvider) + .build(); + SubscriptionAdminClient subscriptionAdminClient = SubscriptionAdminClient.create(subscriptionAdminSettings); + ProjectSubscriptionName subscriptionName = ProjectSubscriptionName.of(PROJECT_ID, subscriptionId); + subscriptionAdminClient.createSubscription(subscriptionName, TopicName.of(PROJECT_ID, topicId), PushConfig.getDefaultInstance(), 10); + } }