Merge github.com:grpc/grpc into plucking-hell

pull/2713/head
Craig Tiller 10 years ago
commit a9c643fc60
  1. 6
      include/grpc++/client_context.h
  2. 6
      include/grpc++/server_context.h
  3. 8
      include/grpc/grpc.h
  4. 8
      src/compiler/generator_helpers.h
  5. 6
      src/core/iomgr/fd_posix.c
  6. 6
      src/core/iomgr/tcp_windows.c
  7. 8
      src/core/surface/channel_connectivity.c
  8. 3
      src/core/transport/chttp2/alpn.c
  9. 11
      src/cpp/client/client_context.cc
  10. 11
      src/cpp/server/server_context.cc
  11. 2
      src/node/examples/math_server.js
  12. 2
      src/node/examples/route_guide_server.js
  13. 2
      src/node/examples/stock_server.js
  14. 44
      src/node/ext/server.cc
  15. 1
      src/node/ext/server.h
  16. 18
      src/node/ext/server_credentials.cc
  17. 1
      src/node/ext/server_credentials.h
  18. 4
      src/node/interop/interop_server.js
  19. 6
      src/node/src/server.js
  20. 3
      src/node/test/call_test.js
  21. 3
      src/node/test/end_to_end_test.js
  22. 3
      src/node/test/health_test.js
  23. 3
      src/node/test/math_client_test.js
  24. 19
      src/node/test/server_test.js
  25. 12
      src/node/test/surface_test.js
  26. 14
      src/objective-c/GRPCClient/GRPCCall.m
  27. 18
      src/objective-c/GRPCClient/private/GRPCCompletionQueue.h
  28. 5
      src/objective-c/generated_libraries/RemoteTestClient/RemoteTest.podspec
  29. 5
      src/objective-c/generated_libraries/RouteGuideClient/RouteGuide.podspec
  30. 37
      src/objective-c/tests/build_tests.sh
  31. 3
      src/objective-c/tests/run_tests.sh
  32. 25
      test/core/end2end/tests/channel_connectivity.c
  33. 4
      test/core/transport/chttp2/alpn_test.c
  34. 29
      test/cpp/end2end/end2end_test.cc
  35. 2
      test/cpp/util/messages.proto
  36. 62
      tools/gce_setup/grpc_docker.sh
  37. 5
      tools/run_tests/run_sanity.sh

