11 import com.
google.protobuf_test_messages.proto2.TestMessagesProto2;
12 import com.
google.protobuf_test_messages.proto2.TestMessagesProto2.TestAllTypesProto2;
13 import com.
google.protobuf_test_messages.proto3.TestMessagesProto3;
14 import com.
google.protobuf_test_messages.proto3.TestMessagesProto3.TestAllTypesProto3;
15 import java.nio.ByteBuffer;
16 import java.util.ArrayList;
18 class ConformanceJava {
19 private int testCount = 0;
22 private boolean readFromStdin(
byte[]
buf,
int len)
throws Exception {
25 int read = System.in.read(
buf, ofs,
len);
36 private void writeToStdout(
byte[]
buf)
throws Exception {
37 System.out.write(
buf);
41 private int readLittleEndianIntFromStdin() throws Exception {
42 byte[]
buf =
new byte[4];
43 if (!readFromStdin(
buf, 4)) {
46 return (
buf[0] & 0xff)
47 | ((
buf[1] & 0xff) << 8)
48 | ((
buf[2] & 0xff) << 16)
49 | ((
buf[3] & 0xff) << 24);
52 private void writeLittleEndianIntToStdout(
int val)
throws Exception {
53 byte[]
buf =
new byte[4];
76 case BTYE_STRING_DECODER:
78 case BYTE_ARRAY_DECODER:
79 return parser.parseFrom(
bytes.toByteArray(), extensions);
80 case ARRAY_BYTE_BUFFER_DECODER: {
81 ByteBuffer
buffer = ByteBuffer.allocate(
bytes.size());
90 case READONLY_ARRAY_BYTE_BUFFER_DECODER: {
98 case DIRECT_BYTE_BUFFER_DECODER: {
99 ByteBuffer
buffer = ByteBuffer.allocateDirect(
bytes.size());
108 case READONLY_DIRECT_BYTE_BUFFER_DECODER: {
109 ByteBuffer
buffer = ByteBuffer.allocateDirect(
bytes.size());
119 case INPUT_STREAM_DECODER: {
121 return parser.parseFrom(
bytes.newInput(), extensions);
132 private <MessageType extends AbstractMessage> MessageType parseBinary(
135 ArrayList <MessageType> messages =
new ArrayList <MessageType> ();
136 ArrayList <InvalidProtocolBufferException> exceptions =
137 new ArrayList <InvalidProtocolBufferException>();
139 for (
int i = 0;
i < BinaryDecoderType.values().
length;
i++) {
141 exceptions.add(
null);
143 BinaryDecoder <MessageType>
decoder =
new BinaryDecoder <MessageType> ();
145 boolean hasMessage =
false;
146 boolean hasException =
false;
147 for (
int i = 0;
i < BinaryDecoderType.values().
length; ++
i) {
153 exceptions.set(
i, e);
158 if (hasMessage && hasException) {
160 new StringBuilder(
"Binary decoders disagreed on whether the payload was valid.\n");
161 for (
int i = 0;
i < BinaryDecoderType.values().
length; ++
i) {
162 sb.append(BinaryDecoderType.values()[
i].name());
163 if (messages.get(
i) !=
null) {
164 sb.append(
" accepted the payload.\n");
166 sb.append(
" rejected the payload.\n");
169 throw new RuntimeException(
sb.toString());
175 throw exceptions.get(0);
180 boolean allEqual =
true;
181 for (
int i = 1;
i < messages.size(); ++
i) {
182 if (!messages.get(0).equals(messages.get(
i))) {
190 StringBuilder
sb =
new StringBuilder();
191 for (
int i = 0;
i < messages.size() - 1; ++
i) {
192 for (
int j =
i + 1; j < messages.size(); ++j) {
193 if (!messages.get(
i).equals(messages.get(j))) {
194 sb.append(BinaryDecoderType.values()[
i].name())
196 .append(BinaryDecoderType.values()[j].name())
197 .append(
" parsed the payload differently.\n");
201 throw new RuntimeException(
sb.toString());
204 return messages.get(0);
207 private Conformance.ConformanceResponse doTest(Conformance.ConformanceRequest request) {
209 boolean isProto3 = request.getMessageType().
equals(
"protobuf_test_messages.proto3.TestAllTypesProto3");
210 boolean isProto2 = request.getMessageType().equals(
"protobuf_test_messages.proto2.TestAllTypesProto2");
212 switch (request.getPayloadCase()) {
213 case PROTOBUF_PAYLOAD: {
217 TestMessagesProto3.registerAllExtensions(extensions);
218 testMessage = parseBinary(request.getProtobufPayload(), TestAllTypesProto3.parser(), extensions);
220 return Conformance.ConformanceResponse.newBuilder().setParseError(e.getMessage()).build();
222 }
else if (isProto2) {
225 TestMessagesProto2.registerAllExtensions(extensions);
226 testMessage = parseBinary(request.getProtobufPayload(), TestAllTypesProto2.parser(), extensions);
228 return Conformance.ConformanceResponse.newBuilder().setParseError(e.getMessage()).build();
231 throw new RuntimeException(
"Protobuf request doesn't have specific payload type.");
237 TestMessagesProto3.TestAllTypesProto3.Builder builder =
238 TestMessagesProto3.TestAllTypesProto3.newBuilder();
240 if (request.getTestCategory()
241 == Conformance.TestCategory.JSON_IGNORE_UNKNOWN_PARSING_TEST) {
244 parser.merge(request.getJsonPayload(), builder);
245 testMessage = builder.build();
247 return Conformance.ConformanceResponse.newBuilder().setParseError(e.getMessage()).build();
254 TestMessagesProto3.TestAllTypesProto3.Builder builder =
255 TestMessagesProto3.TestAllTypesProto3.newBuilder();
257 testMessage = builder.build();
259 return Conformance.ConformanceResponse.newBuilder()
260 .setParseError(e.getMessage())
263 }
else if (isProto2) {
265 TestMessagesProto2.TestAllTypesProto2.Builder builder =
266 TestMessagesProto2.TestAllTypesProto2.newBuilder();
268 testMessage = builder.build();
270 return Conformance.ConformanceResponse.newBuilder()
271 .setParseError(e.getMessage())
275 throw new RuntimeException(
"Protobuf request doesn't have specific payload type.");
279 case PAYLOAD_NOT_SET: {
280 throw new RuntimeException(
"Request didn't have payload.");
284 throw new RuntimeException(
"Unexpected payload case.");
288 switch (request.getRequestedOutputFormat()) {
290 throw new RuntimeException(
"Unspecified output format.");
293 ByteString MessageString = testMessage.toByteString();
294 return Conformance.ConformanceResponse.newBuilder().setProtobufPayload(MessageString).build();
299 return Conformance.ConformanceResponse.newBuilder().setJsonPayload(
302 return Conformance.ConformanceResponse.newBuilder().setSerializeError(
303 e.getMessage()).build();
307 return Conformance.ConformanceResponse.newBuilder().setTextPayload(
311 throw new RuntimeException(
"Unexpected request output.");
316 private boolean doTestIo() throws Exception {
317 int bytes = readLittleEndianIntFromStdin();
323 byte[] serializedInput =
new byte[
bytes];
325 if (!readFromStdin(serializedInput,
bytes)) {
326 throw new RuntimeException(
"Unexpected EOF from test program.");
329 Conformance.ConformanceRequest request =
330 Conformance.ConformanceRequest.parseFrom(serializedInput);
331 Conformance.ConformanceResponse
response = doTest(request);
332 byte[] serializedOutput =
response.toByteArray();
334 writeLittleEndianIntToStdout(serializedOutput.length);
335 writeToStdout(serializedOutput);
340 public void run() throws Exception {
342 TestMessagesProto3.TestAllTypesProto3.getDescriptor()).
build();
347 System.err.println(
"ConformanceJava: received EOF from test runner after " +
348 this.testCount +
" tests");
351 public static void main(String[]
args)
throws Exception {
352 new ConformanceJava().run();