Add disposable singleton test cases (dotnet/Extensions#2465)
authorTom Akita <tomakita@gmail.com>
Sat, 5 Oct 2019 23:31:02 +0000 (18:31 -0500)
committerDavid Fowler <davidfowl@gmail.com>
Sat, 5 Oct 2019 23:31:01 +0000 (16:31 -0700)
* add disposable singleton test cases

* fix style errors and use ServiceCollection

* fix style error

Commit migrated from https://github.com/dotnet/Extensions/commit/97db8a3859aa3e8ca860c4ecf9015d9e83f58803

src/libraries/Microsoft.Extensions.DependencyInjection/tests/ServiceProviderContainerTests.cs

index 9d0fe3c..b9ed376 100644 (file)
@@ -346,6 +346,48 @@ namespace Microsoft.Extensions.DependencyInjection.Tests
                 exception.Message);
         }
 
+        [Fact]
+        public void SingletonServiceCreatedFromFactoryIsDisposedWhenContainerIsDisposed()
+        {
+            // Arrange
+            var serviceCollection = new ServiceCollection();
+            serviceCollection.AddSingleton(_ => new FakeDisposable());
+            var serviceProvider = CreateServiceProvider(serviceCollection);
+
+            // Act
+            var service = serviceProvider.GetService<FakeDisposable>();
+            ((IDisposable)serviceProvider).Dispose();
+
+            // Assert
+            Assert.True(service.IsDisposed);
+        }
+
+        [Fact]
+        public void SingletonServiceCreatedFromInstanceIsNotDisposedWhenContainerIsDisposed()
+        {
+            // Arrange
+            var serviceCollection = new ServiceCollection();
+            serviceCollection.AddSingleton(new FakeDisposable());
+            var serviceProvider = CreateServiceProvider(serviceCollection);
+
+            // Act
+            var service = serviceProvider.GetService<FakeDisposable>();
+            ((IDisposable)serviceProvider).Dispose();
+
+            // Assert
+            Assert.False(service.IsDisposed);
+        }
+
+        private class FakeDisposable : IDisposable
+        {
+            public bool IsDisposed { get; private set; }
+
+            public void Dispose()
+            {
+                IsDisposed = true;
+            }
+        }
+
         private class FakeMultipleServiceWithIEnumerableDependency: IFakeMultipleService
         {
             public FakeMultipleServiceWithIEnumerableDependency(IEnumerable<IFakeService> fakeServices)