1*1b3f573fSAndroid Build Coastguard Worker#!/usr/bin/env ruby 2*1b3f573fSAndroid Build Coastguard Worker# 3*1b3f573fSAndroid Build Coastguard Worker# Protocol Buffers - Google's data interchange format 4*1b3f573fSAndroid Build Coastguard Worker# Copyright 2008 Google Inc. All rights reserved. 5*1b3f573fSAndroid Build Coastguard Worker# https://developers.google.com/protocol-buffers/ 6*1b3f573fSAndroid Build Coastguard Worker# 7*1b3f573fSAndroid Build Coastguard Worker# Redistribution and use in source and binary forms, with or without 8*1b3f573fSAndroid Build Coastguard Worker# modification, are permitted provided that the following conditions are 9*1b3f573fSAndroid Build Coastguard Worker# met: 10*1b3f573fSAndroid Build Coastguard Worker# 11*1b3f573fSAndroid Build Coastguard Worker# * Redistributions of source code must retain the above copyright 12*1b3f573fSAndroid Build Coastguard Worker# notice, this list of conditions and the following disclaimer. 13*1b3f573fSAndroid Build Coastguard Worker# * Redistributions in binary form must reproduce the above 14*1b3f573fSAndroid Build Coastguard Worker# copyright notice, this list of conditions and the following disclaimer 15*1b3f573fSAndroid Build Coastguard Worker# in the documentation and/or other materials provided with the 16*1b3f573fSAndroid Build Coastguard Worker# distribution. 17*1b3f573fSAndroid Build Coastguard Worker# * Neither the name of Google Inc. nor the names of its 18*1b3f573fSAndroid Build Coastguard Worker# contributors may be used to endorse or promote products derived from 19*1b3f573fSAndroid Build Coastguard Worker# this software without specific prior written permission. 20*1b3f573fSAndroid Build Coastguard Worker# 21*1b3f573fSAndroid Build Coastguard Worker# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 22*1b3f573fSAndroid Build Coastguard Worker# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 23*1b3f573fSAndroid Build Coastguard Worker# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 24*1b3f573fSAndroid Build Coastguard Worker# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 25*1b3f573fSAndroid Build Coastguard Worker# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 26*1b3f573fSAndroid Build Coastguard Worker# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27*1b3f573fSAndroid Build Coastguard Worker# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 28*1b3f573fSAndroid Build Coastguard Worker# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 29*1b3f573fSAndroid Build Coastguard Worker# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 30*1b3f573fSAndroid Build Coastguard Worker# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 31*1b3f573fSAndroid Build Coastguard Worker# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32*1b3f573fSAndroid Build Coastguard Worker 33*1b3f573fSAndroid Build Coastguard Workerrequire 'conformance_pb' 34*1b3f573fSAndroid Build Coastguard Workerrequire 'google/protobuf/test_messages_proto3_pb' 35*1b3f573fSAndroid Build Coastguard Workerrequire 'google/protobuf/test_messages_proto2_pb' 36*1b3f573fSAndroid Build Coastguard Worker 37*1b3f573fSAndroid Build Coastguard Worker$test_count = 0 38*1b3f573fSAndroid Build Coastguard Worker$verbose = false 39*1b3f573fSAndroid Build Coastguard Worker 40*1b3f573fSAndroid Build Coastguard Workerdef do_test(request) 41*1b3f573fSAndroid Build Coastguard Worker test_message = ProtobufTestMessages::Proto3::TestAllTypesProto3.new 42*1b3f573fSAndroid Build Coastguard Worker response = Conformance::ConformanceResponse.new 43*1b3f573fSAndroid Build Coastguard Worker descriptor = Google::Protobuf::DescriptorPool.generated_pool.lookup(request.message_type) 44*1b3f573fSAndroid Build Coastguard Worker 45*1b3f573fSAndroid Build Coastguard Worker unless descriptor 46*1b3f573fSAndroid Build Coastguard Worker response.skipped = "Unknown message type: " + request.message_type 47*1b3f573fSAndroid Build Coastguard Worker end 48*1b3f573fSAndroid Build Coastguard Worker 49*1b3f573fSAndroid Build Coastguard Worker begin 50*1b3f573fSAndroid Build Coastguard Worker case request.payload 51*1b3f573fSAndroid Build Coastguard Worker when :protobuf_payload 52*1b3f573fSAndroid Build Coastguard Worker begin 53*1b3f573fSAndroid Build Coastguard Worker test_message = descriptor.msgclass.decode(request.protobuf_payload) 54*1b3f573fSAndroid Build Coastguard Worker rescue Google::Protobuf::ParseError => err 55*1b3f573fSAndroid Build Coastguard Worker response.parse_error = err.message.encode('utf-8') 56*1b3f573fSAndroid Build Coastguard Worker return response 57*1b3f573fSAndroid Build Coastguard Worker end 58*1b3f573fSAndroid Build Coastguard Worker 59*1b3f573fSAndroid Build Coastguard Worker when :json_payload 60*1b3f573fSAndroid Build Coastguard Worker begin 61*1b3f573fSAndroid Build Coastguard Worker options = {} 62*1b3f573fSAndroid Build Coastguard Worker if request.test_category == :JSON_IGNORE_UNKNOWN_PARSING_TEST 63*1b3f573fSAndroid Build Coastguard Worker options[:ignore_unknown_fields] = true 64*1b3f573fSAndroid Build Coastguard Worker end 65*1b3f573fSAndroid Build Coastguard Worker test_message = descriptor.msgclass.decode_json(request.json_payload, options) 66*1b3f573fSAndroid Build Coastguard Worker rescue Google::Protobuf::ParseError => err 67*1b3f573fSAndroid Build Coastguard Worker response.parse_error = err.message.encode('utf-8') 68*1b3f573fSAndroid Build Coastguard Worker return response 69*1b3f573fSAndroid Build Coastguard Worker end 70*1b3f573fSAndroid Build Coastguard Worker 71*1b3f573fSAndroid Build Coastguard Worker when :text_payload 72*1b3f573fSAndroid Build Coastguard Worker begin 73*1b3f573fSAndroid Build Coastguard Worker response.skipped = "Ruby doesn't support text format" 74*1b3f573fSAndroid Build Coastguard Worker return response 75*1b3f573fSAndroid Build Coastguard Worker end 76*1b3f573fSAndroid Build Coastguard Worker 77*1b3f573fSAndroid Build Coastguard Worker when nil 78*1b3f573fSAndroid Build Coastguard Worker fail "Request didn't have payload" 79*1b3f573fSAndroid Build Coastguard Worker end 80*1b3f573fSAndroid Build Coastguard Worker 81*1b3f573fSAndroid Build Coastguard Worker case request.requested_output_format 82*1b3f573fSAndroid Build Coastguard Worker when :UNSPECIFIED 83*1b3f573fSAndroid Build Coastguard Worker fail 'Unspecified output format' 84*1b3f573fSAndroid Build Coastguard Worker 85*1b3f573fSAndroid Build Coastguard Worker when :PROTOBUF 86*1b3f573fSAndroid Build Coastguard Worker begin 87*1b3f573fSAndroid Build Coastguard Worker response.protobuf_payload = test_message.to_proto 88*1b3f573fSAndroid Build Coastguard Worker rescue Google::Protobuf::ParseError => err 89*1b3f573fSAndroid Build Coastguard Worker response.serialize_error = err.message.encode('utf-8') 90*1b3f573fSAndroid Build Coastguard Worker end 91*1b3f573fSAndroid Build Coastguard Worker 92*1b3f573fSAndroid Build Coastguard Worker when :JSON 93*1b3f573fSAndroid Build Coastguard Worker begin 94*1b3f573fSAndroid Build Coastguard Worker response.json_payload = test_message.to_json 95*1b3f573fSAndroid Build Coastguard Worker rescue Google::Protobuf::ParseError => err 96*1b3f573fSAndroid Build Coastguard Worker response.serialize_error = err.message.encode('utf-8') 97*1b3f573fSAndroid Build Coastguard Worker end 98*1b3f573fSAndroid Build Coastguard Worker 99*1b3f573fSAndroid Build Coastguard Worker when nil 100*1b3f573fSAndroid Build Coastguard Worker fail "Request didn't have requested output format" 101*1b3f573fSAndroid Build Coastguard Worker end 102*1b3f573fSAndroid Build Coastguard Worker rescue StandardError => err 103*1b3f573fSAndroid Build Coastguard Worker response.runtime_error = err.message.encode('utf-8') 104*1b3f573fSAndroid Build Coastguard Worker end 105*1b3f573fSAndroid Build Coastguard Worker 106*1b3f573fSAndroid Build Coastguard Worker response 107*1b3f573fSAndroid Build Coastguard Workerend 108*1b3f573fSAndroid Build Coastguard Worker 109*1b3f573fSAndroid Build Coastguard Worker# Returns true if the test ran successfully, false on legitimate EOF. 110*1b3f573fSAndroid Build Coastguard Worker# If EOF is encountered in an unexpected place, raises IOError. 111*1b3f573fSAndroid Build Coastguard Workerdef do_test_io 112*1b3f573fSAndroid Build Coastguard Worker length_bytes = STDIN.read(4) 113*1b3f573fSAndroid Build Coastguard Worker return false if length_bytes.nil? 114*1b3f573fSAndroid Build Coastguard Worker 115*1b3f573fSAndroid Build Coastguard Worker length = length_bytes.unpack('V').first 116*1b3f573fSAndroid Build Coastguard Worker serialized_request = STDIN.read(length) 117*1b3f573fSAndroid Build Coastguard Worker if serialized_request.nil? || serialized_request.length != length 118*1b3f573fSAndroid Build Coastguard Worker fail IOError 119*1b3f573fSAndroid Build Coastguard Worker end 120*1b3f573fSAndroid Build Coastguard Worker 121*1b3f573fSAndroid Build Coastguard Worker request = Conformance::ConformanceRequest.decode(serialized_request) 122*1b3f573fSAndroid Build Coastguard Worker 123*1b3f573fSAndroid Build Coastguard Worker response = do_test(request) 124*1b3f573fSAndroid Build Coastguard Worker 125*1b3f573fSAndroid Build Coastguard Worker serialized_response = Conformance::ConformanceResponse.encode(response) 126*1b3f573fSAndroid Build Coastguard Worker STDOUT.write([serialized_response.length].pack('V')) 127*1b3f573fSAndroid Build Coastguard Worker STDOUT.write(serialized_response) 128*1b3f573fSAndroid Build Coastguard Worker STDOUT.flush 129*1b3f573fSAndroid Build Coastguard Worker 130*1b3f573fSAndroid Build Coastguard Worker if $verbose 131*1b3f573fSAndroid Build Coastguard Worker STDERR.puts("conformance_ruby: request=#{request.to_json}, " \ 132*1b3f573fSAndroid Build Coastguard Worker "response=#{response.to_json}\n") 133*1b3f573fSAndroid Build Coastguard Worker end 134*1b3f573fSAndroid Build Coastguard Worker 135*1b3f573fSAndroid Build Coastguard Worker $test_count += 1 136*1b3f573fSAndroid Build Coastguard Worker 137*1b3f573fSAndroid Build Coastguard Worker true 138*1b3f573fSAndroid Build Coastguard Workerend 139*1b3f573fSAndroid Build Coastguard Worker 140*1b3f573fSAndroid Build Coastguard Workerloop do 141*1b3f573fSAndroid Build Coastguard Worker unless do_test_io 142*1b3f573fSAndroid Build Coastguard Worker STDERR.puts('conformance_ruby: received EOF from test runner ' \ 143*1b3f573fSAndroid Build Coastguard Worker "after #{$test_count} tests, exiting") 144*1b3f573fSAndroid Build Coastguard Worker break 145*1b3f573fSAndroid Build Coastguard Worker end 146*1b3f573fSAndroid Build Coastguard Workerend 147