xref: /aosp_15_r20/external/protobuf/conformance/conformance_ruby.rb (revision 1b3f573f81763fcece89efc2b6a5209149e44ab8)
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