blob: 108051a1e5de1b43c22c8fd62f3393a98f7bdc3a [file] [log] [blame]
Craig Tiller06059952015-02-18 08:34:56 -08001# Copyright 2015, Google Inc.
nnoble097ef9b2014-12-01 17:06:10 -08002# All rights reserved.
3#
4# Redistribution and use in source and binary forms, with or without
5# modification, are permitted provided that the following conditions are
6# met:
7#
8# * Redistributions of source code must retain the above copyright
9# notice, this list of conditions and the following disclaimer.
10# * Redistributions in binary form must reproduce the above
11# copyright notice, this list of conditions and the following disclaimer
12# in the documentation and/or other materials provided with the
13# distribution.
14# * Neither the name of Google Inc. nor the names of its
15# contributors may be used to endorse or promote products derived from
16# this software without specific prior written permission.
17#
18# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
30require 'grpc'
nnoble097ef9b2014-12-01 17:06:10 -080031
nnoble0c475f02014-12-05 15:37:39 -080032include GRPC::Core::StatusCodes
nnoble097ef9b2014-12-01 17:06:10 -080033
nnoble0c475f02014-12-05 15:37:39 -080034describe GRPC::Core::RpcErrors do
nnoble097ef9b2014-12-01 17:06:10 -080035 before(:each) do
36 @known_types = {
Tim Emiolae2860c52015-01-16 02:58:41 -080037 OK: 0,
38 ERROR: 1,
39 NOT_ON_SERVER: 2,
40 NOT_ON_CLIENT: 3,
41 ALREADY_ACCEPTED: 4,
42 ALREADY_INVOKED: 5,
43 NOT_INVOKED: 6,
44 ALREADY_FINISHED: 7,
45 TOO_MANY_OPERATIONS: 8,
46 INVALID_FLAGS: 9,
47 ErrorMessages: {
48 0 => 'ok',
49 1 => 'unknown error',
50 2 => 'not available on a server',
51 3 => 'not available on a client',
52 4 => 'call is already accepted',
53 5 => 'call is already invoked',
54 6 => 'call is not yet invoked',
55 7 => 'call is already finished',
56 8 => 'outstanding read or write present',
57 9 => 'a bad flag was given'
nnoble097ef9b2014-12-01 17:06:10 -080058 }
59 }
60 end
61
62 it 'should have symbols for all the known error codes' do
nnoble0c475f02014-12-05 15:37:39 -080063 m = GRPC::Core::RpcErrors
nnoble097ef9b2014-12-01 17:06:10 -080064 syms_and_codes = m.constants.collect { |c| [c, m.const_get(c)] }
65 expect(Hash[syms_and_codes]).to eq(@known_types)
66 end
nnoble097ef9b2014-12-01 17:06:10 -080067end
68
Tim Emiola37b09f42015-03-27 13:39:16 -070069describe GRPC::Core::CallOps do
70 before(:each) do
71 @known_types = {
72 SEND_INITIAL_METADATA: 0,
73 SEND_MESSAGE: 1,
74 SEND_CLOSE_FROM_CLIENT: 2,
75 SEND_STATUS_FROM_SERVER: 3,
76 RECV_INITIAL_METADATA: 4,
77 RECV_MESSAGE: 5,
78 RECV_STATUS_ON_CLIENT: 6,
79 RECV_CLOSE_ON_SERVER: 7,
80 }
81 end
82
83 it 'should have symbols for all the known operation types' do
84 m = GRPC::Core::CallOps
85 syms_and_codes = m.constants.collect { |c| [c, m.const_get(c)] }
86 expect(Hash[syms_and_codes]).to eq(@known_types)
87 end
88end
89
nnoble0c475f02014-12-05 15:37:39 -080090describe GRPC::Core::Call do
Tim Emiola564719d2015-03-27 13:07:34 -070091 let (:client_queue) { GRPC::Core::CompletionQueue.new }
92 let (:test_tag) { Object.new }
93 let (:fake_host) { 'localhost:10101' }
94
nnoble097ef9b2014-12-01 17:06:10 -080095 before(:each) do
Tim Emiolad02d1d52015-01-26 18:36:17 -080096 @ch = GRPC::Core::Channel.new(fake_host, nil)
nnoble097ef9b2014-12-01 17:06:10 -080097 end
98
99 describe '#start_read' do
Tim Emiolab24054a2015-02-09 12:34:16 -0800100 xit 'should fail if called immediately' do
Tim Emiola564719d2015-03-27 13:07:34 -0700101 blk = proc { make_test_call.start_read(test_tag) }
temiola58327912014-12-15 17:51:16 -0800102 expect(&blk).to raise_error GRPC::Core::CallError
nnoble097ef9b2014-12-01 17:06:10 -0800103 end
104 end
105
106 describe '#start_write' do
Tim Emiolab24054a2015-02-09 12:34:16 -0800107 xit 'should fail if called immediately' do
nnoble0c475f02014-12-05 15:37:39 -0800108 bytes = GRPC::Core::ByteBuffer.new('test string')
Tim Emiola564719d2015-03-27 13:07:34 -0700109 blk = proc { make_test_call.start_write(bytes, test_tag) }
temiola58327912014-12-15 17:51:16 -0800110 expect(&blk).to raise_error GRPC::Core::CallError
nnoble097ef9b2014-12-01 17:06:10 -0800111 end
112 end
113
114 describe '#start_write_status' do
Tim Emiolab24054a2015-02-09 12:34:16 -0800115 xit 'should fail if called immediately' do
Tim Emiola564719d2015-03-27 13:07:34 -0700116 blk = proc { make_test_call.start_write_status(153, 'x', test_tag) }
temiola58327912014-12-15 17:51:16 -0800117 expect(&blk).to raise_error GRPC::Core::CallError
nnoble097ef9b2014-12-01 17:06:10 -0800118 end
119 end
120
121 describe '#writes_done' do
Tim Emiolab24054a2015-02-09 12:34:16 -0800122 xit 'should fail if called immediately' do
Tim Emiolae2860c52015-01-16 02:58:41 -0800123 blk = proc { make_test_call.writes_done(Object.new) }
temiola58327912014-12-15 17:51:16 -0800124 expect(&blk).to raise_error GRPC::Core::CallError
nnoble097ef9b2014-12-01 17:06:10 -0800125 end
126 end
127
128 describe '#add_metadata' do
129 it 'adds metadata to a call without fail' do
130 call = make_test_call
131 n = 37
Tim Emiolae2860c52015-01-16 02:58:41 -0800132 one_md = proc { |x| [sprintf('key%d', x), sprintf('value%d', x)] }
133 metadata = Hash[n.times.collect { |i| one_md.call i }]
nnoble097ef9b2014-12-01 17:06:10 -0800134 expect { call.add_metadata(metadata) }.to_not raise_error
135 end
136 end
137
nnoble097ef9b2014-12-01 17:06:10 -0800138 describe '#status' do
139 it 'can save the status and read it back' do
140 call = make_test_call
temiola58327912014-12-15 17:51:16 -0800141 sts = Struct::Status.new(OK, 'OK')
nnoble097ef9b2014-12-01 17:06:10 -0800142 expect { call.status = sts }.not_to raise_error
temiola58327912014-12-15 17:51:16 -0800143 expect(call.status).to eq(sts)
nnoble097ef9b2014-12-01 17:06:10 -0800144 end
145
146 it 'must be set to a status' do
147 call = make_test_call
148 bad_sts = Object.new
149 expect { call.status = bad_sts }.to raise_error(TypeError)
150 end
151
152 it 'can be set to nil' do
153 call = make_test_call
154 expect { call.status = nil }.not_to raise_error
155 end
156 end
157
158 describe '#metadata' do
159 it 'can save the metadata hash and read it back' do
160 call = make_test_call
Tim Emiolae2860c52015-01-16 02:58:41 -0800161 md = { 'k1' => 'v1', 'k2' => 'v2' }
nnoble097ef9b2014-12-01 17:06:10 -0800162 expect { call.metadata = md }.not_to raise_error
163 expect(call.metadata).to be(md)
164 end
165
166 it 'must be set with a hash' do
167 call = make_test_call
168 bad_md = Object.new
169 expect { call.metadata = bad_md }.to raise_error(TypeError)
170 end
171
172 it 'can be set to nil' do
173 call = make_test_call
174 expect { call.metadata = nil }.not_to raise_error
175 end
176 end
177
nnoble097ef9b2014-12-01 17:06:10 -0800178 def make_test_call
Tim Emiola564719d2015-03-27 13:07:34 -0700179 @ch.create_call(client_queue, 'dummy_method', 'dummy_host', deadline)
nnoble097ef9b2014-12-01 17:06:10 -0800180 end
181
182 def deadline
183 Time.now + 2 # in 2 seconds; arbitrary
184 end
Craig Tiller190d3602015-02-18 09:23:38 -0800185end