|  | @@ -67,30 +67,26 @@ const int kReceiveDelayMilliSeconds = 20;
 | 
	
		
			
				|  |  |  const int kLargeRequestSize = 271828;
 | 
	
		
			
				|  |  |  const int kLargeResponseSize = 314159;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -CompressionType GetInteropCompressionTypeFromCompressionAlgorithm(
 | 
	
		
			
				|  |  | -    grpc_compression_algorithm algorithm) {
 | 
	
		
			
				|  |  | -  switch (algorithm) {
 | 
	
		
			
				|  |  | -    case GRPC_COMPRESS_NONE:
 | 
	
		
			
				|  |  | -      return CompressionType::NONE;
 | 
	
		
			
				|  |  | -    case GRPC_COMPRESS_GZIP:
 | 
	
		
			
				|  |  | -      return CompressionType::GZIP;
 | 
	
		
			
				|  |  | -    case GRPC_COMPRESS_DEFLATE:
 | 
	
		
			
				|  |  | -      return CompressionType::DEFLATE;
 | 
	
		
			
				|  |  | -    default:
 | 
	
		
			
				|  |  | -      GPR_ASSERT(false);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -}
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  void NoopChecks(const InteropClientContextInspector& inspector,
 | 
	
		
			
				|  |  |                  const SimpleRequest* request, const SimpleResponse* response) {}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void CompressionChecks(const InteropClientContextInspector& inspector,
 | 
	
		
			
				|  |  |                         const SimpleRequest* request,
 | 
	
		
			
				|  |  |                         const SimpleResponse* response) {
 | 
	
		
			
				|  |  | -  GPR_ASSERT(request->response_compression() ==
 | 
	
		
			
				|  |  | -             GetInteropCompressionTypeFromCompressionAlgorithm(
 | 
	
		
			
				|  |  | -                 inspector.GetCallCompressionAlgorithm()));
 | 
	
		
			
				|  |  | -  if (request->response_compression() == NONE) {
 | 
	
		
			
				|  |  | +  const grpc_compression_algorithm received_compression =
 | 
	
		
			
				|  |  | +      inspector.GetCallCompressionAlgorithm();
 | 
	
		
			
				|  |  | +  if (request->request_compressed_response() &&
 | 
	
		
			
				|  |  | +      received_compression == GRPC_COMPRESS_NONE) {
 | 
	
		
			
				|  |  | +    if (request->request_compressed_response() &&
 | 
	
		
			
				|  |  | +        received_compression == GRPC_COMPRESS_NONE) {
 | 
	
		
			
				|  |  | +      // Requested some compression, got NONE. This is an error.
 | 
	
		
			
				|  |  | +      gpr_log(GPR_ERROR,
 | 
	
		
			
				|  |  | +              "Failure: Requested compression but got uncompressed response "
 | 
	
		
			
				|  |  | +              "from server.");
 | 
	
		
			
				|  |  | +      abort();
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +  if (!request->request_compressed_response()) {
 | 
	
		
			
				|  |  |      GPR_ASSERT(!(inspector.GetMessageFlags() & GRPC_WRITE_INTERNAL_COMPRESS));
 | 
	
		
			
				|  |  |    } else if (request->response_type() == PayloadType::COMPRESSABLE) {
 | 
	
		
			
				|  |  |      // requested compression and compressable response => results should always
 | 
	
	
		
			
				|  | @@ -211,20 +207,22 @@ bool InteropClient::PerformLargeUnary(SimpleRequest* request,
 | 
	
		
			
				|  |  |    custom_checks_fn(inspector, request, response);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    // Payload related checks.
 | 
	
		
			
				|  |  | -  if (request->response_type() != PayloadType::RANDOM) {
 | 
	
		
			
				|  |  | -    GPR_ASSERT(response->payload().type() == request->response_type());
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +  GPR_ASSERT(response->payload().type() == request->response_type());
 | 
	
		
			
				|  |  |    switch (response->payload().type()) {
 | 
	
		
			
				|  |  |      case PayloadType::COMPRESSABLE:
 | 
	
		
			
				|  |  |        GPR_ASSERT(response->payload().body() ==
 | 
	
		
			
				|  |  |                   grpc::string(kLargeResponseSize, '\0'));
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  |      case PayloadType::UNCOMPRESSABLE: {
 | 
	
		
			
				|  |  | -      std::ifstream rnd_file(kRandomFile);
 | 
	
		
			
				|  |  | -      GPR_ASSERT(rnd_file.good());
 | 
	
		
			
				|  |  | -      for (int i = 0; i < kLargeResponseSize; i++) {
 | 
	
		
			
				|  |  | -        GPR_ASSERT(response->payload().body()[i] == (char)rnd_file.get());
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | +      // We don't really check anything: We can't assert that the payload is
 | 
	
		
			
				|  |  | +      // uncompressed because it's the server's prerogative to decide on that,
 | 
	
		
			
				|  |  | +      // and different implementations decide differently (ie, Java always
 | 
	
		
			
				|  |  | +      // compresses when requested to do so, whereas C core throws away the
 | 
	
		
			
				|  |  | +      // compressed payload if the output is larger than the input).
 | 
	
		
			
				|  |  | +      // In addition, we don't compare the actual random bytes received because
 | 
	
		
			
				|  |  | +      // asserting that data is sent/received properly isn't the purpose of this
 | 
	
		
			
				|  |  | +      // test. Moreover, different implementations are also free to use
 | 
	
		
			
				|  |  | +      // different sets of random bytes.
 | 
	
		
			
				|  |  |      } break;
 | 
	
		
			
				|  |  |      default:
 | 
	
		
			
				|  |  |        GPR_ASSERT(false);
 | 
	
	
		
			
				|  | @@ -341,13 +339,13 @@ bool InteropClient::DoLargeUnary() {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  bool InteropClient::DoLargeCompressedUnary() {
 | 
	
		
			
				|  |  | -  const CompressionType compression_types[] = {NONE, GZIP, DEFLATE};
 | 
	
		
			
				|  |  | -  const PayloadType payload_types[] = {COMPRESSABLE, UNCOMPRESSABLE, RANDOM};
 | 
	
		
			
				|  |  | +  const bool request_compression[] = {false, true};
 | 
	
		
			
				|  |  | +  const PayloadType payload_types[] = {COMPRESSABLE, UNCOMPRESSABLE};
 | 
	
		
			
				|  |  |    for (size_t i = 0; i < GPR_ARRAY_SIZE(payload_types); i++) {
 | 
	
		
			
				|  |  | -    for (size_t j = 0; j < GPR_ARRAY_SIZE(compression_types); j++) {
 | 
	
		
			
				|  |  | +    for (size_t j = 0; j < GPR_ARRAY_SIZE(request_compression); j++) {
 | 
	
		
			
				|  |  |        char* log_suffix;
 | 
	
		
			
				|  |  |        gpr_asprintf(&log_suffix, "(compression=%s; payload=%s)",
 | 
	
		
			
				|  |  | -                   CompressionType_Name(compression_types[j]).c_str(),
 | 
	
		
			
				|  |  | +                   request_compression[j] ? "true" : "false",
 | 
	
		
			
				|  |  |                     PayloadType_Name(payload_types[i]).c_str());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        gpr_log(GPR_DEBUG, "Sending a large compressed unary rpc %s.",
 | 
	
	
		
			
				|  | @@ -355,7 +353,7 @@ bool InteropClient::DoLargeCompressedUnary() {
 | 
	
		
			
				|  |  |        SimpleRequest request;
 | 
	
		
			
				|  |  |        SimpleResponse response;
 | 
	
		
			
				|  |  |        request.set_response_type(payload_types[i]);
 | 
	
		
			
				|  |  | -      request.set_response_compression(compression_types[j]);
 | 
	
		
			
				|  |  | +      request.set_request_compressed_response(request_compression[j]);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        if (!PerformLargeUnary(&request, &response, CompressionChecks)) {
 | 
	
		
			
				|  |  |          gpr_log(GPR_ERROR, "Large compressed unary failed %s", log_suffix);
 | 
	
	
		
			
				|  | @@ -452,23 +450,23 @@ bool InteropClient::DoResponseStreaming() {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  bool InteropClient::DoResponseCompressedStreaming() {
 | 
	
		
			
				|  |  | -  const CompressionType compression_types[] = {NONE, GZIP, DEFLATE};
 | 
	
		
			
				|  |  | -  const PayloadType payload_types[] = {COMPRESSABLE, UNCOMPRESSABLE, RANDOM};
 | 
	
		
			
				|  |  | +  const bool request_compression[] = {false, true};
 | 
	
		
			
				|  |  | +  const PayloadType payload_types[] = {COMPRESSABLE, UNCOMPRESSABLE};
 | 
	
		
			
				|  |  |    for (size_t i = 0; i < GPR_ARRAY_SIZE(payload_types); i++) {
 | 
	
		
			
				|  |  | -    for (size_t j = 0; j < GPR_ARRAY_SIZE(compression_types); j++) {
 | 
	
		
			
				|  |  | +    for (size_t j = 0; j < GPR_ARRAY_SIZE(request_compression); j++) {
 | 
	
		
			
				|  |  |        ClientContext context;
 | 
	
		
			
				|  |  |        InteropClientContextInspector inspector(context);
 | 
	
		
			
				|  |  |        StreamingOutputCallRequest request;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        char* log_suffix;
 | 
	
		
			
				|  |  |        gpr_asprintf(&log_suffix, "(compression=%s; payload=%s)",
 | 
	
		
			
				|  |  | -                   CompressionType_Name(compression_types[j]).c_str(),
 | 
	
		
			
				|  |  | +                   request_compression[j] ? "true" : "false",
 | 
	
		
			
				|  |  |                     PayloadType_Name(payload_types[i]).c_str());
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        gpr_log(GPR_DEBUG, "Receiving response streaming rpc %s.", log_suffix);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        request.set_response_type(payload_types[i]);
 | 
	
		
			
				|  |  | -      request.set_response_compression(compression_types[j]);
 | 
	
		
			
				|  |  | +      request.set_request_compressed_response(request_compression[j]);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |        for (size_t k = 0; k < response_stream_sizes.size(); ++k) {
 | 
	
		
			
				|  |  |          ResponseParameters* response_parameter =
 | 
	
	
		
			
				|  | @@ -483,9 +481,7 @@ bool InteropClient::DoResponseCompressedStreaming() {
 | 
	
		
			
				|  |  |        size_t k = 0;
 | 
	
		
			
				|  |  |        while (stream->Read(&response)) {
 | 
	
		
			
				|  |  |          // Payload related checks.
 | 
	
		
			
				|  |  | -        if (request.response_type() != PayloadType::RANDOM) {
 | 
	
		
			
				|  |  | -          GPR_ASSERT(response.payload().type() == request.response_type());
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | +        GPR_ASSERT(response.payload().type() == request.response_type());
 | 
	
		
			
				|  |  |          switch (response.payload().type()) {
 | 
	
		
			
				|  |  |            case PayloadType::COMPRESSABLE:
 | 
	
		
			
				|  |  |              GPR_ASSERT(response.payload().body() ==
 | 
	
	
		
			
				|  | @@ -503,17 +499,19 @@ bool InteropClient::DoResponseCompressedStreaming() {
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          // Compression related checks.
 | 
	
		
			
				|  |  | -        GPR_ASSERT(request.response_compression() ==
 | 
	
		
			
				|  |  | -                   GetInteropCompressionTypeFromCompressionAlgorithm(
 | 
	
		
			
				|  |  | -                       inspector.GetCallCompressionAlgorithm()));
 | 
	
		
			
				|  |  | -        if (request.response_compression() == NONE) {
 | 
	
		
			
				|  |  | +        if (request.request_compressed_response()) {
 | 
	
		
			
				|  |  | +          GPR_ASSERT(inspector.GetCallCompressionAlgorithm() >
 | 
	
		
			
				|  |  | +                     GRPC_COMPRESS_NONE);
 | 
	
		
			
				|  |  | +          if (request.response_type() == PayloadType::COMPRESSABLE) {
 | 
	
		
			
				|  |  | +            // requested compression and compressable response => results should
 | 
	
		
			
				|  |  | +            // always be compressed.
 | 
	
		
			
				|  |  | +            GPR_ASSERT(inspector.GetMessageFlags() &
 | 
	
		
			
				|  |  | +                       GRPC_WRITE_INTERNAL_COMPRESS);
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        } else {
 | 
	
		
			
				|  |  | +          // requested *no* compression.
 | 
	
		
			
				|  |  |            GPR_ASSERT(
 | 
	
		
			
				|  |  |                !(inspector.GetMessageFlags() & GRPC_WRITE_INTERNAL_COMPRESS));
 | 
	
		
			
				|  |  | -        } else if (request.response_type() == PayloadType::COMPRESSABLE) {
 | 
	
		
			
				|  |  | -          // requested compression and compressable response => results should
 | 
	
		
			
				|  |  | -          // always be compressed.
 | 
	
		
			
				|  |  | -          GPR_ASSERT(inspector.GetMessageFlags() &
 | 
	
		
			
				|  |  | -                     GRPC_WRITE_INTERNAL_COMPRESS);
 | 
	
		
			
				|  |  |          }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          ++k;
 |