Home | History | Annotate | Download | only in conformance
      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