| # Copyright 2020 gRPC authors. |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| |
| require 'spec_helper' |
| |
| # a test service that checks the cert of its peer |
| class UserAgentEchoService |
| include GRPC::GenericService |
| rpc :an_rpc, EchoMsg, EchoMsg |
| |
| def an_rpc(_req, call) |
| EchoMsg.new(msg: call.metadata['user-agent']) |
| end |
| end |
| |
| UserAgentEchoServiceStub = UserAgentEchoService.rpc_stub_class |
| |
| describe 'user agent' do |
| RpcServer = GRPC::RpcServer |
| |
| before(:all) do |
| server_opts = { |
| poll_period: 1 |
| } |
| @srv = new_rpc_server_for_testing(**server_opts) |
| @port = @srv.add_http2_port('0.0.0.0:0', :this_port_is_insecure) |
| @srv.handle(UserAgentEchoService) |
| @srv_thd = Thread.new { @srv.run } |
| @srv.wait_till_running |
| end |
| |
| after(:all) do |
| expect(@srv.stopped?).to be(false) |
| @srv.stop |
| @srv_thd.join |
| end |
| |
| it 'client sends expected user agent' do |
| stub = UserAgentEchoServiceStub.new("localhost:#{@port}", |
| :this_channel_is_insecure, |
| channel_args: {}) |
| response = stub.an_rpc(EchoMsg.new) |
| expected_user_agent_prefix = "grpc-ruby/#{GRPC::VERSION}" |
| expect(response.msg.start_with?(expected_user_agent_prefix)).to be true |
| # check that the expected user agent prefix occurs in the real user agent exactly once |
| expect(response.msg.split(expected_user_agent_prefix).size).to eq 2 |
| end |
| |
| it 'user agent header does not grow when the same channel args hash is used across multiple stubs' do |
| shared_channel_args_hash = {} |
| 10.times do |
| stub = UserAgentEchoServiceStub.new("localhost:#{@port}", |
| :this_channel_is_insecure, |
| channel_args: shared_channel_args_hash) |
| response = stub.an_rpc(EchoMsg.new) |
| puts "got echo response: #{response.msg}" |
| expected_user_agent_prefix = "grpc-ruby/#{GRPC::VERSION}" |
| expect(response.msg.start_with?(expected_user_agent_prefix)).to be true |
| # check that the expected user agent prefix occurs in the real user agent exactly once |
| expect(response.msg.split(expected_user_agent_prefix).size).to eq 2 |
| end |
| end |
| end |