Improve error messages for incorrectly formated JSON work responses.
RELNOTES: None.
PiperOrigin-RevId: 331603943
diff --git a/src/main/java/com/google/devtools/build/lib/worker/JsonWorkerProtocol.java b/src/main/java/com/google/devtools/build/lib/worker/JsonWorkerProtocol.java
index 132bc8b..181bc6e 100644
--- a/src/main/java/com/google/devtools/build/lib/worker/JsonWorkerProtocol.java
+++ b/src/main/java/com/google/devtools/build/lib/worker/JsonWorkerProtocol.java
@@ -18,10 +18,12 @@
import com.google.devtools.build.lib.worker.WorkerProtocol.WorkRequest;
import com.google.devtools.build.lib.worker.WorkerProtocol.WorkResponse;
import com.google.gson.stream.JsonReader;
+import com.google.gson.stream.MalformedJsonException;
import com.google.protobuf.util.JsonFormat;
import com.google.protobuf.util.JsonFormat.Printer;
import java.io.BufferedReader;
import java.io.BufferedWriter;
+import java.io.EOFException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -55,34 +57,37 @@
Integer exitCode = null;
String output = null;
Integer requestId = null;
-
- reader.beginObject();
- while (reader.hasNext()) {
- String name = reader.nextName();
- switch (name) {
- case "exitCode":
- if (exitCode != null) {
- throw new IOException("Work response cannot have more than one exit code");
- }
- exitCode = reader.nextInt();
- break;
- case "output":
- if (output != null) {
- throw new IOException("Work response cannot have more than one output");
- }
- output = reader.nextString();
- break;
- case "requestId":
- if (requestId != null) {
- throw new IOException("Work response cannot have more than one requestId");
- }
- requestId = reader.nextInt();
- break;
- default:
- throw new IOException(name + " is an incorrect field in work response");
+ try {
+ reader.beginObject();
+ while (reader.hasNext()) {
+ String name = reader.nextName();
+ switch (name) {
+ case "exitCode":
+ if (exitCode != null) {
+ throw new IOException("Work response cannot have more than one exit code");
+ }
+ exitCode = reader.nextInt();
+ break;
+ case "output":
+ if (output != null) {
+ throw new IOException("Work response cannot have more than one output");
+ }
+ output = reader.nextString();
+ break;
+ case "requestId":
+ if (requestId != null) {
+ throw new IOException("Work response cannot have more than one requestId");
+ }
+ requestId = reader.nextInt();
+ break;
+ default:
+ throw new IOException(name + " is an incorrect field in work response");
+ }
}
- }
reader.endObject();
+ } catch (MalformedJsonException | EOFException | IllegalStateException e) {
+ throw new IOException("Could not parse json work request correctly", e);
+ }
WorkResponse.Builder responseBuilder = WorkResponse.newBuilder();
diff --git a/src/test/java/com/google/devtools/build/lib/worker/WorkerTest.java b/src/test/java/com/google/devtools/build/lib/worker/WorkerTest.java
index f380730..9b38382 100644
--- a/src/test/java/com/google/devtools/build/lib/worker/WorkerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/worker/WorkerTest.java
@@ -283,7 +283,18 @@
throws IOException {
TestWorker testWorker = createTestWorker(responseString.getBytes(UTF_8), JSON);
IOException ex = assertThrows(IOException.class, testWorker::getResponse);
- assertThat(ex).hasMessageThat().isEqualTo(expectedError);
+ assertThat(ex).hasMessageThat().contains(expectedError);
+ }
+
+ @Test
+ public void testGetResponse_json_emptyString_throws() throws IOException {
+ verifyGetResponseFailure("", "Could not parse json work request correctly");
+ }
+
+ @Test
+ public void testGetResponse_badJson_throws() throws IOException {
+ verifyGetResponseFailure(
+ "{ \"output\": \"I'm missing a bracket\"", "Could not parse json work request correctly");
}
@Test