• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.Threading.Tasks;
21 using Grpc.Core.Utils;
22 using NUnit.Framework;
23 
24 namespace Grpc.Core.Tests
25 {
26     public class AppDomainUnloadTest
27     {
28 #if NETCOREAPP1_0
29         [Test]
30         [Ignore("Not supported for CoreCLR")]
AppDomainUnloadHookCanCleanupAbandonedCall()31         public void AppDomainUnloadHookCanCleanupAbandonedCall()
32         {
33         }
34 #else
35         [Test]
36         public void AppDomainUnloadHookCanCleanupAbandonedCall()
37         {
38             var setup = new AppDomainSetup
39             {
40                 ApplicationBase = AppDomain.CurrentDomain.BaseDirectory
41             };
42             var childDomain = AppDomain.CreateDomain("test", null, setup);
43             var remoteObj = childDomain.CreateInstance(typeof(AppDomainTestClass).Assembly.GetName().Name, typeof(AppDomainTestClass).FullName);
44 
45             // Try to unload the appdomain once we've created a server and a channel inside the appdomain.
46             AppDomain.Unload(childDomain);
47         }
48 
49         public class AppDomainTestClass
50         {
51             const string Host = "127.0.0.1";
52 
53             /// <summary>
54             /// Creates a server and a channel and initiates a call. The code is invoked from inside of an AppDomain
55             /// to test if AppDomain.Unload() work if Grpc is being used.
56             /// </summary>
57             public AppDomainTestClass()
58             {
59                 var helper = new MockServiceHelper(Host);
60                 var readyToShutdown = new TaskCompletionSource<object>();
61                 helper.DuplexStreamingHandler = new DuplexStreamingServerMethod<string, string>(async (requestStream, responseStream, context) =>
62                 {
63                     readyToShutdown.SetResult(null);
64                     await requestStream.ToListAsync();
65                 });
66 
67                 var server = helper.GetServer();
68                 server.Start();
69                 var channel = helper.GetChannel();
70 
71                 var call = Calls.AsyncDuplexStreamingCall(helper.CreateDuplexStreamingCall());
72                 readyToShutdown.Task.Wait();  // make sure handler is running
73             }
74         }
75 #endif
76     }
77 }
78