public void OnlyMaxLifetimeIsSpecified_ValidYoungObjectsAreKept()
        {
            _settings.MaxObjectLifetimeInSeconds = 5;
            _settings.MaxObjectIdleTimeSpanInSeconds = null;
            _pool = new PWObjectStateMonitoringWrapper<TestKey, TestResource>(_settings, _baseSuccessfulPoolMock.Object, _successfulObjectActionsMock.Object, _objectUtilizerMock.Object);
            AddObject("young");

            _pool.DropLifelessObjectsAndWakeupOthers();

            Assert.That(_pool.ObjectToLifetimeData.Count, Is.EqualTo(1));
        }
        public void MaxLifetimeIsSpecified_TooOldObjectsAreUtilizedAndForgotten()
        {
            _settings.MaxObjectLifetimeInSeconds = 5;
            _pool = new PWObjectStateMonitoringWrapper<TestKey, TestResource>(_settings, _baseSuccessfulPoolMock.Object, _successfulObjectActionsMock.Object, _objectUtilizerMock.Object);
            var tooOldResource = new TestResource("old");
            _pool.ObjectToLifetimeData[tooOldResource] = new ObjectLifetimeData<TestKey>(_key)
            {
                CreationTimeStamp = DateTime.Now - TimeSpan.FromSeconds(6),
            };

            _pool.DropLifelessObjectsAndWakeupOthers();

            Assert.That(_pool.ObjectToLifetimeData.Count, Is.EqualTo(0));
            _objectUtilizerMock.Verify(x => x.Utilize(_key, tooOldResource, _pool), Times.Once);
        }
        public void CleaningExecutedAndTimespansAreNotSpecified_InvalidObjectsAreUtilizedAndForgotten()
        {
            _settings.MaxObjectIdleTimeSpanInSeconds = null;
            _settings.MaxObjectLifetimeInSeconds = null;
            _pool = new PWObjectStateMonitoringWrapper<TestKey, TestResource>(_settings, _baseSuccessfulPoolMock.Object, _successfulObjectActionsMock.Object, _objectUtilizerMock.Object);
            var invalidResource = AddObject(Mocks.ObjectActions.SubstringOfInvalidObject);

            _pool.DropLifelessObjectsAndWakeupOthers();

            Assert.That(_pool.ObjectToLifetimeData.Count, Is.EqualTo(0));
            _objectUtilizerMock.Verify(x => x.Utilize(_key, invalidResource, _pool), Times.Once);
        }
        public void CleaningExecuted_UsefulObjectsArePinged()
        {
            _pool = new PWObjectStateMonitoringWrapper<TestKey, TestResource>(_settings, _baseSuccessfulPoolMock.Object, _successfulObjectActionsMock.Object, _objectUtilizerMock.Object);
            var usefulResource = AddObject("useful");

            _pool.DropLifelessObjectsAndWakeupOthers();

            _successfulObjectActionsMock.Verify(x => x.Ping(usefulResource));
        }
        public void CleaningExecutedAndPingFailed_ObjectIsUtilizedAndForgottenAndCleaningProceeds()
        {
            _settings.TimeSpanBetweenRevivalsInSeconds = 100;
            _pool = new PWObjectStateMonitoringWrapper<TestKey, TestResource>(_settings, _baseThrowingPoolMock.Object, _failingOnPingObjectActionsMock.Object, _objectUtilizerMock.Object);
            var object1 = AddObject("something1");
            var object2 = AddObject("something2");

            _pool.DropLifelessObjectsAndWakeupOthers();

            Assert.That(_pool.ObjectToLifetimeData.Count, Is.EqualTo(0));
            _objectUtilizerMock.Verify(x => x.Utilize(_key,object1,_pool));
            _objectUtilizerMock.Verify(x => x.Utilize(_key,object2,_pool));
        }