Skip to content

Commit ca5fbd7

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 ca5fbd7

File tree

1 file changed

+77
-53
lines changed

1 file changed

+77
-53
lines changed

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

Lines changed: 77 additions & 53 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,53 +35,19 @@
2635

2736
class BigQueryEmulatorContainerTest {
2837

29-
@Test
30-
public void testGrcp() throws IOException {
31-
// Shallow test, validate that connection can be set up, and attempt to create write stream fails.
32-
// BigQueryWriteSettings requires a HTTP/2 connection, not provided by the originally exposed endpoint. A "not found" exceptionm
33-
// indicates successful
34-
try (BigQueryEmulatorContainer container = new BigQueryEmulatorContainer("ghcr.io/goccy/bigquery-emulator:0.6.5")) {
35-
container.start();
36-
BigQueryWriteSettings.Builder bigQueryWriteSettingsBuilder = BigQueryWriteSettings.newBuilder();
37-
38-
bigQueryWriteSettingsBuilder.createWriteStreamSettings()
39-
.setRetrySettings(bigQueryWriteSettingsBuilder.createWriteStreamSettings()
40-
.getRetrySettings()
41-
.toBuilder()
42-
.setTotalTimeout(Duration.ofSeconds(60))
43-
.build());
44-
45-
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()
50-
);
51-
52-
TableName parentTable = TableName.of(container.getProjectId(), "dataset", "table");
53-
CreateWriteStreamRequest createWriteStreamRequest = CreateWriteStreamRequest.newBuilder()
54-
.setParent(parentTable.toString())
55-
.setWriteStream(WriteStream.newBuilder().setType(WriteStream.Type.PENDING))
56-
.build();
57-
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");
68-
69-
bigQueryWriteClient.shutdown();
70-
bigQueryWriteClient.close();
71-
}
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();
7247
}
7348

7449
@Test
75-
void test() throws Exception {
50+
void testHttpEndpoint() throws Exception {
7651
try (
7752
// emulatorContainer {
7853
BigQueryEmulatorContainer container = new BigQueryEmulatorContainer("ghcr.io/goccy/bigquery-emulator:0.4.3")
@@ -81,15 +56,7 @@ void test() throws Exception {
8156
container.start();
8257

8358
// 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();
59+
BigQuery bigQuery = getBigQuery(container);
9360
// }
9461

9562
String fn =
@@ -107,4 +74,61 @@ void test() throws Exception {
10774
assertThat(values).containsOnly(BigDecimal.valueOf(30));
10875
}
10976
}
77+
78+
@Test
79+
void testGrcpEndpoint() throws IOException {
80+
try (BigQueryEmulatorContainer container = new BigQueryEmulatorContainer("ghcr.io/goccy/bigquery-emulator:0.6.5")) {
81+
container.start();
82+
83+
// Test setup.
84+
// Create a table the "regular" way. We need this to verify we can connect a writestream
85+
BigQuery bigQuery = getBigQuery(container);
86+
String tableName = "test-table";
87+
String datasetName = "test-dataset";
88+
89+
bigQuery.create(DatasetInfo.of(DatasetId.of(container.getProjectId(), datasetName)));
90+
91+
Schema schema = Schema.of(
92+
Field.of("name", StandardSQLTypeName.STRING)
93+
);
94+
95+
TableId tableId = TableId.of(datasetName, tableName);
96+
TableDefinition tableDefinition = StandardTableDefinition.of(schema);
97+
TableInfo tableInfo = TableInfo.newBuilder(tableId, tableDefinition).build();
98+
99+
bigQuery.create(tableInfo);
100+
101+
// Actual test.
102+
// BigQueryWriteSettings requires a HTTP/2 connection, not provided by the originally exposed endpoint.
103+
BigQueryWriteSettings.Builder bigQueryWriteSettingsBuilder = BigQueryWriteSettings.newBuilder();
104+
105+
bigQueryWriteSettingsBuilder.createWriteStreamSettings()
106+
.setRetrySettings(bigQueryWriteSettingsBuilder.createWriteStreamSettings()
107+
.getRetrySettings()
108+
.toBuilder()
109+
.setTotalTimeout(Duration.ofSeconds(60))
110+
.build());
111+
112+
// Use the now exposed grpcPort to get a working connection.
113+
BigQueryWriteClient bigQueryWriteClient = BigQueryWriteClient.create(
114+
bigQueryWriteSettingsBuilder.setTransportChannelProvider(FixedTransportChannelProvider.create(GrpcTransportChannel.create(
115+
ManagedChannelBuilder.forAddress(container.getHost(), container.getEmulatorGrpcPort()).usePlaintext().build())))
116+
.setCredentialsProvider(NoCredentialsProvider.create())
117+
.build()
118+
);
119+
120+
TableName parentTable = TableName.of(container.getProjectId(), datasetName, tableName);
121+
CreateWriteStreamRequest createWriteStreamRequest = CreateWriteStreamRequest.newBuilder()
122+
.setParent(parentTable.toString())
123+
.setWriteStream(WriteStream.newBuilder().setType(WriteStream.Type.PENDING))
124+
.build();
125+
126+
// Validate that we can successfully create a write stream. This would not work with http endpoint
127+
bigQueryWriteClient.createWriteStream(createWriteStreamRequest);
128+
129+
bigQueryWriteClient.shutdown();
130+
bigQueryWriteClient.close();
131+
}
132+
}
133+
110134
}

0 commit comments

Comments
 (0)