| OLD | NEW |
| (Empty) |
| 1 | |
| 2 import com.google.protobuf.conformance.Conformance; | |
| 3 import com.google.protobuf.InvalidProtocolBufferException; | |
| 4 | |
| 5 class ConformanceJava { | |
| 6 private int testCount = 0; | |
| 7 | |
| 8 private boolean readFromStdin(byte[] buf, int len) throws Exception { | |
| 9 int ofs = 0; | |
| 10 while (len > 0) { | |
| 11 int read = System.in.read(buf, ofs, len); | |
| 12 if (read == -1) { | |
| 13 return false; // EOF | |
| 14 } | |
| 15 ofs += read; | |
| 16 len -= read; | |
| 17 } | |
| 18 | |
| 19 return true; | |
| 20 } | |
| 21 | |
| 22 private void writeToStdout(byte[] buf) throws Exception { | |
| 23 System.out.write(buf); | |
| 24 } | |
| 25 | |
| 26 // Returns -1 on EOF (the actual values will always be positive). | |
| 27 private int readLittleEndianIntFromStdin() throws Exception { | |
| 28 byte[] buf = new byte[4]; | |
| 29 if (!readFromStdin(buf, 4)) { | |
| 30 return -1; | |
| 31 } | |
| 32 return buf[0] | (buf[1] << 1) | (buf[2] << 2) | (buf[3] << 3); | |
| 33 } | |
| 34 | |
| 35 private void writeLittleEndianIntToStdout(int val) throws Exception { | |
| 36 byte[] buf = new byte[4]; | |
| 37 buf[0] = (byte)val; | |
| 38 buf[1] = (byte)(val >> 8); | |
| 39 buf[2] = (byte)(val >> 16); | |
| 40 buf[3] = (byte)(val >> 24); | |
| 41 writeToStdout(buf); | |
| 42 } | |
| 43 | |
| 44 private Conformance.ConformanceResponse doTest(Conformance.ConformanceRequest
request) { | |
| 45 Conformance.TestAllTypes testMessage; | |
| 46 | |
| 47 switch (request.getPayloadCase()) { | |
| 48 case PROTOBUF_PAYLOAD: { | |
| 49 try { | |
| 50 testMessage = Conformance.TestAllTypes.parseFrom(request.getProtobufPa
yload()); | |
| 51 } catch (InvalidProtocolBufferException e) { | |
| 52 return Conformance.ConformanceResponse.newBuilder().setParseError(e.ge
tMessage()).build(); | |
| 53 } | |
| 54 break; | |
| 55 } | |
| 56 case JSON_PAYLOAD: { | |
| 57 return Conformance.ConformanceResponse.newBuilder().setSkipped("JSON not
yet supported.").build(); | |
| 58 } | |
| 59 case PAYLOAD_NOT_SET: { | |
| 60 throw new RuntimeException("Request didn't have payload."); | |
| 61 } | |
| 62 | |
| 63 default: { | |
| 64 throw new RuntimeException("Unexpected payload case."); | |
| 65 } | |
| 66 } | |
| 67 | |
| 68 switch (request.getRequestedOutputFormat()) { | |
| 69 case UNSPECIFIED: | |
| 70 throw new RuntimeException("Unspecified output format."); | |
| 71 | |
| 72 case PROTOBUF: | |
| 73 return Conformance.ConformanceResponse.newBuilder().setProtobufPayload(t
estMessage.toByteString()).build(); | |
| 74 | |
| 75 case JSON: | |
| 76 return Conformance.ConformanceResponse.newBuilder().setSkipped("JSON not
yet supported.").build(); | |
| 77 | |
| 78 default: { | |
| 79 throw new RuntimeException("Unexpected request output."); | |
| 80 } | |
| 81 } | |
| 82 } | |
| 83 | |
| 84 private boolean doTestIo() throws Exception { | |
| 85 int bytes = readLittleEndianIntFromStdin(); | |
| 86 | |
| 87 if (bytes == -1) { | |
| 88 return false; // EOF | |
| 89 } | |
| 90 | |
| 91 byte[] serializedInput = new byte[bytes]; | |
| 92 | |
| 93 if (!readFromStdin(serializedInput, bytes)) { | |
| 94 throw new RuntimeException("Unexpected EOF from test program."); | |
| 95 } | |
| 96 | |
| 97 Conformance.ConformanceRequest request = | |
| 98 Conformance.ConformanceRequest.parseFrom(serializedInput); | |
| 99 Conformance.ConformanceResponse response = doTest(request); | |
| 100 byte[] serializedOutput = response.toByteArray(); | |
| 101 | |
| 102 writeLittleEndianIntToStdout(serializedOutput.length); | |
| 103 writeToStdout(serializedOutput); | |
| 104 | |
| 105 return true; | |
| 106 } | |
| 107 | |
| 108 public void run() throws Exception { | |
| 109 while (doTestIo()) { | |
| 110 // Empty. | |
| 111 } | |
| 112 | |
| 113 System.err.println("ConformanceJava: received EOF from test runner after " + | |
| 114 this.testCount + " tests"); | |
| 115 } | |
| 116 | |
| 117 public static void main(String[] args) throws Exception { | |
| 118 new ConformanceJava().run(); | |
| 119 } | |
| 120 } | |
| OLD | NEW |