diff --git a/test/cpp/interop/client.cc b/test/cpp/interop/client.cc
index 072968f7cdc6a6572ae37a838de0f7363b44aafa..65ce2e9c2a91443ed4289f250db1225d5c7e3211 100644
--- a/test/cpp/interop/client.cc
+++ b/test/cpp/interop/client.cc
@@ -62,6 +62,8 @@ DEFINE_string(test_case, "large_unary",
               " streaming with slow client consumer; "
               "half_duplex : half-duplex streaming; "
               "ping_pong : full-duplex streaming; "
+              "cancel_after_begin : cancel stream after starting it; "
+              "cancel_after_first_response: cancel on first response; "
               "service_account_creds : large_unary with service_account auth; "
               "compute_engine_creds: large_unary with compute engine auth; "
               "jwt_token_creds: large_unary with JWT token auth; "
@@ -95,6 +97,10 @@ int main(int argc, char** argv) {
     client.DoHalfDuplex();
   } else if (FLAGS_test_case == "ping_pong") {
     client.DoPingPong();
+  } else if (FLAGS_test_case == "cancel_after_begin") {
+    client.DoCancelAfterBegin();
+  } else if (FLAGS_test_case == "cancel_after_first_response") {
+    client.DoCancelAfterFirstResponse();
   } else if (FLAGS_test_case == "service_account_creds") {
     grpc::string json_key = GetServiceAccountJsonKey();
     client.DoServiceAccountCreds(json_key, FLAGS_oauth_scope);
@@ -111,6 +117,8 @@ int main(int argc, char** argv) {
     client.DoResponseStreaming();
     client.DoHalfDuplex();
     client.DoPingPong();
+    client.DoCancelAfterBegin();
+    client.DoCancelAfterFirstResponse();
     // service_account_creds and jwt_token_creds can only run with ssl.
     if (FLAGS_enable_ssl) {
       grpc::string json_key = GetServiceAccountJsonKey();
@@ -123,6 +131,7 @@ int main(int argc, char** argv) {
         GPR_ERROR,
         "Unsupported test case %s. Valid options are all|empty_unary|"
         "large_unary|client_streaming|server_streaming|half_duplex|ping_pong|"
+        "cancel_after_begin|cancel_after_first_response|"
         "service_account_creds|compute_engine_creds|jwt_token_creds",
         FLAGS_test_case.c_str());
     ret = 1;
diff --git a/test/cpp/interop/interop_client.cc b/test/cpp/interop/interop_client.cc
index 7f5757d2ba854c53c5bae773fa1f23348ca8f0b5..874510e54f7e7f47d4e157e78dab280b8d4dc857 100644
--- a/test/cpp/interop/interop_client.cc
+++ b/test/cpp/interop/interop_client.cc
@@ -307,5 +307,49 @@ void InteropClient::DoPingPong() {
   gpr_log(GPR_INFO, "Ping pong streaming done.");
 }
 
+void InteropClient::DoCancelAfterBegin() {
+  gpr_log(GPR_INFO, "Sending request steaming rpc ...");
+  std::unique_ptr<TestService::Stub> stub(TestService::NewStub(channel_));
+
+  ClientContext context;
+  StreamingInputCallRequest request;
+  StreamingInputCallResponse response;
+
+  std::unique_ptr<ClientWriter<StreamingInputCallRequest>> stream(
+      stub->StreamingInputCall(&context, &response));
+
+  gpr_log(GPR_INFO, "Trying to cancel...");
+  context.TryCancel();
+  Status s = stream->Finish();
+  GPR_ASSERT(s.code() == StatusCode::CANCELLED);
+  gpr_log(GPR_INFO, "Canceling streaming done.");
+}
+
+void InteropClient::DoCancelAfterFirstResponse() {
+  gpr_log(GPR_INFO, "Sending Ping Pong streaming rpc ...");
+  std::unique_ptr<TestService::Stub> stub(TestService::NewStub(channel_));
+
+  ClientContext context;
+  std::unique_ptr<ClientReaderWriter<StreamingOutputCallRequest,
+                                     StreamingOutputCallResponse>>
+      stream(stub->FullDuplexCall(&context));
+
+  StreamingOutputCallRequest request;
+  request.set_response_type(PayloadType::COMPRESSABLE);
+  ResponseParameters* response_parameter = request.add_response_parameters();
+  response_parameter->set_size(31415);
+  request.mutable_payload()->set_body(grpc::string(27182, '\0'));
+  StreamingOutputCallResponse response;
+  GPR_ASSERT(stream->Write(request));
+  GPR_ASSERT(stream->Read(&response));
+  GPR_ASSERT(response.payload().has_body());
+  GPR_ASSERT(response.payload().body() == grpc::string(31415, '\0'));
+  gpr_log(GPR_INFO, "Trying to cancel...");
+  context.TryCancel();
+
+  Status s = stream->Finish();
+  gpr_log(GPR_INFO, "Canceling pingpong streaming done.");
+}
+
 }  // namespace testing
 }  // namespace grpc
diff --git a/test/cpp/interop/interop_client.h b/test/cpp/interop/interop_client.h
index 3161f7f87563302cacd52bc7ef6f83fd3701a57d..d9c895dfd926fc323eaef898aaf4661de84cc6c5 100644
--- a/test/cpp/interop/interop_client.h
+++ b/test/cpp/interop/interop_client.h
@@ -57,6 +57,8 @@ class InteropClient {
   void DoRequestStreaming();
   void DoResponseStreaming();
   void DoResponseStreamingWithSlowConsumer();
+  void DoCancelAfterBegin();
+  void DoCancelAfterFirstResponse();
   // Auth tests.
   // username is a string containing the user email
   void DoJwtTokenCreds(const grpc::string& username);