From 339f4c04332d121e5c4df1c66b18cabb15aba487 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Mon, 9 Jul 2018 19:09:44 +0200 Subject: [PATCH] Properly create slices from utf8 strings. Fixes #426. --- packages/grpc-native-core/ext/slice.cc | 2 +- .../grpc-native-core/test/surface_test.js | 32 ++++++++++++++++--- .../grpc-native-core/test/test_service.proto | 1 + test/interop/interop_client.js | 6 ++-- 4 files changed, 33 insertions(+), 8 deletions(-) diff --git a/packages/grpc-native-core/ext/slice.cc b/packages/grpc-native-core/ext/slice.cc index 8806a61a..49bc05b0 100644 --- a/packages/grpc-native-core/ext/slice.cc +++ b/packages/grpc-native-core/ext/slice.cc @@ -51,7 +51,7 @@ void buffer_destroy_func(void *user_data) { grpc_slice CreateSliceFromString(const Local source) { Nan::HandleScope scope; Nan::Utf8String *utf8_value = new Nan::Utf8String(source); - return grpc_slice_new_with_user_data(**utf8_value, source->Length(), + return grpc_slice_new_with_user_data(**utf8_value, utf8_value->length(), string_destroy_func, utf8_value); } diff --git a/packages/grpc-native-core/test/surface_test.js b/packages/grpc-native-core/test/surface_test.js index 36179738..aa124620 100644 --- a/packages/grpc-native-core/test/surface_test.js +++ b/packages/grpc-native-core/test/surface_test.js @@ -839,8 +839,12 @@ describe('Other conditions', function() { unary: function(call, cb) { var req = call.request; if (req.error) { + var message = 'Requested error'; + if (req.message) { + message = req.message; + } cb({code: grpc.status.UNKNOWN, - details: 'Requested error'}, null, trailer_metadata); + details: message}, null, trailer_metadata); } else { cb(null, {count: 1}, trailer_metadata); } @@ -850,8 +854,12 @@ describe('Other conditions', function() { var errored; stream.on('data', function(data) { if (data.error) { + var message = 'Requested error'; + if (data.message) { + message = data.message; + } errored = true; - cb(new Error('Requested error'), null, trailer_metadata); + cb(new Error(message), null, trailer_metadata); } else { count += 1; } @@ -865,8 +873,12 @@ describe('Other conditions', function() { serverStream: function(stream) { var req = stream.request; if (req.error) { + var message = 'Requested error'; + if (req.message) { + message = req.message; + } var err = {code: grpc.status.UNKNOWN, - details: 'Requested error'}; + details: message}; err.metadata = trailer_metadata; stream.emit('error', err); } else { @@ -880,7 +892,11 @@ describe('Other conditions', function() { var count = 0; stream.on('data', function(data) { if (data.error) { - var err = new Error('Requested error'); + var message = 'Requested error'; + if (data.message) { + message = data.message; + } + var err = new Error(message); err.metadata = trailer_metadata.clone(); err.metadata.add('count', '' + count); stream.emit('error', err); @@ -1127,6 +1143,14 @@ describe('Other conditions', function() { done(); }); }); + it('for a UTF-8 error message', function(done) { + client.unary({error: true, message: '測試字符串'}, function(err, data) { + assert(err); + assert.strictEqual(err.code, grpc.status.UNKNOWN); + assert.strictEqual(err.details, '測試字符串'); + done(); + }); + }); }); describe('call.getPeer should return the peer', function() { it('for a unary call', function(done) { diff --git a/packages/grpc-native-core/test/test_service.proto b/packages/grpc-native-core/test/test_service.proto index b16dfecc..a0e49842 100644 --- a/packages/grpc-native-core/test/test_service.proto +++ b/packages/grpc-native-core/test/test_service.proto @@ -16,6 +16,7 @@ syntax = "proto3"; message Request { bool error = 1; + string message = 2; } message Response { diff --git a/test/interop/interop_client.js b/test/interop/interop_client.js index 195ef8d4..6bf68901 100644 --- a/test/interop/interop_client.js +++ b/test/interop/interop_client.js @@ -347,13 +347,13 @@ function statusCodeAndMessage(client, done) { var arg = { response_status: { code: 2, - message: 'test status message' + message: 'test status message - 測試字符串' } }; client.unaryCall(arg, function(err, resp) { assert(err); assert.strictEqual(err.code, 2); - assert.strictEqual(err.details, 'test status message'); + assert.strictEqual(err.details, 'test status message - 測試字符串'); done(); }); var duplex = client.fullDuplexCall(); @@ -361,7 +361,7 @@ function statusCodeAndMessage(client, done) { duplex.on('status', function(status) { assert(status); assert.strictEqual(status.code, 2); - assert.strictEqual(status.details, 'test status message'); + assert.strictEqual(status.details, 'test status message - 測試字符串'); done(); }); duplex.on('error', function(){});