diff options
Diffstat (limited to 'src/node/test')
-rw-r--r-- | src/node/test/call_test.js | 4 | ||||
-rw-r--r-- | src/node/test/end_to_end_test.js | 87 | ||||
-rw-r--r-- | src/node/test/server_test.js | 94 | ||||
-rw-r--r-- | src/node/test/surface_test.js | 53 |
4 files changed, 226 insertions, 12 deletions
diff --git a/src/node/test/call_test.js b/src/node/test/call_test.js index 7b2b36ae37..98158ffff3 100644 --- a/src/node/test/call_test.js +++ b/src/node/test/call_test.js @@ -142,8 +142,8 @@ describe('call', function() { assert.doesNotThrow(function() { var batch = {}; batch[grpc.opType.SEND_INITIAL_METADATA] = { - 'key1': [new Buffer('value1')], - 'key2': [new Buffer('value2')] + 'key1-bin': [new Buffer('value1')], + 'key2-bin': [new Buffer('value2')] }; call.startBatch(batch, function(err, resp) { assert.ifError(err); diff --git a/src/node/test/end_to_end_test.js b/src/node/test/end_to_end_test.js index 1cc1928691..60e9861bc8 100644 --- a/src/node/test/end_to_end_test.js +++ b/src/node/test/end_to_end_test.js @@ -138,21 +138,21 @@ describe('end-to-end', function() { client_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true; call.startBatch(client_batch, function(err, response) { assert.ifError(err); - assert(response['send metadata']); - assert(response['client close']); - assert(response.hasOwnProperty('metadata')); - assert.strictEqual(response.metadata.server_key[0].toString(), - 'server_value'); - assert.deepEqual(response.status, {'code': grpc.status.OK, - 'details': status_text, - 'metadata': {}}); + assert.deepEqual(response,{ + 'send metadata': true, + 'client close': true, + metadata: {server_key: ['server_value']}, + status: {'code': grpc.status.OK, + 'details': status_text, + 'metadata': {}} + }); done(); }); server.requestCall(function(err, call_details) { var new_call = call_details['new call']; assert.notEqual(new_call, null); - assert.strictEqual(new_call.metadata.client_key[0].toString(), + assert.strictEqual(new_call.metadata.client_key[0], 'client_value'); var server_call = new_call.call; assert.notEqual(server_call, null); @@ -235,4 +235,73 @@ describe('end-to-end', function() { }); }); }); + it('should send multiple messages', function(complete) { + var done = multiDone(complete, 2); + var requests = ['req1', 'req2']; + var deadline = new Date(); + deadline.setSeconds(deadline.getSeconds() + 3); + var status_text = 'xyz'; + var call = new grpc.Call(channel, + 'dummy_method', + Infinity); + var client_batch = {}; + client_batch[grpc.opType.SEND_INITIAL_METADATA] = {}; + client_batch[grpc.opType.SEND_MESSAGE] = new Buffer(requests[0]); + client_batch[grpc.opType.RECV_INITIAL_METADATA] = true; + call.startBatch(client_batch, function(err, response) { + assert.ifError(err); + assert.deepEqual(response, { + 'send metadata': true, + 'send message': true, + 'metadata': {} + }); + var req2_batch = {}; + req2_batch[grpc.opType.SEND_MESSAGE] = new Buffer(requests[1]); + req2_batch[grpc.opType.SEND_CLOSE_FROM_CLIENT] = true; + req2_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true; + call.startBatch(req2_batch, function(err, resp) { + assert.ifError(err); + assert.deepEqual(resp, { + 'send message': true, + 'client close': true, + 'status': { + 'code': grpc.status.OK, + 'details': status_text, + 'metadata': {} + } + }); + done(); + }); + }); + + server.requestCall(function(err, call_details) { + var new_call = call_details['new call']; + assert.notEqual(new_call, null); + var server_call = new_call.call; + assert.notEqual(server_call, null); + var server_batch = {}; + server_batch[grpc.opType.SEND_INITIAL_METADATA] = {}; + server_batch[grpc.opType.RECV_MESSAGE] = true; + server_call.startBatch(server_batch, function(err, response) { + assert.ifError(err); + assert(response['send metadata']); + assert.strictEqual(response.read.toString(), requests[0]); + var end_batch = {}; + end_batch[grpc.opType.RECV_CLOSE_ON_SERVER] = true; + end_batch[grpc.opType.SEND_STATUS_FROM_SERVER] = { + 'metadata': {}, + 'code': grpc.status.OK, + 'details': status_text + }; + end_batch[grpc.opType.RECV_MESSAGE] = true; + server_call.startBatch(end_batch, function(err, response) { + assert.ifError(err); + assert(response['send status']); + assert(!response.cancelled); + assert.strictEqual(response.read.toString(), requests[1]); + done(); + }); + }); + }); + }); }); diff --git a/src/node/test/server_test.js b/src/node/test/server_test.js new file mode 100644 index 0000000000..7cb34fa0cb --- /dev/null +++ b/src/node/test/server_test.js @@ -0,0 +1,94 @@ +/* + * + * Copyright 2015, Google Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Google Inc. nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +'use strict'; + +var assert = require('assert'); +var grpc = require('bindings')('grpc.node'); + +describe('server', function() { + describe('constructor', function() { + it('should work with no arguments', function() { + assert.doesNotThrow(function() { + new grpc.Server(); + }); + }); + it('should work with an empty list argument', function() { + assert.doesNotThrow(function() { + new grpc.Server([]); + }); + }); + }); + describe('addHttp2Port', function() { + var server; + before(function() { + server = new grpc.Server(); + }); + it('should bind to an unused port', function() { + var port; + assert.doesNotThrow(function() { + port = server.addHttp2Port('0.0.0.0:0'); + }); + assert(port > 0); + }); + }); + describe('addSecureHttp2Port', function() { + var server; + before(function() { + server = new grpc.Server(); + }); + it('should bind to an unused port with fake credentials', function() { + var port; + var creds = grpc.ServerCredentials.createFake(); + assert.doesNotThrow(function() { + port = server.addSecureHttp2Port('0.0.0.0:0', creds); + }); + assert(port > 0); + }); + }); + describe('listen', function() { + var server; + before(function() { + server = new grpc.Server(); + server.addHttp2Port('0.0.0.0:0'); + }); + after(function() { + server.shutdown(); + }); + it('should listen without error', function() { + assert.doesNotThrow(function() { + server.start(); + }); + }); + }); +}); diff --git a/src/node/test/surface_test.js b/src/node/test/surface_test.js index 91d8197bee..96b47815e1 100644 --- a/src/node/test/surface_test.js +++ b/src/node/test/surface_test.js @@ -45,6 +45,8 @@ var math_proto = ProtoBuf.loadProtoFile(__dirname + '/../examples/math.proto'); var mathService = math_proto.lookup('math.Math'); +var capitalize = require('underscore.string/capitalize'); + describe('Surface server constructor', function() { it('Should fail with conflicting method names', function() { assert.throws(function() { @@ -75,6 +77,55 @@ describe('Surface server constructor', function() { }, /math.Math/); }); }); +describe('Generic client and server', function() { + function toString(val) { + return val.toString(); + } + function toBuffer(str) { + return new Buffer(str); + } + var string_service_attrs = { + 'capitalize' : { + path: '/string/capitalize', + requestStream: false, + responseStream: false, + requestSerialize: toBuffer, + requestDeserialize: toString, + responseSerialize: toBuffer, + responseDeserialize: toString + } + }; + describe('String client and server', function() { + var client; + var server; + before(function() { + var Server = grpc.makeGenericServerConstructor({ + string: string_service_attrs + }); + server = new Server({ + string: { + capitalize: function(call, callback) { + callback(null, capitalize(call.request)); + } + } + }); + var port = server.bind('localhost:0'); + server.listen(); + var Client = grpc.makeGenericClientConstructor(string_service_attrs); + client = new Client('localhost:' + port); + }); + after(function() { + server.shutdown(); + }); + it('Should respond with a capitalized string', function(done) { + client.capitalize('abc', function(err, response) { + assert.ifError(err); + assert.strictEqual(response, 'Abc'); + done(); + }); + }); + }); +}); describe('Cancelling surface client', function() { var client; var server; @@ -89,7 +140,7 @@ describe('Cancelling surface client', function() { } }); var port = server.bind('localhost:0'); - var Client = surface_client.makeClientConstructor(mathService); + var Client = surface_client.makeProtobufClientConstructor(mathService); client = new Client('localhost:' + port); }); after(function() { |