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