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 {
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:
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: {
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++) {
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) {
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());
180 boolean allEqual =
true;
181 for (
int i = 1;
i < messages.size(); ++
i) {
182 if (!messages.get(0).equals(messages.get(
i))) {
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();
241 == Conformance.TestCategory.JSON_IGNORE_UNKNOWN_PARSING_TEST) {
247 return Conformance.ConformanceResponse.newBuilder().setParseError(
e.getMessage()).build();
254 TestMessagesProto3.TestAllTypesProto3.Builder
builder =
255 TestMessagesProto3.TestAllTypesProto3.newBuilder();
259 return Conformance.ConformanceResponse.newBuilder()
260 .setParseError(
e.getMessage())
263 }
else if (isProto2) {
265 TestMessagesProto2.TestAllTypesProto2.Builder
builder =
266 TestMessagesProto2.TestAllTypesProto2.newBuilder();
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);
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();