From fd3549696e536e7b864e1687075f498f7ce1be2d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Fri, 21 Jul 2023 20:14:56 -0600 Subject: [PATCH 1/5] Add BigQueryEmulatorContainer --- modules/gcloud/build.gradle | 1 + .../containers/BigQueryEmulatorContainer.java | 30 +++++++++++ .../BigQueryEmulatorContainerTest.java | 52 +++++++++++++++++++ 3 files changed, 83 insertions(+) create mode 100644 modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java create mode 100644 modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java diff --git a/modules/gcloud/build.gradle b/modules/gcloud/build.gradle index 8815961168b..11e005a65d5 100644 --- a/modules/gcloud/build.gradle +++ b/modules/gcloud/build.gradle @@ -4,6 +4,7 @@ dependencies { api project(':testcontainers') testImplementation platform("com.google.cloud:libraries-bom:26.18.0") + testImplementation 'com.google.cloud:google-cloud-bigquery' testImplementation 'com.google.cloud:google-cloud-datastore' testImplementation 'com.google.cloud:google-cloud-firestore' testImplementation 'com.google.cloud:google-cloud-pubsub' diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java new file mode 100644 index 00000000000..19c361415f2 --- /dev/null +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java @@ -0,0 +1,30 @@ +package org.testcontainers.containers; + +import org.testcontainers.utility.DockerImageName; + +/** + * Testcontainers implementation for BigQuery. + */ +public class BigQueryEmulatorContainer extends GenericContainer { + + private static final DockerImageName DEFAULT_IMAGE_NAME = DockerImageName.parse("ghcr.io/goccy/bigquery-emulator"); + + private static final int HTTP_PORT = 9050; + + private static final int GRPC_PORT = 9060; + + public BigQueryEmulatorContainer(String image) { + this(DockerImageName.parse(image)); + } + + public BigQueryEmulatorContainer(DockerImageName dockerImageName) { + super(dockerImageName); + dockerImageName.assertCompatibleWith(DEFAULT_IMAGE_NAME); + addExposedPorts(HTTP_PORT, GRPC_PORT); + withCommand("--project", "test"); + } + + public String getEmulatorHttpEndpoint() { + return getHost() + ":" + getMappedPort(HTTP_PORT); + } +} diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java new file mode 100644 index 00000000000..4c381883b94 --- /dev/null +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java @@ -0,0 +1,52 @@ +package org.testcontainers.containers; + +import com.google.cloud.bigquery.BigQuery; +import com.google.cloud.bigquery.BigQueryOptions; +import com.google.cloud.bigquery.DatasetInfo; +import com.google.cloud.bigquery.QueryJobConfiguration; +import com.google.cloud.bigquery.TableResult; +import org.junit.Test; + +import java.math.BigDecimal; +import java.util.List; +import java.util.stream.Collectors; + +import static org.assertj.core.api.Assertions.assertThat; + +public class BigQueryEmulatorContainerTest { + + @Test + public void test() throws Exception { + try ( + BigQueryEmulatorContainer container = new BigQueryEmulatorContainer("ghcr.io/goccy/bigquery-emulator:0.4.3") + ) { + container.start(); + + String url = String.format("http://%s", container.getEmulatorHttpEndpoint()); + BigQueryOptions options = BigQueryOptions + .newBuilder() + .setProjectId("test") + .setHost(url) + .setLocation(url) + .build(); + BigQuery bigQuery = options.getService(); + + DatasetInfo datasetInfo = DatasetInfo.newBuilder("testds").build(); + bigQuery.create(datasetInfo); + + String fn = + "CREATE FUNCTION test.testds.testr(arr ARRAY>) AS ((SELECT SUM(IF(elem.name = \"foo\",elem.val,null)) FROM UNNEST(arr) AS elem))"; + + bigQuery.query(QueryJobConfiguration.newBuilder(fn).build()); + + String sql = + "SELECT test.testds.testr([STRUCT(\"foo\", 10), STRUCT(\"bar\", 40), STRUCT(\"foo\", 20)])"; + TableResult result = bigQuery.query(QueryJobConfiguration.newBuilder(sql).build()); + List values = result + .streamValues() + .map(fieldValues -> fieldValues.get(0).getNumericValue()) + .collect(Collectors.toList()); + assertThat(values).containsOnly(BigDecimal.valueOf(30)); + } + } +} From 054bc21ef0c79e5f8c4f80bf5321ebdacfb89381 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 24 Jul 2023 14:45:59 -0600 Subject: [PATCH 2/5] Fix comment --- .../containers/BigQueryEmulatorContainer.java | 10 ++++++++-- .../containers/BigQueryEmulatorContainerTest.java | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java index 19c361415f2..f99185f3796 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java @@ -13,6 +13,8 @@ public class BigQueryEmulatorContainer extends GenericContainer Date: Mon, 24 Jul 2023 14:49:57 -0600 Subject: [PATCH 3/5] Fix projectId --- .../testcontainers/containers/BigQueryEmulatorContainer.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java b/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java index f99185f3796..50153006b5e 100644 --- a/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java +++ b/modules/gcloud/src/main/java/org/testcontainers/containers/BigQueryEmulatorContainer.java @@ -13,7 +13,7 @@ public class BigQueryEmulatorContainer extends GenericContainer Date: Mon, 24 Jul 2023 14:53:18 -0600 Subject: [PATCH 4/5] Add docs --- docs/modules/gcloud.md | 11 ++++++++++- .../containers/BigQueryEmulatorContainerTest.java | 2 ++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/modules/gcloud.md b/docs/modules/gcloud.md index 807b81de433..de846bf48a2 100644 --- a/docs/modules/gcloud.md +++ b/docs/modules/gcloud.md @@ -5,10 +5,11 @@ Testcontainers module for the Google Cloud Platform's [Cloud SDK](https://cloud.google.com/sdk/). -Currently, the module supports `Bigtable`, `Datastore`, `Firestore`, `Spanner`, and `Pub/Sub` emulators. In order to use it, you should use the following classes: +Currently, the module supports `BigQuery`, `Bigtable`, `Datastore`, `Firestore`, `Spanner`, and `Pub/Sub` emulators. In order to use it, you should use the following classes: Class | Container Image -|- +BigQueryEmulatorContainer | ["ghcr.io/goccy/bigquery-emulator"]("ghcr.io/goccy/bigquery-emulator") BigtableEmulatorContainer | [gcr.io/google.com/cloudsdktool/cloud-sdk:emulators](https://gcr.io/google.com/cloudsdktool/cloud-sdk) DatastoreEmulatorContainer | [gcr.io/google.com/cloudsdktool/cloud-sdk:emulators](https://gcr.io/google.com/cloudsdktool/cloud-sdk) FirestoreEmulatorContainer | [gcr.io/google.com/cloudsdktool/cloud-sdk:emulators](https://gcr.io/google.com/cloudsdktool/cloud-sdk) @@ -17,6 +18,14 @@ PubSubEmulatorContainer | [gcr.io/google.com/cloudsdktool/cloud-sdk:emulators](h ## Usage example +### BigQuery + +Start BigQuery Emulator during a test: + + +[Starting a BigQuery Emulator container](../../modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java) inside_block:emulatorContainer + + ### Bigtable Start Bigtable Emulator during a test: diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java index 45f465380d3..7f80bc14ee1 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java @@ -18,7 +18,9 @@ public class BigQueryEmulatorContainerTest { @Test public void test() throws Exception { try ( + // emulatorContainer { BigQueryEmulatorContainer container = new BigQueryEmulatorContainer("ghcr.io/goccy/bigquery-emulator:0.4.3") + // } ) { container.start(); From 0da47843a119c37ae3a96603c17fe2c69ba8b0f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edd=C3=BA=20Mel=C3=A9ndez?= Date: Mon, 24 Jul 2023 15:23:27 -0600 Subject: [PATCH 5/5] Fix test --- .../containers/BigQueryEmulatorContainerTest.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java b/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java index 7f80bc14ee1..cd1dffde843 100644 --- a/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java +++ b/modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java @@ -2,7 +2,6 @@ import com.google.cloud.bigquery.BigQuery; import com.google.cloud.bigquery.BigQueryOptions; -import com.google.cloud.bigquery.DatasetInfo; import com.google.cloud.bigquery.QueryJobConfiguration; import com.google.cloud.bigquery.TableResult; import org.junit.Test; @@ -33,16 +32,13 @@ public void test() throws Exception { .build(); BigQuery bigQuery = options.getService(); - DatasetInfo datasetInfo = DatasetInfo.newBuilder("testds").build(); - bigQuery.create(datasetInfo); - String fn = - "CREATE FUNCTION test.testds.testr(arr ARRAY>) AS ((SELECT SUM(IF(elem.name = \"foo\",elem.val,null)) FROM UNNEST(arr) AS elem))"; + "CREATE FUNCTION testr(arr ARRAY>) AS ((SELECT SUM(IF(elem.name = \"foo\",elem.val,null)) FROM UNNEST(arr) AS elem))"; bigQuery.query(QueryJobConfiguration.newBuilder(fn).build()); String sql = - "SELECT test.testds.testr([STRUCT(\"foo\", 10), STRUCT(\"bar\", 40), STRUCT(\"foo\", 20)])"; + "SELECT testr([STRUCT(\"foo\", 10), STRUCT(\"bar\", 40), STRUCT(\"foo\", 20)])"; TableResult result = bigQuery.query(QueryJobConfiguration.newBuilder(sql).build()); List values = result .streamValues()