mirror of https://github.com/grpc/grpc-node.git
Merge branch 'master' into node_explicit_insecure_channel
This commit is contained in:
commit
64bc987d00
|
@ -85,7 +85,7 @@ An object with factory methods for creating credential objects for clients.
|
||||||
ServerCredentials
|
ServerCredentials
|
||||||
```
|
```
|
||||||
|
|
||||||
An object with factory methods fro creating credential objects for servers.
|
An object with factory methods for creating credential objects for servers.
|
||||||
|
|
||||||
[homebrew]:http://brew.sh
|
[homebrew]:http://brew.sh
|
||||||
[linuxbrew]:https://github.com/Homebrew/linuxbrew#installation
|
[linuxbrew]:https://github.com/Homebrew/linuxbrew#installation
|
||||||
|
|
22
ext/call.cc
22
ext/call.cc
|
@ -192,7 +192,7 @@ class SendMetadataOp : public Op {
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
std::string GetTypeString() const {
|
std::string GetTypeString() const {
|
||||||
return "send metadata";
|
return "send_metadata";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -216,7 +216,7 @@ class SendMessageOp : public Op {
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
std::string GetTypeString() const {
|
std::string GetTypeString() const {
|
||||||
return "send message";
|
return "send_message";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -232,7 +232,7 @@ class SendClientCloseOp : public Op {
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
std::string GetTypeString() const {
|
std::string GetTypeString() const {
|
||||||
return "client close";
|
return "client_close";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -276,7 +276,7 @@ class SendServerStatusOp : public Op {
|
||||||
}
|
}
|
||||||
protected:
|
protected:
|
||||||
std::string GetTypeString() const {
|
std::string GetTypeString() const {
|
||||||
return "send status";
|
return "send_status";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -453,6 +453,8 @@ void Call::Init(Handle<Object> exports) {
|
||||||
NanNew<FunctionTemplate>(StartBatch)->GetFunction());
|
NanNew<FunctionTemplate>(StartBatch)->GetFunction());
|
||||||
NanSetPrototypeTemplate(tpl, "cancel",
|
NanSetPrototypeTemplate(tpl, "cancel",
|
||||||
NanNew<FunctionTemplate>(Cancel)->GetFunction());
|
NanNew<FunctionTemplate>(Cancel)->GetFunction());
|
||||||
|
NanSetPrototypeTemplate(tpl, "getPeer",
|
||||||
|
NanNew<FunctionTemplate>(GetPeer)->GetFunction());
|
||||||
NanAssignPersistent(fun_tpl, tpl);
|
NanAssignPersistent(fun_tpl, tpl);
|
||||||
Handle<Function> ctr = tpl->GetFunction();
|
Handle<Function> ctr = tpl->GetFunction();
|
||||||
ctr->Set(NanNew("WRITE_BUFFER_HINT"),
|
ctr->Set(NanNew("WRITE_BUFFER_HINT"),
|
||||||
|
@ -608,5 +610,17 @@ NAN_METHOD(Call::Cancel) {
|
||||||
NanReturnUndefined();
|
NanReturnUndefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NAN_METHOD(Call::GetPeer) {
|
||||||
|
NanScope();
|
||||||
|
if (!HasInstance(args.This())) {
|
||||||
|
return NanThrowTypeError("getPeer can only be called on Call objects");
|
||||||
|
}
|
||||||
|
Call *call = ObjectWrap::Unwrap<Call>(args.This());
|
||||||
|
char *peer = grpc_call_get_peer(call->wrapped_call);
|
||||||
|
Handle<Value> peer_value = NanNew(peer);
|
||||||
|
gpr_free(peer);
|
||||||
|
NanReturnValue(peer_value);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace node
|
} // namespace node
|
||||||
} // namespace grpc
|
} // namespace grpc
|
||||||
|
|
|
@ -120,6 +120,7 @@ class Call : public ::node::ObjectWrap {
|
||||||
static NAN_METHOD(New);
|
static NAN_METHOD(New);
|
||||||
static NAN_METHOD(StartBatch);
|
static NAN_METHOD(StartBatch);
|
||||||
static NAN_METHOD(Cancel);
|
static NAN_METHOD(Cancel);
|
||||||
|
static NAN_METHOD(GetPeer);
|
||||||
static NanCallback *constructor;
|
static NanCallback *constructor;
|
||||||
// Used for typechecking instances of this javascript class
|
// Used for typechecking instances of this javascript class
|
||||||
static v8::Persistent<v8::FunctionTemplate> fun_tpl;
|
static v8::Persistent<v8::FunctionTemplate> fun_tpl;
|
||||||
|
|
|
@ -76,6 +76,8 @@ void Channel::Init(Handle<Object> exports) {
|
||||||
tpl->InstanceTemplate()->SetInternalFieldCount(1);
|
tpl->InstanceTemplate()->SetInternalFieldCount(1);
|
||||||
NanSetPrototypeTemplate(tpl, "close",
|
NanSetPrototypeTemplate(tpl, "close",
|
||||||
NanNew<FunctionTemplate>(Close)->GetFunction());
|
NanNew<FunctionTemplate>(Close)->GetFunction());
|
||||||
|
NanSetPrototypeTemplate(tpl, "getTarget",
|
||||||
|
NanNew<FunctionTemplate>(GetTarget)->GetFunction());
|
||||||
NanAssignPersistent(fun_tpl, tpl);
|
NanAssignPersistent(fun_tpl, tpl);
|
||||||
Handle<Function> ctr = tpl->GetFunction();
|
Handle<Function> ctr = tpl->GetFunction();
|
||||||
constructor = new NanCallback(ctr);
|
constructor = new NanCallback(ctr);
|
||||||
|
@ -103,7 +105,7 @@ NAN_METHOD(Channel::New) {
|
||||||
NanUtf8String *host = new NanUtf8String(args[0]);
|
NanUtf8String *host = new NanUtf8String(args[0]);
|
||||||
NanUtf8String *host_override = NULL;
|
NanUtf8String *host_override = NULL;
|
||||||
if (args[1]->IsUndefined()) {
|
if (args[1]->IsUndefined()) {
|
||||||
wrapped_channel = grpc_channel_create(**host, NULL);
|
wrapped_channel = grpc_insecure_channel_create(**host, NULL);
|
||||||
} else if (args[1]->IsObject()) {
|
} else if (args[1]->IsObject()) {
|
||||||
grpc_credentials *creds = NULL;
|
grpc_credentials *creds = NULL;
|
||||||
Handle<Object> args_hash(args[1]->ToObject()->Clone());
|
Handle<Object> args_hash(args[1]->ToObject()->Clone());
|
||||||
|
@ -148,7 +150,7 @@ NAN_METHOD(Channel::New) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (creds == NULL) {
|
if (creds == NULL) {
|
||||||
wrapped_channel = grpc_channel_create(**host, &channel_args);
|
wrapped_channel = grpc_insecure_channel_create(**host, &channel_args);
|
||||||
} else {
|
} else {
|
||||||
wrapped_channel =
|
wrapped_channel =
|
||||||
grpc_secure_channel_create(creds, **host, &channel_args);
|
grpc_secure_channel_create(creds, **host, &channel_args);
|
||||||
|
@ -185,5 +187,14 @@ NAN_METHOD(Channel::Close) {
|
||||||
NanReturnUndefined();
|
NanReturnUndefined();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NAN_METHOD(Channel::GetTarget) {
|
||||||
|
NanScope();
|
||||||
|
if (!HasInstance(args.This())) {
|
||||||
|
return NanThrowTypeError("getTarget can only be called on Channel objects");
|
||||||
|
}
|
||||||
|
Channel *channel = ObjectWrap::Unwrap<Channel>(args.This());
|
||||||
|
NanReturnValue(NanNew(grpc_channel_get_target(channel->wrapped_channel)));
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace node
|
} // namespace node
|
||||||
} // namespace grpc
|
} // namespace grpc
|
||||||
|
|
|
@ -66,6 +66,7 @@ class Channel : public ::node::ObjectWrap {
|
||||||
|
|
||||||
static NAN_METHOD(New);
|
static NAN_METHOD(New);
|
||||||
static NAN_METHOD(Close);
|
static NAN_METHOD(Close);
|
||||||
|
static NAN_METHOD(GetTarget);
|
||||||
static NanCallback *constructor;
|
static NanCallback *constructor;
|
||||||
static v8::Persistent<v8::FunctionTemplate> fun_tpl;
|
static v8::Persistent<v8::FunctionTemplate> fun_tpl;
|
||||||
|
|
||||||
|
|
|
@ -79,8 +79,6 @@ void Credentials::Init(Handle<Object> exports) {
|
||||||
NanNew<FunctionTemplate>(CreateComposite)->GetFunction());
|
NanNew<FunctionTemplate>(CreateComposite)->GetFunction());
|
||||||
ctr->Set(NanNew("createGce"),
|
ctr->Set(NanNew("createGce"),
|
||||||
NanNew<FunctionTemplate>(CreateGce)->GetFunction());
|
NanNew<FunctionTemplate>(CreateGce)->GetFunction());
|
||||||
ctr->Set(NanNew("createFake"),
|
|
||||||
NanNew<FunctionTemplate>(CreateFake)->GetFunction());
|
|
||||||
ctr->Set(NanNew("createIam"),
|
ctr->Set(NanNew("createIam"),
|
||||||
NanNew<FunctionTemplate>(CreateIam)->GetFunction());
|
NanNew<FunctionTemplate>(CreateIam)->GetFunction());
|
||||||
ctr->Set(NanNew("createInsecure"),
|
ctr->Set(NanNew("createInsecure"),
|
||||||
|
@ -194,11 +192,6 @@ NAN_METHOD(Credentials::CreateGce) {
|
||||||
NanReturnValue(WrapStruct(creds));
|
NanReturnValue(WrapStruct(creds));
|
||||||
}
|
}
|
||||||
|
|
||||||
NAN_METHOD(Credentials::CreateFake) {
|
|
||||||
NanScope();
|
|
||||||
NanReturnValue(WrapStruct(grpc_fake_transport_security_credentials_create()));
|
|
||||||
}
|
|
||||||
|
|
||||||
NAN_METHOD(Credentials::CreateIam) {
|
NAN_METHOD(Credentials::CreateIam) {
|
||||||
NanScope();
|
NanScope();
|
||||||
if (!args[0]->IsString()) {
|
if (!args[0]->IsString()) {
|
||||||
|
|
|
@ -108,7 +108,7 @@ class NewCallOp : public Op {
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
std::string GetTypeString() const {
|
std::string GetTypeString() const {
|
||||||
return "new call";
|
return "new_call";
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -73,8 +73,6 @@ void ServerCredentials::Init(Handle<Object> exports) {
|
||||||
Handle<Function> ctr = tpl->GetFunction();
|
Handle<Function> ctr = tpl->GetFunction();
|
||||||
ctr->Set(NanNew("createSsl"),
|
ctr->Set(NanNew("createSsl"),
|
||||||
NanNew<FunctionTemplate>(CreateSsl)->GetFunction());
|
NanNew<FunctionTemplate>(CreateSsl)->GetFunction());
|
||||||
ctr->Set(NanNew("createFake"),
|
|
||||||
NanNew<FunctionTemplate>(CreateFake)->GetFunction());
|
|
||||||
constructor = new NanCallback(ctr);
|
constructor = new NanCallback(ctr);
|
||||||
exports->Set(NanNew("ServerCredentials"), ctr);
|
exports->Set(NanNew("ServerCredentials"), ctr);
|
||||||
}
|
}
|
||||||
|
@ -144,11 +142,5 @@ NAN_METHOD(ServerCredentials::CreateSsl) {
|
||||||
grpc_ssl_server_credentials_create(root_certs, &key_cert_pair, 1)));
|
grpc_ssl_server_credentials_create(root_certs, &key_cert_pair, 1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
NAN_METHOD(ServerCredentials::CreateFake) {
|
|
||||||
NanScope();
|
|
||||||
NanReturnValue(
|
|
||||||
WrapStruct(grpc_fake_transport_security_server_credentials_create()));
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace node
|
} // namespace node
|
||||||
} // namespace grpc
|
} // namespace grpc
|
||||||
|
|
|
@ -63,7 +63,6 @@ class ServerCredentials : public ::node::ObjectWrap {
|
||||||
|
|
||||||
static NAN_METHOD(New);
|
static NAN_METHOD(New);
|
||||||
static NAN_METHOD(CreateSsl);
|
static NAN_METHOD(CreateSsl);
|
||||||
static NAN_METHOD(CreateFake);
|
|
||||||
static NanCallback *constructor;
|
static NanCallback *constructor;
|
||||||
// Used for typechecking instances of this javascript class
|
// Used for typechecking instances of this javascript class
|
||||||
static v8::Persistent<v8::FunctionTemplate> fun_tpl;
|
static v8::Persistent<v8::FunctionTemplate> fun_tpl;
|
||||||
|
|
|
@ -187,6 +187,19 @@ ClientReadableStream.prototype.cancel = cancel;
|
||||||
ClientWritableStream.prototype.cancel = cancel;
|
ClientWritableStream.prototype.cancel = cancel;
|
||||||
ClientDuplexStream.prototype.cancel = cancel;
|
ClientDuplexStream.prototype.cancel = cancel;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the endpoint this call/stream is connected to.
|
||||||
|
* @return {string} The URI of the endpoint
|
||||||
|
*/
|
||||||
|
function getPeer() {
|
||||||
|
/* jshint validthis: true */
|
||||||
|
return this.call.getPeer();
|
||||||
|
}
|
||||||
|
|
||||||
|
ClientReadableStream.prototype.getPeer = getPeer;
|
||||||
|
ClientWritableStream.prototype.getPeer = getPeer;
|
||||||
|
ClientDuplexStream.prototype.getPeer = getPeer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a function that can make unary requests to the specified method.
|
* Get a function that can make unary requests to the specified method.
|
||||||
* @param {string} method The name of the method to request
|
* @param {string} method The name of the method to request
|
||||||
|
@ -223,6 +236,9 @@ function makeUnaryRequestFunction(method, serialize, deserialize) {
|
||||||
emitter.cancel = function cancel() {
|
emitter.cancel = function cancel() {
|
||||||
call.cancel();
|
call.cancel();
|
||||||
};
|
};
|
||||||
|
emitter.getPeer = function getPeer() {
|
||||||
|
return call.getPeer();
|
||||||
|
};
|
||||||
this.updateMetadata(this.auth_uri, metadata, function(error, metadata) {
|
this.updateMetadata(this.auth_uri, metadata, function(error, metadata) {
|
||||||
if (error) {
|
if (error) {
|
||||||
call.cancel();
|
call.cancel();
|
||||||
|
|
|
@ -373,6 +373,19 @@ ServerDuplexStream.prototype._read = _read;
|
||||||
ServerDuplexStream.prototype._write = _write;
|
ServerDuplexStream.prototype._write = _write;
|
||||||
ServerDuplexStream.prototype.sendMetadata = sendMetadata;
|
ServerDuplexStream.prototype.sendMetadata = sendMetadata;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the endpoint this call/stream is connected to.
|
||||||
|
* @return {string} The URI of the endpoint
|
||||||
|
*/
|
||||||
|
function getPeer() {
|
||||||
|
/* jshint validthis: true */
|
||||||
|
return this.call.getPeer();
|
||||||
|
}
|
||||||
|
|
||||||
|
ServerReadableStream.prototype.getPeer = getPeer;
|
||||||
|
ServerWritableStream.prototype.getPeer = getPeer;
|
||||||
|
ServerDuplexStream.prototype.getPeer = getPeer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Fully handle a unary call
|
* Fully handle a unary call
|
||||||
* @param {grpc.Call} call The call to handle
|
* @param {grpc.Call} call The call to handle
|
||||||
|
@ -389,6 +402,9 @@ function handleUnary(call, handler, metadata) {
|
||||||
call.startBatch(batch, function() {});
|
call.startBatch(batch, function() {});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
emitter.getPeer = function() {
|
||||||
|
return call.getPeer();
|
||||||
|
};
|
||||||
emitter.on('error', function(error) {
|
emitter.on('error', function(error) {
|
||||||
handleError(call, error);
|
handleError(call, error);
|
||||||
});
|
});
|
||||||
|
@ -544,7 +560,7 @@ function Server(options) {
|
||||||
if (err) {
|
if (err) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var details = event['new call'];
|
var details = event.new_call;
|
||||||
var call = details.call;
|
var call = details.call;
|
||||||
var method = details.method;
|
var method = details.method;
|
||||||
var metadata = details.metadata;
|
var metadata = details.metadata;
|
||||||
|
|
|
@ -132,7 +132,7 @@ describe('call', function() {
|
||||||
'key2': ['value2']};
|
'key2': ['value2']};
|
||||||
call.startBatch(batch, function(err, resp) {
|
call.startBatch(batch, function(err, resp) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert.deepEqual(resp, {'send metadata': true});
|
assert.deepEqual(resp, {'send_metadata': true});
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -147,7 +147,7 @@ describe('call', function() {
|
||||||
};
|
};
|
||||||
call.startBatch(batch, function(err, resp) {
|
call.startBatch(batch, function(err, resp) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert.deepEqual(resp, {'send metadata': true});
|
assert.deepEqual(resp, {'send_metadata': true});
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -184,4 +184,10 @@ describe('call', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
describe('getPeer', function() {
|
||||||
|
it('should return a string', function() {
|
||||||
|
var call = new grpc.Call(channel, 'method', getDeadline(1));
|
||||||
|
assert.strictEqual(typeof call.getPeer(), 'string');
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -87,4 +87,10 @@ describe('channel', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
describe('getTarget', function() {
|
||||||
|
it('should return a string', function() {
|
||||||
|
var channel = new grpc.Channel('localhost', {});
|
||||||
|
assert.strictEqual(typeof channel.getTarget(), 'string');
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -85,37 +85,37 @@ describe('end-to-end', function() {
|
||||||
call.startBatch(client_batch, function(err, response) {
|
call.startBatch(client_batch, function(err, response) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert.deepEqual(response, {
|
assert.deepEqual(response, {
|
||||||
'send metadata': true,
|
send_metadata: true,
|
||||||
'client close': true,
|
client_close: true,
|
||||||
'metadata': {},
|
metadata: {},
|
||||||
'status': {
|
status: {
|
||||||
'code': grpc.status.OK,
|
code: grpc.status.OK,
|
||||||
'details': status_text,
|
details: status_text,
|
||||||
'metadata': {}
|
metadata: {}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
server.requestCall(function(err, call_details) {
|
server.requestCall(function(err, call_details) {
|
||||||
var new_call = call_details['new call'];
|
var new_call = call_details.new_call;
|
||||||
assert.notEqual(new_call, null);
|
assert.notEqual(new_call, null);
|
||||||
var server_call = new_call.call;
|
var server_call = new_call.call;
|
||||||
assert.notEqual(server_call, null);
|
assert.notEqual(server_call, null);
|
||||||
var server_batch = {};
|
var server_batch = {};
|
||||||
server_batch[grpc.opType.SEND_INITIAL_METADATA] = {};
|
server_batch[grpc.opType.SEND_INITIAL_METADATA] = {};
|
||||||
server_batch[grpc.opType.SEND_STATUS_FROM_SERVER] = {
|
server_batch[grpc.opType.SEND_STATUS_FROM_SERVER] = {
|
||||||
'metadata': {},
|
metadata: {},
|
||||||
'code': grpc.status.OK,
|
code: grpc.status.OK,
|
||||||
'details': status_text
|
details: status_text
|
||||||
};
|
};
|
||||||
server_batch[grpc.opType.RECV_CLOSE_ON_SERVER] = true;
|
server_batch[grpc.opType.RECV_CLOSE_ON_SERVER] = true;
|
||||||
server_call.startBatch(server_batch, function(err, response) {
|
server_call.startBatch(server_batch, function(err, response) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert.deepEqual(response, {
|
assert.deepEqual(response, {
|
||||||
'send metadata': true,
|
send_metadata: true,
|
||||||
'send status': true,
|
send_status: true,
|
||||||
'cancelled': false
|
cancelled: false
|
||||||
});
|
});
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
@ -131,7 +131,7 @@ describe('end-to-end', function() {
|
||||||
Infinity);
|
Infinity);
|
||||||
var client_batch = {};
|
var client_batch = {};
|
||||||
client_batch[grpc.opType.SEND_INITIAL_METADATA] = {
|
client_batch[grpc.opType.SEND_INITIAL_METADATA] = {
|
||||||
'client_key': ['client_value']
|
client_key: ['client_value']
|
||||||
};
|
};
|
||||||
client_batch[grpc.opType.SEND_CLOSE_FROM_CLIENT] = true;
|
client_batch[grpc.opType.SEND_CLOSE_FROM_CLIENT] = true;
|
||||||
client_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
|
client_batch[grpc.opType.RECV_INITIAL_METADATA] = true;
|
||||||
|
@ -139,18 +139,18 @@ describe('end-to-end', function() {
|
||||||
call.startBatch(client_batch, function(err, response) {
|
call.startBatch(client_batch, function(err, response) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert.deepEqual(response,{
|
assert.deepEqual(response,{
|
||||||
'send metadata': true,
|
send_metadata: true,
|
||||||
'client close': true,
|
client_close: true,
|
||||||
metadata: {server_key: ['server_value']},
|
metadata: {server_key: ['server_value']},
|
||||||
status: {'code': grpc.status.OK,
|
status: {code: grpc.status.OK,
|
||||||
'details': status_text,
|
details: status_text,
|
||||||
'metadata': {}}
|
metadata: {}}
|
||||||
});
|
});
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
server.requestCall(function(err, call_details) {
|
server.requestCall(function(err, call_details) {
|
||||||
var new_call = call_details['new call'];
|
var new_call = call_details.new_call;
|
||||||
assert.notEqual(new_call, null);
|
assert.notEqual(new_call, null);
|
||||||
assert.strictEqual(new_call.metadata.client_key[0],
|
assert.strictEqual(new_call.metadata.client_key[0],
|
||||||
'client_value');
|
'client_value');
|
||||||
|
@ -158,20 +158,20 @@ describe('end-to-end', function() {
|
||||||
assert.notEqual(server_call, null);
|
assert.notEqual(server_call, null);
|
||||||
var server_batch = {};
|
var server_batch = {};
|
||||||
server_batch[grpc.opType.SEND_INITIAL_METADATA] = {
|
server_batch[grpc.opType.SEND_INITIAL_METADATA] = {
|
||||||
'server_key': ['server_value']
|
server_key: ['server_value']
|
||||||
};
|
};
|
||||||
server_batch[grpc.opType.SEND_STATUS_FROM_SERVER] = {
|
server_batch[grpc.opType.SEND_STATUS_FROM_SERVER] = {
|
||||||
'metadata': {},
|
metadata: {},
|
||||||
'code': grpc.status.OK,
|
code: grpc.status.OK,
|
||||||
'details': status_text
|
details: status_text
|
||||||
};
|
};
|
||||||
server_batch[grpc.opType.RECV_CLOSE_ON_SERVER] = true;
|
server_batch[grpc.opType.RECV_CLOSE_ON_SERVER] = true;
|
||||||
server_call.startBatch(server_batch, function(err, response) {
|
server_call.startBatch(server_batch, function(err, response) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert.deepEqual(response, {
|
assert.deepEqual(response, {
|
||||||
'send metadata': true,
|
send_metadata: true,
|
||||||
'send status': true,
|
send_status: true,
|
||||||
'cancelled': false
|
cancelled: false
|
||||||
});
|
});
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
@ -196,19 +196,19 @@ describe('end-to-end', function() {
|
||||||
client_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
|
client_batch[grpc.opType.RECV_STATUS_ON_CLIENT] = true;
|
||||||
call.startBatch(client_batch, function(err, response) {
|
call.startBatch(client_batch, function(err, response) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert(response['send metadata']);
|
assert(response.send_metadata);
|
||||||
assert(response['client close']);
|
assert(response.client_close);
|
||||||
assert.deepEqual(response.metadata, {});
|
assert.deepEqual(response.metadata, {});
|
||||||
assert(response['send message']);
|
assert(response.send_message);
|
||||||
assert.strictEqual(response.read.toString(), reply_text);
|
assert.strictEqual(response.read.toString(), reply_text);
|
||||||
assert.deepEqual(response.status, {'code': grpc.status.OK,
|
assert.deepEqual(response.status, {code: grpc.status.OK,
|
||||||
'details': status_text,
|
details: status_text,
|
||||||
'metadata': {}});
|
metadata: {}});
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
||||||
server.requestCall(function(err, call_details) {
|
server.requestCall(function(err, call_details) {
|
||||||
var new_call = call_details['new call'];
|
var new_call = call_details.new_call;
|
||||||
assert.notEqual(new_call, null);
|
assert.notEqual(new_call, null);
|
||||||
var server_call = new_call.call;
|
var server_call = new_call.call;
|
||||||
assert.notEqual(server_call, null);
|
assert.notEqual(server_call, null);
|
||||||
|
@ -217,18 +217,18 @@ describe('end-to-end', function() {
|
||||||
server_batch[grpc.opType.RECV_MESSAGE] = true;
|
server_batch[grpc.opType.RECV_MESSAGE] = true;
|
||||||
server_call.startBatch(server_batch, function(err, response) {
|
server_call.startBatch(server_batch, function(err, response) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert(response['send metadata']);
|
assert(response.send_metadata);
|
||||||
assert.strictEqual(response.read.toString(), req_text);
|
assert.strictEqual(response.read.toString(), req_text);
|
||||||
var response_batch = {};
|
var response_batch = {};
|
||||||
response_batch[grpc.opType.SEND_MESSAGE] = new Buffer(reply_text);
|
response_batch[grpc.opType.SEND_MESSAGE] = new Buffer(reply_text);
|
||||||
response_batch[grpc.opType.SEND_STATUS_FROM_SERVER] = {
|
response_batch[grpc.opType.SEND_STATUS_FROM_SERVER] = {
|
||||||
'metadata': {},
|
metadata: {},
|
||||||
'code': grpc.status.OK,
|
code: grpc.status.OK,
|
||||||
'details': status_text
|
details: status_text
|
||||||
};
|
};
|
||||||
response_batch[grpc.opType.RECV_CLOSE_ON_SERVER] = true;
|
response_batch[grpc.opType.RECV_CLOSE_ON_SERVER] = true;
|
||||||
server_call.startBatch(response_batch, function(err, response) {
|
server_call.startBatch(response_batch, function(err, response) {
|
||||||
assert(response['send status']);
|
assert(response.send_status);
|
||||||
assert(!response.cancelled);
|
assert(!response.cancelled);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
@ -251,9 +251,9 @@ describe('end-to-end', function() {
|
||||||
call.startBatch(client_batch, function(err, response) {
|
call.startBatch(client_batch, function(err, response) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert.deepEqual(response, {
|
assert.deepEqual(response, {
|
||||||
'send metadata': true,
|
send_metadata: true,
|
||||||
'send message': true,
|
send_message: true,
|
||||||
'metadata': {}
|
metadata: {}
|
||||||
});
|
});
|
||||||
var req2_batch = {};
|
var req2_batch = {};
|
||||||
req2_batch[grpc.opType.SEND_MESSAGE] = new Buffer(requests[1]);
|
req2_batch[grpc.opType.SEND_MESSAGE] = new Buffer(requests[1]);
|
||||||
|
@ -262,12 +262,12 @@ describe('end-to-end', function() {
|
||||||
call.startBatch(req2_batch, function(err, resp) {
|
call.startBatch(req2_batch, function(err, resp) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert.deepEqual(resp, {
|
assert.deepEqual(resp, {
|
||||||
'send message': true,
|
send_message: true,
|
||||||
'client close': true,
|
client_close: true,
|
||||||
'status': {
|
status: {
|
||||||
'code': grpc.status.OK,
|
code: grpc.status.OK,
|
||||||
'details': status_text,
|
details: status_text,
|
||||||
'metadata': {}
|
metadata: {}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
done();
|
done();
|
||||||
|
@ -275,7 +275,7 @@ describe('end-to-end', function() {
|
||||||
});
|
});
|
||||||
|
|
||||||
server.requestCall(function(err, call_details) {
|
server.requestCall(function(err, call_details) {
|
||||||
var new_call = call_details['new call'];
|
var new_call = call_details.new_call;
|
||||||
assert.notEqual(new_call, null);
|
assert.notEqual(new_call, null);
|
||||||
var server_call = new_call.call;
|
var server_call = new_call.call;
|
||||||
assert.notEqual(server_call, null);
|
assert.notEqual(server_call, null);
|
||||||
|
@ -284,7 +284,7 @@ describe('end-to-end', function() {
|
||||||
server_batch[grpc.opType.RECV_MESSAGE] = true;
|
server_batch[grpc.opType.RECV_MESSAGE] = true;
|
||||||
server_call.startBatch(server_batch, function(err, response) {
|
server_call.startBatch(server_batch, function(err, response) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert(response['send metadata']);
|
assert(response.send_metadata);
|
||||||
assert.strictEqual(response.read.toString(), requests[0]);
|
assert.strictEqual(response.read.toString(), requests[0]);
|
||||||
var snd_batch = {};
|
var snd_batch = {};
|
||||||
snd_batch[grpc.opType.RECV_MESSAGE] = true;
|
snd_batch[grpc.opType.RECV_MESSAGE] = true;
|
||||||
|
@ -294,13 +294,13 @@ describe('end-to-end', function() {
|
||||||
var end_batch = {};
|
var end_batch = {};
|
||||||
end_batch[grpc.opType.RECV_CLOSE_ON_SERVER] = true;
|
end_batch[grpc.opType.RECV_CLOSE_ON_SERVER] = true;
|
||||||
end_batch[grpc.opType.SEND_STATUS_FROM_SERVER] = {
|
end_batch[grpc.opType.SEND_STATUS_FROM_SERVER] = {
|
||||||
'metadata': {},
|
metadata: {},
|
||||||
'code': grpc.status.OK,
|
code: grpc.status.OK,
|
||||||
'details': status_text
|
details: status_text
|
||||||
};
|
};
|
||||||
server_call.startBatch(end_batch, function(err, response) {
|
server_call.startBatch(end_batch, function(err, response) {
|
||||||
assert.ifError(err);
|
assert.ifError(err);
|
||||||
assert(response['send status']);
|
assert(response.send_status);
|
||||||
assert(!response.cancelled);
|
assert(!response.cancelled);
|
||||||
done();
|
done();
|
||||||
});
|
});
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
var assert = require('assert');
|
var assert = require('assert');
|
||||||
|
var fs = require('fs');
|
||||||
|
var path = require('path');
|
||||||
var grpc = require('bindings')('grpc.node');
|
var grpc = require('bindings')('grpc.node');
|
||||||
|
|
||||||
describe('server', function() {
|
describe('server', function() {
|
||||||
|
@ -67,9 +69,13 @@ describe('server', function() {
|
||||||
before(function() {
|
before(function() {
|
||||||
server = new grpc.Server();
|
server = new grpc.Server();
|
||||||
});
|
});
|
||||||
it('should bind to an unused port with fake credentials', function() {
|
it('should bind to an unused port with ssl credentials', function() {
|
||||||
var port;
|
var port;
|
||||||
var creds = grpc.ServerCredentials.createFake();
|
var key_path = path.join(__dirname, '../test/data/server1.key');
|
||||||
|
var pem_path = path.join(__dirname, '../test/data/server1.pem');
|
||||||
|
var key_data = fs.readFileSync(key_path);
|
||||||
|
var pem_data = fs.readFileSync(pem_path);
|
||||||
|
var creds = grpc.ServerCredentials.createSsl(null, key_data, pem_data);
|
||||||
assert.doesNotThrow(function() {
|
assert.doesNotThrow(function() {
|
||||||
port = server.addSecureHttp2Port('0.0.0.0:0', creds);
|
port = server.addSecureHttp2Port('0.0.0.0:0', creds);
|
||||||
});
|
});
|
||||||
|
|
|
@ -344,6 +344,9 @@ describe('Other conditions', function() {
|
||||||
after(function() {
|
after(function() {
|
||||||
server.shutdown();
|
server.shutdown();
|
||||||
});
|
});
|
||||||
|
it('channel.getTarget should be available', function() {
|
||||||
|
assert.strictEqual(typeof client.channel.getTarget(), 'string');
|
||||||
|
});
|
||||||
describe('Server recieving bad input', function() {
|
describe('Server recieving bad input', function() {
|
||||||
var misbehavingClient;
|
var misbehavingClient;
|
||||||
var badArg = new Buffer([0xFF]);
|
var badArg = new Buffer([0xFF]);
|
||||||
|
@ -549,6 +552,43 @@ describe('Other conditions', function() {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
describe('call.getPeer should return the peer', function() {
|
||||||
|
it('for a unary call', function(done) {
|
||||||
|
var call = client.unary({error: false}, function(err, data) {
|
||||||
|
assert.ifError(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
assert.strictEqual(typeof call.getPeer(), 'string');
|
||||||
|
});
|
||||||
|
it('for a client stream call', function(done) {
|
||||||
|
var call = client.clientStream(function(err, data) {
|
||||||
|
assert.ifError(err);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
assert.strictEqual(typeof call.getPeer(), 'string');
|
||||||
|
call.write({error: false});
|
||||||
|
call.end();
|
||||||
|
});
|
||||||
|
it('for a server stream call', function(done) {
|
||||||
|
var call = client.serverStream({error: false});
|
||||||
|
assert.strictEqual(typeof call.getPeer(), 'string');
|
||||||
|
call.on('data', function(){});
|
||||||
|
call.on('status', function(status) {
|
||||||
|
assert.strictEqual(status.code, grpc.status.OK);
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
it('for a bidi stream call', function(done) {
|
||||||
|
var call = client.bidiStream();
|
||||||
|
assert.strictEqual(typeof call.getPeer(), 'string');
|
||||||
|
call.write({error: false});
|
||||||
|
call.end();
|
||||||
|
call.on('data', function(){});
|
||||||
|
call.on('status', function(status) {
|
||||||
|
done();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
describe('Cancelling surface client', function() {
|
describe('Cancelling surface client', function() {
|
||||||
var client;
|
var client;
|
||||||
|
|
Loading…
Reference in New Issue