blob: 121dc7d1b6a1757b22537d00a2abcb485a081f91 [file] [log] [blame]
Jisi Liu3b3c8ab2016-03-30 11:39:59 -07001
2import com.google.protobuf.conformance.Conformance;
3import com.google.protobuf.InvalidProtocolBufferException;
4
5class ConformanceJavaLite {
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] & 0xff)
33 | ((buf[1] & 0xff) << 8)
34 | ((buf[2] & 0xff) << 16)
35 | ((buf[3] & 0xff) << 24);
36 }
37
38 private void writeLittleEndianIntToStdout(int val) throws Exception {
39 byte[] buf = new byte[4];
40 buf[0] = (byte)val;
41 buf[1] = (byte)(val >> 8);
42 buf[2] = (byte)(val >> 16);
43 buf[3] = (byte)(val >> 24);
44 writeToStdout(buf);
45 }
46
47 private Conformance.ConformanceResponse doTest(Conformance.ConformanceRequest request) {
48 Conformance.TestAllTypes testMessage;
49
50 switch (request.getPayloadCase()) {
51 case PROTOBUF_PAYLOAD: {
52 try {
53 testMessage = Conformance.TestAllTypes.parseFrom(request.getProtobufPayload());
54 } catch (InvalidProtocolBufferException e) {
55 return Conformance.ConformanceResponse.newBuilder().setParseError(e.getMessage()).build();
56 }
57 break;
58 }
59 case JSON_PAYLOAD: {
60 return Conformance.ConformanceResponse.newBuilder().setSkipped(
61 "Lite runtime does not suport Json Formant.").build();
62 }
63 case PAYLOAD_NOT_SET: {
64 throw new RuntimeException("Request didn't have payload.");
65 }
66
67 default: {
68 throw new RuntimeException("Unexpected payload case.");
69 }
70 }
71
72 switch (request.getRequestedOutputFormat()) {
73 case UNSPECIFIED:
74 throw new RuntimeException("Unspecified output format.");
75
76 case PROTOBUF:
77 return Conformance.ConformanceResponse.newBuilder().setProtobufPayload(testMessage.toByteString()).build();
78
79 case JSON:
80 return Conformance.ConformanceResponse.newBuilder().setSkipped(
81 "Lite runtime does not suport Json Formant.").build();
82
83 default: {
84 throw new RuntimeException("Unexpected request output.");
85 }
86 }
87 }
88
89 private boolean doTestIo() throws Exception {
90 int bytes = readLittleEndianIntFromStdin();
91
92 if (bytes == -1) {
93 return false; // EOF
94 }
95
96 byte[] serializedInput = new byte[bytes];
97
98 if (!readFromStdin(serializedInput, bytes)) {
99 throw new RuntimeException("Unexpected EOF from test program.");
100 }
101
102 Conformance.ConformanceRequest request =
103 Conformance.ConformanceRequest.parseFrom(serializedInput);
104 Conformance.ConformanceResponse response = doTest(request);
105 byte[] serializedOutput = response.toByteArray();
106
107 writeLittleEndianIntToStdout(serializedOutput.length);
108 writeToStdout(serializedOutput);
109
110 return true;
111 }
112
113 public void run() throws Exception {
114 while (doTestIo()) {
115 this.testCount++;
116 }
117
118 System.err.println("ConformanceJavaLite: received EOF from test runner after " +
119 this.testCount + " tests");
120 }
121
122 public static void main(String[] args) throws Exception {
123 new ConformanceJavaLite().run();
124 }
125}