wip
diff --git a/test/cpp/interop/client_helper.cc b/test/cpp/interop/client_helper.cc
index 48b1b2e..9df79bd 100644
--- a/test/cpp/interop/client_helper.cc
+++ b/test/cpp/interop/client_helper.cc
@@ -48,10 +48,13 @@
 #include <grpc++/create_channel.h>
 #include <grpc++/credentials.h>
 #include <grpc++/stream.h>
-#include "src/cpp/client/secure_credentials.h"
+
 #include "test/core/security/oauth2_utils.h"
 #include "test/cpp/util/create_test_channel.h"
 
+#include "src/core/surface/call.h"
+#include "src/cpp/client/secure_credentials.h"
+
 DECLARE_bool(enable_ssl);
 DECLARE_bool(use_prod_roots);
 DECLARE_int32(server_port);
@@ -62,6 +65,8 @@
 DECLARE_string(service_account_key_file);
 DECLARE_string(oauth_scope);
 
+using grpc::testing::CompressionType;
+
 namespace grpc {
 namespace testing {
 
@@ -137,5 +142,29 @@
   }
 }
 
+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);
+  }
+}
+
+InteropClientContextInspector::InteropClientContextInspector(
+    const ::grpc::ClientContext& context)
+    : context_(context) {}
+
+grpc_compression_algorithm
+InteropClientContextInspector::GetCallCompressionAlgorithm() const {
+  return grpc_call_get_compression_algorithm(context_.call_);
+}
+
+
 }  // namespace testing
 }  // namespace grpc
diff --git a/test/cpp/interop/client_helper.h b/test/cpp/interop/client_helper.h
index c4361bb..fb8a664 100644
--- a/test/cpp/interop/client_helper.h
+++ b/test/cpp/interop/client_helper.h
@@ -39,6 +39,8 @@
 #include <grpc++/config.h>
 #include <grpc++/channel_interface.h>
 
+#include "test/proto/messages.grpc.pb.h"
+
 namespace grpc {
 namespace testing {
 
@@ -49,6 +51,22 @@
 std::shared_ptr<ChannelInterface> CreateChannelForTestCase(
     const grpc::string& test_case);
 
+grpc::testing::CompressionType
+GetInteropCompressionTypeFromCompressionAlgorithm(
+    grpc_compression_algorithm algorithm);
+
+class InteropClientContextInspector {
+ public:
+  InteropClientContextInspector(const ::grpc::ClientContext& context);
+
+  // Inspector methods, able to peek inside ClientContext, follow.
+  grpc_compression_algorithm GetCallCompressionAlgorithm() const;
+
+ private:
+  const ::grpc::ClientContext& context_;
+};
+
+
 }  // namespace testing
 }  // namespace grpc
 
diff --git a/test/cpp/interop/interop_client.cc b/test/cpp/interop/interop_client.cc
index b53535b..3a28c70 100644
--- a/test/cpp/interop/interop_client.cc
+++ b/test/cpp/interop/interop_client.cc
@@ -43,6 +43,8 @@
 #include <grpc++/client_context.h>
 #include <grpc++/status.h>
 #include <grpc++/stream.h>
+
+#include "test/cpp/interop/client_helper.h"
 #include "test/proto/test.grpc.pb.h"
 #include "test/proto/empty.grpc.pb.h"
 #include "test/proto/messages.grpc.pb.h"
@@ -93,24 +95,18 @@
   std::unique_ptr<TestService::Stub> stub(TestService::NewStub(channel_));
 
   ClientContext context;
-  // XXX: add UNCOMPRESSABLE to the mix
-  //
-  // XXX: 1) set request.response_compression to all the diff available
-  // compression values. We can't check the compression method used at the
-  // application level, but if something is wrong, two different implementations
-  // of gRPC (java vs c) won't be able to communicate.
-  //
-  // 2) for UNCOMPRESSABLE, verify that the response can be whatever, most
-  // likely uncompressed
-  request->set_response_type(PayloadType::COMPRESSABLE);
+  InteropClientContextInspector inspector(context);
   request->set_response_size(kLargeResponseSize);
   grpc::string payload(kLargeRequestSize, '\0');
   request->mutable_payload()->set_body(payload.c_str(), kLargeRequestSize);
 
   Status s = stub->UnaryCall(&context, *request, response);
 
+  GPR_ASSERT(request->response_compression() ==
+             GetInteropCompressionTypeFromCompressionAlgorithm(
+                 inspector.GetCallCompressionAlgorithm()));
   AssertOkOrPrintErrorStatus(s);
-  GPR_ASSERT(response->payload().type() == PayloadType::COMPRESSABLE);
+  GPR_ASSERT(response->payload().type() == request->response_type());
   GPR_ASSERT(response->payload().body() ==
              grpc::string(kLargeResponseSize, '\0'));
 }
@@ -124,6 +120,7 @@
   SimpleResponse response;
   request.set_fill_username(true);
   request.set_fill_oauth_scope(true);
+  request.set_response_type(PayloadType::COMPRESSABLE);
   PerformLargeUnary(&request, &response);
   gpr_log(GPR_INFO, "Got username %s", response.username().c_str());
   gpr_log(GPR_INFO, "Got oauth_scope %s", response.oauth_scope().c_str());
@@ -143,6 +140,7 @@
   SimpleResponse response;
   request.set_fill_username(true);
   request.set_fill_oauth_scope(true);
