11# frozen_string_literal: true
22
33require "test_helper"
4+ require 'zlib'
45require_relative "echo_pb"
56require_relative "echo_services_pb"
67
8+
79class TestGrpc < HyperRubyTest
810 def test_grpc_request
911 buffer = String . new ( capacity : 1024 )
@@ -129,6 +131,28 @@ def test_grpc_over_unix_socket
129131 end
130132 end
131133
134+ def test_grpc_compression
135+ buffer = String . new ( capacity : 1024 )
136+ compression_options = GRPC ::Core ::CompressionOptions . new ( default_algorithm : :gzip )
137+ compression_channel_args = compression_options . to_channel_arg_hash
138+
139+ with_server ( -> ( request ) { handler_grpc_compressed ( request , buffer ) } ) do |_client |
140+ stub = Echo ::Echo ::Stub . new (
141+ "127.0.0.1:3010" ,
142+ :this_channel_is_insecure ,
143+ channel_args : {
144+ 'grpc.enable_http_proxy' => 0 ,
145+ } . merge ( compression_channel_args )
146+ )
147+
148+ request = Echo ::EchoRequest . new ( message : "Hello Compressed GRPC " + ( "a" * 10000 ) )
149+ response = stub . echo ( request )
150+
151+ assert_instance_of Echo ::EchoResponse , response
152+ assert_equal "Decompressed: Hello Compressed GRPC " + ( "a" * 10000 ) , response . message
153+ end
154+ end
155+
132156 private
133157
134158 def handler_grpc ( request , buffer )
@@ -185,4 +209,26 @@ def handler_grpc_status(request)
185209 HyperRuby ::GrpcResponse . error ( 2 , "unknown error" ) # UNKNOWN = 2
186210 end
187211 end
212+
213+ def handler_grpc_compressed ( request , buffer )
214+ assert_equal "application/grpc" , request . header ( "content-type" )
215+ assert_equal "echo.Echo" , request . service
216+ assert_equal "Echo" , request . method
217+ # Check if the message is compressed
218+ assert request . compressed? , "Expected request to be compressed"
219+
220+ # Get the compressed message
221+ request . fill_body ( buffer )
222+
223+ decompressed = Zlib . gunzip ( buffer )
224+ echo_request = Echo ::EchoRequest . decode ( decompressed )
225+
226+ echo_response = Echo ::EchoResponse . new ( message : "Decompressed: #{ echo_request . message } " )
227+ response_data = Echo ::EchoResponse . encode ( echo_response )
228+
229+ HyperRuby ::GrpcResponse . new ( 0 , response_data )
230+ rescue => e
231+ pp e
232+ raise e
233+ end
188234end
0 commit comments