41 import com.
google.protobuf_test_messages.proto2.TestMessagesProto2;
42 import com.
google.protobuf_test_messages.proto2.TestMessagesProto2.TestAllTypesProto2;
43 import com.
google.protobuf_test_messages.proto3.TestMessagesProto3;
44 import com.
google.protobuf_test_messages.proto3.TestMessagesProto3.TestAllTypesProto3;
45 import java.nio.ByteBuffer;
46 import java.util.ArrayList;
48 class ConformanceJava {
49 private int testCount = 0;
52 private boolean readFromStdin(
byte[]
buf,
int len)
throws Exception {
66 private void writeToStdout(
byte[]
buf)
throws Exception {
67 System.out.write(
buf);
71 private int readLittleEndianIntFromStdin() throws Exception {
72 byte[]
buf =
new byte[4];
73 if (!readFromStdin(
buf, 4)) {
76 return (
buf[0] & 0xff)
77 | ((
buf[1] & 0xff) << 8)
78 | ((
buf[2] & 0xff) << 16)
79 | ((
buf[3] & 0xff) << 24);
82 private void writeLittleEndianIntToStdout(
int val)
throws Exception {
83 byte[]
buf =
new byte[4];
91 private enum BinaryDecoderType {
94 ARRAY_BYTE_BUFFER_DECODER,
95 READONLY_ARRAY_BYTE_BUFFER_DECODER,
96 DIRECT_BYTE_BUFFER_DECODER,
97 READONLY_DIRECT_BYTE_BUFFER_DECODER,
106 case BTYE_STRING_DECODER:
107 case BYTE_ARRAY_DECODER:
109 case ARRAY_BYTE_BUFFER_DECODER:
111 ByteBuffer
buffer = ByteBuffer.allocate(
bytes.size());
116 case READONLY_ARRAY_BYTE_BUFFER_DECODER:
121 case DIRECT_BYTE_BUFFER_DECODER:
123 ByteBuffer
buffer = ByteBuffer.allocateDirect(
bytes.size());
128 case READONLY_DIRECT_BYTE_BUFFER_DECODER:
130 ByteBuffer
buffer = ByteBuffer.allocateDirect(
bytes.size());
136 case INPUT_STREAM_DECODER:
145 private <T extends AbstractMessage>
T parseBinary(
148 ArrayList<T> messages =
new ArrayList<>();
149 ArrayList<InvalidProtocolBufferException>
exceptions =
new ArrayList<>();
151 for (
int i = 0;
i < BinaryDecoderType.values().
length;
i++) {
155 if (messages.isEmpty()) {
156 throw new RuntimeException(
"binary decoder types missing");
159 BinaryDecoder<T> decoder =
new BinaryDecoder<>();
161 boolean hasMessage =
false;
162 boolean hasException =
false;
163 for (
int i = 0;
i < BinaryDecoderType.values().
length; ++
i) {
174 if (hasMessage && hasException) {
176 new StringBuilder(
"Binary decoders disagreed on whether the payload was valid.\n");
177 for (
int i = 0;
i < BinaryDecoderType.values().
length; ++
i) {
178 sb.append(BinaryDecoderType.values()[
i].name());
179 if (messages.get(
i) !=
null) {
180 sb.append(
" accepted the payload.\n");
182 sb.append(
" rejected the payload.\n");
185 throw new RuntimeException(sb.toString());
193 if (exception !=
null) {
194 exception.addSuppressed(e);
204 boolean allEqual =
true;
205 for (
int i = 1;
i < messages.size(); ++
i) {
206 if (!messages.get(0).equals(messages.get(
i))) {
215 for (
int i = 0;
i < messages.size() - 1; ++
i) {
216 for (
int j =
i + 1;
j < messages.size(); ++
j) {
217 if (!messages.get(
i).equals(messages.get(j))) {
218 sb.append(BinaryDecoderType.values()[
i].name())
220 .append(BinaryDecoderType.values()[j].name())
221 .append(
" parsed the payload differently.\n");
225 throw new RuntimeException(sb.toString());
228 return messages.get(0);
231 private Conformance.ConformanceResponse doTest(Conformance.ConformanceRequest
request) {
234 request.getMessageType().equals(
"protobuf_test_messages.proto3.TestAllTypesProto3");
236 request.getMessageType().equals(
"protobuf_test_messages.proto2.TestAllTypesProto2");
238 switch (
request.getPayloadCase()) {
239 case PROTOBUF_PAYLOAD:
244 TestMessagesProto3.registerAllExtensions(
extensions);
249 return Conformance.ConformanceResponse.newBuilder()
250 .setParseError(
e.getMessage())
253 }
else if (isProto2) {
256 TestMessagesProto2.registerAllExtensions(
extensions);
261 return Conformance.ConformanceResponse.newBuilder()
262 .setParseError(
e.getMessage())
266 throw new RuntimeException(
"Protobuf request doesn't have specific payload type.");
275 == Conformance.TestCategory.JSON_IGNORE_UNKNOWN_PARSING_TEST) {
279 TestMessagesProto3.TestAllTypesProto3.Builder
builder =
280 TestMessagesProto3.TestAllTypesProto3.newBuilder();
283 }
else if (isProto2) {
284 TestMessagesProto2.TestAllTypesProto2.Builder
builder =
285 TestMessagesProto2.TestAllTypesProto2.newBuilder();
289 throw new RuntimeException(
"Protobuf request doesn't have specific payload type.");
292 return Conformance.ConformanceResponse.newBuilder()
293 .setParseError(
e.getMessage())
302 TestMessagesProto3.TestAllTypesProto3.Builder
builder =
303 TestMessagesProto3.TestAllTypesProto3.newBuilder();
307 return Conformance.ConformanceResponse.newBuilder()
308 .setParseError(
e.getMessage())
311 }
else if (isProto2) {
313 TestMessagesProto2.TestAllTypesProto2.Builder
builder =
314 TestMessagesProto2.TestAllTypesProto2.newBuilder();
318 return Conformance.ConformanceResponse.newBuilder()
319 .setParseError(
e.getMessage())
323 throw new RuntimeException(
"Protobuf request doesn't have specific payload type.");
327 case PAYLOAD_NOT_SET:
329 throw new RuntimeException(
"Request didn't have payload.");
334 throw new RuntimeException(
"Unexpected payload case.");
338 switch (
request.getRequestedOutputFormat()) {
340 throw new RuntimeException(
"Unspecified output format.");
344 ByteString messageString = testMessage.toByteString();
345 return Conformance.ConformanceResponse.newBuilder()
346 .setProtobufPayload(messageString)
352 return Conformance.ConformanceResponse.newBuilder()
357 return Conformance.ConformanceResponse.newBuilder()
358 .setSerializeError(
e.getMessage())
363 return Conformance.ConformanceResponse.newBuilder()
369 throw new RuntimeException(
"Unexpected request output.");
374 private boolean doTestIo() throws Exception {
375 int bytes = readLittleEndianIntFromStdin();
381 byte[] serializedInput =
new byte[
bytes];
383 if (!readFromStdin(serializedInput,
bytes)) {
384 throw new RuntimeException(
"Unexpected EOF from test program.");
387 Conformance.ConformanceRequest
request =
388 Conformance.ConformanceRequest.parseFrom(serializedInput);
390 byte[] serializedOutput =
response.toByteArray();
392 writeLittleEndianIntToStdout(serializedOutput.length);
393 writeToStdout(serializedOutput);
398 public void run() throws Exception {
401 .
add(TestMessagesProto3.TestAllTypesProto3.getDescriptor())
408 "ConformanceJava: received EOF from test runner after " + this.testCount +
" tests");
411 public static void main(String[]
args)
throws Exception {
412 new ConformanceJava().run();