From de0d8b534fb4bdc4af4bbff257f62c447cde125c Mon Sep 17 00:00:00 2001
From: Jan Tattermusch <jtattermusch@google.com>
Date: Thu, 10 Dec 2015 18:53:55 -0800
Subject: [PATCH] improve PropagateCancellation test

---
 src/csharp/Grpc.Core.Tests/CallOptionsTest.cs |  2 +-
 .../Grpc.Core.Tests/ChannelOptionsTest.cs     |  2 +-
 .../Grpc.Core.Tests/ContextPropagationTest.cs | 32 +++++++++++++++----
 3 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/src/csharp/Grpc.Core.Tests/CallOptionsTest.cs b/src/csharp/Grpc.Core.Tests/CallOptionsTest.cs
index 519cebb145..a3a613be74 100644
--- a/src/csharp/Grpc.Core.Tests/CallOptionsTest.cs
+++ b/src/csharp/Grpc.Core.Tests/CallOptionsTest.cs
@@ -39,7 +39,7 @@ using Grpc.Core.Internal;
 using Grpc.Core.Utils;
 using NUnit.Framework;
 
-namespace Grpc.Core.Internal.Tests
+namespace Grpc.Core.Tests
 {
     public class CallOptionsTest
     {
diff --git a/src/csharp/Grpc.Core.Tests/ChannelOptionsTest.cs b/src/csharp/Grpc.Core.Tests/ChannelOptionsTest.cs
index 52be77c846..d2b5a436fd 100644
--- a/src/csharp/Grpc.Core.Tests/ChannelOptionsTest.cs
+++ b/src/csharp/Grpc.Core.Tests/ChannelOptionsTest.cs
@@ -38,7 +38,7 @@ using Grpc.Core.Internal;
 using Grpc.Core.Utils;
 using NUnit.Framework;
 
-namespace Grpc.Core.Internal.Tests
+namespace Grpc.Core.Tests
 {
     public class ChannelOptionsTest
     {
diff --git a/src/csharp/Grpc.Core.Tests/ContextPropagationTest.cs b/src/csharp/Grpc.Core.Tests/ContextPropagationTest.cs
index 2db3f286f7..90c510ec61 100644
--- a/src/csharp/Grpc.Core.Tests/ContextPropagationTest.cs
+++ b/src/csharp/Grpc.Core.Tests/ContextPropagationTest.cs
@@ -69,11 +69,19 @@ namespace Grpc.Core.Tests
         [Test]
         public async Task PropagateCancellation()
         {
+            var readyToCancelTcs = new TaskCompletionSource<object>();
+            var successTcs = new TaskCompletionSource<string>();
+
             helper.UnaryHandler = new UnaryServerMethod<string, string>(async (request, context) =>
             {
-                // check that we didn't obtain the default cancellation token.
-                Assert.IsTrue(context.CancellationToken.CanBeCanceled);
-                return "PASS";
+                readyToCancelTcs.SetResult(null);  // child call running, ready to parent call
+
+                while (!context.CancellationToken.IsCancellationRequested)
+                {
+                    await Task.Delay(10);
+                }
+                successTcs.SetResult("CHILD_CALL_CANCELLED");
+                return "";
             });
 
             helper.ClientStreamingHandler = new ClientStreamingServerMethod<string, string>(async (requestStream, context) =>
@@ -82,13 +90,23 @@ namespace Grpc.Core.Tests
                 Assert.IsNotNull(propagationToken.ParentCall);
 
                 var callOptions = new CallOptions(propagationToken: propagationToken);
-                return await Calls.AsyncUnaryCall(helper.CreateUnaryCall(callOptions), "xyz");
+                try
+                {
+                    await Calls.AsyncUnaryCall(helper.CreateUnaryCall(callOptions), "xyz");
+                }
+                catch(RpcException)
+                {
+                    // Child call will get cancelled, eat the exception.
+                }
+                return "";
             });
                 
             var cts = new CancellationTokenSource();
-            var call = Calls.AsyncClientStreamingCall(helper.CreateClientStreamingCall(new CallOptions(cancellationToken: cts.Token)));
-            await call.RequestStream.CompleteAsync();
-            Assert.AreEqual("PASS", await call);
+            var parentCall = Calls.AsyncClientStreamingCall(helper.CreateClientStreamingCall(new CallOptions(cancellationToken: cts.Token)));
+            await readyToCancelTcs.Task;
+            cts.Cancel();
+            Assert.Throws(typeof(RpcException), async () => await parentCall);
+            Assert.AreEqual("CHILD_CALL_CANCELLED", await successTcs.Task);
         }
 
         [Test]
-- 
GitLab