+  request.set_response_type(PayloadType::COMPRESSABLE);
   PerformLargeUnary(&request, &response);
   GPR_ASSERT(!response.username().empty());
   GPR_ASSERT(!response.oauth_scope().empty());
@@ -180,6 +178,7 @@
   SimpleRequest request;
   SimpleResponse response;
   request.set_fill_username(true);
+  request.set_response_type(PayloadType::COMPRESSABLE);
   PerformLargeUnary(&request, &response);
   GPR_ASSERT(!response.username().empty());
   GPR_ASSERT(username.find(response.username()) != grpc::string::npos);
@@ -187,12 +186,19 @@
 }
 
 void InteropClient::DoLargeUnary() {
-  gpr_log(GPR_INFO, "Sending a large unary rpc...");
-  SimpleRequest request;
-  request.set_response_compression(grpc::testing::GZIP);
-  SimpleResponse response;
-  PerformLargeUnary(&request, &response);
-  gpr_log(GPR_INFO, "Large unary done.");
+  const CompressionType compression_types[] = {NONE, GZIP, DEFLATE};
+  const PayloadType payload_types[] = {COMPRESSABLE, UNCOMPRESSABLE, RANDOM};
+  for (const auto payload_type : payload_types) {
+    for (const auto compression_type : compression_types) {
+      gpr_log(GPR_INFO, "Sending a large unary rpc...");
+      SimpleRequest request;
+      SimpleResponse response;
+      request.set_response_type(payload_type);
+      request.set_response_compression(compression_type);
+      PerformLargeUnary(&request, &response);
+      gpr_log(GPR_INFO, "Large unary done.");
+    }
+  }
 }
 
 void InteropClient::DoRequestStreaming() {
@@ -227,11 +233,15 @@
 
   ClientContext context;
   StreamingOutputCallRequest request;
+  request.set_response_type(PayloadType::COMPRESSABLE);
+  request.set_response_compression(CompressionType::GZIP);
+
   for (unsigned int i = 0; i < response_stream_sizes.size(); ++i) {
     ResponseParameters* response_parameter = request.add_response_parameters();
     response_parameter->set_size(response_stream_sizes[i]);
   }
   StreamingOutputCallResponse response;
+
   std::unique_ptr<ClientReader<StreamingOutputCallResponse>> stream(
       stub->StreamingOutputCall(&context, request));
 
diff --git a/test/cpp/interop/server.cc b/test/cpp/interop/server.cc
index 7605b2a..55df82b 100644
--- a/test/cpp/interop/server.cc
+++ b/test/cpp/interop/server.cc
@@ -81,8 +81,28 @@
 bool SetPayload(PayloadType type, int size, Payload* payload) {
   PayloadType response_type = type;
   payload->set_type(response_type);
-  std::unique_ptr<char[]> body(new char[size]());
-  payload->set_body(body.get(), size);
+  switch (type) {
+    case PayloadType::COMPRESSABLE:
+      {
+        std::unique_ptr<char[]> body(new char[size]());
+        payload->set_body(body.get(), size);
+      }
+      break;
+    case PayloadType::UNCOMPRESSABLE:
+      {
+        // XXX
+        std::unique_ptr<char[]> body(new char[size]());
+        payload->set_body(body.get(), size);
+      }
+      break;
+    case PayloadType::RANDOM:
+      {
+        // XXX
+        std::unique_ptr<char[]> body(new char[size]());
+        payload->set_body(body.get(), size);
+      }
+      break;
+  }
   return true;
 }
 
@@ -122,6 +142,7 @@
         return Status(grpc::StatusCode::INTERNAL, "Error creating payload.");
       }
     }
+
     return Status::OK;
   }
 
diff --git a/test/cpp/interop/server_helper.cc b/test/cpp/interop/server_helper.cc
index 0f8e5ff..8cfed2a 100644
--- a/test/cpp/interop/server_helper.cc
+++ b/test/cpp/interop/server_helper.cc
@@ -60,21 +60,21 @@
   }
 }
 
-InteropContextInspector::InteropContextInspector(
+InteropServerContextInspector::InteropServerContextInspector(
     const ::grpc::ServerContext& context)
     : context_(context) {}
 
 grpc_compression_algorithm
-InteropContextInspector::GetCallCompressionAlgorithm() const {
+InteropServerContextInspector::GetCallCompressionAlgorithm() const {
   return grpc_call_get_compression_algorithm(context_.call_);
 }
 
-std::shared_ptr<const AuthContext> InteropContextInspector::GetAuthContext()
+std::shared_ptr<const AuthContext> InteropServerContextInspector::GetAuthContext()
     const {
   return context_.auth_context();
 }
 
-bool InteropContextInspector::IsCancelled() const {
+bool InteropServerContextInspector::IsCancelled() const {
   return context_.IsCancelled();
 }
 
diff --git a/test/cpp/interop/server_helper.h b/test/cpp/interop/server_helper.h
index 504652c..a57ef0b 100644
--- a/test/cpp/interop/server_helper.h
+++ b/test/cpp/interop/server_helper.h
@@ -45,9 +45,9 @@
 
 std::shared_ptr<ServerCredentials> CreateInteropServerCredentials();
 
-class InteropContextInspector {
+class InteropServerContextInspector {
  public:
-  InteropContextInspector(const ::grpc::ServerContext& context);
+  InteropServerContextInspector(const ::grpc::ServerContext& context);
 
   // Inspector methods, able to peek inside ServerContext, follow.
   std::shared_ptr<const AuthContext> GetAuthContext() const;