public void Records_ForEmptyCounter_YieldsEmptySingleResultSetForCurrentPeriod()
 {
     var sut = new PerformanceStats(TimeSpan.FromMinutes(5), It.IsAny<int>());
     var item = sut.Records.First();
     item.StartTime.Should().BeWithin(TimeSpan.FromMilliseconds(50)).Before(DateTime.Now);
     item.EndTime.Should().BeWithin(TimeSpan.FromMilliseconds(50)).Before(DateTime.Now.AddMinutes(5));
 }
        public async Task TidyRecords_WhenAddingRecords_ShouldNotOverflowMaxRecordCount()
        {
            var sut = new PerformanceStats(TimeSpan.FromMilliseconds(30), 3);

            await Task.Delay(150);

            var records = (Queue<PerformanceRecord>)sut.Records;

            sut.TidyRecords();

            records.Count.Should().Be(3);
        }
        public async Task MessageProcessed_ShouldGrowQueueIfNewEventIsLaterThanLatestTimePeriod()
        {
            var sut = new PerformanceStats(TimeSpan.FromMilliseconds(50), 3);
            
            sut.MessageProcessed("something arbitrary");

            await Task.Delay(60);
            sut.Records.Should().HaveCount(2);

            await Task.Delay(60);
            sut.MessageProcessed("something arbitrary");
            sut.Records.Should().HaveCount(3);
        }
        public async Task MessageProcessed_ShouldNotGrowQueueIfNewEventIsWithinTheLatestTimePeriod()
        {
            var sut = new PerformanceStats(TimeSpan.FromHours(1), 3);
            await Task.Delay(5);

            sut.MessageProcessed("something arbitrary");
            await Task.Delay(5);
            sut.Records.Should().HaveCount(1);

            sut.MessageProcessed("something arbitrary");
            await Task.Delay(5);
            sut.Records.Should().HaveCount(1);
        }
        public async Task TidyRecords_WhenAddingRecords_ShouldGrowUpToMaximumSize()
        {
            var sut = new PerformanceStats(TimeSpan.FromMilliseconds(50), 3);

            await Task.Delay(60);

            sut.MessageProcessed("something arbitrary");

            sut.Records.Should().HaveCount(2);
            
            await Task.Delay(60);
            sut.MessageProcessed("something arbitrary");
            sut.Records.Should().HaveCount(3);

            sut.MessageProcessed("something arbitrary");
            sut.Records.Should().HaveCount(3);
        }
 internal EventStreamSubscriber(EventStreamSubscriberSettings settings)
 {
     _connection = settings.Connection;
     _eventHandlerResolver = settings.EventHandlerResolver;
     _streamPositionRepository = settings.StreamPositionRepository;
     _subscriptionTimerManager = settings.SubscriptionTimerManager;
     _eventTypeResolver = settings.EventTypeResolver;
     _defaultPollingInterval = settings.DefaultPollingInterval;
     _sliceSize = settings.SliceSize;
     _longPollingTimeout = settings.LongPollingTimeout;
     _performanceMonitors = settings.PerformanceMonitors;
     _log = settings.Log;
     
     StreamSubscriberMonitor = settings.SubscriberIntervalMonitor;
     AllEventsStats = new PerformanceStats(settings.MessageProcessingStatsWindowPeriod, settings.MessageProcessingStatsWindowCount);
     ProcessedEventsStats = new PerformanceStats(settings.MessageProcessingStatsWindowPeriod, settings.MessageProcessingStatsWindowCount);
 }
        public async Task TidyRecords_WhenAddingRecords_ShouldFillInGapsInBuketsIfNecessary()
        {
            var sut = new PerformanceStats(TimeSpan.FromMilliseconds(30), 3);

            await Task.Delay(150);

            var records = (Queue<PerformanceRecord>)sut.Records;

            sut.TidyRecords();

            var now = DateTime.Now;

            var last = records.Skip(2).First();
            var middle = records.Skip(1).First();
            var first = records.Skip(0).First();
            last.EndTime.Should().BeWithin(TimeSpan.FromMilliseconds(50)).After(now);
            last.EndTime.Should().BeWithin(TimeSpan.FromMilliseconds(50)).Before(now);

            var oneMS = TimeSpan.FromMilliseconds(1);
            last.StartTime.Should().BeWithin(oneMS).After(middle.EndTime);
            middle.StartTime.Should().BeWithin(oneMS).After(first.EndTime);
        }
 public void Records_ForEmptyCounter_YieldsEmptySingleResultSet()
 {
     var sut = new PerformanceStats(It.IsAny<TimeSpan>(), It.IsAny<int>());
     sut.Records.Should().HaveCount(1);
 }
        public async Task RecordsAfter_ShouldReturnAllRecordsStartingAfterTheSuppliedDate()
        {
            var sut = new PerformanceStats(TimeSpan.FromMilliseconds(30), 3);

            var records = (Queue<PerformanceRecord>)sut.Records;

            records.Clear();

            var first = new PerformanceRecord(It.IsAny<TimeSpan>(), new DateTime(1, 2, 3));
            var second = new PerformanceRecord(It.IsAny<TimeSpan>(), first.StartTime.AddTicks(1));
            
            records.Enqueue(first);
            records.Enqueue(second);

            var foundRecords = sut.RecordsAfter(first.StartTime);

            foundRecords.Should().BeEquivalentTo(new[] {second});
        }