Skip to content

Commit 72bc484

Browse files
Expand test to include a proper table
we can connect to, and validate that we can connect a BigQueryWriteClient to the table.
1 parent b9dad59 commit 72bc484

File tree

1 file changed

+74
-51
lines changed

1 file changed

+74
-51
lines changed

modules/gcloud/src/test/java/org/testcontainers/containers/BigQueryEmulatorContainerTest.java

Lines changed: 74 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,16 @@
66
import com.google.cloud.NoCredentials;
77
import com.google.cloud.bigquery.BigQuery;
88
import com.google.cloud.bigquery.BigQueryOptions;
9+
import com.google.cloud.bigquery.DatasetId;
10+
import com.google.cloud.bigquery.DatasetInfo;
11+
import com.google.cloud.bigquery.Field;
912
import com.google.cloud.bigquery.QueryJobConfiguration;
13+
import com.google.cloud.bigquery.Schema;
14+
import com.google.cloud.bigquery.StandardSQLTypeName;
15+
import com.google.cloud.bigquery.StandardTableDefinition;
16+
import com.google.cloud.bigquery.TableDefinition;
17+
import com.google.cloud.bigquery.TableId;
18+
import com.google.cloud.bigquery.TableInfo;
1019
import com.google.cloud.bigquery.TableResult;
1120
import com.google.cloud.bigquery.storage.v1.BigQueryWriteClient;
1221
import com.google.cloud.bigquery.storage.v1.BigQueryWriteSettings;
@@ -26,13 +35,71 @@
2635

