From cca5ffa9911b810042a30978eb92ca3d426b1c20 Mon Sep 17 00:00:00 2001 From: murgatroid99 Date: Thu, 15 Jan 2015 14:06:56 -0800 Subject: Added code generation for clients and servers --- src/node/test/math_client_test.js | 86 ++++----------------------------------- src/node/test/surface_test.js | 75 ++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 78 deletions(-) create mode 100644 src/node/test/surface_test.js (limited to 'src/node/test') diff --git a/src/node/test/math_client_test.js b/src/node/test/math_client_test.js index 5b34a228ad..45c956d179 100644 --- a/src/node/test/math_client_test.js +++ b/src/node/test/math_client_test.js @@ -32,83 +32,13 @@ */ var assert = require('assert'); -var ProtoBuf = require('protobufjs'); var port_picker = require('../port_picker'); -var builder = ProtoBuf.loadProtoFile(__dirname + '/../examples/math.proto'); -var math = builder.build('math'); +var grpc = require('..'); +var math = grpc.load(__dirname + '/../examples/math.proto').math; -var client = require('../surface_client.js'); -var makeConstructor = client.makeClientConstructor; /** - * Get a function that deserializes a specific type of protobuf. - * @param {function()} cls The constructor of the message type to deserialize - * @return {function(Buffer):cls} The deserialization function - */ -function deserializeCls(cls) { - /** - * Deserialize a buffer to a message object - * @param {Buffer} arg_buf The buffer to deserialize - * @return {cls} The resulting object - */ - return function deserialize(arg_buf) { - return cls.decode(arg_buf); - }; -} - -/** - * Get a function that serializes objects to a buffer by protobuf class. - * @param {function()} Cls The constructor of the message type to serialize - * @return {function(Cls):Buffer} The serialization function - */ -function serializeCls(Cls) { - /** - * Serialize an object to a Buffer - * @param {Object} arg The object to serialize - * @return {Buffer} The serialized object - */ - return function serialize(arg) { - return new Buffer(new Cls(arg).encode().toBuffer()); - }; -} - -/* This function call creates a client constructor for clients that expose the - * four specified methods. This specifies how to serialize messages that the - * client sends and deserialize messages that the server sends, and whether the - * client or the server will send a stream of messages, for each method. This - * also specifies a prefix that will be added to method names when sending them - * on the wire. This function call and all of the preceding code in this file - * are intended to approximate what the generated code will look like for the - * math client */ -var MathClient = makeConstructor({ - Div: { - serialize: serializeCls(math.DivArgs), - deserialize: deserializeCls(math.DivReply), - client_stream: false, - server_stream: false - }, - Fib: { - serialize: serializeCls(math.FibArgs), - deserialize: deserializeCls(math.Num), - client_stream: false, - server_stream: true - }, - Sum: { - serialize: serializeCls(math.Num), - deserialize: deserializeCls(math.Num), - client_stream: true, - server_stream: false - }, - DivMany: { - serialize: serializeCls(math.DivArgs), - deserialize: deserializeCls(math.DivReply), - client_stream: true, - server_stream: true - } -}, '/Math/'); - -/** - * Channel to use to make requests to a running server. + * Client to use to make requests to a running server. */ var math_client; @@ -122,7 +52,7 @@ describe('Math client', function() { before(function(done) { port_picker.nextAvailablePort(function(port) { server.bind(port).listen(); - math_client = new MathClient(port); + math_client = new math.Math(port); done(); }); }); @@ -137,7 +67,7 @@ describe('Math client', function() { assert.equal(value.remainder, 3); }); call.on('status', function checkStatus(status) { - assert.strictEqual(status.code, client.status.OK); + assert.strictEqual(status.code, grpc.status.OK); done(); }); }); @@ -150,7 +80,7 @@ describe('Math client', function() { next_expected += 1; }); call.on('status', function checkStatus(status) { - assert.strictEqual(status.code, client.status.OK); + assert.strictEqual(status.code, grpc.status.OK); done(); }); }); @@ -164,7 +94,7 @@ describe('Math client', function() { } call.end(); call.on('status', function checkStatus(status) { - assert.strictEqual(status.code, client.status.OK); + assert.strictEqual(status.code, grpc.status.OK); done(); }); }); @@ -184,7 +114,7 @@ describe('Math client', function() { } call.end(); call.on('status', function checkStatus(status) { - assert.strictEqual(status.code, client.status.OK); + assert.strictEqual(status.code, grpc.status.OK); done(); }); }); diff --git a/src/node/test/surface_test.js b/src/node/test/surface_test.js new file mode 100644 index 0000000000..8d0d8ec3bc --- /dev/null +++ b/src/node/test/surface_test.js @@ -0,0 +1,75 @@ +/* + * + * Copyright 2014, 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. + * + */ + +var assert = require('assert'); + +var surface_server = require('../surface_server.js'); + +var ProtoBuf = require('protobufjs'); + +var grpc = require('..'); + +var math_proto = ProtoBuf.loadProtoFile(__dirname + '/../examples/math.proto'); + +var mathService = math_proto.lookup('math.Math'); + +describe('Surface server constructor', function() { + it('Should fail with conflicting method names', function() { + assert.throws(function() { + grpc.buildServer([mathService, mathService]); + }); + }); + it('Should succeed with a single service', function() { + assert.doesNotThrow(function() { + grpc.buildServer([mathService]); + }); + }); + it('Should fail with missing handlers', function() { + var Server = grpc.buildServer([mathService]); + assert.throws(function() { + new Server({ + 'math.Math': { + 'Div': function() {}, + 'DivMany': function() {}, + 'Fib': function() {} + } + }); + }, /math.Math.Sum/); + }); + it('Should fail with no handlers for the service', function() { + var Server = grpc.buildServer([mathService]); + assert.throws(function() { + new Server({}); + }, /math.Math/); + }); +}); -- cgit v1.2.3