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