Home | History | Annotate | Download | only in Grpc.Core.Tests
      1 #region Copyright notice and license
      2 
      3 // Copyright 2015 gRPC authors.
      4 //
      5 // Licensed under the Apache License, Version 2.0 (the "License");
      6 // you may not use this file except in compliance with the License.
      7 // You may obtain a copy of the License at
      8 //
      9 //     http://www.apache.org/licenses/LICENSE-2.0
     10 //
     11 // Unless required by applicable law or agreed to in writing, software
     12 // distributed under the License is distributed on an "AS IS" BASIS,
     13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 // See the License for the specific language governing permissions and
     15 // limitations under the License.
     16 
     17 #endregion
     18 
     19 using System;
     20 using System.Diagnostics;
     21 using System.Linq;
     22 using System.Threading;
     23 using System.Threading.Tasks;
     24 using Grpc.Core;
     25 using Grpc.Core.Internal;
     26 using Grpc.Core.Utils;
     27 using NUnit.Framework;
     28 
     29 namespace Grpc.Core.Tests
     30 {
     31     public class ShutdownTest
     32     {
     33         const string Host = "127.0.0.1";
     34 
     35         MockServiceHelper helper;
     36         Server server;
     37         Channel channel;
     38 
     39         [SetUp]
     40         public void Init()
     41         {
     42             helper = new MockServiceHelper(Host);
     43             server = helper.GetServer();
     44             server.Start();
     45             channel = helper.GetChannel();
     46         }
     47 
     48         [Test]
     49         public async Task AbandonedCall_ServerKillAsync()
     50         {
     51             var readyToShutdown = new TaskCompletionSource<object>();
     52             helper.DuplexStreamingHandler = new DuplexStreamingServerMethod<string, string>(async (requestStream, responseStream, context) =>
     53             {
     54                 readyToShutdown.SetResult(null);
     55                 await requestStream.ToListAsync();
     56             });
     57 
     58             var call = Calls.AsyncDuplexStreamingCall(helper.CreateDuplexStreamingCall());
     59             await readyToShutdown.Task;  // make sure handler is running
     60 
     61             await channel.ShutdownAsync();  // channel.ShutdownAsync() works even if there's a pending call.
     62             await server.KillAsync();  // server.ShutdownAsync() would hang waiting for the call to finish.
     63         }
     64     }
     65 }
     66