public async Task BackgroundPrunePrunes() { var mockFactory = new Mock <IObjectPoolFactory <IFoo> >(); var mockObj = new Mock <IFoo>(); mockFactory.Setup(x => x.Create()).Returns(mockObj.Object); var options = new ObjectPoolOptions { MaxObjects = 1, MinObjects = 0, AcquisitionTimeout = TimeSpan.FromMilliseconds(500), SweepFrequency = TimeSpan.FromMilliseconds(100), }; var sut = new DefaultObjectPool <IFoo>(mockFactory.Object, options); var obj = await sut.GetObjectAsync(); obj.Dispose(); await Task.Delay(TimeSpan.FromMilliseconds(150)); sut.AvailableCount.Should().Be(0); sut.ActiveCount.Should().Be(0); mockObj.Verify(x => x.Dispose(), Times.Once); }
/// <summary> /// Adds an <see cref="IObjectPool{TObject}"/> to dependency injection. /// </summary> /// <param name="services">The service collection to add the pool to.</param> /// <param name="optionsAction">An action to modify options for the pool.</param> /// <param name="objectActivator">An activator for the pool.</param> /// <param name="objectPassivator">A passivator for the pool.</param> /// <typeparam name="TObject">The type of object pool to create.</typeparam> /// <returns>The service collection passed in.</returns> /// <exception cref="ArgumentNullException">Thrown if <paramref name="services"/> is null.</exception> public static IServiceCollection AddObjectPool <TObject>( this IServiceCollection services, Action <ObjectPoolOptions>?optionsAction = null, Func <TObject, bool>?objectActivator = null, Func <TObject, bool>?objectPassivator = null) where TObject : class, IDisposable { if (services is null) { throw new ArgumentNullException(nameof(services)); } var options = new ObjectPoolOptions(); optionsAction?.Invoke(options); services.TryAddSingleton <IObjectPool <TObject> >(sp => new DefaultObjectPool <TObject>( sp.GetRequiredService <IObjectPoolFactory <TObject> >(), options, objectActivator, objectPassivator)); return(services); }
public async Task TimeoutExpires() { var mockFactory = new Mock <IObjectPoolFactory <IFoo> >(); var mockObj = new Mock <IFoo>(); mockFactory.Setup(x => x.Create()).Returns(mockObj.Object); var options = new ObjectPoolOptions { MaxObjects = 1, MinObjects = 0, SweepFrequency = TimeSpan.FromMinutes(20), AcquisitionTimeout = TimeSpan.FromMilliseconds(500), }; var sut = new DefaultObjectPool <IFoo>(mockFactory.Object, options); using var obj = await sut.GetObjectAsync(); Func <Task> act = async() => await sut.GetObjectAsync(); await act.Should().ThrowExactlyAsync <PoolExhaustedException>(); }