@ -118,6 +118,12 @@ class ClientContext {
std::shared_ptr<const AuthContext> auth_context() const; std::shared_ptr<const AuthContext> auth_context() const;
// Return the peer uri in a string.
// WARNING: this value is never authenticated or subject to any security
// related code. It must not be used for any authentication related
// functionality. Instead, use auth_context.
grpc::string peer() const;
// Get and set census context // Get and set census context
void set_census_context(struct census_context* ccp) { census_context_ = ccp; } void set_census_context(struct census_context* ccp) { census_context_ = ccp; }
struct census_context* census_context() const { return census_context_; } struct census_context* census_context() const { return census_context_; }

@ -117,6 +117,12 @@ class ServerContext {
std::shared_ptr<const AuthContext> auth_context() const; std::shared_ptr<const AuthContext> auth_context() const;
// Return the peer uri in a string.
// WARNING: this value is never authenticated or subject to any security
// related code. It must not be used for any authentication related
// functionality. Instead, use auth_context.
grpc::string peer() const;
const struct census_context* census_context() const; const struct census_context* census_context() const;
private: private:

@ -423,14 +423,10 @@ grpc_connectivity_state grpc_channel_check_connectivity_state(
Once the channel connectivity state is different from last_observed_state, Once the channel connectivity state is different from last_observed_state,
tag will be enqueued on cq with success=1. tag will be enqueued on cq with success=1.
If deadline expires BEFORE the state is changed, tag will be enqueued on cq If deadline expires BEFORE the state is changed, tag will be enqueued on cq
with success=0. with success=0. */
If optional_new_state is non-NULL, it will be set to the newly observed
connectivity state of the channel at the same point as tag is enqueued onto
the completion queue. */
void grpc_channel_watch_connectivity_state( void grpc_channel_watch_connectivity_state(
grpc_channel *channel, grpc_connectivity_state last_observed_state, grpc_channel *channel, grpc_connectivity_state last_observed_state,
grpc_connectivity_state *optional_new_state, gpr_timespec deadline, gpr_timespec deadline, grpc_completion_queue *cq, void *tag);
grpc_completion_queue *cq, void *tag);
/** Create a call given a grpc_channel, in order to call 'method'. All /** Create a call given a grpc_channel, in order to call 'method'. All
completions are sent to 'completion_queue'. 'method' and 'host' need only completions are sent to 'completion_queue'. 'method' and 'host' need only

@ -126,7 +126,13 @@ inline grpc::string LowerUnderscoreToUpperCamel(grpc::string str) {
} }
inline grpc::string FileNameInUpperCamel(const grpc::protobuf::FileDescriptor *file) { inline grpc::string FileNameInUpperCamel(const grpc::protobuf::FileDescriptor *file) {
return LowerUnderscoreToUpperCamel(StripProto(file->name())); std::vector<grpc::string> tokens = tokenize(StripProto(file->name()), "/");
grpc::string result = "";
for (unsigned int i = 0; i < tokens.size() - 1; i++) {
result += tokens[i] + "/";
}
result += LowerUnderscoreToUpperCamel(tokens.back());
return result;
} }
enum MethodType { enum MethodType {

@ -382,13 +382,15 @@ gpr_uint32 grpc_fd_begin_poll(grpc_fd *fd, grpc_pollset *pollset,
return 0; return 0;
} }
/* if there is nobody polling for read, but we need to, then start doing so */ /* if there is nobody polling for read, but we need to, then start doing so */
if (read_mask && !fd->read_watcher && gpr_atm_acq_load(&fd->readst) > READY) { if (read_mask && !fd->read_watcher &&
(gpr_uintptr)gpr_atm_acq_load(&fd->readst) > READY) {
fd->read_watcher = watcher; fd->read_watcher = watcher;
mask |= read_mask; mask |= read_mask;
} }
/* if there is nobody polling for write, but we need to, then start doing so /* if there is nobody polling for write, but we need to, then start doing so
*/ */
if (write_mask && !fd->write_watcher && gpr_atm_acq_load(&fd->writest) > READY) { if (write_mask && !fd->write_watcher &&
(gpr_uintptr)gpr_atm_acq_load(&fd->writest) > READY) {
fd->write_watcher = watcher; fd->write_watcher = watcher;
mask |= write_mask; mask |= write_mask;
} }

@ -369,14 +369,16 @@ static grpc_endpoint_write_status win_write(grpc_endpoint *ep,
} }
static void win_add_to_pollset(grpc_endpoint *ep, grpc_pollset *ps) { static void win_add_to_pollset(grpc_endpoint *ep, grpc_pollset *ps) {
grpc_tcp *tcp;
(void) ps; (void) ps;
grpc_tcp *tcp = (grpc_tcp *) ep; tcp = (grpc_tcp *) ep;
grpc_iocp_add_socket(tcp->socket); grpc_iocp_add_socket(tcp->socket);
} }
static void win_add_to_pollset_set(grpc_endpoint *ep, grpc_pollset_set *pss) { static void win_add_to_pollset_set(grpc_endpoint *ep, grpc_pollset_set *pss) {
grpc_tcp *tcp;
(void) pss; (void) pss;
grpc_tcp *tcp = (grpc_tcp *) ep; tcp = (grpc_tcp *) ep;
grpc_iocp_add_socket(tcp->socket); grpc_iocp_add_socket(tcp->socket);
} }

@ -70,7 +70,6 @@ typedef struct {
grpc_iomgr_closure on_complete; grpc_iomgr_closure on_complete;
grpc_alarm alarm; grpc_alarm alarm;
grpc_connectivity_state state; grpc_connectivity_state state;
grpc_connectivity_state *optional_new_state;
grpc_completion_queue *cq; grpc_completion_queue *cq;
grpc_cq_completion completion_storage; grpc_cq_completion completion_storage;
grpc_channel *channel; grpc_channel *channel;
@ -124,9 +123,6 @@ static void partly_done(state_watcher *w, int due_to_completion) {
switch (w->phase) { switch (w->phase) {
case WAITING: case WAITING:
w->phase = CALLING_BACK; w->phase = CALLING_BACK;
if (w->optional_new_state) {
*w->optional_new_state = w->state;
}
grpc_cq_end_op(w->cq, w->tag, w->success, finished_completion, w, grpc_cq_end_op(w->cq, w->tag, w->success, finished_completion, w,
&w->completion_storage); &w->completion_storage);
break; break;
@ -154,8 +150,7 @@ static void timeout_complete(void *pw, int success) { partly_done(pw, 0); }
void grpc_channel_watch_connectivity_state( void grpc_channel_watch_connectivity_state(
grpc_channel *channel, grpc_connectivity_state last_observed_state, grpc_channel *channel, grpc_connectivity_state last_observed_state,
grpc_connectivity_state *optional_new_state, gpr_timespec deadline, gpr_timespec deadline, grpc_completion_queue *cq, void *tag) {
grpc_completion_queue *cq, void *tag) {
grpc_channel_element *client_channel_elem = grpc_channel_element *client_channel_elem =
grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel)); grpc_channel_stack_last_element(grpc_channel_get_channel_stack(channel));
state_watcher *w = gpr_malloc(sizeof(*w)); state_watcher *w = gpr_malloc(sizeof(*w));
@ -167,7 +162,6 @@ void grpc_channel_watch_connectivity_state(
w->phase = WAITING; w->phase = WAITING;
w->state = last_observed_state; w->state = last_observed_state;
w->success = 0; w->success = 0;
w->optional_new_state = optional_new_state;
w->cq = cq; w->cq = cq;
w->tag = tag; w->tag = tag;
w->channel = channel; w->channel = channel;

@ -36,8 +36,7 @@
#include <grpc/support/useful.h> #include <grpc/support/useful.h>
/* in order of preference */ /* in order of preference */
static const char *const supported_versions[] = {"h2", "h2-17", "h2-16", static const char *const supported_versions[] = {"h2"};
"h2-15", "h2-14"};
int grpc_chttp2_is_alpn_version_supported(const char *version, size_t size) { int grpc_chttp2_is_alpn_version_supported(const char *version, size_t size) {
size_t i; size_t i;

@ -34,6 +34,7 @@
#include <grpc++/client_context.h> #include <grpc++/client_context.h>
#include <grpc/grpc.h> #include <grpc/grpc.h>
#include <grpc/support/alloc.h>
#include <grpc/support/string_util.h> #include <grpc/support/string_util.h>
#include <grpc++/credentials.h> #include <grpc++/credentials.h>
#include <grpc++/time.h> #include <grpc++/time.h>
@ -104,4 +105,14 @@ void ClientContext::TryCancel() {
} }
} }
grpc::string ClientContext::peer() const {
grpc::string peer;
if (call_) {
char* c_peer = grpc_call_get_peer(call_);
peer = c_peer;
gpr_free(c_peer);
}
return peer;
}
} // namespace grpc } // namespace grpc

@ -34,6 +34,7 @@
#include <grpc++/server_context.h> #include <grpc++/server_context.h>
#include <grpc/grpc.h> #include <grpc/grpc.h>
#include <grpc/support/alloc.h>
#include <grpc/support/log.h> #include <grpc/support/log.h>
#include <grpc++/impl/call.h> #include <grpc++/impl/call.h>
#include <grpc++/impl/sync.h> #include <grpc++/impl/sync.h>
@ -179,6 +180,16 @@ std::shared_ptr<const AuthContext> ServerContext::auth_context() const {
return auth_context_; return auth_context_;
} }
grpc::string ServerContext::peer() const {
grpc::string peer;
if (call_) {
char* c_peer = grpc_call_get_peer(call_);
peer = c_peer;
gpr_free(c_peer);
}
return peer;
}
const struct census_context* ServerContext::census_context() const { const struct census_context* ServerContext::census_context() const {
return grpc_census_call_get_context(call_); return grpc_census_call_get_context(call_);
} }

@ -115,7 +115,7 @@ server.addProtoService(math.Math.service, {
}); });
if (require.main === module) { if (require.main === module) {
server.bind('0.0.0.0:50051'); server.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
server.start(); server.start();
} }

@ -239,7 +239,7 @@ function getServer() {
if (require.main === module) { if (require.main === module) {
// If this is run as a script, start a server on an unused port // If this is run as a script, start a server on an unused port
var routeServer = getServer(); var routeServer = getServer();
routeServer.bind('0.0.0.0:50051'); routeServer.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
var argv = parseArgs(process.argv, { var argv = parseArgs(process.argv, {
string: 'db_path' string: 'db_path'
}); });

@ -80,7 +80,7 @@ stockServer.addProtoService(examples.Stock.service, {
}); });
if (require.main === module) { if (require.main === module) {
stockServer.bind('0.0.0.0:50051'); stockServer.bind('0.0.0.0:50051', grpc.ServerCredentials.createInsecure());
stockServer.listen(); stockServer.listen();
} }

@ -136,10 +136,6 @@ void Server::Init(Handle<Object> exports) {
tpl, "addHttp2Port", tpl, "addHttp2Port",
NanNew<FunctionTemplate>(AddHttp2Port)->GetFunction()); NanNew<FunctionTemplate>(AddHttp2Port)->GetFunction());
NanSetPrototypeTemplate(
tpl, "addSecureHttp2Port",
NanNew<FunctionTemplate>(AddSecureHttp2Port)->GetFunction());
NanSetPrototypeTemplate(tpl, "start", NanSetPrototypeTemplate(tpl, "start",
NanNew<FunctionTemplate>(Start)->GetFunction()); NanNew<FunctionTemplate>(Start)->GetFunction());
@ -246,45 +242,37 @@ NAN_METHOD(Server::RequestCall) {
} }
NAN_METHOD(Server::AddHttp2Port) { NAN_METHOD(Server::AddHttp2Port) {
NanScope();
if (!HasInstance(args.This())) {
return NanThrowTypeError("addHttp2Port can only be called on a Server");
}
if (!args[0]->IsString()) {
return NanThrowTypeError("addHttp2Port's argument must be a String");
}
Server *server = ObjectWrap::Unwrap<Server>(args.This());
if (server->wrapped_server == NULL) {
return NanThrowError("addHttp2Port cannot be called on a shut down Server");
}
NanReturnValue(NanNew<Number>(grpc_server_add_http2_port(
server->wrapped_server, *NanUtf8String(args[0]))));
}
NAN_METHOD(Server::AddSecureHttp2Port) {
NanScope(); NanScope();
if (!HasInstance(args.This())) { if (!HasInstance(args.This())) {
return NanThrowTypeError( return NanThrowTypeError(
"addSecureHttp2Port can only be called on a Server"); "addHttp2Port can only be called on a Server");
} }
if (!args[0]->IsString()) { if (!args[0]->IsString()) {
return NanThrowTypeError( return NanThrowTypeError(
"addSecureHttp2Port's first argument must be a String"); "addHttp2Port's first argument must be a String");
} }
if (!ServerCredentials::HasInstance(args[1])) { if (!ServerCredentials::HasInstance(args[1])) {
return NanThrowTypeError( return NanThrowTypeError(
"addSecureHttp2Port's second argument must be ServerCredentials"); "addHttp2Port's second argument must be ServerCredentials");
} }
Server *server = ObjectWrap::Unwrap<Server>(args.This()); Server *server = ObjectWrap::Unwrap<Server>(args.This());
if (server->wrapped_server == NULL) { if (server->wrapped_server == NULL) {
return NanThrowError( return NanThrowError(
"addSecureHttp2Port cannot be called on a shut down Server"); "addHttp2Port cannot be called on a shut down Server");
} }
ServerCredentials *creds = ObjectWrap::Unwrap<ServerCredentials>( ServerCredentials *creds_object = ObjectWrap::Unwrap<ServerCredentials>(
args[1]->ToObject()); args[1]->ToObject());
NanReturnValue(NanNew<Number>(grpc_server_add_secure_http2_port( grpc_server_credentials *creds = creds_object->GetWrappedServerCredentials();
server->wrapped_server, *NanUtf8String(args[0]), int port;
creds->GetWrappedServerCredentials()))); if (creds == NULL) {
port = grpc_server_add_http2_port(server->wrapped_server,
*NanUtf8String(args[0]));
} else {
port = grpc_server_add_secure_http2_port(server->wrapped_server,
*NanUtf8String(args[0]),
creds);
}
NanReturnValue(NanNew<Number>(port));
} }
NAN_METHOD(Server::Start) { NAN_METHOD(Server::Start) {

@ -66,7 +66,6 @@ class Server : public ::node::ObjectWrap {
static NAN_METHOD(New); static NAN_METHOD(New);
static NAN_METHOD(RequestCall); static NAN_METHOD(RequestCall);
static NAN_METHOD(AddHttp2Port); static NAN_METHOD(AddHttp2Port);
static NAN_METHOD(AddSecureHttp2Port);
static NAN_METHOD(Start); static NAN_METHOD(Start);
static NAN_METHOD(Shutdown); static NAN_METHOD(Shutdown);
static NanCallback *constructor; static NanCallback *constructor;

@ -73,6 +73,8 @@ 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("createInsecure"),
NanNew<FunctionTemplate>(CreateInsecure)->GetFunction());
constructor = new NanCallback(ctr); constructor = new NanCallback(ctr);
exports->Set(NanNew("ServerCredentials"), ctr); exports->Set(NanNew("ServerCredentials"), ctr);
} }
@ -85,9 +87,6 @@ bool ServerCredentials::HasInstance(Handle<Value> val) {
Handle<Value> ServerCredentials::WrapStruct( Handle<Value> ServerCredentials::WrapStruct(
grpc_server_credentials *credentials) { grpc_server_credentials *credentials) {
NanEscapableScope(); NanEscapableScope();
if (credentials == NULL) {
return NanEscapeScope(NanNull());
}
const int argc = 1; const int argc = 1;
Handle<Value> argv[argc] = { Handle<Value> argv[argc] = {
NanNew<External>(reinterpret_cast<void *>(credentials))}; NanNew<External>(reinterpret_cast<void *>(credentials))};
@ -140,8 +139,17 @@ NAN_METHOD(ServerCredentials::CreateSsl) {
key_cert_pair.cert_chain = ::node::Buffer::Data(args[2]); key_cert_pair.cert_chain = ::node::Buffer::Data(args[2]);
// TODO Add a force_client_auth parameter and pass it as the last parameter // TODO Add a force_client_auth parameter and pass it as the last parameter
// here. // here.
NanReturnValue(WrapStruct( grpc_server_credentials *creds =
grpc_ssl_server_credentials_create(root_certs, &key_cert_pair, 1, 0))); grpc_ssl_server_credentials_create(root_certs, &key_cert_pair, 1, 0);
if (creds == NULL) {
NanReturnNull();
}
NanReturnValue(WrapStruct(creds));
}
NAN_METHOD(ServerCredentials::CreateInsecure) {
NanScope();
NanReturnValue(WrapStruct(NULL));
} }
} // namespace node } // namespace node

@ -63,6 +63,7 @@ class ServerCredentials : public ::node::ObjectWrap {
static NAN_METHOD(New); static NAN_METHOD(New);
static NAN_METHOD(CreateSsl); static NAN_METHOD(CreateSsl);
static NAN_METHOD(CreateInsecure);
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;

@ -161,7 +161,7 @@ function handleHalfDuplex(call) {
function getServer(port, tls) { function getServer(port, tls) {
// TODO(mlumish): enable TLS functionality // TODO(mlumish): enable TLS functionality
var options = {}; var options = {};
var server_creds = null; var server_creds;
if (tls) { if (tls) {
var key_path = path.join(__dirname, '../test/data/server1.key'); var key_path = path.join(__dirname, '../test/data/server1.key');
var pem_path = path.join(__dirname, '../test/data/server1.pem'); var pem_path = path.join(__dirname, '../test/data/server1.pem');
@ -171,6 +171,8 @@ function getServer(port, tls) {
server_creds = grpc.ServerCredentials.createSsl(null, server_creds = grpc.ServerCredentials.createSsl(null,
key_data, key_data,
pem_data); pem_data);
} else {
server_creds = grpc.ServerCredentials.createInsecure();
} }
var server = new grpc.Server(options); var server = new grpc.Server(options);
server.addProtoService(testProto.TestService.service, { server.addProtoService(testProto.TestService.service, {

@ -714,11 +714,7 @@ Server.prototype.bind = function(port, creds) {
if (this.started) { if (this.started) {
throw new Error('Can\'t bind an already running server to an address'); throw new Error('Can\'t bind an already running server to an address');
} }
if (creds) { return this._server.addHttp2Port(port, creds);
return this._server.addSecureHttp2Port(port, creds);
} else {
return this._server.addHttp2Port(port);
}
}; };
/** /**

@ -55,7 +55,8 @@ describe('call', function() {
var server; var server;
before(function() { before(function() {
server = new grpc.Server(); server = new grpc.Server();
var port = server.addHttp2Port('localhost:0'); var port = server.addHttp2Port('localhost:0',
grpc.ServerCredentials.createInsecure());
server.start(); server.start();
channel = new grpc.Channel('localhost:' + port, insecureCreds); channel = new grpc.Channel('localhost:' + port, insecureCreds);
}); });

@ -64,7 +64,8 @@ describe('end-to-end', function() {
var channel; var channel;
before(function() { before(function() {
server = new grpc.Server(); server = new grpc.Server();
var port_num = server.addHttp2Port('0.0.0.0:0'); var port_num = server.addHttp2Port('0.0.0.0:0',
grpc.ServerCredentials.createInsecure());
server.start(); server.start();
channel = new grpc.Channel('localhost:' + port_num, insecureCreds); channel = new grpc.Channel('localhost:' + port_num, insecureCreds);
}); });

@ -54,7 +54,8 @@ describe('Health Checking', function() {
new health.Implementation(statusMap)); new health.Implementation(statusMap));
var healthClient; var healthClient;
before(function() { before(function() {
var port_num = healthServer.bind('0.0.0.0:0'); var port_num = healthServer.bind('0.0.0.0:0',
grpc.ServerCredentials.createInsecure());
healthServer.start(); healthServer.start();
healthClient = new health.Client('localhost:' + port_num, healthClient = new health.Client('localhost:' + port_num,
grpc.Credentials.createInsecure()); grpc.Credentials.createInsecure());

@ -51,7 +51,8 @@ var server = require('../examples/math_server.js');
describe('Math client', function() { describe('Math client', function() {
before(function(done) { before(function(done) {
var port_num = server.bind('0.0.0.0:0'); var port_num = server.bind('0.0.0.0:0',
grpc.ServerCredentials.createInsecure());
server.start(); server.start();
math_client = new math.Math('localhost:' + port_num, math_client = new math.Math('localhost:' + port_num,
grpc.Credentials.createInsecure()); grpc.Credentials.createInsecure());

@ -59,16 +59,11 @@ describe('server', function() {
it('should bind to an unused port', function() { it('should bind to an unused port', function() {
var port; var port;
assert.doesNotThrow(function() { assert.doesNotThrow(function() {
port = server.addHttp2Port('0.0.0.0:0'); port = server.addHttp2Port('0.0.0.0:0',
grpc.ServerCredentials.createInsecure());
}); });
assert(port > 0); assert(port > 0);
}); });
});
describe('addSecureHttp2Port', function() {
var server;
before(function() {
server = new grpc.Server();
});
it('should bind to an unused port with ssl credentials', function() { it('should bind to an unused port with ssl credentials', function() {
var port; var port;
var key_path = path.join(__dirname, '../test/data/server1.key'); var key_path = path.join(__dirname, '../test/data/server1.key');
@ -77,16 +72,22 @@ describe('server', function() {
var pem_data = fs.readFileSync(pem_path); var pem_data = fs.readFileSync(pem_path);
var creds = grpc.ServerCredentials.createSsl(null, key_data, pem_data); 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.addHttp2Port('0.0.0.0:0', creds);
}); });
assert(port > 0); assert(port > 0);
}); });
}); });
describe('addSecureHttp2Port', function() {
var server;
before(function() {
server = new grpc.Server();
});
});
describe('listen', function() { describe('listen', function() {
var server; var server;
before(function() { before(function() {
server = new grpc.Server(); server = new grpc.Server();
server.addHttp2Port('0.0.0.0:0'); server.addHttp2Port('0.0.0.0:0', grpc.ServerCredentials.createInsecure());
}); });
after(function() { after(function() {
server.shutdown(); server.shutdown();

@ -47,6 +47,8 @@ var mathService = math_proto.lookup('math.Math');
var _ = require('lodash'); var _ = require('lodash');
var server_insecure_creds = grpc.ServerCredentials.createInsecure();
describe('File loader', function() { describe('File loader', function() {
it('Should load a proto file by default', function() { it('Should load a proto file by default', function() {
assert.doesNotThrow(function() { assert.doesNotThrow(function() {
@ -122,7 +124,7 @@ describe('Echo service', function() {
callback(null, call.request); callback(null, call.request);
} }
}); });
var port = server.bind('localhost:0'); var port = server.bind('localhost:0', server_insecure_creds);
var Client = surface_client.makeProtobufClientConstructor(echo_service); var Client = surface_client.makeProtobufClientConstructor(echo_service);
client = new Client('localhost:' + port, grpc.Credentials.createInsecure()); client = new Client('localhost:' + port, grpc.Credentials.createInsecure());
server.start(); server.start();
@ -166,7 +168,7 @@ describe('Generic client and server', function() {
callback(null, _.capitalize(call.request)); callback(null, _.capitalize(call.request));
} }
}); });
var port = server.bind('localhost:0'); var port = server.bind('localhost:0', server_insecure_creds);
server.start(); server.start();
var Client = grpc.makeGenericClientConstructor(string_service_attrs); var Client = grpc.makeGenericClientConstructor(string_service_attrs);
client = new Client('localhost:' + port, client = new Client('localhost:' + port,
@ -215,7 +217,7 @@ describe('Echo metadata', function() {
}); });
} }
}); });
var port = server.bind('localhost:0'); var port = server.bind('localhost:0', server_insecure_creds);
var Client = surface_client.makeProtobufClientConstructor(test_service); var Client = surface_client.makeProtobufClientConstructor(test_service);
client = new Client('localhost:' + port, grpc.Credentials.createInsecure()); client = new Client('localhost:' + port, grpc.Credentials.createInsecure());
server.start(); server.start();
@ -336,7 +338,7 @@ describe('Other conditions', function() {
}); });
} }
}); });
port = server.bind('localhost:0'); port = server.bind('localhost:0', server_insecure_creds);
var Client = surface_client.makeProtobufClientConstructor(test_service); var Client = surface_client.makeProtobufClientConstructor(test_service);
client = new Client('localhost:' + port, grpc.Credentials.createInsecure()); client = new Client('localhost:' + port, grpc.Credentials.createInsecure());
server.start(); server.start();
@ -602,7 +604,7 @@ describe('Cancelling surface client', function() {
'fib': function(stream) {}, 'fib': function(stream) {},
'sum': function(stream) {} 'sum': function(stream) {}
}); });
var port = server.bind('localhost:0'); var port = server.bind('localhost:0', server_insecure_creds);
var Client = surface_client.makeProtobufClientConstructor(mathService); var Client = surface_client.makeProtobufClientConstructor(mathService);
client = new Client('localhost:' + port, grpc.Credentials.createInsecure()); client = new Client('localhost:' + port, grpc.Credentials.createInsecure());
server.start(); server.start();

@ -38,7 +38,6 @@
#import <RxLibrary/GRXConcurrentWriteable.h> #import <RxLibrary/GRXConcurrentWriteable.h>
#import "private/GRPCChannel.h" #import "private/GRPCChannel.h"
#import "private/GRPCCompletionQueue.h"
#import "private/GRPCWrappedCall.h" #import "private/GRPCWrappedCall.h"
#import "private/NSData+GRPC.h" #import "private/NSData+GRPC.h"
#import "private/NSDictionary+GRPC.h" #import "private/NSDictionary+GRPC.h"
@ -72,7 +71,6 @@ NSString * const kGRPCStatusMetadataKey = @"io.grpc.StatusMetadataKey";
dispatch_once_t _callAlreadyInvoked; dispatch_once_t _callAlreadyInvoked;
GRPCChannel *_channel; GRPCChannel *_channel;
GRPCCompletionQueue *_completionQueue;
// The C gRPC library has less guarantees on the ordering of events than we // The C gRPC library has less guarantees on the ordering of events than we
// do. Particularly, in the face of errors, there's no ordering guarantee at // do. Particularly, in the face of errors, there's no ordering guarantee at
@ -100,19 +98,13 @@ NSString * const kGRPCStatusMetadataKey = @"io.grpc.StatusMetadataKey";
path:(NSString *)path path:(NSString *)path
requestsWriter:(GRXWriter *)requestWriter { requestsWriter:(GRXWriter *)requestWriter {
if (!host || !path) { if (!host || !path) {
[NSException raise:NSInvalidArgumentException format:@"Neither host nor method can be nil."]; [NSException raise:NSInvalidArgumentException format:@"Neither host nor path can be nil."];
} }
if (requestWriter.state != GRXWriterStateNotStarted) { if (requestWriter.state != GRXWriterStateNotStarted) {
[NSException raise:NSInvalidArgumentException format:@"The requests writer can't be already started."]; [NSException raise:NSInvalidArgumentException
format:@"The requests writer can't be already started."];
} }
if ((self = [super init])) { if ((self = [super init])) {
static dispatch_once_t initialization;
dispatch_once(&initialization, ^{
grpc_init();
});
_completionQueue = [GRPCCompletionQueue completionQueue];
_channel = [GRPCChannel channelToHost:host]; _channel = [GRPCChannel channelToHost:host];
_wrappedCall = [[GRPCWrappedCall alloc] initWithChannel:_channel _wrappedCall = [[GRPCWrappedCall alloc] initWithChannel:_channel

@ -36,15 +36,15 @@
typedef void(^GRPCQueueCompletionHandler)(bool success); typedef void(^GRPCQueueCompletionHandler)(bool success);
// This class lets one more easily use grpc_completion_queue. To use it, pass // This class lets one more easily use |grpc_completion_queue|. To use it, pass the value of the
// the value of the unmanagedQueue property of an instance of this class to // |unmanagedQueue| property of an instance of this class to |grpc_channel_create_call|. Then for
// grpc_call_start_invoke. Then for every grpc_call_* method that accepts a tag, // every |grpc_call_*| method that accepts a tag, you can pass a block of type
// you can pass a block of type GRPCEventHandler (remembering to cast it using // |GRPCQueueCompletionHandler| (remembering to cast it using |__bridge_retained|). The block is
// __bridge_retained). The block is guaranteed to eventually be called, by a // guaranteed to eventually be called, by a concurrent queue, and then released. Each such block is
// concurrent queue, and then released. Each such block is passed a pointer to // passed a |bool| that tells if the operation was successful.
// the grpc_event that carried it (in event->tag). //
// Release the GRPCCompletionQueue object only after you are not going to pass // Release the GRPCCompletionQueue object only after you are not going to pass any more blocks to
// any more blocks to the grpc_call that's using it. // the |grpc_call| that's using it.
@interface GRPCCompletionQueue : NSObject @interface GRPCCompletionQueue : NSObject
@property(nonatomic, readonly) grpc_completion_queue *unmanagedQueue; @property(nonatomic, readonly) grpc_completion_queue *unmanagedQueue;

@ -8,7 +8,10 @@ Pod::Spec.new do |s|
# Run protoc with the Objective-C and gRPC plugins to generate protocol messages and gRPC clients. # Run protoc with the Objective-C and gRPC plugins to generate protocol messages and gRPC clients.
s.prepare_command = <<-CMD s.prepare_command = <<-CMD
protoc --plugin=protoc-gen-grpc=../../../../bins/$CONFIG/grpc_objective_c_plugin --objc_out=. --grpc_out=. *.proto BINDIR=../../../../bins/$CONFIG
PROTOC=$BINDIR/protobuf/protoc
PLUGIN=$BINDIR/grpc_objective_c_plugin
$PROTOC --plugin=protoc-gen-grpc=$PLUGIN --objc_out=. --grpc_out=. *.proto
CMD CMD
s.subspec "Messages" do |ms| s.subspec "Messages" do |ms|

@ -8,7 +8,10 @@ Pod::Spec.new do |s|
# Run protoc with the Objective-C and gRPC plugins to generate protocol messages and gRPC clients. # Run protoc with the Objective-C and gRPC plugins to generate protocol messages and gRPC clients.
s.prepare_command = <<-CMD s.prepare_command = <<-CMD
protoc --plugin=protoc-gen-grpc=../../../../bins/$CONFIG/grpc_objective_c_plugin --objc_out=. --grpc_out=. *.proto BINDIR=../../../../bins/$CONFIG
PROTOC=$BINDIR/protobuf/protoc
PLUGIN=$BINDIR/grpc_objective_c_plugin
$PROTOC --plugin=protoc-gen-grpc=$PLUGIN --objc_out=. --grpc_out=. *.proto
CMD CMD
s.subspec "Messages" do |ms| s.subspec "Messages" do |ms|

@ -28,12 +28,39 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# Don't run this script standalone. Instead, run from the repository root:
# ./tools/run_tests/run_tests.py -l objc
set -e set -e
cd $(dirname $0) cd $(dirname $0)
# The local test server needs to be compiled before this because pod install of hash pod 2>/dev/null || { echo >&2 "Cocoapods needs to be installed."; exit 1; }
# gRPC renames some C gRPC files and not the server's code references to them. hash xcodebuild 2>/dev/null || {
# echo >&2 "XCode command-line tools need to be installed."
# Suppress error output because Cocoapods issue #3823 causes a flooding warning. exit 1
pod install 2>/dev/null }
BINDIR=../../../bins/$CONFIG
if [ ! -f $BINDIR/protobuf/protoc ]; then
hash protoc 2>/dev/null || {
echo >&2 "Can't find protoc. Make sure run_tests.py is making" \
"grpc_objective_c_plugin before calling this script."
exit 1
}
# When protoc is already installed, make doesn't compile one. Put a link
# there so the podspecs can do codegen using that path.
mkdir -p $BINDIR/protobuf
ln -s `which protoc` $BINDIR/protobuf/protoc
fi
[ -f $BINDIR/interop_server ] || {
echo >&2 "Can't find the test server. Make sure run_tests.py is making" \
"interop_server before calling this script. It needs to be done" \
"before because pod install of gRPC renames some C gRPC files" \
"and not the server's code references to them."
exit 1
}
pod install

@ -28,6 +28,9 @@
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# Don't run this script standalone. Instead, run from the repository root:
# ./tools/run_tests/run_tests.py -l objc
set -e set -e
cd $(dirname $0) cd $(dirname $0)

@ -54,7 +54,7 @@ static void test_connectivity(grpc_end2end_test_config config) {
/* start watching for a change */ /* start watching for a change */
grpc_channel_watch_connectivity_state( grpc_channel_watch_connectivity_state(
f.client, GRPC_CHANNEL_IDLE, &state, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(3), f.cq, tag(1)); f.client, GRPC_CHANNEL_IDLE, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(3), f.cq, tag(1));
/* nothing should happen */ /* nothing should happen */
cq_verify_empty(cqv); cq_verify_empty(cqv);
@ -64,14 +64,18 @@ static void test_connectivity(grpc_end2end_test_config config) {
/* and now the watch should trigger */ /* and now the watch should trigger */
cq_expect_completion(cqv, tag(1), 1); cq_expect_completion(cqv, tag(1), 1);
cq_verify(cqv); cq_verify(cqv);
GPR_ASSERT(state == GRPC_CHANNEL_CONNECTING); state = grpc_channel_check_connectivity_state(f.client, 0);
GPR_ASSERT(state == GRPC_CHANNEL_TRANSIENT_FAILURE ||
state == GRPC_CHANNEL_CONNECTING);
/* quickly followed by a transition to TRANSIENT_FAILURE */ /* quickly followed by a transition to TRANSIENT_FAILURE */
grpc_channel_watch_connectivity_state( grpc_channel_watch_connectivity_state(
f.client, GRPC_CHANNEL_CONNECTING, &state, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(3), f.cq, tag(2)); f.client, GRPC_CHANNEL_CONNECTING, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(3), f.cq, tag(2));
cq_expect_completion(cqv, tag(2), 1); cq_expect_completion(cqv, tag(2), 1);
cq_verify(cqv); cq_verify(cqv);
GPR_ASSERT(state == GRPC_CHANNEL_TRANSIENT_FAILURE); state = grpc_channel_check_connectivity_state(f.client, 0);
GPR_ASSERT(state == GRPC_CHANNEL_TRANSIENT_FAILURE ||
state == GRPC_CHANNEL_CONNECTING);
gpr_log(GPR_DEBUG, "*** STARTING SERVER ***"); gpr_log(GPR_DEBUG, "*** STARTING SERVER ***");
@ -84,10 +88,13 @@ static void test_connectivity(grpc_end2end_test_config config) {
READY is reached */ READY is reached */
while (state != GRPC_CHANNEL_READY) { while (state != GRPC_CHANNEL_READY) {
grpc_channel_watch_connectivity_state( grpc_channel_watch_connectivity_state(
f.client, state, &state, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(3), f.cq, tag(3)); f.client, state, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(3), f.cq, tag(3));
cq_expect_completion(cqv, tag(3), 1); cq_expect_completion(cqv, tag(3), 1);
cq_verify(cqv); cq_verify(cqv);
GPR_ASSERT(state == GRPC_CHANNEL_READY || state == GRPC_CHANNEL_CONNECTING || state == GRPC_CHANNEL_TRANSIENT_FAILURE); state = grpc_channel_check_connectivity_state(f.client, 0);
GPR_ASSERT(state == GRPC_CHANNEL_READY ||
state == GRPC_CHANNEL_CONNECTING ||
state == GRPC_CHANNEL_TRANSIENT_FAILURE);
} }
/* bring down the server again */ /* bring down the server again */
@ -95,14 +102,16 @@ static void test_connectivity(grpc_end2end_test_config config) {
gpr_log(GPR_DEBUG, "*** SHUTTING DOWN SERVER ***"); gpr_log(GPR_DEBUG, "*** SHUTTING DOWN SERVER ***");
grpc_channel_watch_connectivity_state( grpc_channel_watch_connectivity_state(
f.client, GRPC_CHANNEL_READY, &state, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(3), f.cq, tag(4)); f.client, GRPC_CHANNEL_READY, GRPC_TIMEOUT_SECONDS_TO_DEADLINE(3), f.cq, tag(4));
grpc_server_shutdown_and_notify(f.server, f.cq, tag(0xdead)); grpc_server_shutdown_and_notify(f.server, f.cq, tag(0xdead));
cq_expect_completion(cqv, tag(4), 1); cq_expect_completion(cqv, tag(4), 1);
cq_expect_completion(cqv, tag(0xdead), 1); cq_expect_completion(cqv, tag(0xdead), 1);
cq_verify(cqv); cq_verify(cqv);
GPR_ASSERT(state == GRPC_CHANNEL_TRANSIENT_FAILURE); state = grpc_channel_check_connectivity_state(f.client, 0);
GPR_ASSERT(state == GRPC_CHANNEL_TRANSIENT_FAILURE ||
state == GRPC_CHANNEL_CONNECTING);
/* cleanup server */ /* cleanup server */
grpc_server_destroy(f.server); grpc_server_destroy(f.server);

@ -37,9 +37,7 @@
#include "test/core/util/test_config.h" #include "test/core/util/test_config.h"
static void test_alpn_success(void) { static void test_alpn_success(void) {
GPR_ASSERT(grpc_chttp2_is_alpn_version_supported("h2-16", 5)); GPR_ASSERT(grpc_chttp2_is_alpn_version_supported("h2", 2));
GPR_ASSERT(grpc_chttp2_is_alpn_version_supported("h2-15", 5));
GPR_ASSERT(grpc_chttp2_is_alpn_version_supported("h2-14", 5));
} }
static void test_alpn_failure(void) { static void test_alpn_failure(void) {

@ -93,6 +93,15 @@ void CheckServerAuthContext(const ServerContext* context) {
EXPECT_TRUE(auth_ctx->GetPeerIdentity().empty()); EXPECT_TRUE(auth_ctx->GetPeerIdentity().empty());
} }
bool CheckIsLocalhost(const grpc::string& addr) {
const grpc::string kIpv6("ipv6:[::1]:");
const grpc::string kIpv4MappedIpv6("ipv6:[::ffff:127.0.0.1]:");
const grpc::string kIpv4("ipv4:127.0.0.1:");
return addr.substr(0, kIpv4.size()) == kIpv4 ||
addr.substr(0, kIpv4MappedIpv6.size()) == kIpv4MappedIpv6 ||
addr.substr(0, kIpv6.size()) == kIpv6;
}
} // namespace } // namespace
class TestServiceImpl : public ::grpc::cpp::test::util::TestService::Service { class TestServiceImpl : public ::grpc::cpp::test::util::TestService::Service {
@ -148,6 +157,9 @@ class TestServiceImpl : public ::grpc::cpp::test::util::TestService::Service {
response->set_message( response->set_message(
grpc::string(request->param().response_message_length(), '\0')); grpc::string(request->param().response_message_length(), '\0'));
} }
if (request->has_param() && request->param().echo_peer()) {
response->mutable_param()->set_peer(context->peer());
}
return Status::OK; return Status::OK;
} }
@ -236,7 +248,7 @@ class End2endTest : public ::testing::Test {
void SetUp() GRPC_OVERRIDE { void SetUp() GRPC_OVERRIDE {
int port = grpc_pick_unused_port_or_die(); int port = grpc_pick_unused_port_or_die();
server_address_ << "localhost:" << port; server_address_ << "127.0.0.1:" << port;
// Setup server // Setup server
ServerBuilder builder; ServerBuilder builder;
SslServerCredentialsOptions::PemKeyCertPair pkcp = {test_server1_key, SslServerCredentialsOptions::PemKeyCertPair pkcp = {test_server1_key,
@ -818,6 +830,21 @@ TEST_F(End2endTest, HugeResponse) {
EXPECT_TRUE(s.ok()); EXPECT_TRUE(s.ok());
} }
TEST_F(End2endTest, Peer) {
ResetStub();
EchoRequest request;
EchoResponse response;
request.set_message("hello");
request.mutable_param()->set_echo_peer(true);
ClientContext context;
Status s = stub_->Echo(&context, request, &response);
EXPECT_EQ(response.message(), request.message());
EXPECT_TRUE(s.ok());
EXPECT_TRUE(CheckIsLocalhost(response.param().peer()));
EXPECT_TRUE(CheckIsLocalhost(context.peer()));
}
} // namespace testing } // namespace testing
} // namespace grpc } // namespace grpc

@ -39,6 +39,7 @@ message RequestParams {
optional bool echo_metadata = 4; optional bool echo_metadata = 4;
optional bool check_auth_context = 5; optional bool check_auth_context = 5;
optional int32 response_message_length = 6; optional int32 response_message_length = 6;
optional bool echo_peer = 7;
} }
message EchoRequest { message EchoRequest {
@ -49,6 +50,7 @@ message EchoRequest {
message ResponseParams { message ResponseParams {
optional int64 request_deadline = 1; optional int64 request_deadline = 1;
optional string host = 2; optional string host = 2;
optional string peer = 3;
} }
message EchoResponse { message EchoResponse {

@ -1638,6 +1638,68 @@ grpc_cloud_prod_auth_compute_engine_creds_gen_csharp_dotnet_cmd() {
echo $the_cmd echo $the_cmd
} }
# constructs the full dockerized csharp-mono oauth2_auth_token auth interop test cmd.
#
# call-seq:
# flags= .... # generic flags to include the command
# cmd=$($grpc_gen_test_cmd $flags)
grpc_cloud_prod_auth_oauth2_auth_token_gen_csharp_mono_cmd() {
local workdir_flag="-w /var/local/git/grpc/src/csharp/Grpc.IntegrationTesting.Client/bin/Debug"
local env_flag="-e SSL_CERT_FILE=/cacerts/roots.pem "
env_flag+="-e GOOGLE_APPLICATION_CREDENTIALS=/service_account/stubbyCloudTestingTest-7dd63462c60c.json "
local cmd_prefix="sudo docker run $workdir_flag $env_flag grpc/csharp_mono";
local test_script="mono Grpc.IntegrationTesting.Client.exe --use_tls=true";
local gfe_flags=$(_grpc_prod_gfe_flags);
local the_cmd="$cmd_prefix $test_script $gfe_flags $@";
echo $the_cmd
}
# constructs the csharp-dotnet oauth2_auth_token auth interop test cmd.
#
# call-seq:
# flags= .... # generic flags to include the command
# cmd=$($grpc_gen_test_cmd $flags)
grpc_cloud_prod_auth_oauth2_auth_token_gen_csharp_dotnet_cmd() {
local set_workdir="cd /cygdrive/c/github/grpc/src/csharp/Grpc.IntegrationTesting.Client/bin/Debug &&"
local test_script="./Grpc.IntegrationTesting.Client.exe --use_tls=true";
local set_certfile="SSL_CERT_FILE=/cacerts/roots.pem "
local set_creds="GOOGLE_APPLICATION_CREDENTIALS=/service_account/stubbyCloudTestingTest-7dd63462c60c.json "
local gfe_flags=$(_grpc_prod_gfe_flags);
local the_cmd="$set_workdir $set_certfile $set_creds $test_script $gfe_flags $@";
echo $the_cmd
}
# constructs the full dockerized csharp-mono per_rpc_creds auth interop test cmd.
#
# call-seq:
# flags= .... # generic flags to include the command
# cmd=$($grpc_gen_test_cmd $flags)
grpc_cloud_prod_auth_per_rpc_creds_gen_csharp_mono_cmd() {
local workdir_flag="-w /var/local/git/grpc/src/csharp/Grpc.IntegrationTesting.Client/bin/Debug"
local env_flag="-e SSL_CERT_FILE=/cacerts/roots.pem "
env_flag+="-e GOOGLE_APPLICATION_CREDENTIALS=/service_account/stubbyCloudTestingTest-7dd63462c60c.json "
local cmd_prefix="sudo docker run $workdir_flag $env_flag grpc/csharp_mono";
local test_script="mono Grpc.IntegrationTesting.Client.exe --use_tls=true";
local gfe_flags=$(_grpc_prod_gfe_flags);
local the_cmd="$cmd_prefix $test_script $gfe_flags $@";
echo $the_cmd
}
# constructs the csharp-dotnet per_rpc_creds auth interop test cmd.
#
# call-seq:
# flags= .... # generic flags to include the command
# cmd=$($grpc_gen_test_cmd $flags)
grpc_cloud_prod_auth_per_rpc_creds_gen_csharp_dotnet_cmd() {
local set_workdir="cd /cygdrive/c/github/grpc/src/csharp/Grpc.IntegrationTesting.Client/bin/Debug &&"
local test_script="./Grpc.IntegrationTesting.Client.exe --use_tls=true";
local set_certfile="SSL_CERT_FILE=/cacerts/roots.pem "
local set_creds="GOOGLE_APPLICATION_CREDENTIALS=/service_account/stubbyCloudTestingTest-7dd63462c60c.json "
local gfe_flags=$(_grpc_prod_gfe_flags);
local the_cmd="$set_workdir $set_certfile $set_creds $test_script $gfe_flags $@";
echo $the_cmd
}
# outputs the flags passed to gfe tests # outputs the flags passed to gfe tests
_grpc_prod_gfe_flags() { _grpc_prod_gfe_flags() {
echo " --server_port=443 --server_host=grpc-test.sandbox.google.com --server_host_override=grpc-test.sandbox.google.com" echo " --server_port=443 --server_host=grpc-test.sandbox.google.com --server_host_override=grpc-test.sandbox.google.com"

@ -48,3 +48,8 @@ diff -u $submodules - << EOF
3e2c8a5dd79481e1d36572cdf65be93514ba6581 third_party/protobuf (v3.0.0-alpha-1-1048-g3e2c8a5) 3e2c8a5dd79481e1d36572cdf65be93514ba6581 third_party/protobuf (v3.0.0-alpha-1-1048-g3e2c8a5)
50893291621658f355bc5b4d450a8d06a563053d third_party/zlib (v1.2.8) 50893291621658f355bc5b4d450a8d06a563053d third_party/zlib (v1.2.8)
EOF EOF
if [ -f cache.mk ] ; then
echo "Please don't commit cache.mk"
exit 1
fi

Loading…
Cancel
Save