Skip to content
This repository was archived by the owner on Feb 24, 2026. It is now read-only.

Commit fb515ab

Browse files
fix: Accept null json values in JsonToProtoMessage converter (#1288)
* fix: accept null json values in JsonToProtoMessage converter * remove a unit test since we no longe cares about StreamWriter * 🦉 Updates from OwlBot See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
1 parent b920cd5 commit fb515ab

File tree

3 files changed

+7
-101
lines changed

3 files changed

+7
-101
lines changed

google-cloud-bigquerystorage/src/main/java/com/google/cloud/bigquery/storage/v1beta2/JsonToProtoMessage.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,9 @@ private static void fillField(
133133
throws IllegalArgumentException {
134134

135135
java.lang.Object val = json.get(exactJsonKeyName);
136+
if (val == JSONObject.NULL) {
137+
return;
138+
}
136139
switch (fieldDescriptor.getType()) {
137140
case BOOL:
138141
if (val instanceof Boolean) {

google-cloud-bigquerystorage/src/test/java/com/google/cloud/bigquery/storage/v1beta2/JsonToProtoMessageTest.java

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -743,15 +743,12 @@ public void testTopLevelMatchSecondLevelMismatch() throws Exception {
743743

744744
@Test
745745
public void testJsonNullValue() throws Exception {
746+
TestInt64 expectedProto = TestInt64.newBuilder().setInt(1).build();
746747
JSONObject json = new JSONObject();
747748
json.put("long", JSONObject.NULL);
748749
json.put("int", 1);
749-
try {
750-
DynamicMessage protoMsg =
751-
JsonToProtoMessage.convertJsonToProtoMessage(TestInt64.getDescriptor(), json);
752-
Assert.fail("Should fail");
753-
} catch (IllegalArgumentException e) {
754-
assertEquals(e.getMessage(), "JSONObject does not have a int64 field at root.long.");
755-
}
750+
DynamicMessage protoMsg =
751+
JsonToProtoMessage.convertJsonToProtoMessage(TestInt64.getDescriptor(), json);
752+
assertEquals(expectedProto, protoMsg);
756753
}
757754
}

google-cloud-bigquerystorage/src/test/java/com/google/cloud/bigquery/storage/v1beta2/StreamWriterTest.java

Lines changed: 0 additions & 94 deletions
Original file line numberDiff line numberDiff line change
@@ -901,100 +901,6 @@ public Throwable call() {
901901
executor.shutdown();
902902
}
903903

904-
@Test
905-
public void testFlowControlBehaviorBlockAbortOnShutdown() throws Exception {
906-
StreamWriter writer =
907-
getTestStreamWriterBuilder()
908-
.setBatchingSettings(
909-
StreamWriter.Builder.DEFAULT_BATCHING_SETTINGS
910-
.toBuilder()
911-
.setElementCountThreshold(1L)
912-
.setFlowControlSettings(
913-
StreamWriter.Builder.DEFAULT_FLOW_CONTROL_SETTINGS
914-
.toBuilder()
915-
.setMaxOutstandingElementCount(2L)
916-
.setLimitExceededBehavior(FlowController.LimitExceededBehavior.Block)
917-
.build())
918-
.build())
919-
.build();
920-
921-
testBigQueryWrite.addResponse(
922-
AppendRowsResponse.newBuilder()
923-
.setAppendResult(
924-
AppendRowsResponse.AppendResult.newBuilder().setOffset(Int64Value.of(2)).build())
925-
.build());
926-
testBigQueryWrite.addResponse(
927-
AppendRowsResponse.newBuilder()
928-
.setAppendResult(
929-
AppendRowsResponse.AppendResult.newBuilder().setOffset(Int64Value.of(3)).build())
930-
.build());
931-
testBigQueryWrite.addResponse(
932-
AppendRowsResponse.newBuilder()
933-
.setAppendResult(
934-
AppendRowsResponse.AppendResult.newBuilder().setOffset(Int64Value.of(4)).build())
935-
.build());
936-
// Response will have a 10 second delay before server sends them back.
937-
testBigQueryWrite.setResponseDelay(Duration.ofSeconds(10));
938-
939-
ApiFuture<AppendRowsResponse> appendFuture1 = sendTestMessage(writer, new String[] {"A"}, 2);
940-
final StreamWriter writer1 = writer;
941-
ExecutorService executor = Executors.newFixedThreadPool(2);
942-
Callable<Throwable> callable =
943-
new Callable<Throwable>() {
944-
@Override
945-
public Throwable call() {
946-
try {
947-
ApiFuture<AppendRowsResponse> appendFuture2 =
948-
sendTestMessage(writer1, new String[] {"B"}, 3);
949-
ApiFuture<AppendRowsResponse> appendFuture3 =
950-
sendTestMessage(writer1, new String[] {"C"}, 4);
951-
952-
// This request will be send out immediately because there is space in inflight queue.
953-
if (3L != appendFuture2.get().getAppendResult().getOffset().getValue()) {
954-
return new Exception(
955-
"Expect offset to be 3 but got "
956-
+ appendFuture2.get().getAppendResult().getOffset().getValue());
957-
}
958-
testBigQueryWrite.waitForResponseScheduled();
959-
// This triggers the last response to come back.
960-
fakeExecutor.advanceTime(Duration.ofSeconds(10));
961-
// This request will be waiting for previous response to come back.
962-
if (4L != appendFuture3.get().getAppendResult().getOffset().getValue()) {
963-
return new Exception(
964-
"Expect offset to be 4 but got "
965-
+ appendFuture2.get().getAppendResult().getOffset().getValue());
966-
}
967-
} catch (InterruptedException e) {
968-
return e;
969-
} catch (ExecutionException e) {
970-
return e;
971-
} catch (IllegalStateException e) {
972-
// In very rare cases, the stream is shutdown before the request is send, ignore this
973-
// error.
974-
}
975-
return null;
976-
}
977-
};
978-
Future<Throwable> future = executor.submit(callable);
979-
assertEquals(false, appendFuture1.isDone());
980-
// Wait is necessary for response to be scheduled before timer is advanced.
981-
testBigQueryWrite.waitForResponseScheduled();
982-
testBigQueryWrite.waitForResponseScheduled();
983-
// This will trigger the previous two responses to come back.
984-
fakeExecutor.advanceTime(Duration.ofSeconds(10));
985-
// The first requests gets back while the second one is blocked.
986-
assertEquals(2L, appendFuture1.get().getAppendResult().getOffset().getValue());
987-
// When close is called, there should be one inflight request waiting.
988-
Thread.sleep(500);
989-
writer.close();
990-
if (future.get() != null) {
991-
future.get().printStackTrace();
992-
fail("Callback got exception" + future.get().toString());
993-
}
994-
// Everything should come back.
995-
executor.shutdown();
996-
}
997-
998904
@Test
999905
public void testFlowControlBehaviorException() throws Exception {
1000906
try (StreamWriter writer =

0 commit comments

Comments
 (0)