xref: /aosp_15_r20/external/grpc-grpc/src/ruby/spec/channel_spec.rb (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker# Copyright 2015 gRPC authors.
2*cc02d7e2SAndroid Build Coastguard Worker#
3*cc02d7e2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*cc02d7e2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*cc02d7e2SAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*cc02d7e2SAndroid Build Coastguard Worker#
7*cc02d7e2SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*cc02d7e2SAndroid Build Coastguard Worker#
9*cc02d7e2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*cc02d7e2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*cc02d7e2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*cc02d7e2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*cc02d7e2SAndroid Build Coastguard Worker# limitations under the License.
14*cc02d7e2SAndroid Build Coastguard Worker
15*cc02d7e2SAndroid Build Coastguard Workerrequire 'spec_helper'
16*cc02d7e2SAndroid Build Coastguard Workerrequire 'English'
17*cc02d7e2SAndroid Build Coastguard Worker
18*cc02d7e2SAndroid Build Coastguard Workerdef load_test_certs
19*cc02d7e2SAndroid Build Coastguard Worker  test_root = File.join(File.dirname(__FILE__), 'testdata')
20*cc02d7e2SAndroid Build Coastguard Worker  files = ['ca.pem', 'server1.key', 'server1.pem']
21*cc02d7e2SAndroid Build Coastguard Worker  files.map { |f| File.open(File.join(test_root, f)).read }
22*cc02d7e2SAndroid Build Coastguard Workerend
23*cc02d7e2SAndroid Build Coastguard Worker
24*cc02d7e2SAndroid Build Coastguard Workerdescribe GRPC::Core::Channel do
25*cc02d7e2SAndroid Build Coastguard Worker  let(:fake_host) { 'localhost:0' }
26*cc02d7e2SAndroid Build Coastguard Worker
27*cc02d7e2SAndroid Build Coastguard Worker  def create_test_cert
28*cc02d7e2SAndroid Build Coastguard Worker    GRPC::Core::ChannelCredentials.new(load_test_certs[0])
29*cc02d7e2SAndroid Build Coastguard Worker  end
30*cc02d7e2SAndroid Build Coastguard Worker
31*cc02d7e2SAndroid Build Coastguard Worker  shared_examples '#new' do
32*cc02d7e2SAndroid Build Coastguard Worker    it 'take a host name without channel args' do
33*cc02d7e2SAndroid Build Coastguard Worker      blk = proc do
34*cc02d7e2SAndroid Build Coastguard Worker        GRPC::Core::Channel.new('phony_host', nil, :this_channel_is_insecure)
35*cc02d7e2SAndroid Build Coastguard Worker      end
36*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).not_to raise_error
37*cc02d7e2SAndroid Build Coastguard Worker    end
38*cc02d7e2SAndroid Build Coastguard Worker
39*cc02d7e2SAndroid Build Coastguard Worker    it 'does not take a hash with bad keys as channel args' do
40*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args(Object.new => 1)
41*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to raise_error TypeError
42*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args(1 => 1)
43*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to raise_error TypeError
44*cc02d7e2SAndroid Build Coastguard Worker    end
45*cc02d7e2SAndroid Build Coastguard Worker
46*cc02d7e2SAndroid Build Coastguard Worker    it 'does not take a hash with bad values as channel args' do
47*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args(symbol: Object.new)
48*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to raise_error TypeError
49*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args('1' => {})
50*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to raise_error TypeError
51*cc02d7e2SAndroid Build Coastguard Worker    end
52*cc02d7e2SAndroid Build Coastguard Worker
53*cc02d7e2SAndroid Build Coastguard Worker    it 'can take a hash with a symbol key as channel args' do
54*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args(a_symbol: 1)
55*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
56*cc02d7e2SAndroid Build Coastguard Worker    end
57*cc02d7e2SAndroid Build Coastguard Worker
58*cc02d7e2SAndroid Build Coastguard Worker    it 'can take a hash with a string key as channel args' do
59*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args('a_symbol' => 1)
60*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
61*cc02d7e2SAndroid Build Coastguard Worker    end
62*cc02d7e2SAndroid Build Coastguard Worker
63*cc02d7e2SAndroid Build Coastguard Worker    it 'can take a hash with a string value as channel args' do
64*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args(a_symbol: '1')
65*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
66*cc02d7e2SAndroid Build Coastguard Worker    end
67*cc02d7e2SAndroid Build Coastguard Worker
68*cc02d7e2SAndroid Build Coastguard Worker    it 'can take a hash with a symbol value as channel args' do
69*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args(a_symbol: :another_symbol)
70*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
71*cc02d7e2SAndroid Build Coastguard Worker    end
72*cc02d7e2SAndroid Build Coastguard Worker
73*cc02d7e2SAndroid Build Coastguard Worker    it 'can take a hash with a numeric value as channel args' do
74*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args(a_symbol: 1)
75*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
76*cc02d7e2SAndroid Build Coastguard Worker    end
77*cc02d7e2SAndroid Build Coastguard Worker
78*cc02d7e2SAndroid Build Coastguard Worker    it 'can take a hash with many args as channel args' do
79*cc02d7e2SAndroid Build Coastguard Worker      args = Hash[127.times.collect { |x| [x.to_s, x] }]
80*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args(args)
81*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
82*cc02d7e2SAndroid Build Coastguard Worker    end
83*cc02d7e2SAndroid Build Coastguard Worker  end
84*cc02d7e2SAndroid Build Coastguard Worker
85*cc02d7e2SAndroid Build Coastguard Worker  describe '#new for secure channels' do
86*cc02d7e2SAndroid Build Coastguard Worker    def construct_with_args(a)
87*cc02d7e2SAndroid Build Coastguard Worker      proc { GRPC::Core::Channel.new('phony_host', a, create_test_cert) }
88*cc02d7e2SAndroid Build Coastguard Worker    end
89*cc02d7e2SAndroid Build Coastguard Worker
90*cc02d7e2SAndroid Build Coastguard Worker    it_behaves_like '#new'
91*cc02d7e2SAndroid Build Coastguard Worker  end
92*cc02d7e2SAndroid Build Coastguard Worker
93*cc02d7e2SAndroid Build Coastguard Worker  describe '#new for insecure channels' do
94*cc02d7e2SAndroid Build Coastguard Worker    it_behaves_like '#new'
95*cc02d7e2SAndroid Build Coastguard Worker
96*cc02d7e2SAndroid Build Coastguard Worker    def construct_with_args(a)
97*cc02d7e2SAndroid Build Coastguard Worker      proc do
98*cc02d7e2SAndroid Build Coastguard Worker        GRPC::Core::Channel.new('phony_host', a, :this_channel_is_insecure)
99*cc02d7e2SAndroid Build Coastguard Worker      end
100*cc02d7e2SAndroid Build Coastguard Worker    end
101*cc02d7e2SAndroid Build Coastguard Worker  end
102*cc02d7e2SAndroid Build Coastguard Worker
103*cc02d7e2SAndroid Build Coastguard Worker  describe '#new for XDS channels' do
104*cc02d7e2SAndroid Build Coastguard Worker    it_behaves_like '#new'
105*cc02d7e2SAndroid Build Coastguard Worker
106*cc02d7e2SAndroid Build Coastguard Worker    def construct_with_args(a)
107*cc02d7e2SAndroid Build Coastguard Worker      proc do
108*cc02d7e2SAndroid Build Coastguard Worker        xds_creds = GRPC::Core::XdsChannelCredentials.new(create_test_cert)
109*cc02d7e2SAndroid Build Coastguard Worker        GRPC::Core::Channel.new('dummy_host', a, xds_creds)
110*cc02d7e2SAndroid Build Coastguard Worker      end
111*cc02d7e2SAndroid Build Coastguard Worker    end
112*cc02d7e2SAndroid Build Coastguard Worker  end
113*cc02d7e2SAndroid Build Coastguard Worker
114*cc02d7e2SAndroid Build Coastguard Worker  describe '#create_call' do
115*cc02d7e2SAndroid Build Coastguard Worker    it 'creates a call OK' do
116*cc02d7e2SAndroid Build Coastguard Worker      ch = GRPC::Core::Channel.new(fake_host, nil, :this_channel_is_insecure)
117*cc02d7e2SAndroid Build Coastguard Worker
118*cc02d7e2SAndroid Build Coastguard Worker      deadline = Time.now + 5
119*cc02d7e2SAndroid Build Coastguard Worker
120*cc02d7e2SAndroid Build Coastguard Worker      blk = proc do
121*cc02d7e2SAndroid Build Coastguard Worker        ch.create_call(nil, nil, 'phony_method', nil, deadline)
122*cc02d7e2SAndroid Build Coastguard Worker      end
123*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
124*cc02d7e2SAndroid Build Coastguard Worker    end
125*cc02d7e2SAndroid Build Coastguard Worker
126*cc02d7e2SAndroid Build Coastguard Worker    it 'raises an error if called on a closed channel' do
127*cc02d7e2SAndroid Build Coastguard Worker      STDERR.puts "#{Time.now}: begin: raises an error if called on a closed channel"
128*cc02d7e2SAndroid Build Coastguard Worker      ch = GRPC::Core::Channel.new(fake_host, nil, :this_channel_is_insecure)
129*cc02d7e2SAndroid Build Coastguard Worker      STDERR.puts "#{Time.now}: created channel"
130*cc02d7e2SAndroid Build Coastguard Worker      ch.close
131*cc02d7e2SAndroid Build Coastguard Worker      STDERR.puts "#{Time.now}: closed channel"
132*cc02d7e2SAndroid Build Coastguard Worker
133*cc02d7e2SAndroid Build Coastguard Worker      deadline = Time.now + 5
134*cc02d7e2SAndroid Build Coastguard Worker      blk = proc do
135*cc02d7e2SAndroid Build Coastguard Worker        ch.create_call(nil, nil, 'phony_method', nil, deadline)
136*cc02d7e2SAndroid Build Coastguard Worker        STDERR.puts "#{Time.now}: created call"
137*cc02d7e2SAndroid Build Coastguard Worker      end
138*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to raise_error(RuntimeError)
139*cc02d7e2SAndroid Build Coastguard Worker      STDERR.puts "#{Time.now}: finished: raises an error if called on a closed channel"
140*cc02d7e2SAndroid Build Coastguard Worker    end
141*cc02d7e2SAndroid Build Coastguard Worker  end
142*cc02d7e2SAndroid Build Coastguard Worker
143*cc02d7e2SAndroid Build Coastguard Worker  describe '#destroy' do
144*cc02d7e2SAndroid Build Coastguard Worker    it 'destroys a channel ok' do
145*cc02d7e2SAndroid Build Coastguard Worker      ch = GRPC::Core::Channel.new(fake_host, nil, :this_channel_is_insecure)
146*cc02d7e2SAndroid Build Coastguard Worker      blk = proc { ch.destroy }
147*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
148*cc02d7e2SAndroid Build Coastguard Worker    end
149*cc02d7e2SAndroid Build Coastguard Worker
150*cc02d7e2SAndroid Build Coastguard Worker    it 'can be called more than once without error' do
151*cc02d7e2SAndroid Build Coastguard Worker      ch = GRPC::Core::Channel.new(fake_host, nil, :this_channel_is_insecure)
152*cc02d7e2SAndroid Build Coastguard Worker      blk = proc { ch.destroy }
153*cc02d7e2SAndroid Build Coastguard Worker      blk.call
154*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
155*cc02d7e2SAndroid Build Coastguard Worker    end
156*cc02d7e2SAndroid Build Coastguard Worker  end
157*cc02d7e2SAndroid Build Coastguard Worker
158*cc02d7e2SAndroid Build Coastguard Worker  describe '#connectivity_state' do
159*cc02d7e2SAndroid Build Coastguard Worker    it 'returns an enum' do
160*cc02d7e2SAndroid Build Coastguard Worker      ch = GRPC::Core::Channel.new(fake_host, nil, :this_channel_is_insecure)
161*cc02d7e2SAndroid Build Coastguard Worker      valid_states = [
162*cc02d7e2SAndroid Build Coastguard Worker        GRPC::Core::ConnectivityStates::IDLE,
163*cc02d7e2SAndroid Build Coastguard Worker        GRPC::Core::ConnectivityStates::CONNECTING,
164*cc02d7e2SAndroid Build Coastguard Worker        GRPC::Core::ConnectivityStates::READY,
165*cc02d7e2SAndroid Build Coastguard Worker        GRPC::Core::ConnectivityStates::TRANSIENT_FAILURE,
166*cc02d7e2SAndroid Build Coastguard Worker        GRPC::Core::ConnectivityStates::FATAL_FAILURE
167*cc02d7e2SAndroid Build Coastguard Worker      ]
168*cc02d7e2SAndroid Build Coastguard Worker
169*cc02d7e2SAndroid Build Coastguard Worker      expect(valid_states).to include(ch.connectivity_state)
170*cc02d7e2SAndroid Build Coastguard Worker    end
171*cc02d7e2SAndroid Build Coastguard Worker
172*cc02d7e2SAndroid Build Coastguard Worker    it 'returns an enum when trying to connect' do
173*cc02d7e2SAndroid Build Coastguard Worker      ch = GRPC::Core::Channel.new(fake_host, nil, :this_channel_is_insecure)
174*cc02d7e2SAndroid Build Coastguard Worker      ch.connectivity_state(true)
175*cc02d7e2SAndroid Build Coastguard Worker      valid_states = [
176*cc02d7e2SAndroid Build Coastguard Worker        GRPC::Core::ConnectivityStates::IDLE,
177*cc02d7e2SAndroid Build Coastguard Worker        GRPC::Core::ConnectivityStates::CONNECTING,
178*cc02d7e2SAndroid Build Coastguard Worker        GRPC::Core::ConnectivityStates::READY,
179*cc02d7e2SAndroid Build Coastguard Worker        GRPC::Core::ConnectivityStates::TRANSIENT_FAILURE,
180*cc02d7e2SAndroid Build Coastguard Worker        GRPC::Core::ConnectivityStates::FATAL_FAILURE
181*cc02d7e2SAndroid Build Coastguard Worker      ]
182*cc02d7e2SAndroid Build Coastguard Worker
183*cc02d7e2SAndroid Build Coastguard Worker      expect(valid_states).to include(ch.connectivity_state)
184*cc02d7e2SAndroid Build Coastguard Worker    end
185*cc02d7e2SAndroid Build Coastguard Worker  end
186*cc02d7e2SAndroid Build Coastguard Worker
187*cc02d7e2SAndroid Build Coastguard Worker  describe '::SSL_TARGET' do
188*cc02d7e2SAndroid Build Coastguard Worker    it 'is a symbol' do
189*cc02d7e2SAndroid Build Coastguard Worker      expect(GRPC::Core::Channel::SSL_TARGET).to be_a(Symbol)
190*cc02d7e2SAndroid Build Coastguard Worker    end
191*cc02d7e2SAndroid Build Coastguard Worker  end
192*cc02d7e2SAndroid Build Coastguard Worker
193*cc02d7e2SAndroid Build Coastguard Worker  describe '#close' do
194*cc02d7e2SAndroid Build Coastguard Worker    it 'closes a channel ok' do
195*cc02d7e2SAndroid Build Coastguard Worker      ch = GRPC::Core::Channel.new(fake_host, nil, :this_channel_is_insecure)
196*cc02d7e2SAndroid Build Coastguard Worker      blk = proc { ch.close }
197*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
198*cc02d7e2SAndroid Build Coastguard Worker    end
199*cc02d7e2SAndroid Build Coastguard Worker
200*cc02d7e2SAndroid Build Coastguard Worker    it 'can be called more than once without error' do
201*cc02d7e2SAndroid Build Coastguard Worker      ch = GRPC::Core::Channel.new(fake_host, nil, :this_channel_is_insecure)
202*cc02d7e2SAndroid Build Coastguard Worker      blk = proc { ch.close }
203*cc02d7e2SAndroid Build Coastguard Worker      blk.call
204*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
205*cc02d7e2SAndroid Build Coastguard Worker    end
206*cc02d7e2SAndroid Build Coastguard Worker  end
207*cc02d7e2SAndroid Build Coastguard Workerend
208