|  | @@ -690,165 +690,187 @@ describe('Other conditions', function() {
 | 
	
		
			
				|  |  |        });
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  | -  describe('Call propagation', function() {
 | 
	
		
			
				|  |  | -    var proxy;
 | 
	
		
			
				|  |  | -    var proxy_impl;
 | 
	
		
			
				|  |  | -    beforeEach(function() {
 | 
	
		
			
				|  |  | -      proxy = new grpc.Server();
 | 
	
		
			
				|  |  | -      proxy_impl = {
 | 
	
		
			
				|  |  | -        unary: function(call) {},
 | 
	
		
			
				|  |  | -        clientStream: function(stream) {},
 | 
	
		
			
				|  |  | -        serverStream: function(stream) {},
 | 
	
		
			
				|  |  | -        bidiStream: function(stream) {}
 | 
	
		
			
				|  |  | -      };
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +describe('Call propagation', function() {
 | 
	
		
			
				|  |  | +  var proxy;
 | 
	
		
			
				|  |  | +  var proxy_impl;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  var test_service;
 | 
	
		
			
				|  |  | +  var Client;
 | 
	
		
			
				|  |  | +  var client;
 | 
	
		
			
				|  |  | +  var server;
 | 
	
		
			
				|  |  | +  before(function() {
 | 
	
		
			
				|  |  | +    var test_proto = ProtoBuf.loadProtoFile(__dirname + '/test_service.proto');
 | 
	
		
			
				|  |  | +    test_service = test_proto.lookup('TestService');
 | 
	
		
			
				|  |  | +    server = new grpc.Server();
 | 
	
		
			
				|  |  | +    server.addProtoService(test_service, {
 | 
	
		
			
				|  |  | +      unary: function(call) {},
 | 
	
		
			
				|  |  | +      clientStream: function(stream) {},
 | 
	
		
			
				|  |  | +      serverStream: function(stream) {},
 | 
	
		
			
				|  |  | +      bidiStream: function(stream) {}
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  | -    afterEach(function() {
 | 
	
		
			
				|  |  | -      console.log('Shutting down server');
 | 
	
		
			
				|  |  | -      proxy.forceShutdown();
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | -    describe('Cancellation', function() {
 | 
	
		
			
				|  |  | -      it('With a unary call', function(done) {
 | 
	
		
			
				|  |  | -        done = multiDone(done, 2);
 | 
	
		
			
				|  |  | -        proxy_impl.unary = function(parent, callback) {
 | 
	
		
			
				|  |  | -          client.unary(parent.request, function(err, value) {
 | 
	
		
			
				|  |  | -            try {
 | 
	
		
			
				|  |  | -              assert(err);
 | 
	
		
			
				|  |  | -              assert.strictEqual(err.code, grpc.status.CANCELLED);
 | 
	
		
			
				|  |  | -            } finally {
 | 
	
		
			
				|  |  | -              callback(err, value);
 | 
	
		
			
				|  |  | -              done();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -          }, null, {parent: parent});
 | 
	
		
			
				|  |  | -          call.cancel();
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -        proxy.addProtoService(test_service, proxy_impl);
 | 
	
		
			
				|  |  | -        var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
 | 
	
		
			
				|  |  | -        proxy.start();
 | 
	
		
			
				|  |  | -        var proxy_client = new Client('localhost:' + proxy_port,
 | 
	
		
			
				|  |  | -                                      grpc.Credentials.createInsecure());
 | 
	
		
			
				|  |  | -        var call = proxy_client.unary({}, function(err, value) {
 | 
	
		
			
				|  |  | -          done();
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -      });
 | 
	
		
			
				|  |  | -      it('With a client stream call', function(done) {
 | 
	
		
			
				|  |  | -        done = multiDone(done, 2);
 | 
	
		
			
				|  |  | -        proxy_impl.clientStream = function(parent, callback) {
 | 
	
		
			
				|  |  | -          client.clientStream(function(err, value) {
 | 
	
		
			
				|  |  | -            try {
 | 
	
		
			
				|  |  | -              assert(err);
 | 
	
		
			
				|  |  | -              assert.strictEqual(err.code, grpc.status.CANCELLED);
 | 
	
		
			
				|  |  | -            } finally {
 | 
	
		
			
				|  |  | -              callback(err, value);
 | 
	
		
			
				|  |  | -              done();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -          }, null, {parent: parent});
 | 
	
		
			
				|  |  | -          call.cancel();
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -        proxy.addProtoService(test_service, proxy_impl);
 | 
	
		
			
				|  |  | -        var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
 | 
	
		
			
				|  |  | -        proxy.start();
 | 
	
		
			
				|  |  | -        var proxy_client = new Client('localhost:' + proxy_port,
 | 
	
		
			
				|  |  | -                                      grpc.Credentials.createInsecure());
 | 
	
		
			
				|  |  | -        var call = proxy_client.clientStream(function(err, value) {
 | 
	
		
			
				|  |  | -          done();
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | -      });
 | 
	
		
			
				|  |  | -      it('With a server stream call', function(done) {
 | 
	
		
			
				|  |  | -        done = multiDone(done, 2);
 | 
	
		
			
				|  |  | -        proxy_impl.serverStream = function(parent) {
 | 
	
		
			
				|  |  | -          var child = client.serverStream(parent.request, null,
 | 
	
		
			
				|  |  | -                                          {parent: parent});
 | 
	
		
			
				|  |  | -          child.on('error', function(err) {
 | 
	
		
			
				|  |  | +    var port = server.bind('localhost:0', server_insecure_creds);
 | 
	
		
			
				|  |  | +    Client = surface_client.makeProtobufClientConstructor(test_service);
 | 
	
		
			
				|  |  | +    client = new Client('localhost:' + port, grpc.Credentials.createInsecure());
 | 
	
		
			
				|  |  | +    server.start();
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  after(function() {
 | 
	
		
			
				|  |  | +    server.forceShutdown();
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  beforeEach(function() {
 | 
	
		
			
				|  |  | +    proxy = new grpc.Server();
 | 
	
		
			
				|  |  | +    proxy_impl = {
 | 
	
		
			
				|  |  | +      unary: function(call) {},
 | 
	
		
			
				|  |  | +      clientStream: function(stream) {},
 | 
	
		
			
				|  |  | +      serverStream: function(stream) {},
 | 
	
		
			
				|  |  | +      bidiStream: function(stream) {}
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  afterEach(function() {
 | 
	
		
			
				|  |  | +    proxy.forceShutdown();
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  describe('Cancellation', function() {
 | 
	
		
			
				|  |  | +    it('With a unary call', function(done) {
 | 
	
		
			
				|  |  | +      done = multiDone(done, 2);
 | 
	
		
			
				|  |  | +      proxy_impl.unary = function(parent, callback) {
 | 
	
		
			
				|  |  | +        client.unary(parent.request, function(err, value) {
 | 
	
		
			
				|  |  | +          try {
 | 
	
		
			
				|  |  |              assert(err);
 | 
	
		
			
				|  |  |              assert.strictEqual(err.code, grpc.status.CANCELLED);
 | 
	
		
			
				|  |  | +          } finally {
 | 
	
		
			
				|  |  | +            callback(err, value);
 | 
	
		
			
				|  |  |              done();
 | 
	
		
			
				|  |  | -          });
 | 
	
		
			
				|  |  | -          call.cancel();
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -        proxy.addProtoService(test_service, proxy_impl);
 | 
	
		
			
				|  |  | -        var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
 | 
	
		
			
				|  |  | -        proxy.start();
 | 
	
		
			
				|  |  | -        var proxy_client = new Client('localhost:' + proxy_port,
 | 
	
		
			
				|  |  | -                                      grpc.Credentials.createInsecure());
 | 
	
		
			
				|  |  | -        var call = proxy_client.serverStream({});
 | 
	
		
			
				|  |  | -        call.on('error', function(err) {
 | 
	
		
			
				|  |  | -          done();
 | 
	
		
			
				|  |  | -        });
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }, null, {parent: parent});
 | 
	
		
			
				|  |  | +        call.cancel();
 | 
	
		
			
				|  |  | +      };
 | 
	
		
			
				|  |  | +      proxy.addProtoService(test_service, proxy_impl);
 | 
	
		
			
				|  |  | +      var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
 | 
	
		
			
				|  |  | +      proxy.start();
 | 
	
		
			
				|  |  | +      var proxy_client = new Client('localhost:' + proxy_port,
 | 
	
		
			
				|  |  | +                                    grpc.Credentials.createInsecure());
 | 
	
		
			
				|  |  | +      var call = proxy_client.unary({}, function(err, value) {
 | 
	
		
			
				|  |  | +        done();
 | 
	
		
			
				|  |  |        });
 | 
	
		
			
				|  |  | -      it('With a bidi stream call', function(done) {
 | 
	
		
			
				|  |  | -        done = multiDone(done, 2);
 | 
	
		
			
				|  |  | -        proxy_impl.bidiStream = function(parent) {
 | 
	
		
			
				|  |  | -          var child = client.bidiStream(null, {parent: parent});
 | 
	
		
			
				|  |  | -          child.on('error', function(err) {
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    it('With a client stream call', function(done) {
 | 
	
		
			
				|  |  | +      done = multiDone(done, 2);
 | 
	
		
			
				|  |  | +      proxy_impl.clientStream = function(parent, callback) {
 | 
	
		
			
				|  |  | +        client.clientStream(function(err, value) {
 | 
	
		
			
				|  |  | +          try {
 | 
	
		
			
				|  |  |              assert(err);
 | 
	
		
			
				|  |  |              assert.strictEqual(err.code, grpc.status.CANCELLED);
 | 
	
		
			
				|  |  | +          } finally {
 | 
	
		
			
				|  |  | +            callback(err, value);
 | 
	
		
			
				|  |  |              done();
 | 
	
		
			
				|  |  | -          });
 | 
	
		
			
				|  |  | -          call.cancel();
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -        proxy.addProtoService(test_service, proxy_impl);
 | 
	
		
			
				|  |  | -        var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
 | 
	
		
			
				|  |  | -        proxy.start();
 | 
	
		
			
				|  |  | -        var proxy_client = new Client('localhost:' + proxy_port,
 | 
	
		
			
				|  |  | -                                      grpc.Credentials.createInsecure());
 | 
	
		
			
				|  |  | -        var call = proxy_client.bidiStream();
 | 
	
		
			
				|  |  | -        call.on('error', function(err) {
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }, null, {parent: parent});
 | 
	
		
			
				|  |  | +        call.cancel();
 | 
	
		
			
				|  |  | +      };
 | 
	
		
			
				|  |  | +      proxy.addProtoService(test_service, proxy_impl);
 | 
	
		
			
				|  |  | +      var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
 | 
	
		
			
				|  |  | +      proxy.start();
 | 
	
		
			
				|  |  | +      var proxy_client = new Client('localhost:' + proxy_port,
 | 
	
		
			
				|  |  | +                                    grpc.Credentials.createInsecure());
 | 
	
		
			
				|  |  | +      var call = proxy_client.clientStream(function(err, value) {
 | 
	
		
			
				|  |  | +        done();
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    it('With a server stream call', function(done) {
 | 
	
		
			
				|  |  | +      done = multiDone(done, 2);
 | 
	
		
			
				|  |  | +      proxy_impl.serverStream = function(parent) {
 | 
	
		
			
				|  |  | +        var child = client.serverStream(parent.request, null,
 | 
	
		
			
				|  |  | +                                        {parent: parent});
 | 
	
		
			
				|  |  | +        child.on('error', function(err) {
 | 
	
		
			
				|  |  | +          assert(err);
 | 
	
		
			
				|  |  | +          assert.strictEqual(err.code, grpc.status.CANCELLED);
 | 
	
		
			
				|  |  |            done();
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  | +        call.cancel();
 | 
	
		
			
				|  |  | +      };
 | 
	
		
			
				|  |  | +      proxy.addProtoService(test_service, proxy_impl);
 | 
	
		
			
				|  |  | +      var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
 | 
	
		
			
				|  |  | +      proxy.start();
 | 
	
		
			
				|  |  | +      var proxy_client = new Client('localhost:' + proxy_port,
 | 
	
		
			
				|  |  | +                                    grpc.Credentials.createInsecure());
 | 
	
		
			
				|  |  | +      var call = proxy_client.serverStream({});
 | 
	
		
			
				|  |  | +      call.on('error', function(err) {
 | 
	
		
			
				|  |  | +        done();
 | 
	
		
			
				|  |  |        });
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  | -    describe('Deadline', function() {
 | 
	
		
			
				|  |  | -      /* jshint bitwise:false */
 | 
	
		
			
				|  |  | -      var deadline_flags = (grpc.propagate.DEFAULTS &
 | 
	
		
			
				|  |  | -          ~grpc.propagate.CANCELLATION);
 | 
	
		
			
				|  |  | -      it('With a client stream call', function(done) {
 | 
	
		
			
				|  |  | -        done = multiDone(done, 2);
 | 
	
		
			
				|  |  | -        proxy_impl.clientStream = function(parent, callback) {
 | 
	
		
			
				|  |  | -          client.clientStream(function(err, value) {
 | 
	
		
			
				|  |  | -            try {
 | 
	
		
			
				|  |  | -              assert(err);
 | 
	
		
			
				|  |  | -              assert(err.code === grpc.status.DEADLINE_EXCEEDED ||
 | 
	
		
			
				|  |  | -                  err.code === grpc.status.INTERNAL);
 | 
	
		
			
				|  |  | -            } finally {
 | 
	
		
			
				|  |  | -              callback(err, value);
 | 
	
		
			
				|  |  | -              done();
 | 
	
		
			
				|  |  | -            }
 | 
	
		
			
				|  |  | -          }, null, {parent: parent, propagate_flags: deadline_flags});
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -        proxy.addProtoService(test_service, proxy_impl);
 | 
	
		
			
				|  |  | -        var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
 | 
	
		
			
				|  |  | -        proxy.start();
 | 
	
		
			
				|  |  | -        var proxy_client = new Client('localhost:' + proxy_port,
 | 
	
		
			
				|  |  | -                                      grpc.Credentials.createInsecure());
 | 
	
		
			
				|  |  | -        var deadline = new Date();
 | 
	
		
			
				|  |  | -        deadline.setSeconds(deadline.getSeconds() + 1);
 | 
	
		
			
				|  |  | -        proxy_client.clientStream(function(err, value) {
 | 
	
		
			
				|  |  | +    it('With a bidi stream call', function(done) {
 | 
	
		
			
				|  |  | +      done = multiDone(done, 2);
 | 
	
		
			
				|  |  | +      proxy_impl.bidiStream = function(parent) {
 | 
	
		
			
				|  |  | +        var child = client.bidiStream(null, {parent: parent});
 | 
	
		
			
				|  |  | +        child.on('error', function(err) {
 | 
	
		
			
				|  |  | +          assert(err);
 | 
	
		
			
				|  |  | +          assert.strictEqual(err.code, grpc.status.CANCELLED);
 | 
	
		
			
				|  |  |            done();
 | 
	
		
			
				|  |  | -        }, null, {deadline: deadline});
 | 
	
		
			
				|  |  | -      });
 | 
	
		
			
				|  |  | -      it('With a bidi stream call', function(done) {
 | 
	
		
			
				|  |  | -        done = multiDone(done, 2);
 | 
	
		
			
				|  |  | -        proxy_impl.bidiStream = function(parent) {
 | 
	
		
			
				|  |  | -          var child = client.bidiStream(
 | 
	
		
			
				|  |  | -              null, {parent: parent, propagate_flags: deadline_flags});
 | 
	
		
			
				|  |  | -          child.on('error', function(err) {
 | 
	
		
			
				|  |  | +        });
 | 
	
		
			
				|  |  | +        call.cancel();
 | 
	
		
			
				|  |  | +      };
 | 
	
		
			
				|  |  | +      proxy.addProtoService(test_service, proxy_impl);
 | 
	
		
			
				|  |  | +      var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
 | 
	
		
			
				|  |  | +      proxy.start();
 | 
	
		
			
				|  |  | +      var proxy_client = new Client('localhost:' + proxy_port,
 | 
	
		
			
				|  |  | +                                    grpc.Credentials.createInsecure());
 | 
	
		
			
				|  |  | +      var call = proxy_client.bidiStream();
 | 
	
		
			
				|  |  | +      call.on('error', function(err) {
 | 
	
		
			
				|  |  | +        done();
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +  });
 | 
	
		
			
				|  |  | +  describe('Deadline', function() {
 | 
	
		
			
				|  |  | +    /* jshint bitwise:false */
 | 
	
		
			
				|  |  | +    var deadline_flags = (grpc.propagate.DEFAULTS &
 | 
	
		
			
				|  |  | +        ~grpc.propagate.CANCELLATION);
 | 
	
		
			
				|  |  | +    it('With a client stream call', function(done) {
 | 
	
		
			
				|  |  | +      done = multiDone(done, 2);
 | 
	
		
			
				|  |  | +      proxy_impl.clientStream = function(parent, callback) {
 | 
	
		
			
				|  |  | +        client.clientStream(function(err, value) {
 | 
	
		
			
				|  |  | +          try {
 | 
	
		
			
				|  |  |              assert(err);
 | 
	
		
			
				|  |  |              assert(err.code === grpc.status.DEADLINE_EXCEEDED ||
 | 
	
		
			
				|  |  |                  err.code === grpc.status.INTERNAL);
 | 
	
		
			
				|  |  | +          } finally {
 | 
	
		
			
				|  |  | +            callback(err, value);
 | 
	
		
			
				|  |  |              done();
 | 
	
		
			
				|  |  | -          });
 | 
	
		
			
				|  |  | -        };
 | 
	
		
			
				|  |  | -        proxy.addProtoService(test_service, proxy_impl);
 | 
	
		
			
				|  |  | -        var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
 | 
	
		
			
				|  |  | -        proxy.start();
 | 
	
		
			
				|  |  | -        var proxy_client = new Client('localhost:' + proxy_port,
 | 
	
		
			
				|  |  | -                                      grpc.Credentials.createInsecure());
 | 
	
		
			
				|  |  | -        var deadline = new Date();
 | 
	
		
			
				|  |  | -        deadline.setSeconds(deadline.getSeconds() + 1);
 | 
	
		
			
				|  |  | -        var call = proxy_client.bidiStream(null, {deadline: deadline});
 | 
	
		
			
				|  |  | -        call.on('error', function(err) {
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }, null, {parent: parent, propagate_flags: deadline_flags});
 | 
	
		
			
				|  |  | +      };
 | 
	
		
			
				|  |  | +      proxy.addProtoService(test_service, proxy_impl);
 | 
	
		
			
				|  |  | +      var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
 | 
	
		
			
				|  |  | +      proxy.start();
 | 
	
		
			
				|  |  | +      var proxy_client = new Client('localhost:' + proxy_port,
 | 
	
		
			
				|  |  | +                                    grpc.Credentials.createInsecure());
 | 
	
		
			
				|  |  | +      var deadline = new Date();
 | 
	
		
			
				|  |  | +      deadline.setSeconds(deadline.getSeconds() + 1);
 | 
	
		
			
				|  |  | +      proxy_client.clientStream(function(err, value) {
 | 
	
		
			
				|  |  | +        done();
 | 
	
		
			
				|  |  | +      }, null, {deadline: deadline});
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    it('With a bidi stream call', function(done) {
 | 
	
		
			
				|  |  | +      done = multiDone(done, 2);
 | 
	
		
			
				|  |  | +      proxy_impl.bidiStream = function(parent) {
 | 
	
		
			
				|  |  | +        var child = client.bidiStream(
 | 
	
		
			
				|  |  | +            null, {parent: parent, propagate_flags: deadline_flags});
 | 
	
		
			
				|  |  | +        child.on('error', function(err) {
 | 
	
		
			
				|  |  | +          assert(err);
 | 
	
		
			
				|  |  | +          assert(err.code === grpc.status.DEADLINE_EXCEEDED ||
 | 
	
		
			
				|  |  | +              err.code === grpc.status.INTERNAL);
 | 
	
		
			
				|  |  |            done();
 | 
	
		
			
				|  |  |          });
 | 
	
		
			
				|  |  | +      };
 | 
	
		
			
				|  |  | +      proxy.addProtoService(test_service, proxy_impl);
 | 
	
		
			
				|  |  | +      var proxy_port = proxy.bind('localhost:0', server_insecure_creds);
 | 
	
		
			
				|  |  | +      proxy.start();
 | 
	
		
			
				|  |  | +      var proxy_client = new Client('localhost:' + proxy_port,
 | 
	
		
			
				|  |  | +                                    grpc.Credentials.createInsecure());
 | 
	
		
			
				|  |  | +      var deadline = new Date();
 | 
	
		
			
				|  |  | +      deadline.setSeconds(deadline.getSeconds() + 1);
 | 
	
		
			
				|  |  | +      var call = proxy_client.bidiStream(null, {deadline: deadline});
 | 
	
		
			
				|  |  | +      call.on('error', function(err) {
 | 
	
		
			
				|  |  | +        done();
 | 
	
		
			
				|  |  |        });
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |    });
 |