| 
					
				 | 
			
			
				@@ -0,0 +1,79 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#region Copyright notice and license 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Copyright 2017 gRPC authors. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Licensed under the Apache License, Version 2.0 (the "License"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// you may not use this file except in compliance with the License. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// You may obtain a copy of the License at 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//     http://www.apache.org/licenses/LICENSE-2.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Unless required by applicable law or agreed to in writing, software 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// distributed under the License is distributed on an "AS IS" BASIS, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// See the License for the specific language governing permissions and 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// limitations under the License. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#endregion 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Grpc.Core; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Grpc.Core.Internal; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Grpc.Core.Utils; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using NUnit.Framework; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+namespace Grpc.Core.Internal.Tests 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public class DefaultObjectPoolTest 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Test] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [TestCase(10, 2)] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [TestCase(10, 1)] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [TestCase(0, 2)] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [TestCase(2, 0)] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void ObjectIsReused(int sharedCapacity, int threadLocalCapacity) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var pool = new DefaultObjectPool<TestPooledObject>(() => new TestPooledObject(), sharedCapacity, threadLocalCapacity); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var origLeased = pool.Lease(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pool.Return(origLeased); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreSame(origLeased, pool.Lease()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreNotSame(origLeased, pool.Lease()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Test] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void ZeroCapacities() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var pool = new DefaultObjectPool<TestPooledObject>(() => new TestPooledObject(), 0, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var origLeased = pool.Lease(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pool.Return(origLeased); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreNotSame(origLeased, pool.Lease()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Test] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void DisposeCleansSharedPool() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var pool = new DefaultObjectPool<TestPooledObject>(() => new TestPooledObject(), 10, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            var origLeased = pool.Lease(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pool.Return(origLeased); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            pool.Dispose(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.AreNotSame(origLeased, pool.Lease()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        [Test] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        public void Constructor() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Throws<ArgumentNullException>(() => new DefaultObjectPool<TestPooledObject>(null, 10, 2)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Throws<ArgumentException>(() => new DefaultObjectPool<TestPooledObject>(() => new TestPooledObject(), -1, 10)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Assert.Throws<ArgumentException>(() => new DefaultObjectPool<TestPooledObject>(() => new TestPooledObject(), 10, -1)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        class TestPooledObject : IDisposable 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            public void Dispose() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |