aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/node
diff options
context:
space:
mode:
authorGravatar murgatroid99 <mlumish@google.com>2016-02-17 15:36:28 -0800
committerGravatar murgatroid99 <mlumish@google.com>2016-02-17 15:36:28 -0800
commit654d2549b752dfd74500f0b5882abaf306cd62c1 (patch)
tree05a0f733520e1cb0c6d3cab93930a88a45bbc050 /src/node
parentc02910b07ae492098d7d0c1bca747fbcad742393 (diff)
Add tests and documentation for new options
Diffstat (limited to 'src/node')
-rw-r--r--src/node/index.js10
-rw-r--r--src/node/src/client.js3
-rw-r--r--src/node/src/common.js11
-rw-r--r--src/node/test/common_test.js50
-rw-r--r--src/node/test/test_messages.proto5
5 files changed, 71 insertions, 8 deletions
diff --git a/src/node/index.js b/src/node/index.js
index 4e4d12d9e4..1c197729d7 100644
--- a/src/node/index.js
+++ b/src/node/index.js
@@ -78,7 +78,15 @@ exports.loadObject = function loadObject(value, options) {
var loadObject = exports.loadObject;
/**
- * Load a gRPC object from a .proto file.
+ * Load a gRPC object from a .proto file. The options object can provide the
+ * following options:
+ * - convertFieldsToCamelCase: Loads this file with that option on protobuf.js
+ * set as specified. See
+ * https://github.com/dcodeIO/protobuf.js/wiki/Advanced-options for details
+ * - binaryAsBase64: deserialize bytes values as base64 strings instead of
+ * Buffers. Defaults to false
+ * - longsAsStrings: deserialize long values as strings instead of objects.
+ * Defaults to true
* @param {string|{root: string, file: string}} filename The file to load
* @param {string=} format The file format to expect. Must be either 'proto' or
* 'json'. Defaults to 'proto'
diff --git a/src/node/src/client.js b/src/node/src/client.js
index 5523d6b9a4..c02c44730e 100644
--- a/src/node/src/client.js
+++ b/src/node/src/client.js
@@ -702,7 +702,8 @@ exports.waitForClientReady = function(client, deadline, callback) {
* @return {function(string, Object)} New client constructor
*/
exports.makeProtobufClientConstructor = function(service, options) {
- var method_attrs = common.getProtobufServiceAttrs(service, service.name, options);
+ var method_attrs = common.getProtobufServiceAttrs(service, service.name,
+ options);
var Client = exports.makeClientConstructor(
method_attrs, common.fullyQualifiedName(service));
Client.service = service;
diff --git a/src/node/src/common.js b/src/node/src/common.js
index 3e6609ab10..e5217608ec 100644
--- a/src/node/src/common.js
+++ b/src/node/src/common.js
@@ -44,10 +44,10 @@ var _ = require('lodash');
/**
* Get a function that deserializes a specific type of protobuf.
* @param {function()} cls The constructor of the message type to deserialize
- * @param {bool=} binaryAsBase64 Deserialize bytes fields as base64 instead of binary.
- * Defaults to false
- * @param {bool=} longsAsStrings Deserialize long values as strings instead of doubles.
- * Defaults to true
+ * @param {bool=} binaryAsBase64 Deserialize bytes fields as base64 strings
+ * instead of Buffers. Defaults to false
+ * @param {bool=} longsAsStrings Deserialize long values as strings instead of
+ * objects. Defaults to true
* @return {function(Buffer):cls} The deserialization function
*/
exports.deserializeCls = function deserializeCls(cls, binaryAsBase64,
@@ -133,7 +133,8 @@ exports.wrapIgnoreNull = function wrapIgnoreNull(func) {
* @param {Object=} options Options to apply to these attributes
* @return {Object} The attributes map
*/
-exports.getProtobufServiceAttrs = function getProtobufServiceAttrs(service, options) {
+exports.getProtobufServiceAttrs = function getProtobufServiceAttrs(service,
+ options) {
var prefix = '/' + fullyQualifiedName(service) + '/';
var binaryAsBase64, longsAsStrings;
if (options) {
diff --git a/src/node/test/common_test.js b/src/node/test/common_test.js
index 08ba429ed7..c57b7388f6 100644
--- a/src/node/test/common_test.js
+++ b/src/node/test/common_test.js
@@ -42,7 +42,7 @@ var ProtoBuf = require('protobufjs');
var messages_proto = ProtoBuf.loadProtoFile(
__dirname + '/test_messages.proto').build();
-describe('Proto message serialize and deserialize', function() {
+describe('Proto message long int serialize and deserialize', function() {
var longSerialize = common.serializeCls(messages_proto.LongValues);
var longDeserialize = common.deserializeCls(messages_proto.LongValues);
var pos_value = '314159265358979';
@@ -87,4 +87,52 @@ describe('Proto message serialize and deserialize', function() {
assert.strictEqual(longDeserialize(serialized).sfixed_64.toString(),
neg_value);
});
+ it('should deserialize as a number with the right option set', function() {
+ var longNumDeserialize = common.deserializeCls(messages_proto.LongValues,
+ false, false);
+ var serialized = longSerialize({int_64: pos_value});
+ assert.strictEqual(typeof longDeserialize(serialized).int_64, 'string');
+ /* With the longsAsStrings option disabled, long values are represented as
+ * objects with 3 keys: low, high, and unsigned */
+ assert.strictEqual(typeof longNumDeserialize(serialized).int_64, 'object');
+ });
+});
+describe('Proto message bytes serialize and deserialize', function() {
+ var sequenceSerialize = common.serializeCls(messages_proto.SequenceValues);
+ var sequenceDeserialize = common.deserializeCls(
+ messages_proto.SequenceValues);
+ var sequenceBase64Deserialize = common.deserializeCls(
+ messages_proto.SequenceValues, true);
+ var buffer_val = new Buffer([0x69, 0xb7]);
+ var base64_val = 'abc=';
+ it('should preserve a buffer', function() {
+ var serialized = sequenceSerialize({bytes_field: buffer_val});
+ var deserialized = sequenceDeserialize(serialized);
+ assert.strictEqual(deserialized.bytes_field.compare(buffer_val), 0);
+ });
+ it('should accept base64 encoded strings', function() {
+ var serialized = sequenceSerialize({bytes_field: base64_val});
+ var deserialized = sequenceDeserialize(serialized);
+ assert.strictEqual(deserialized.bytes_field.compare(buffer_val), 0);
+ });
+ it('should output base64 encoded strings with an option set', function() {
+ var serialized = sequenceSerialize({bytes_field: base64_val});
+ var deserialized = sequenceBase64Deserialize(serialized);
+ assert.strictEqual(deserialized.bytes_field, base64_val);
+ });
+ /* The next two tests are specific tests to verify that issue
+ * https://github.com/grpc/grpc/issues/5174 has been fixed. They are skipped
+ * because they will not pass until a protobuf.js release has been published
+ * with a fix for https://github.com/dcodeIO/protobuf.js/issues/390 */
+ it.skip('should serialize a repeated field as packed by default', function() {
+ var expected_serialize = new Buffer([0x12, 0x01, 0x01, 0x0a]);
+ var serialized = sequenceSerialize({repeated_field: [10]});
+ assert.strictEqual(expected_serialize.compare(serialized), 0);
+ });
+ it.skip('should deserialize packed or unpacked repeated', function() {
+ var serialized = new Buffer([0x12, 0x01, 0x01, 0x0a]);
+ assert.doesNotThrow(function() {
+ sequenceDeserialize(serialized);
+ });
+ });
});
diff --git a/src/node/test/test_messages.proto b/src/node/test/test_messages.proto
index c77a937d3f..d1ffcf996d 100644
--- a/src/node/test/test_messages.proto
+++ b/src/node/test/test_messages.proto
@@ -36,3 +36,8 @@ message LongValues {
fixed64 fixed_64 = 4;
sfixed64 sfixed_64 = 5;
}
+
+message SequenceValues {
+ bytes bytes_field = 1;
+ repeated int32 repeated_field = 2;
+} \ No newline at end of file