blob: f1f86b35db39a4efc201e415dc26e73326917558 [file] [log] [blame]
murgatroid99749666e2015-01-12 18:25:58 -08001/*
2 *
murgatroid991578c6a2015-02-11 16:19:55 -08003 * Copyright 2015, Google Inc.
murgatroid99749666e2015-01-12 18:25:58 -08004 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions are
8 * met:
9 *
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above
13 * copyright notice, this list of conditions and the following disclaimer
14 * in the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google Inc. nor the names of its
17 * contributors may be used to endorse or promote products derived from
18 * this software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
23 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
24 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
25 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
26 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31 *
32 */
33
murgatroid99dca966d2015-02-19 14:37:18 -080034'use strict';
35
murgatroid99e5061512015-01-12 18:14:35 -080036var assert = require('assert');
murgatroid992af89e42015-10-01 11:54:00 -070037var grpc = require('bindings')('grpc_node');
murgatroid99e5061512015-01-12 18:14:35 -080038
murgatroid99e5061512015-01-12 18:14:35 -080039/**
40 * Helper function to return an absolute deadline given a relative timeout in
41 * seconds.
42 * @param {number} timeout_secs The number of seconds to wait before timing out
43 * @return {Date} A date timeout_secs in the future
44 */
45function getDeadline(timeout_secs) {
46 var deadline = new Date();
47 deadline.setSeconds(deadline.getSeconds() + timeout_secs);
48 return deadline;
49}
50
murgatroid995f709ca2015-09-30 14:22:54 -070051var insecureCreds = grpc.ChannelCredentials.createInsecure();
murgatroid99893690f2015-07-27 14:56:40 -070052
murgatroid99e5061512015-01-12 18:14:35 -080053describe('call', function() {
murgatroid994b962f72015-01-26 14:31:03 -080054 var channel;
55 var server;
56 before(function() {
57 server = new grpc.Server();
murgatroid991a7dcac2015-07-27 16:13:28 -070058 var port = server.addHttp2Port('localhost:0',
59 grpc.ServerCredentials.createInsecure());
murgatroid994b962f72015-01-26 14:31:03 -080060 server.start();
murgatroid99893690f2015-07-27 14:56:40 -070061 channel = new grpc.Channel('localhost:' + port, insecureCreds);
murgatroid994b962f72015-01-26 14:31:03 -080062 });
63 after(function() {
murgatroid99cb951f62015-08-18 17:38:11 -070064 server.forceShutdown();
murgatroid994b962f72015-01-26 14:31:03 -080065 });
murgatroid99e5061512015-01-12 18:14:35 -080066 describe('constructor', function() {
67 it('should reject anything less than 3 arguments', function() {
68 assert.throws(function() {
69 new grpc.Call();
70 }, TypeError);
71 assert.throws(function() {
72 new grpc.Call(channel);
73 }, TypeError);
74 assert.throws(function() {
75 new grpc.Call(channel, 'method');
76 }, TypeError);
77 });
78 it('should succeed with a Channel, a string, and a date or number',
79 function() {
80 assert.doesNotThrow(function() {
81 new grpc.Call(channel, 'method', new Date());
82 });
83 assert.doesNotThrow(function() {
84 new grpc.Call(channel, 'method', 0);
85 });
86 });
murgatroid99a16b5ef2015-08-03 15:18:23 -070087 it('should accept an optional fourth string parameter', function() {
88 assert.doesNotThrow(function() {
89 new grpc.Call(channel, 'method', new Date(), 'host_override');
90 });
91 });
murgatroid99e5061512015-01-12 18:14:35 -080092 it('should fail with a closed channel', function() {
murgatroid99893690f2015-07-27 14:56:40 -070093 var local_channel = new grpc.Channel('hostname', insecureCreds);
murgatroid99e5061512015-01-12 18:14:35 -080094 local_channel.close();
95 assert.throws(function() {
96 new grpc.Call(channel, 'method');
97 });
98 });
99 it('should fail with other types', function() {
100 assert.throws(function() {
101 new grpc.Call({}, 'method', 0);
102 }, TypeError);
103 assert.throws(function() {
104 new grpc.Call(channel, null, 0);
105 }, TypeError);
106 assert.throws(function() {
107 new grpc.Call(channel, 'method', 'now');
108 }, TypeError);
109 });
murgatroid9971f50362015-10-12 16:12:18 -0700110 it('should succeed without the new keyword', function() {
111 assert.doesNotThrow(function() {
112 var call = grpc.Call(channel, 'method', new Date());
113 assert(call instanceof grpc.Call);
114 });
115 });
murgatroid99e5061512015-01-12 18:14:35 -0800116 });
murgatroid996fe015e2015-10-12 13:18:06 -0700117 describe('deadline', function() {
118 it('should time out immediately with negative deadline', function(done) {
119 var call = new grpc.Call(channel, 'method', -Infinity);
120 var batch = {};
121 batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
122 call.startBatch(batch, function(err, response) {
123 assert.strictEqual(response.status.code, grpc.status.DEADLINE_EXCEEDED);
124 done();
125 });
126 });
127 });
murgatroid99016bb502015-02-09 15:55:10 -0800128 describe('startBatch', function() {
129 it('should fail without an object and a function', function() {
murgatroid99e5061512015-01-12 18:14:35 -0800130 var call = new grpc.Call(channel, 'method', getDeadline(1));
murgatroid99016bb502015-02-09 15:55:10 -0800131 assert.throws(function() {
132 call.startBatch();
murgatroid99e5061512015-01-12 18:14:35 -0800133 });
murgatroid99016bb502015-02-09 15:55:10 -0800134 assert.throws(function() {
135 call.startBatch({});
136 });
137 assert.throws(function() {
138 call.startBatch(null, function(){});
murgatroid997625db42015-01-28 15:36:27 -0800139 });
140 });
murgatroid99c55ee612015-02-12 13:58:24 -0800141 it('should succeed with an empty object', function(done) {
murgatroid997625db42015-01-28 15:36:27 -0800142 var call = new grpc.Call(channel, 'method', getDeadline(1));
143 assert.doesNotThrow(function() {
murgatroid99016bb502015-02-09 15:55:10 -0800144 call.startBatch({}, function(err) {
145 assert.ifError(err);
146 done();
147 });
murgatroid99e5061512015-01-12 18:14:35 -0800148 });
murgatroid99016bb502015-02-09 15:55:10 -0800149 });
150 });
151 describe('startBatch with metadata', function() {
152 it('should succeed with a map of strings to string arrays', function(done) {
153 var call = new grpc.Call(channel, 'method', getDeadline(1));
murgatroid99e5061512015-01-12 18:14:35 -0800154 assert.doesNotThrow(function() {
murgatroid99016bb502015-02-09 15:55:10 -0800155 var batch = {};
156 batch[grpc.opType.SEND_INITIAL_METADATA] = {'key1': ['value1'],
157 'key2': ['value2']};
158 call.startBatch(batch, function(err, resp) {
159 assert.ifError(err);
murgatroid99a627d892015-07-23 10:40:19 -0700160 assert.deepEqual(resp, {'send_metadata': true});
murgatroid99016bb502015-02-09 15:55:10 -0800161 done();
162 });
163 });
164 });
165 it('should succeed with a map of strings to buffer arrays', function(done) {
166 var call = new grpc.Call(channel, 'method', getDeadline(1));
167 assert.doesNotThrow(function() {
168 var batch = {};
169 batch[grpc.opType.SEND_INITIAL_METADATA] = {
murgatroid99da771512015-03-17 18:13:55 -0700170 'key1-bin': [new Buffer('value1')],
171 'key2-bin': [new Buffer('value2')]
murgatroid99016bb502015-02-09 15:55:10 -0800172 };
173 call.startBatch(batch, function(err, resp) {
174 assert.ifError(err);
murgatroid99a627d892015-07-23 10:40:19 -0700175 assert.deepEqual(resp, {'send_metadata': true});
murgatroid99016bb502015-02-09 15:55:10 -0800176 done();
177 });
murgatroid99e5061512015-01-12 18:14:35 -0800178 });
179 });
180 it('should fail with other parameter types', function() {
181 var call = new grpc.Call(channel, 'method', getDeadline(1));
182 assert.throws(function() {
murgatroid99016bb502015-02-09 15:55:10 -0800183 var batch = {};
184 batch[grpc.opType.SEND_INITIAL_METADATA] = undefined;
185 call.startBatch(batch, function(){});
murgatroid997625db42015-01-28 15:36:27 -0800186 });
187 assert.throws(function() {
murgatroid99016bb502015-02-09 15:55:10 -0800188 var batch = {};
189 batch[grpc.opType.SEND_INITIAL_METADATA] = null;
190 call.startBatch(batch, function(){});
murgatroid99e5061512015-01-12 18:14:35 -0800191 }, TypeError);
192 assert.throws(function() {
murgatroid99016bb502015-02-09 15:55:10 -0800193 var batch = {};
194 batch[grpc.opType.SEND_INITIAL_METADATA] = 'value';
195 call.startBatch(batch, function(){});
murgatroid99e5061512015-01-12 18:14:35 -0800196 }, TypeError);
197 assert.throws(function() {
murgatroid99016bb502015-02-09 15:55:10 -0800198 var batch = {};
199 batch[grpc.opType.SEND_INITIAL_METADATA] = 5;
200 call.startBatch(batch, function(){});
murgatroid99e5061512015-01-12 18:14:35 -0800201 }, TypeError);
202 });
murgatroid99e5061512015-01-12 18:14:35 -0800203 });
204 describe('cancel', function() {
205 it('should succeed', function() {
206 var call = new grpc.Call(channel, 'method', getDeadline(1));
207 assert.doesNotThrow(function() {
208 call.cancel();
209 });
210 });
211 });
murgatroid996fe015e2015-10-12 13:18:06 -0700212 describe('cancelWithStatus', function() {
213 it('should reject anything other than an integer and a string', function() {
214 assert.doesNotThrow(function() {
215 var call = new grpc.Call(channel, 'method', getDeadline(1));
216 call.cancelWithStatus(1, 'details');
217 });
218 assert.throws(function() {
219 var call = new grpc.Call(channel, 'method', getDeadline(1));
220 call.cancelWithStatus();
221 });
222 assert.throws(function() {
223 var call = new grpc.Call(channel, 'method', getDeadline(1));
224 call.cancelWithStatus('');
225 });
226 assert.throws(function() {
227 var call = new grpc.Call(channel, 'method', getDeadline(1));
228 call.cancelWithStatus(5, {});
229 });
230 });
231 it('should reject the OK status code', function() {
232 assert.throws(function() {
233 var call = new grpc.Call(channel, 'method', getDeadline(1));
234 call.cancelWithStatus(0, 'details');
235 });
236 });
237 it('should result in the call ending with a status', function(done) {
238 var call = new grpc.Call(channel, 'method', getDeadline(1));
239 var batch = {};
240 batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
241 call.startBatch(batch, function(err, response) {
242 assert.strictEqual(response.status.code, 5);
243 assert.strictEqual(response.status.details, 'details');
244 done();
245 });
246 call.cancelWithStatus(5, 'details');
247 });
248 });
murgatroid99ea12b972015-07-24 10:43:27 -0700249 describe('getPeer', function() {
250 it('should return a string', function() {
251 var call = new grpc.Call(channel, 'method', getDeadline(1));
252 assert.strictEqual(typeof call.getPeer(), 'string');
253 });
254 });
murgatroid99e5061512015-01-12 18:14:35 -0800255});