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