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
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