Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        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>();
        }