2736
class BigQueryEmulatorContainerTest {
2837

38+
private BigQuery getBigQuery(BigQueryEmulatorContainer container) {
39+
String url = container.getEmulatorHttpEndpoint();
40+
return BigQueryOptions
41+
.newBuilder()
42+
.setProjectId(container.getProjectId())
43+
.setHost(url)
44+
.setLocation(url)
45+
.setCredentials(NoCredentials.getInstance())
46+
.build().getService();
47+
}
48+
49+
@Test
50+
void test() throws Exception {
51+
try (
52+
// emulatorContainer {
53+
BigQueryEmulatorContainer container = new BigQueryEmulatorContainer("ghcr.io/goccy/bigquery-emulator:0.4.3")
54+
// }
55+
) {
56+
container.start();
57+
58+
// bigQueryClient {
59+
BigQuery bigQuery = getBigQuery(container);
60+
// }
61+
62+
String fn =
63+
"CREATE FUNCTION testr(arr ARRAY<STRUCT<name STRING, val INT64>>) AS ((SELECT SUM(IF(elem.name = \"foo\",elem.val,null)) FROM UNNEST(arr) AS elem))";
64+
65+
bigQuery.query(QueryJobConfiguration.newBuilder(fn).build());
66+
67+
String sql =
68+
"SELECT testr([STRUCT<name STRING, val INT64>(\"foo\", 10), STRUCT<name STRING, val INT64>(\"bar\", 40), STRUCT<name STRING, val INT64>(\"foo\", 20)])";
69+
TableResult result = bigQuery.query(QueryJobConfiguration.newBuilder(sql).build());
70+
List<BigDecimal> values = result
71+
.streamValues()
72+
.map(fieldValues -> fieldValues.get(0).getNumericValue())
73+
.collect(Collectors.toList());
74+
assertThat(values).containsOnly(BigDecimal.valueOf(30));
75+
}
76+
}
77+
2978
@Test
3079
public void testGrcp() throws IOException {
3180
// Shallow test, validate that connection can be set up, and attempt to create write stream fails.
3281
// BigQueryWriteSettings requires a HTTP/2 connection, not provided by the originally exposed endpoint. A "not found" exceptionm
3382
// indicates successful
3483
try (BigQueryEmulatorContainer container = new BigQueryEmulatorContainer("ghcr.io/goccy/bigquery-emulator:0.6.5")) {
3584
container.start();
85+
86+
// Create a table we can connect a write stream to
87+
BigQuery bigQuery = getBigQuery(container);
88+
String tableName = "test-table";
89+
String datasetName = "test-dataset";
90+
91+
bigQuery.create(DatasetInfo.of(DatasetId.of(container.getProjectId(), datasetName)));
92+
93+
Schema schema = Schema.of(
94+
Field.of("name", StandardSQLTypeName.STRING)
95+
);
96+
97+
TableId tableId = TableId.of(datasetName, tableName);
98+
TableDefinition tableDefinition = StandardTableDefinition.of(schema);
99+
TableInfo tableInfo = TableInfo.newBuilder(tableId, tableDefinition).build();
100+
101+
bigQuery.create(tableInfo);
102+
36103
BigQueryWriteSettings.Builder bigQueryWriteSettingsBuilder = BigQueryWriteSettings.newBuilder();
37104

38105
bigQueryWriteSettingsBuilder.createWriteStreamSettings()
@@ -43,68 +110,24 @@ public void testGrcp() throws IOException {
43110
.build());
44111

45112
BigQueryWriteClient bigQueryWriteClient = BigQueryWriteClient.create(
46-
bigQueryWriteSettingsBuilder.setTransportChannelProvider(FixedTransportChannelProvider.create(GrpcTransportChannel.create(
47-
ManagedChannelBuilder.forAddress(container.getHost(), container.getEmulatorGrpcPort()).usePlaintext().build())))
48-
.setCredentialsProvider(NoCredentialsProvider.create())
49-
.build()
113+
bigQueryWriteSettingsBuilder.setTransportChannelProvider(FixedTransportChannelProvider.create(GrpcTransportChannel.create(
114+
ManagedChannelBuilder.forAddress(container.getHost(), container.getEmulatorGrpcPort()).usePlaintext().build())))
115+
.setCredentialsProvider(NoCredentialsProvider.create())
116+
.build()
50117
);
51118

52-
TableName parentTable = TableName.of(container.getProjectId(), "dataset", "table");
119+
TableName parentTable = TableName.of(container.getProjectId(), datasetName, tableName);
53120
CreateWriteStreamRequest createWriteStreamRequest = CreateWriteStreamRequest.newBuilder()
54121
.setParent(parentTable.toString())
55122
.setWriteStream(WriteStream.newBuilder().setType(WriteStream.Type.PENDING))
56123
.build();
57124

58-
String message = null;
59-
try {
60-
// This will fail, extract error message to check that it fails in a "we reached the backend" way to ensure that setup was correct
61-
WriteStream writeStream = bigQueryWriteClient.createWriteStream(createWriteStreamRequest);
62-
// Example setting up StreamWriter. Note passing bigQueryWriteClient as parameter, this is needed to avoid using gcloud credentials:
63-
/* StreamWriter writer = StreamWriter.newBuilder(writeStream.getName(), bigQueryWriteClient).setWriterSchema(schema).build(); */
64-
} catch (RuntimeException e) {
65-
message = e.getMessage();
66-
}
67-
assertThat(message).contains("dataset dataset is not found in project test-project");
125+
// Validate that we can successfully create a write stream. This would not work with http endpoint
126+
bigQueryWriteClient.createWriteStream(createWriteStreamRequest);
68127

69128
bigQueryWriteClient.shutdown();
70129
bigQueryWriteClient.close();
71130
}
72131
}
73132

74-
@Test
75-
void test() throws Exception {
76-
try (
77-
// emulatorContainer {
78-
BigQueryEmulatorContainer container = new BigQueryEmulatorContainer("ghcr.io/goccy/bigquery-emulator:0.4.3")
79-
// }
80-
) {
81-
container.start();
82-
83-
// bigQueryClient {
84-
String url = container.getEmulatorHttpEndpoint();
85-
BigQueryOptions options = BigQueryOptions
86-
.newBuilder()
87-
.setProjectId(container.getProjectId())
88-
.setHost(url)
89-
.setLocation(url)
90-
.setCredentials(NoCredentials.getInstance())
91-
.build();
92-
BigQuery bigQuery = options.getService();
93-
// }
94-
95-
String fn =
96-
"CREATE FUNCTION testr(arr ARRAY<STRUCT<name STRING, val INT64>>) AS ((SELECT SUM(IF(elem.name = \"foo\",elem.val,null)) FROM UNNEST(arr) AS elem))";
97-
98-
bigQuery.query(QueryJobConfiguration.newBuilder(fn).build());
99-
100-
String sql =
101-
"SELECT testr([STRUCT<name STRING, val INT64>(\"foo\", 10), STRUCT<name STRING, val INT64>(\"bar\", 40), STRUCT<name STRING, val INT64>(\"foo\", 20)])";
102-
TableResult result = bigQuery.query(QueryJobConfiguration.newBuilder(sql).build());
103-
List<BigDecimal> values = result
104-
.streamValues()
105-
.map(fieldValues -> fieldValues.get(0).getNumericValue())
106-
.collect(Collectors.toList());
107-
assertThat(values).containsOnly(BigDecimal.valueOf(30));
108-
}
109-
}
110133
}

0 commit comments

Comments
 (0)