1ffe3c632Sopenharmony_ci// Protocol Buffers - Google's data interchange format
2ffe3c632Sopenharmony_ci// Copyright 2008 Google Inc.  All rights reserved.
3ffe3c632Sopenharmony_ci// https://developers.google.com/protocol-buffers/
4ffe3c632Sopenharmony_ci//
5ffe3c632Sopenharmony_ci// Redistribution and use in source and binary forms, with or without
6ffe3c632Sopenharmony_ci// modification, are permitted provided that the following conditions are
7ffe3c632Sopenharmony_ci// met:
8ffe3c632Sopenharmony_ci//
9ffe3c632Sopenharmony_ci//     * Redistributions of source code must retain the above copyright
10ffe3c632Sopenharmony_ci// notice, this list of conditions and the following disclaimer.
11ffe3c632Sopenharmony_ci//     * Redistributions in binary form must reproduce the above
12ffe3c632Sopenharmony_ci// copyright notice, this list of conditions and the following disclaimer
13ffe3c632Sopenharmony_ci// in the documentation and/or other materials provided with the
14ffe3c632Sopenharmony_ci// distribution.
15ffe3c632Sopenharmony_ci//     * Neither the name of Google Inc. nor the names of its
16ffe3c632Sopenharmony_ci// contributors may be used to endorse or promote products derived from
17ffe3c632Sopenharmony_ci// this software without specific prior written permission.
18ffe3c632Sopenharmony_ci//
19ffe3c632Sopenharmony_ci// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20ffe3c632Sopenharmony_ci// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21ffe3c632Sopenharmony_ci// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22ffe3c632Sopenharmony_ci// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23ffe3c632Sopenharmony_ci// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24ffe3c632Sopenharmony_ci// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25ffe3c632Sopenharmony_ci// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26ffe3c632Sopenharmony_ci// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27ffe3c632Sopenharmony_ci// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28ffe3c632Sopenharmony_ci// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29ffe3c632Sopenharmony_ci// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30ffe3c632Sopenharmony_ci
31ffe3c632Sopenharmony_ciimport com.google.protobuf.conformance.Conformance;
32ffe3c632Sopenharmony_ciimport com.google.protobuf.InvalidProtocolBufferException;
33ffe3c632Sopenharmony_ci
34ffe3c632Sopenharmony_ciclass ConformanceJavaLite {
35ffe3c632Sopenharmony_ci  private int testCount = 0;
36ffe3c632Sopenharmony_ci
37ffe3c632Sopenharmony_ci  private boolean readFromStdin(byte[] buf, int len) throws Exception {
38ffe3c632Sopenharmony_ci    int ofs = 0;
39ffe3c632Sopenharmony_ci    while (len > 0) {
40ffe3c632Sopenharmony_ci      int read = System.in.read(buf, ofs, len);
41ffe3c632Sopenharmony_ci      if (read == -1) {
42ffe3c632Sopenharmony_ci        return false;  // EOF
43ffe3c632Sopenharmony_ci      }
44ffe3c632Sopenharmony_ci      ofs += read;
45ffe3c632Sopenharmony_ci      len -= read;
46ffe3c632Sopenharmony_ci    }
47ffe3c632Sopenharmony_ci
48ffe3c632Sopenharmony_ci    return true;
49ffe3c632Sopenharmony_ci  }
50ffe3c632Sopenharmony_ci
51ffe3c632Sopenharmony_ci  private void writeToStdout(byte[] buf) throws Exception {
52ffe3c632Sopenharmony_ci    System.out.write(buf);
53ffe3c632Sopenharmony_ci  }
54ffe3c632Sopenharmony_ci
55ffe3c632Sopenharmony_ci  // Returns -1 on EOF (the actual values will always be positive).
56ffe3c632Sopenharmony_ci  private int readLittleEndianIntFromStdin() throws Exception {
57ffe3c632Sopenharmony_ci    byte[] buf = new byte[4];
58ffe3c632Sopenharmony_ci    if (!readFromStdin(buf, 4)) {
59ffe3c632Sopenharmony_ci      return -1;
60ffe3c632Sopenharmony_ci    }
61ffe3c632Sopenharmony_ci    return (buf[0] & 0xff)
62ffe3c632Sopenharmony_ci        | ((buf[1] & 0xff) << 8)
63ffe3c632Sopenharmony_ci        | ((buf[2] & 0xff) << 16)
64ffe3c632Sopenharmony_ci        | ((buf[3] & 0xff) << 24);
65ffe3c632Sopenharmony_ci  }
66ffe3c632Sopenharmony_ci
67ffe3c632Sopenharmony_ci  private void writeLittleEndianIntToStdout(int val) throws Exception {
68ffe3c632Sopenharmony_ci    byte[] buf = new byte[4];
69ffe3c632Sopenharmony_ci    buf[0] = (byte)val;
70ffe3c632Sopenharmony_ci    buf[1] = (byte)(val >> 8);
71ffe3c632Sopenharmony_ci    buf[2] = (byte)(val >> 16);
72ffe3c632Sopenharmony_ci    buf[3] = (byte)(val >> 24);
73ffe3c632Sopenharmony_ci    writeToStdout(buf);
74ffe3c632Sopenharmony_ci  }
75ffe3c632Sopenharmony_ci
76ffe3c632Sopenharmony_ci  private Conformance.ConformanceResponse doTest(Conformance.ConformanceRequest request) {
77ffe3c632Sopenharmony_ci    Conformance.TestAllTypes testMessage;
78ffe3c632Sopenharmony_ci
79ffe3c632Sopenharmony_ci    switch (request.getPayloadCase()) {
80ffe3c632Sopenharmony_ci      case PROTOBUF_PAYLOAD: {
81ffe3c632Sopenharmony_ci        try {
82ffe3c632Sopenharmony_ci          testMessage = Conformance.TestAllTypes.parseFrom(request.getProtobufPayload());
83ffe3c632Sopenharmony_ci        } catch (InvalidProtocolBufferException e) {
84ffe3c632Sopenharmony_ci          return Conformance.ConformanceResponse.newBuilder().setParseError(e.getMessage()).build();
85ffe3c632Sopenharmony_ci        }
86ffe3c632Sopenharmony_ci        break;
87ffe3c632Sopenharmony_ci      }
88ffe3c632Sopenharmony_ci      case JSON_PAYLOAD: {
89ffe3c632Sopenharmony_ci        return Conformance.ConformanceResponse.newBuilder().setSkipped(
90ffe3c632Sopenharmony_ci            "Lite runtime does not support JSON format.").build();
91ffe3c632Sopenharmony_ci      }
92ffe3c632Sopenharmony_ci      case PAYLOAD_NOT_SET: {
93ffe3c632Sopenharmony_ci        throw new RuntimeException("Request didn't have payload.");
94ffe3c632Sopenharmony_ci      }
95ffe3c632Sopenharmony_ci
96ffe3c632Sopenharmony_ci      default: {
97ffe3c632Sopenharmony_ci        throw new RuntimeException("Unexpected payload case.");
98ffe3c632Sopenharmony_ci      }
99ffe3c632Sopenharmony_ci    }
100ffe3c632Sopenharmony_ci
101ffe3c632Sopenharmony_ci    switch (request.getRequestedOutputFormat()) {
102ffe3c632Sopenharmony_ci      case UNSPECIFIED:
103ffe3c632Sopenharmony_ci        throw new RuntimeException("Unspecified output format.");
104ffe3c632Sopenharmony_ci
105ffe3c632Sopenharmony_ci      case PROTOBUF:
106ffe3c632Sopenharmony_ci        return Conformance.ConformanceResponse.newBuilder().setProtobufPayload(testMessage.toByteString()).build();
107ffe3c632Sopenharmony_ci
108ffe3c632Sopenharmony_ci      case JSON:
109ffe3c632Sopenharmony_ci        return Conformance.ConformanceResponse.newBuilder().setSkipped(
110ffe3c632Sopenharmony_ci            "Lite runtime does not support JSON format.").build();
111ffe3c632Sopenharmony_ci
112ffe3c632Sopenharmony_ci      default: {
113ffe3c632Sopenharmony_ci        throw new RuntimeException("Unexpected request output.");
114ffe3c632Sopenharmony_ci      }
115ffe3c632Sopenharmony_ci    }
116ffe3c632Sopenharmony_ci  }
117ffe3c632Sopenharmony_ci
118ffe3c632Sopenharmony_ci  private boolean doTestIo() throws Exception {
119ffe3c632Sopenharmony_ci    int bytes = readLittleEndianIntFromStdin();
120ffe3c632Sopenharmony_ci
121ffe3c632Sopenharmony_ci    if (bytes == -1) {
122ffe3c632Sopenharmony_ci      return false;  // EOF
123ffe3c632Sopenharmony_ci    }
124ffe3c632Sopenharmony_ci
125ffe3c632Sopenharmony_ci    byte[] serializedInput = new byte[bytes];
126ffe3c632Sopenharmony_ci
127ffe3c632Sopenharmony_ci    if (!readFromStdin(serializedInput, bytes)) {
128ffe3c632Sopenharmony_ci      throw new RuntimeException("Unexpected EOF from test program.");
129ffe3c632Sopenharmony_ci    }
130ffe3c632Sopenharmony_ci
131ffe3c632Sopenharmony_ci    Conformance.ConformanceRequest request =
132ffe3c632Sopenharmony_ci        Conformance.ConformanceRequest.parseFrom(serializedInput);
133ffe3c632Sopenharmony_ci    Conformance.ConformanceResponse response = doTest(request);
134ffe3c632Sopenharmony_ci    byte[] serializedOutput = response.toByteArray();
135ffe3c632Sopenharmony_ci
136ffe3c632Sopenharmony_ci    writeLittleEndianIntToStdout(serializedOutput.length);
137ffe3c632Sopenharmony_ci    writeToStdout(serializedOutput);
138ffe3c632Sopenharmony_ci
139ffe3c632Sopenharmony_ci    return true;
140ffe3c632Sopenharmony_ci  }
141ffe3c632Sopenharmony_ci
142ffe3c632Sopenharmony_ci  public void run() throws Exception {
143ffe3c632Sopenharmony_ci    while (doTestIo()) {
144ffe3c632Sopenharmony_ci      this.testCount++;
145ffe3c632Sopenharmony_ci    }
146ffe3c632Sopenharmony_ci
147ffe3c632Sopenharmony_ci    System.err.println("ConformanceJavaLite: received EOF from test runner after " +
148ffe3c632Sopenharmony_ci        this.testCount + " tests");
149ffe3c632Sopenharmony_ci  }
150ffe3c632Sopenharmony_ci
151ffe3c632Sopenharmony_ci  public static void main(String[] args) throws Exception {
152ffe3c632Sopenharmony_ci    new ConformanceJavaLite().run();
153ffe3c632Sopenharmony_ci  }
154ffe3c632Sopenharmony_ci}
155