xref: /aosp_15_r20/external/grpc-grpc/src/ruby/spec/server_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 Worker
17*cc02d7e2SAndroid Build Coastguard Workerdef load_test_certs
18*cc02d7e2SAndroid Build Coastguard Worker  test_root = File.join(File.dirname(__FILE__), 'testdata')
19*cc02d7e2SAndroid Build Coastguard Worker  files = ['ca.pem', 'server1.key', 'server1.pem']
20*cc02d7e2SAndroid Build Coastguard Worker  contents = files.map { |f| File.open(File.join(test_root, f)).read }
21*cc02d7e2SAndroid Build Coastguard Worker  [contents[0], [{ private_key: contents[1], cert_chain: contents[2] }], false]
22*cc02d7e2SAndroid Build Coastguard Workerend
23*cc02d7e2SAndroid Build Coastguard Worker
24*cc02d7e2SAndroid Build Coastguard WorkerServer = GRPC::Core::Server
25*cc02d7e2SAndroid Build Coastguard Worker
26*cc02d7e2SAndroid Build Coastguard Workerdescribe Server do
27*cc02d7e2SAndroid Build Coastguard Worker  def create_test_cert
28*cc02d7e2SAndroid Build Coastguard Worker    GRPC::Core::ServerCredentials.new(*load_test_certs)
29*cc02d7e2SAndroid Build Coastguard Worker  end
30*cc02d7e2SAndroid Build Coastguard Worker
31*cc02d7e2SAndroid Build Coastguard Worker  describe '#start' do
32*cc02d7e2SAndroid Build Coastguard Worker    it 'runs without failing' do
33*cc02d7e2SAndroid Build Coastguard Worker      blk = proc { new_core_server_for_testing(nil).start }
34*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
35*cc02d7e2SAndroid Build Coastguard Worker    end
36*cc02d7e2SAndroid Build Coastguard Worker
37*cc02d7e2SAndroid Build Coastguard Worker    it 'fails if the server is closed' do
38*cc02d7e2SAndroid Build Coastguard Worker      s = new_core_server_for_testing(nil)
39*cc02d7e2SAndroid Build Coastguard Worker      s.shutdown_and_notify(nil)
40*cc02d7e2SAndroid Build Coastguard Worker      s.close
41*cc02d7e2SAndroid Build Coastguard Worker      expect { s.start }.to raise_error(RuntimeError)
42*cc02d7e2SAndroid Build Coastguard Worker    end
43*cc02d7e2SAndroid Build Coastguard Worker  end
44*cc02d7e2SAndroid Build Coastguard Worker
45*cc02d7e2SAndroid Build Coastguard Worker  describe '#shutdown_and_notify and #destroy' do
46*cc02d7e2SAndroid Build Coastguard Worker    it 'destroys a server ok' do
47*cc02d7e2SAndroid Build Coastguard Worker      s = start_a_server
48*cc02d7e2SAndroid Build Coastguard Worker      blk = proc do
49*cc02d7e2SAndroid Build Coastguard Worker        s.shutdown_and_notify(nil)
50*cc02d7e2SAndroid Build Coastguard Worker        s.destroy
51*cc02d7e2SAndroid Build Coastguard Worker      end
52*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
53*cc02d7e2SAndroid Build Coastguard Worker    end
54*cc02d7e2SAndroid Build Coastguard Worker
55*cc02d7e2SAndroid Build Coastguard Worker    it 'can be called more than once without error' do
56*cc02d7e2SAndroid Build Coastguard Worker      s = start_a_server
57*cc02d7e2SAndroid Build Coastguard Worker      begin
58*cc02d7e2SAndroid Build Coastguard Worker        blk = proc do
59*cc02d7e2SAndroid Build Coastguard Worker          s.shutdown_and_notify(nil)
60*cc02d7e2SAndroid Build Coastguard Worker          s.destroy
61*cc02d7e2SAndroid Build Coastguard Worker        end
62*cc02d7e2SAndroid Build Coastguard Worker        expect(&blk).to_not raise_error
63*cc02d7e2SAndroid Build Coastguard Worker        blk.call
64*cc02d7e2SAndroid Build Coastguard Worker        expect(&blk).to_not raise_error
65*cc02d7e2SAndroid Build Coastguard Worker      ensure
66*cc02d7e2SAndroid Build Coastguard Worker        s.shutdown_and_notify(nil)
67*cc02d7e2SAndroid Build Coastguard Worker        s.close
68*cc02d7e2SAndroid Build Coastguard Worker      end
69*cc02d7e2SAndroid Build Coastguard Worker    end
70*cc02d7e2SAndroid Build Coastguard Worker  end
71*cc02d7e2SAndroid Build Coastguard Worker
72*cc02d7e2SAndroid Build Coastguard Worker  describe '#shutdown_and_notify and #close' do
73*cc02d7e2SAndroid Build Coastguard Worker    it 'closes a server ok' do
74*cc02d7e2SAndroid Build Coastguard Worker      s = start_a_server
75*cc02d7e2SAndroid Build Coastguard Worker      begin
76*cc02d7e2SAndroid Build Coastguard Worker        blk = proc do
77*cc02d7e2SAndroid Build Coastguard Worker          s.shutdown_and_notify(nil)
78*cc02d7e2SAndroid Build Coastguard Worker          s.close
79*cc02d7e2SAndroid Build Coastguard Worker        end
80*cc02d7e2SAndroid Build Coastguard Worker        expect(&blk).to_not raise_error
81*cc02d7e2SAndroid Build Coastguard Worker      ensure
82*cc02d7e2SAndroid Build Coastguard Worker        s.shutdown_and_notify(nil)
83*cc02d7e2SAndroid Build Coastguard Worker        s.close
84*cc02d7e2SAndroid Build Coastguard Worker      end
85*cc02d7e2SAndroid Build Coastguard Worker    end
86*cc02d7e2SAndroid Build Coastguard Worker
87*cc02d7e2SAndroid Build Coastguard Worker    it 'can be called more than once without error' do
88*cc02d7e2SAndroid Build Coastguard Worker      s = start_a_server
89*cc02d7e2SAndroid Build Coastguard Worker      blk = proc do
90*cc02d7e2SAndroid Build Coastguard Worker        s.shutdown_and_notify(nil)
91*cc02d7e2SAndroid Build Coastguard Worker        s.close
92*cc02d7e2SAndroid Build Coastguard Worker      end
93*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
94*cc02d7e2SAndroid Build Coastguard Worker      blk.call
95*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
96*cc02d7e2SAndroid Build Coastguard Worker    end
97*cc02d7e2SAndroid Build Coastguard Worker  end
98*cc02d7e2SAndroid Build Coastguard Worker
99*cc02d7e2SAndroid Build Coastguard Worker  describe '#add_http_port' do
100*cc02d7e2SAndroid Build Coastguard Worker    describe 'for insecure servers' do
101*cc02d7e2SAndroid Build Coastguard Worker      it 'runs without failing' do
102*cc02d7e2SAndroid Build Coastguard Worker        blk = proc do
103*cc02d7e2SAndroid Build Coastguard Worker          s = new_core_server_for_testing(nil)
104*cc02d7e2SAndroid Build Coastguard Worker          s.add_http2_port('localhost:0', :this_port_is_insecure)
105*cc02d7e2SAndroid Build Coastguard Worker          s.shutdown_and_notify(nil)
106*cc02d7e2SAndroid Build Coastguard Worker          s.close
107*cc02d7e2SAndroid Build Coastguard Worker        end
108*cc02d7e2SAndroid Build Coastguard Worker        expect(&blk).to_not raise_error
109*cc02d7e2SAndroid Build Coastguard Worker      end
110*cc02d7e2SAndroid Build Coastguard Worker
111*cc02d7e2SAndroid Build Coastguard Worker      it 'fails if the server is closed' do
112*cc02d7e2SAndroid Build Coastguard Worker        s = new_core_server_for_testing(nil)
113*cc02d7e2SAndroid Build Coastguard Worker        s.shutdown_and_notify(nil)
114*cc02d7e2SAndroid Build Coastguard Worker        s.close
115*cc02d7e2SAndroid Build Coastguard Worker        blk = proc do
116*cc02d7e2SAndroid Build Coastguard Worker          s.add_http2_port('localhost:0', :this_port_is_insecure)
117*cc02d7e2SAndroid Build Coastguard Worker        end
118*cc02d7e2SAndroid Build Coastguard Worker        expect(&blk).to raise_error(RuntimeError)
119*cc02d7e2SAndroid Build Coastguard Worker      end
120*cc02d7e2SAndroid Build Coastguard Worker    end
121*cc02d7e2SAndroid Build Coastguard Worker
122*cc02d7e2SAndroid Build Coastguard Worker    describe 'for secure servers' do
123*cc02d7e2SAndroid Build Coastguard Worker      let(:cert) { create_test_cert }
124*cc02d7e2SAndroid Build Coastguard Worker      it 'runs without failing' do
125*cc02d7e2SAndroid Build Coastguard Worker        blk = proc do
126*cc02d7e2SAndroid Build Coastguard Worker          s = new_core_server_for_testing(nil)
127*cc02d7e2SAndroid Build Coastguard Worker          s.add_http2_port('localhost:0', cert)
128*cc02d7e2SAndroid Build Coastguard Worker          s.shutdown_and_notify(nil)
129*cc02d7e2SAndroid Build Coastguard Worker          s.close
130*cc02d7e2SAndroid Build Coastguard Worker        end
131*cc02d7e2SAndroid Build Coastguard Worker        expect(&blk).to_not raise_error
132*cc02d7e2SAndroid Build Coastguard Worker      end
133*cc02d7e2SAndroid Build Coastguard Worker
134*cc02d7e2SAndroid Build Coastguard Worker      it 'fails if the server is closed' do
135*cc02d7e2SAndroid Build Coastguard Worker        s = new_core_server_for_testing(nil)
136*cc02d7e2SAndroid Build Coastguard Worker        s.shutdown_and_notify(nil)
137*cc02d7e2SAndroid Build Coastguard Worker        s.close
138*cc02d7e2SAndroid Build Coastguard Worker        blk = proc { s.add_http2_port('localhost:0', cert) }
139*cc02d7e2SAndroid Build Coastguard Worker        expect(&blk).to raise_error(RuntimeError)
140*cc02d7e2SAndroid Build Coastguard Worker      end
141*cc02d7e2SAndroid Build Coastguard Worker    end
142*cc02d7e2SAndroid Build Coastguard Worker
143*cc02d7e2SAndroid Build Coastguard Worker    describe 'for xds servers' do
144*cc02d7e2SAndroid Build Coastguard Worker      let(:cert) { create_test_cert }
145*cc02d7e2SAndroid Build Coastguard Worker      let(:xds) { GRPC::Core::XdsServerCredentials.new(cert) }
146*cc02d7e2SAndroid Build Coastguard Worker      it 'runs without failing' do
147*cc02d7e2SAndroid Build Coastguard Worker        blk = proc do
148*cc02d7e2SAndroid Build Coastguard Worker          s = new_core_server_for_testing(nil)
149*cc02d7e2SAndroid Build Coastguard Worker          s.add_http2_port('localhost:0', xds)
150*cc02d7e2SAndroid Build Coastguard Worker          s.shutdown_and_notify(nil)
151*cc02d7e2SAndroid Build Coastguard Worker          s.close
152*cc02d7e2SAndroid Build Coastguard Worker        end
153*cc02d7e2SAndroid Build Coastguard Worker        expect(&blk).to_not raise_error
154*cc02d7e2SAndroid Build Coastguard Worker      end
155*cc02d7e2SAndroid Build Coastguard Worker
156*cc02d7e2SAndroid Build Coastguard Worker      it 'fails if the server is closed' do
157*cc02d7e2SAndroid Build Coastguard Worker        s = new_core_server_for_testing(nil)
158*cc02d7e2SAndroid Build Coastguard Worker        s.shutdown_and_notify(nil)
159*cc02d7e2SAndroid Build Coastguard Worker        s.close
160*cc02d7e2SAndroid Build Coastguard Worker        blk = proc { s.add_http2_port('localhost:0', xds) }
161*cc02d7e2SAndroid Build Coastguard Worker        expect(&blk).to raise_error(RuntimeError)
162*cc02d7e2SAndroid Build Coastguard Worker      end
163*cc02d7e2SAndroid Build Coastguard Worker    end
164*cc02d7e2SAndroid Build Coastguard Worker  end
165*cc02d7e2SAndroid Build Coastguard Worker
166*cc02d7e2SAndroid Build Coastguard Worker  shared_examples '#new' do
167*cc02d7e2SAndroid Build Coastguard Worker    it 'takes nil channel args' do
168*cc02d7e2SAndroid Build Coastguard Worker      expect { new_core_server_for_testing(nil) }.to_not raise_error
169*cc02d7e2SAndroid Build Coastguard Worker    end
170*cc02d7e2SAndroid Build Coastguard Worker
171*cc02d7e2SAndroid Build Coastguard Worker    it 'does not take a hash with bad keys as channel args' do
172*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args(Object.new => 1)
173*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to raise_error TypeError
174*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args(1 => 1)
175*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to raise_error TypeError
176*cc02d7e2SAndroid Build Coastguard Worker    end
177*cc02d7e2SAndroid Build Coastguard Worker
178*cc02d7e2SAndroid Build Coastguard Worker    it 'does not take a hash with bad values as channel args' do
179*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args(symbol: Object.new)
180*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to raise_error TypeError
181*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args('1' => {})
182*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to raise_error TypeError
183*cc02d7e2SAndroid Build Coastguard Worker    end
184*cc02d7e2SAndroid Build Coastguard Worker
185*cc02d7e2SAndroid Build Coastguard Worker    it 'can take a hash with a symbol key as channel args' do
186*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args(a_symbol: 1)
187*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
188*cc02d7e2SAndroid Build Coastguard Worker    end
189*cc02d7e2SAndroid Build Coastguard Worker
190*cc02d7e2SAndroid Build Coastguard Worker    it 'can take a hash with a string key as channel args' do
191*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args('a_symbol' => 1)
192*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
193*cc02d7e2SAndroid Build Coastguard Worker    end
194*cc02d7e2SAndroid Build Coastguard Worker
195*cc02d7e2SAndroid Build Coastguard Worker    it 'can take a hash with a string value as channel args' do
196*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args(a_symbol: '1')
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 take a hash with a symbol value as channel args' do
201*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args(a_symbol: :another_symbol)
202*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
203*cc02d7e2SAndroid Build Coastguard Worker    end
204*cc02d7e2SAndroid Build Coastguard Worker
205*cc02d7e2SAndroid Build Coastguard Worker    it 'can take a hash with a numeric value as channel args' do
206*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args(a_symbol: 1)
207*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
208*cc02d7e2SAndroid Build Coastguard Worker    end
209*cc02d7e2SAndroid Build Coastguard Worker
210*cc02d7e2SAndroid Build Coastguard Worker    it 'can take a hash with many args as channel args' do
211*cc02d7e2SAndroid Build Coastguard Worker      args = Hash[127.times.collect { |x| [x.to_s, x] }]
212*cc02d7e2SAndroid Build Coastguard Worker      blk = construct_with_args(args)
213*cc02d7e2SAndroid Build Coastguard Worker      expect(&blk).to_not raise_error
214*cc02d7e2SAndroid Build Coastguard Worker    end
215*cc02d7e2SAndroid Build Coastguard Worker  end
216*cc02d7e2SAndroid Build Coastguard Worker
217*cc02d7e2SAndroid Build Coastguard Worker  describe '#new with an insecure channel' do
218*cc02d7e2SAndroid Build Coastguard Worker    def construct_with_args(a)
219*cc02d7e2SAndroid Build Coastguard Worker      proc { new_core_server_for_testing(a) }
220*cc02d7e2SAndroid Build Coastguard Worker    end
221*cc02d7e2SAndroid Build Coastguard Worker
222*cc02d7e2SAndroid Build Coastguard Worker    it_behaves_like '#new'
223*cc02d7e2SAndroid Build Coastguard Worker  end
224*cc02d7e2SAndroid Build Coastguard Worker
225*cc02d7e2SAndroid Build Coastguard Worker  def start_a_server
226*cc02d7e2SAndroid Build Coastguard Worker    s = new_core_server_for_testing(nil)
227*cc02d7e2SAndroid Build Coastguard Worker    s.add_http2_port('0.0.0.0:0', :this_port_is_insecure)
228*cc02d7e2SAndroid Build Coastguard Worker    s.start
229*cc02d7e2SAndroid Build Coastguard Worker    s
230*cc02d7e2SAndroid Build Coastguard Worker  end
231*cc02d7e2SAndroid Build Coastguard Workerend
232