blob: 3a161763fd0ecb1c1aea14e3bde6b8f7f7aca9f5 [file] [log] [blame]
Jan Tattermusch2f741412016-06-01 16:07:15 -07001#region Copyright notice and license
2
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003// Copyright 2015 gRPC authors.
Jan Tattermusch2f741412016-06-01 16:07:15 -07004//
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005// 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
Jan Tattermusch2f741412016-06-01 16:07:15 -07008//
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009// http://www.apache.org/licenses/LICENSE-2.0
Jan Tattermusch2f741412016-06-01 16:07:15 -070010//
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011// 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.
Jan Tattermusch2f741412016-06-01 16:07:15 -070016
17#endregion
18
19using System;
Jan Tattermusch2f741412016-06-01 16:07:15 -070020using System.Threading.Tasks;
Jan Tattermusch2f741412016-06-01 16:07:15 -070021using Grpc.Core.Utils;
22using NUnit.Framework;
23
24namespace Grpc.Core.Tests
25{
26 public class AppDomainUnloadTest
27 {
Jan Tattermusch1c0f30c2016-07-30 03:59:16 +080028#if NETCOREAPP1_0
Jan Tattermusch635fafc2016-06-15 15:10:51 -070029 [Test]
30 [Ignore("Not supported for CoreCLR")]
31 public void AppDomainUnloadHookCanCleanupAbandonedCall()
32 {
33 }
34#else
Jan Tattermusch2f741412016-06-01 16:07:15 -070035 [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 {
Jan Tattermusch2f741412016-06-01 16:07:15 -070059 var helper = new MockServiceHelper(Host);
Jan Tattermusch2f741412016-06-01 16:07:15 -070060 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
Jan Tattermusched94e392017-04-18 14:25:17 +020067 var server = helper.GetServer();
68 server.Start();
69 var channel = helper.GetChannel();
70
Jan Tattermusch2f741412016-06-01 16:07:15 -070071 var call = Calls.AsyncDuplexStreamingCall(helper.CreateDuplexStreamingCall());
72 readyToShutdown.Task.Wait(); // make sure handler is running
73 }
74 }
Jan Tattermusch635fafc2016-06-15 15:10:51 -070075#endif
Jan Tattermusch2f741412016-06-01 16:07:15 -070076 }
77}