public void ReleasingOfUnknownObject_BasePoolIsCalled()
        {
            _pool = new PWObjectStateMonitoringWrapper<TestKey, TestResource>(_settings, _baseSuccessfulPoolMock.Object, _successfulObjectActionsMock.Object, _objectUtilizerMock.Object);
            var unknownResource = new TestResource("asd");

            _pool.Release(_key, unknownResource);

            _baseSuccessfulPoolMock.Verify(x => x.Release(_key,unknownResource), Times.Once);
        }
        public void ReleasingOfUnknownObject_NotThrowsAndAddsTimestampData()
        {
            _pool = new PWObjectStateMonitoringWrapper<TestKey, TestResource>(_settings, _baseSuccessfulPoolMock.Object, _successfulObjectActionsMock.Object, _objectUtilizerMock.Object);
            var unknownResource = new TestResource("asd");

            Assert.DoesNotThrow(() => _pool.Release(_key, unknownResource));

            Assert.That(_pool.ObjectToLifetimeData.Count, Is.EqualTo(1));
            var lifetimeData = _pool.ObjectToLifetimeData[unknownResource];
            Assert.That(lifetimeData.CreationTimeStamp, Is.EqualTo(DateTime.Now).Within(_timeToleranceInMills).Milliseconds);
            Assert.That(lifetimeData.LastUsageTimeStamp, Is.EqualTo(DateTime.Now).Within(_timeToleranceInMills).Milliseconds);
        }
        public void ReleaseWasCalled_RememberedKeyIsPreserved()
        {
            _pool = new PWObjectStateMonitoringWrapper<TestKey, TestResource>(_settings, _baseSuccessfulPoolMock.Object, _successfulObjectActionsMock.Object, _objectUtilizerMock.Object);
            var resource = AddObject("asd");
            var previous = _pool.ObjectToLifetimeData[resource].Key;

            _pool.Release(_key, resource);

            var current = _pool.ObjectToLifetimeData[resource].Key;
            Assert.That(current, Is.EqualTo(previous));
        }
        public void ReleaseWasCalled_LastUsageTimestampIsUpdated()
        {
            _pool = new PWObjectStateMonitoringWrapper<TestKey, TestResource>(_settings, _baseSuccessfulPoolMock.Object, _successfulObjectActionsMock.Object, _objectUtilizerMock.Object);
            var resource = AddObject("asd");
            var previous = _pool.ObjectToLifetimeData[resource].LastUsageTimeStamp;

            Thread.Sleep(5);
            _pool.Release(_key, resource);

            var current = _pool.ObjectToLifetimeData[resource].LastUsageTimeStamp;
            Assert.That(current - previous >= TimeSpan.FromMilliseconds(5));
            Assert.That(previous, Is.EqualTo(current).Within(_timeToleranceInMills).Milliseconds);
        }
        public void ReleaseWasCalled_CreationTimestampIsNotModified()
        {
            _pool = new PWObjectStateMonitoringWrapper<TestKey, TestResource>(_settings, _baseSuccessfulPoolMock.Object, _successfulObjectActionsMock.Object, _objectUtilizerMock.Object);
            var resource = AddObject("asd");
            var previous = _pool.ObjectToLifetimeData[resource].CreationTimeStamp;

            Thread.Sleep(5);
            _pool.Release(_key, resource);

            var current = _pool.ObjectToLifetimeData[resource].CreationTimeStamp;
            Assert.That(current, Is.EqualTo(previous));
        }
        public void OnlyRevivalTimespanIsSpecified_TimestampsAreNotRememberedOnRelease()
        {
            _settings.MaxObjectIdleTimeSpanInSeconds = null;
            _settings.MaxObjectLifetimeInSeconds = null;
            _pool = new PWObjectStateMonitoringWrapper<TestKey, TestResource>(_settings, _baseSuccessfulPoolMock.Object, _successfulObjectActionsMock.Object, _objectUtilizerMock.Object);
            var unknownResource = new TestResource("asd");

            _pool.Release(_key, unknownResource);

            Assert.That(_pool.ObjectToLifetimeData.Count, Is.EqualTo(0));
        }
        public void BasePoolThrewOnRelease_ItIsRethrownAsIs()
        {
            _pool = new PWObjectStateMonitoringWrapper<TestKey, TestResource>(_settings, _baseThrowingPoolMock.Object, _successfulObjectActionsMock.Object, _objectUtilizerMock.Object);

            _outPoolObject = new TestResource(string.Empty);
            Assert.Throws<InvalidPoolOperationException<TestKey, TestResource>>(
                () => _pool.Release(_key, _outPoolObject));
        }