|  | @@ -44,6 +44,9 @@ var testProto = grpc.load({
 | 
	
		
			
				|  |  |  var ECHO_INITIAL_KEY = 'x-grpc-test-echo-initial';
 | 
	
		
			
				|  |  |  var ECHO_TRAILING_KEY = 'x-grpc-test-echo-trailing-bin';
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +var incompressible_data = fs.readFileSync(
 | 
	
		
			
				|  |  | +    __dirname + '/../../../test/cpp/interop/rnd.dat');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * Create a buffer filled with size zeroes
 | 
	
		
			
				|  |  |   * @param {number} size The length of the buffer
 | 
	
	
		
			
				|  | @@ -83,6 +86,19 @@ function getEchoTrailer(call) {
 | 
	
		
			
				|  |  |    return response_trailer;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +function getPayload(payload_type, size) {
 | 
	
		
			
				|  |  | +  if (payload_type === 'RANDOM') {
 | 
	
		
			
				|  |  | +    payload_type = ['COMPRESSABLE',
 | 
	
		
			
				|  |  | +                    'UNCOMPRESSABLE'][Math.random() < 0.5 ? 0 : 1];
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  var body;
 | 
	
		
			
				|  |  | +  switch (payload_type) {
 | 
	
		
			
				|  |  | +    case 'COMPRESSABLE': body = zeroBuffer(size); break;
 | 
	
		
			
				|  |  | +    case 'UNCOMPRESSABLE': incompressible_data.slice(size); break;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  return {type: payload_type, body: body};
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  /**
 | 
	
		
			
				|  |  |   * Respond to an empty parameter with an empty response.
 | 
	
		
			
				|  |  |   * NOTE: this currently does not work due to issue #137
 | 
	
	
		
			
				|  | @@ -104,13 +120,14 @@ function handleEmpty(call, callback) {
 | 
	
		
			
				|  |  |  function handleUnary(call, callback) {
 | 
	
		
			
				|  |  |    echoHeader(call);
 | 
	
		
			
				|  |  |    var req = call.request;
 | 
	
		
			
				|  |  | -  var zeros = zeroBuffer(req.response_size);
 | 
	
		
			
				|  |  | -  var payload_type = req.response_type;
 | 
	
		
			
				|  |  | -  if (payload_type === 'RANDOM') {
 | 
	
		
			
				|  |  | -    payload_type = ['COMPRESSABLE',
 | 
	
		
			
				|  |  | -                    'UNCOMPRESSABLE'][Math.random() < 0.5 ? 0 : 1];
 | 
	
		
			
				|  |  | +  if (req.response_status) {
 | 
	
		
			
				|  |  | +    var status = req.response_status;
 | 
	
		
			
				|  |  | +    status.metadata = getEchoTrailer(call);
 | 
	
		
			
				|  |  | +    callback(status);
 | 
	
		
			
				|  |  | +    return;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  callback(null, {payload: {type: payload_type, body: zeros}},
 | 
	
		
			
				|  |  | +  var payload = getPayload(req.response_type, req.response_size);
 | 
	
		
			
				|  |  | +  callback(null, {payload: payload},
 | 
	
		
			
				|  |  |             getEchoTrailer(call));
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -139,18 +156,14 @@ function handleStreamingInput(call, callback) {
 | 
	
		
			
				|  |  |  function handleStreamingOutput(call) {
 | 
	
		
			
				|  |  |    echoHeader(call);
 | 
	
		
			
				|  |  |    var req = call.request;
 | 
	
		
			
				|  |  | -  var payload_type = req.response_type;
 | 
	
		
			
				|  |  | -  if (payload_type === 'RANDOM') {
 | 
	
		
			
				|  |  | -    payload_type = ['COMPRESSABLE',
 | 
	
		
			
				|  |  | -                    'UNCOMPRESSABLE'][Math.random() < 0.5 ? 0 : 1];
 | 
	
		
			
				|  |  | +  if (req.response_status) {
 | 
	
		
			
				|  |  | +    var status = req.response_status;
 | 
	
		
			
				|  |  | +    status.metadata = getEchoTrailer(call);
 | 
	
		
			
				|  |  | +    call.emit('error', status);
 | 
	
		
			
				|  |  | +    return;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    _.each(req.response_parameters, function(resp_param) {
 | 
	
		
			
				|  |  | -    call.write({
 | 
	
		
			
				|  |  | -      payload: {
 | 
	
		
			
				|  |  | -        body: zeroBuffer(resp_param.size),
 | 
	
		
			
				|  |  | -        type: payload_type
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    });
 | 
	
		
			
				|  |  | +    call.write({payload: getPayload(req.response_type, resp_param.size)});
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |    call.end(getEchoTrailer(call));
 | 
	
		
			
				|  |  |  }
 | 
	
	
		
			
				|  | @@ -163,18 +176,14 @@ function handleStreamingOutput(call) {
 | 
	
		
			
				|  |  |  function handleFullDuplex(call) {
 | 
	
		
			
				|  |  |    echoHeader(call);
 | 
	
		
			
				|  |  |    call.on('data', function(value) {
 | 
	
		
			
				|  |  | -    var payload_type = value.response_type;
 | 
	
		
			
				|  |  | -    if (payload_type === 'RANDOM') {
 | 
	
		
			
				|  |  | -      payload_type = ['COMPRESSABLE',
 | 
	
		
			
				|  |  | -                      'UNCOMPRESSABLE'][Math.random() < 0.5 ? 0 : 1];
 | 
	
		
			
				|  |  | +    if (value.response_status) {
 | 
	
		
			
				|  |  | +      var status = value.response_status;
 | 
	
		
			
				|  |  | +      status.metadata = getEchoTrailer(call);
 | 
	
		
			
				|  |  | +      call.emit('error', status);
 | 
	
		
			
				|  |  | +      return;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      _.each(value.response_parameters, function(resp_param) {
 | 
	
		
			
				|  |  | -      call.write({
 | 
	
		
			
				|  |  | -        payload: {
 | 
	
		
			
				|  |  | -          body: zeroBuffer(resp_param.size),
 | 
	
		
			
				|  |  | -          type: payload_type
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      });
 | 
	
		
			
				|  |  | +      call.write({payload: getPayload(value.response_type, resp_param.size)});
 | 
	
		
			
				|  |  |      });
 | 
	
		
			
				|  |  |    });
 | 
	
		
			
				|  |  |    call.on('end', function() {
 | 
	
	
		
			
				|  | @@ -188,7 +197,7 @@ function handleFullDuplex(call) {
 | 
	
		
			
				|  |  |   * @param {Call} call Call to handle
 | 
	
		
			
				|  |  |   */
 | 
	
		
			
				|  |  |  function handleHalfDuplex(call) {
 | 
	
		
			
				|  |  | -  throw new Error('HalfDuplexCall not yet implemented');
 | 
	
		
			
				|  |  | +  call.emit('error', Error('HalfDuplexCall not yet implemented'));
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  /**
 |