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