66import com .google .cloud .NoCredentials ;
77import com .google .cloud .bigquery .BigQuery ;
88import 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 ;
912import 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 ;
1019import com .google .cloud .bigquery .TableResult ;
1120import com .google .cloud .bigquery .storage .v1 .BigQueryWriteClient ;
1221import com .google .cloud .bigquery .storage .v1 .BigQueryWriteSettings ;
2635
2736class 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