diff --git a/src/node/interop/interop_client.js b/src/node/interop/interop_client.js index 02f341113d39eb9d2f001e04cac86c295cb05927..2b51bcae6a31fc350dffb6d112cbbd6c0fd426f6 100644 --- a/src/node/interop/interop_client.js +++ b/src/node/interop/interop_client.js @@ -86,7 +86,7 @@ function emptyUnary(client, done) { */ function largeUnary(client, done) { var arg = { - response_type: testProto.PayloadType.COMPRESSABLE, + response_type: 'COMPRESSABLE', response_size: 314159, payload: { body: zeroBuffer(271828) @@ -94,9 +94,8 @@ function largeUnary(client, done) { }; var call = client.unaryCall(arg, function(err, resp) { assert.ifError(err); - assert.strictEqual(resp.payload.type, testProto.PayloadType.COMPRESSABLE); - assert.strictEqual(resp.payload.body.limit - resp.payload.body.offset, - 314159); + assert.strictEqual(resp.payload.type, 'COMPRESSABLE'); + assert.strictEqual(resp.payload.body.length, 314159); }); call.on('status', function(status) { assert.strictEqual(status.code, grpc.status.OK); @@ -138,7 +137,7 @@ function clientStreaming(client, done) { */ function serverStreaming(client, done) { var arg = { - response_type: testProto.PayloadType.COMPRESSABLE, + response_type: 'COMPRESSABLE', response_parameters: [ {size: 31415}, {size: 9}, @@ -150,8 +149,8 @@ function serverStreaming(client, done) { var resp_index = 0; call.on('data', function(value) { assert(resp_index < 4); - assert.strictEqual(value.payload.type, testProto.PayloadType.COMPRESSABLE); - assert.strictEqual(value.payload.body.limit - value.payload.body.offset, + assert.strictEqual(value.payload.type, 'COMPRESSABLE'); + assert.strictEqual(value.payload.body.length, arg.response_parameters[resp_index].size); resp_index += 1; }); @@ -182,23 +181,21 @@ function pingPong(client, done) { }); var index = 0; call.write({ - response_type: testProto.PayloadType.COMPRESSABLE, + response_type: 'COMPRESSABLE', response_parameters: [ {size: response_sizes[index]} ], payload: {body: zeroBuffer(payload_sizes[index])} }); call.on('data', function(response) { - assert.strictEqual(response.payload.type, - testProto.PayloadType.COMPRESSABLE); - assert.equal(response.payload.body.limit - response.payload.body.offset, - response_sizes[index]); + assert.strictEqual(response.payload.type, 'COMPRESSABLE'); + assert.equal(response.payload.body.length, response_sizes[index]); index += 1; if (index === 4) { call.end(); } else { call.write({ - response_type: testProto.PayloadType.COMPRESSABLE, + response_type: 'COMPRESSABLE', response_parameters: [ {size: response_sizes[index]} ], @@ -251,7 +248,7 @@ function cancelAfterBegin(client, done) { function cancelAfterFirstResponse(client, done) { var call = client.fullDuplexCall(); call.write({ - response_type: testProto.PayloadType.COMPRESSABLE, + response_type: 'COMPRESSABLE', response_parameters: [ {size: 31415} ], @@ -281,7 +278,7 @@ function authTest(expected_user, client, done) { } client.updateMetadata = grpc.getGoogleAuthDelegate(credential); var arg = { - response_type: testProto.PayloadType.COMPRESSABLE, + response_type: 'COMPRESSABLE', response_size: 314159, payload: { body: zeroBuffer(271828) @@ -291,9 +288,8 @@ function authTest(expected_user, client, done) { }; var call = client.unaryCall(arg, function(err, resp) { assert.ifError(err); - assert.strictEqual(resp.payload.type, testProto.PayloadType.COMPRESSABLE); - assert.strictEqual(resp.payload.body.limit - resp.payload.body.offset, - 314159); + assert.strictEqual(resp.payload.type, 'COMPRESSABLE'); + assert.strictEqual(resp.payload.body.length, 314159); assert.strictEqual(resp.username, expected_user); assert.strictEqual(resp.oauth_scope, AUTH_SCOPE_RESPONSE); }); diff --git a/src/node/interop/interop_server.js b/src/node/interop/interop_server.js index 8e5c03666fa3b7ddcfb02ae9bd77a9856af52351..dad59c1347769386026c1d322db2545703de9e61 100644 --- a/src/node/interop/interop_server.js +++ b/src/node/interop/interop_server.js @@ -72,10 +72,9 @@ function handleUnary(call, callback) { var req = call.request; var zeros = zeroBuffer(req.response_size); var payload_type = req.response_type; - if (payload_type === testProto.PayloadType.RANDOM) { - payload_type = [ - testProto.PayloadType.COMPRESSABLE, - testProto.PayloadType.UNCOMPRESSABLE][Math.random() < 0.5 ? 0 : 1]; + if (payload_type === 'RANDOM') { + payload_type = ['COMPRESSABLE', + 'UNCOMPRESSABLE'][Math.random() < 0.5 ? 0 : 1]; } callback(null, {payload: {type: payload_type, body: zeros}}); } @@ -89,7 +88,7 @@ function handleUnary(call, callback) { function handleStreamingInput(call, callback) { var aggregate_size = 0; call.on('data', function(value) { - aggregate_size += value.payload.body.limit - value.payload.body.offset; + aggregate_size += value.payload.body.length; }); call.on('end', function() { callback(null, {aggregated_payload_size: aggregate_size}); @@ -103,10 +102,9 @@ function handleStreamingInput(call, callback) { function handleStreamingOutput(call) { var req = call.request; var payload_type = req.response_type; - if (payload_type === testProto.PayloadType.RANDOM) { - payload_type = [ - testProto.PayloadType.COMPRESSABLE, - testProto.PayloadType.UNCOMPRESSABLE][Math.random() < 0.5 ? 0 : 1]; + if (payload_type === 'RANDOM') { + payload_type = ['COMPRESSABLE', + 'UNCOMPRESSABLE'][Math.random() < 0.5 ? 0 : 1]; } _.each(req.response_parameters, function(resp_param) { call.write({ @@ -127,10 +125,9 @@ function handleStreamingOutput(call) { function handleFullDuplex(call) { call.on('data', function(value) { var payload_type = value.response_type; - if (payload_type === testProto.PayloadType.RANDOM) { - payload_type = [ - testProto.PayloadType.COMPRESSABLE, - testProto.PayloadType.UNCOMPRESSABLE][Math.random() < 0.5 ? 0 : 1]; + if (payload_type === 'RANDOM') { + payload_type = ['COMPRESSABLE', + 'UNCOMPRESSABLE'][Math.random() < 0.5 ? 0 : 1]; } _.each(value.response_parameters, function(resp_param) { call.write({ diff --git a/src/node/package.json b/src/node/package.json index 4033bc59cf95d3779dde3c187514d4ab8032ef7e..8d413c3ffaafd88e223c9e0398a4ef1598b0ce00 100644 --- a/src/node/package.json +++ b/src/node/package.json @@ -1,6 +1,6 @@ { "name": "grpc", - "version": "0.7.0", + "version": "0.8.0", "author": "Google Inc.", "description": "gRPC Library for Node", "homepage": "http://www.grpc.io/", diff --git a/src/node/src/common.js b/src/node/src/common.js index 55a6b137828a05150e3cdfd41402ea4ae564efab..98917c0fdd086087bd77edf1b6087499b5e4af59 100644 --- a/src/node/src/common.js +++ b/src/node/src/common.js @@ -50,7 +50,7 @@ function deserializeCls(cls) { * @return {cls} The resulting object */ return function deserialize(arg_buf) { - return cls.decode(arg_buf); + return cls.decode(arg_buf).toRaw(); }; } diff --git a/src/node/test/echo_service.proto b/src/node/test/echo_service.proto new file mode 100644 index 0000000000000000000000000000000000000000..b2c7e3dc23676c8fb07891d0851528e84b921f2e --- /dev/null +++ b/src/node/test/echo_service.proto @@ -0,0 +1,39 @@ +// 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. + +syntax = "proto3"; + +message EchoMessage { + string value = 1; + int32 value2 = 2; +} + +service EchoService { + rpc Echo (EchoMessage) returns (EchoMessage); +} \ No newline at end of file diff --git a/src/node/test/surface_test.js b/src/node/test/surface_test.js index 38f9028bffb1f1f203479abe15475934b5550245..9c72c29fab3fa0bf437ed310fcdbcc5f2a952b73 100644 --- a/src/node/test/surface_test.js +++ b/src/node/test/surface_test.js @@ -99,6 +99,36 @@ describe('Surface server constructor', function() { }, /math.Math/); }); }); +describe('Echo service', function() { + var server; + var client; + before(function() { + var test_proto = ProtoBuf.loadProtoFile(__dirname + '/echo_service.proto'); + var echo_service = test_proto.lookup('EchoService'); + var Server = grpc.buildServer([echo_service]); + server = new Server({ + 'EchoService': { + echo: function(call, callback) { + callback(null, call.request); + } + } + }); + var port = server.bind('localhost:0'); + var Client = surface_client.makeProtobufClientConstructor(echo_service); + client = new Client('localhost:' + port); + server.listen(); + }); + after(function() { + server.shutdown(); + }); + it('should echo the recieved message directly', function(done) { + client.echo({value: 'test value', value2: 3}, function(error, response) { + assert.ifError(error); + assert.deepEqual(response, {value: 'test value', value2: 3}); + done(); + }); + }); +}); describe('Generic client and server', function() { function toString(val) { return val.toString();