xref: /aosp_15_r20/external/grpc-grpc/src/ruby/spec/call_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 Workerinclude GRPC::Core::StatusCodes
18*cc02d7e2SAndroid Build Coastguard Worker
19*cc02d7e2SAndroid Build Coastguard Workerdescribe GRPC::Core::WriteFlags do
20*cc02d7e2SAndroid Build Coastguard Worker  it 'should define the known write flag values' do
21*cc02d7e2SAndroid Build Coastguard Worker    m = GRPC::Core::WriteFlags
22*cc02d7e2SAndroid Build Coastguard Worker    expect(m.const_get(:BUFFER_HINT)).to_not be_nil
23*cc02d7e2SAndroid Build Coastguard Worker    expect(m.const_get(:NO_COMPRESS)).to_not be_nil
24*cc02d7e2SAndroid Build Coastguard Worker  end
25*cc02d7e2SAndroid Build Coastguard Workerend
26*cc02d7e2SAndroid Build Coastguard Worker
27*cc02d7e2SAndroid Build Coastguard Workerdescribe GRPC::Core::RpcErrors do
28*cc02d7e2SAndroid Build Coastguard Worker  before(:each) do
29*cc02d7e2SAndroid Build Coastguard Worker    @known_types = {
30*cc02d7e2SAndroid Build Coastguard Worker      OK: 0,
31*cc02d7e2SAndroid Build Coastguard Worker      ERROR: 1,
32*cc02d7e2SAndroid Build Coastguard Worker      NOT_ON_SERVER: 2,
33*cc02d7e2SAndroid Build Coastguard Worker      NOT_ON_CLIENT: 3,
34*cc02d7e2SAndroid Build Coastguard Worker      ALREADY_ACCEPTED: 4,
35*cc02d7e2SAndroid Build Coastguard Worker      ALREADY_INVOKED: 5,
36*cc02d7e2SAndroid Build Coastguard Worker      NOT_INVOKED: 6,
37*cc02d7e2SAndroid Build Coastguard Worker      ALREADY_FINISHED: 7,
38*cc02d7e2SAndroid Build Coastguard Worker      TOO_MANY_OPERATIONS: 8,
39*cc02d7e2SAndroid Build Coastguard Worker      INVALID_FLAGS: 9,
40*cc02d7e2SAndroid Build Coastguard Worker      ErrorMessages: {
41*cc02d7e2SAndroid Build Coastguard Worker        0 => 'ok',
42*cc02d7e2SAndroid Build Coastguard Worker        1 => 'unknown error',
43*cc02d7e2SAndroid Build Coastguard Worker        2 => 'not available on a server',
44*cc02d7e2SAndroid Build Coastguard Worker        3 => 'not available on a client',
45*cc02d7e2SAndroid Build Coastguard Worker        4 => 'call is already accepted',
46*cc02d7e2SAndroid Build Coastguard Worker        5 => 'call is already invoked',
47*cc02d7e2SAndroid Build Coastguard Worker        6 => 'call is not yet invoked',
48*cc02d7e2SAndroid Build Coastguard Worker        7 => 'call is already finished',
49*cc02d7e2SAndroid Build Coastguard Worker        8 => 'outstanding read or write present',
50*cc02d7e2SAndroid Build Coastguard Worker        9 => 'a bad flag was given'
51*cc02d7e2SAndroid Build Coastguard Worker      }
52*cc02d7e2SAndroid Build Coastguard Worker    }
53*cc02d7e2SAndroid Build Coastguard Worker  end
54*cc02d7e2SAndroid Build Coastguard Worker
55*cc02d7e2SAndroid Build Coastguard Worker  it 'should have symbols for all the known error codes' do
56*cc02d7e2SAndroid Build Coastguard Worker    m = GRPC::Core::RpcErrors
57*cc02d7e2SAndroid Build Coastguard Worker    syms_and_codes = m.constants.collect { |c| [c, m.const_get(c)] }
58*cc02d7e2SAndroid Build Coastguard Worker    expect(Hash[syms_and_codes]).to eq(@known_types)
59*cc02d7e2SAndroid Build Coastguard Worker  end
60*cc02d7e2SAndroid Build Coastguard Workerend
61*cc02d7e2SAndroid Build Coastguard Worker
62*cc02d7e2SAndroid Build Coastguard Workerdescribe GRPC::Core::CallOps do
63*cc02d7e2SAndroid Build Coastguard Worker  before(:each) do
64*cc02d7e2SAndroid Build Coastguard Worker    @known_types = {
65*cc02d7e2SAndroid Build Coastguard Worker      SEND_INITIAL_METADATA: 0,
66*cc02d7e2SAndroid Build Coastguard Worker      SEND_MESSAGE: 1,
67*cc02d7e2SAndroid Build Coastguard Worker      SEND_CLOSE_FROM_CLIENT: 2,
68*cc02d7e2SAndroid Build Coastguard Worker      SEND_STATUS_FROM_SERVER: 3,
69*cc02d7e2SAndroid Build Coastguard Worker      RECV_INITIAL_METADATA: 4,
70*cc02d7e2SAndroid Build Coastguard Worker      RECV_MESSAGE: 5,
71*cc02d7e2SAndroid Build Coastguard Worker      RECV_STATUS_ON_CLIENT: 6,
72*cc02d7e2SAndroid Build Coastguard Worker      RECV_CLOSE_ON_SERVER: 7
73*cc02d7e2SAndroid Build Coastguard Worker    }
74*cc02d7e2SAndroid Build Coastguard Worker  end
75*cc02d7e2SAndroid Build Coastguard Worker
76*cc02d7e2SAndroid Build Coastguard Worker  it 'should have symbols for all the known operation types' do
77*cc02d7e2SAndroid Build Coastguard Worker    m = GRPC::Core::CallOps
78*cc02d7e2SAndroid Build Coastguard Worker    syms_and_codes = m.constants.collect { |c| [c, m.const_get(c)] }
79*cc02d7e2SAndroid Build Coastguard Worker    expect(Hash[syms_and_codes]).to eq(@known_types)
80*cc02d7e2SAndroid Build Coastguard Worker  end
81*cc02d7e2SAndroid Build Coastguard Workerend
82*cc02d7e2SAndroid Build Coastguard Worker
83*cc02d7e2SAndroid Build Coastguard Workerdescribe GRPC::Core::Call do
84*cc02d7e2SAndroid Build Coastguard Worker  let(:test_tag)  { Object.new }
85*cc02d7e2SAndroid Build Coastguard Worker  let(:fake_host) { 'localhost:10101' }
86*cc02d7e2SAndroid Build Coastguard Worker
87*cc02d7e2SAndroid Build Coastguard Worker  before(:each) do
88*cc02d7e2SAndroid Build Coastguard Worker    @ch = GRPC::Core::Channel.new(fake_host, nil, :this_channel_is_insecure)
89*cc02d7e2SAndroid Build Coastguard Worker  end
90*cc02d7e2SAndroid Build Coastguard Worker
91*cc02d7e2SAndroid Build Coastguard Worker  describe '#status' do
92*cc02d7e2SAndroid Build Coastguard Worker    it 'can save the status and read it back' do
93*cc02d7e2SAndroid Build Coastguard Worker      call = make_test_call
94*cc02d7e2SAndroid Build Coastguard Worker      sts = Struct::Status.new(OK, 'OK')
95*cc02d7e2SAndroid Build Coastguard Worker      expect { call.status = sts }.not_to raise_error
96*cc02d7e2SAndroid Build Coastguard Worker      expect(call.status).to eq(sts)
97*cc02d7e2SAndroid Build Coastguard Worker    end
98*cc02d7e2SAndroid Build Coastguard Worker
99*cc02d7e2SAndroid Build Coastguard Worker    it 'must be set to a status' do
100*cc02d7e2SAndroid Build Coastguard Worker      call = make_test_call
101*cc02d7e2SAndroid Build Coastguard Worker      bad_sts = Object.new
102*cc02d7e2SAndroid Build Coastguard Worker      expect { call.status = bad_sts }.to raise_error(TypeError)
103*cc02d7e2SAndroid Build Coastguard Worker    end
104*cc02d7e2SAndroid Build Coastguard Worker
105*cc02d7e2SAndroid Build Coastguard Worker    it 'can be set to nil' do
106*cc02d7e2SAndroid Build Coastguard Worker      call = make_test_call
107*cc02d7e2SAndroid Build Coastguard Worker      expect { call.status = nil }.not_to raise_error
108*cc02d7e2SAndroid Build Coastguard Worker    end
109*cc02d7e2SAndroid Build Coastguard Worker  end
110*cc02d7e2SAndroid Build Coastguard Worker
111*cc02d7e2SAndroid Build Coastguard Worker  describe '#metadata' do
112*cc02d7e2SAndroid Build Coastguard Worker    it 'can save the metadata hash and read it back' do
113*cc02d7e2SAndroid Build Coastguard Worker      call = make_test_call
114*cc02d7e2SAndroid Build Coastguard Worker      md = { 'k1' => 'v1',  'k2' => 'v2' }
115*cc02d7e2SAndroid Build Coastguard Worker      expect { call.metadata = md }.not_to raise_error
116*cc02d7e2SAndroid Build Coastguard Worker      expect(call.metadata).to be(md)
117*cc02d7e2SAndroid Build Coastguard Worker    end
118*cc02d7e2SAndroid Build Coastguard Worker
119*cc02d7e2SAndroid Build Coastguard Worker    it 'must be set with a hash' do
120*cc02d7e2SAndroid Build Coastguard Worker      call = make_test_call
121*cc02d7e2SAndroid Build Coastguard Worker      bad_md = Object.new
122*cc02d7e2SAndroid Build Coastguard Worker      expect { call.metadata = bad_md }.to raise_error(TypeError)
123*cc02d7e2SAndroid Build Coastguard Worker    end
124*cc02d7e2SAndroid Build Coastguard Worker
125*cc02d7e2SAndroid Build Coastguard Worker    it 'can be set to nil' do
126*cc02d7e2SAndroid Build Coastguard Worker      call = make_test_call
127*cc02d7e2SAndroid Build Coastguard Worker      expect { call.metadata = nil }.not_to raise_error
128*cc02d7e2SAndroid Build Coastguard Worker    end
129*cc02d7e2SAndroid Build Coastguard Worker  end
130*cc02d7e2SAndroid Build Coastguard Worker
131*cc02d7e2SAndroid Build Coastguard Worker  describe '#set_credentials!' do
132*cc02d7e2SAndroid Build Coastguard Worker    it 'can set a valid CallCredentials object' do
133*cc02d7e2SAndroid Build Coastguard Worker      call = make_test_call
134*cc02d7e2SAndroid Build Coastguard Worker      auth_proc = proc { { 'plugin_key' => 'plugin_value' } }
135*cc02d7e2SAndroid Build Coastguard Worker      creds = GRPC::Core::CallCredentials.new auth_proc
136*cc02d7e2SAndroid Build Coastguard Worker      expect { call.set_credentials! creds }.not_to raise_error
137*cc02d7e2SAndroid Build Coastguard Worker    end
138*cc02d7e2SAndroid Build Coastguard Worker  end
139*cc02d7e2SAndroid Build Coastguard Worker
140*cc02d7e2SAndroid Build Coastguard Worker  describe '#cancel' do
141*cc02d7e2SAndroid Build Coastguard Worker    it 'completes ok' do
142*cc02d7e2SAndroid Build Coastguard Worker      call = make_test_call
143*cc02d7e2SAndroid Build Coastguard Worker      expect { call.cancel }.not_to raise_error
144*cc02d7e2SAndroid Build Coastguard Worker    end
145*cc02d7e2SAndroid Build Coastguard Worker
146*cc02d7e2SAndroid Build Coastguard Worker    it 'completes ok when the call is closed' do
147*cc02d7e2SAndroid Build Coastguard Worker      call = make_test_call
148*cc02d7e2SAndroid Build Coastguard Worker      call.close
149*cc02d7e2SAndroid Build Coastguard Worker      expect { call.cancel }.not_to raise_error
150*cc02d7e2SAndroid Build Coastguard Worker    end
151*cc02d7e2SAndroid Build Coastguard Worker  end
152*cc02d7e2SAndroid Build Coastguard Worker
153*cc02d7e2SAndroid Build Coastguard Worker  describe '#cancel_with_status' do
154*cc02d7e2SAndroid Build Coastguard Worker    it 'completes ok' do
155*cc02d7e2SAndroid Build Coastguard Worker      call = make_test_call
156*cc02d7e2SAndroid Build Coastguard Worker      expect do
157*cc02d7e2SAndroid Build Coastguard Worker        call.cancel_with_status(0, 'test status')
158*cc02d7e2SAndroid Build Coastguard Worker      end.not_to raise_error
159*cc02d7e2SAndroid Build Coastguard Worker      expect do
160*cc02d7e2SAndroid Build Coastguard Worker        call.cancel_with_status(0, nil)
161*cc02d7e2SAndroid Build Coastguard Worker      end.to raise_error(TypeError)
162*cc02d7e2SAndroid Build Coastguard Worker    end
163*cc02d7e2SAndroid Build Coastguard Worker
164*cc02d7e2SAndroid Build Coastguard Worker    it 'completes ok when the call is closed' do
165*cc02d7e2SAndroid Build Coastguard Worker      call = make_test_call
166*cc02d7e2SAndroid Build Coastguard Worker      call.close
167*cc02d7e2SAndroid Build Coastguard Worker      expect do
168*cc02d7e2SAndroid Build Coastguard Worker        call.cancel_with_status(0, 'test status')
169*cc02d7e2SAndroid Build Coastguard Worker      end.not_to raise_error
170*cc02d7e2SAndroid Build Coastguard Worker    end
171*cc02d7e2SAndroid Build Coastguard Worker  end
172*cc02d7e2SAndroid Build Coastguard Worker
173*cc02d7e2SAndroid Build Coastguard Worker  def make_test_call
174*cc02d7e2SAndroid Build Coastguard Worker    @ch.create_call(nil, nil, 'phony_method', nil, deadline)
175*cc02d7e2SAndroid Build Coastguard Worker  end
176*cc02d7e2SAndroid Build Coastguard Worker
177*cc02d7e2SAndroid Build Coastguard Worker  def deadline
178*cc02d7e2SAndroid Build Coastguard Worker    Time.now + 2  # in 2 seconds; arbitrary
179*cc02d7e2SAndroid Build Coastguard Worker  end
180*cc02d7e2SAndroid Build Coastguard Workerend
181