예제 #1
0
        public async Task AddEvent_RemovesExpiredItems()
        {
            var           window = new SlidingWindow <MyItem>(TimeSpan.FromSeconds(1));
            StringBuilder log    = new StringBuilder();

            for (int i = 0; i < 5; i++)
            {
                window.AddEvent(new MyItem {
                    Data = i
                });
                log.AppendLine($"{DateTime.UtcNow.ToString("HH:mm:ss.FFFZ")}: Added item: {i}");
                Thread.Sleep(50);
            }

            var eventsField = window.GetType().GetField("_events", BindingFlags.Instance | BindingFlags.NonPublic);
            var events      = (List <SlidingWindow <MyItem> .Event>)eventsField.GetValue(window);
            int count       = events.Count;

            Assert.True(count == 5, $"{DateTime.UtcNow} | Expected 5. Actual {count}.{Environment.NewLine}{log.ToString()}");

            // now let the items expire
            await Task.Delay(1000);

            // add a new event that shouldn't be expired
            var evt = new MyItem {
                Data = 8
            };

            window.AddEvent(evt);

            Assert.Equal(1, events.Count);
        }
예제 #2
0
        public async Task GetEvents_RemovesExpiredItems()
        {
            var window = new SlidingWindow <MyItem>(TimeSpan.FromSeconds(1));

            for (int i = 0; i < 5; i++)
            {
                window.AddEvent(new MyItem {
                    Data = i
                });
                await Task.Delay(100);
            }

            var evts = window.GetEvents().ToArray();

            Assert.Equal(5, evts.Length);
            for (int i = 0; i < 5; i++)
            {
                Assert.Equal(i, evts[i].Data);
            }

            // now let the items expire
            await Task.Delay(1000);

            // add a new event that shouldn't be expired
            var evt = new MyItem {
                Data = 7
            };

            window.AddEvent(evt);

            evts = window.GetEvents().ToArray();
            Assert.Equal(1, evts.Length);
            Assert.Same(evt, evts[0]);
        }
        public async Task AddEvent_RemovesExpiredItems()
        {
            var window = new SlidingWindow <MyItem>(TimeSpan.FromSeconds(1));

            for (int i = 0; i < 5; i++)
            {
                window.AddEvent(new MyItem {
                    Data = i
                });
                await Task.Delay(100);
            }

            var eventsField = window.GetType().GetField("_events", BindingFlags.Instance | BindingFlags.NonPublic);
            var events      = (List <SlidingWindow <MyItem> .Event>)eventsField.GetValue(window);

            Assert.Equal(5, events.Count);

            // now let the items expire
            await Task.Delay(1000);

            // add a new event that shouldn't be expired
            var evt = new MyItem {
                Data = 8
            };

            window.AddEvent(evt);

            Assert.Equal(1, events.Count);
        }
예제 #4
0
        public async Task GetEvents_RemovesExpiredItems()
        {
            var expiry              = TimeSpan.FromSeconds(1);
            var window              = new SlidingWindow <MyItem>(expiry);
            var initialEventCount   = 5;
            var insertionTimestamps = new DateTime[initialEventCount];

            for (int i = 0; i < initialEventCount; i++)
            {
                window.AddEvent(new MyItem {
                    Data = i
                });
                insertionTimestamps[i] = DateTime.Now;
                await Task.Delay(100);
            }

            var evts = window.GetEvents().ToArray();

            // How many items have expired? We're at the mercy of the task scheduler here.
            // In theory we should have only waited 5 * 100 = 500ms and have zero expired items but we might have waited longer.
            var insertionCompleteTimestamp = DateTime.Now;
            var expiredCount  = insertionTimestamps.Count(t => (insertionCompleteTimestamp - t) > expiry);
            var expectedCount = initialEventCount - expiredCount;

            // Check the total count and each of the non expired items
            Assert.Equal(expectedCount, evts.Length);
            for (int i = 0; i < expectedCount; i++)
            {
                Assert.Equal(i + expiredCount, evts[i].Data);
            }

            // now let the items expire
            await Task.Delay(expiry);

            // add a new event that shouldn't be expired
            var evt = new MyItem {
                Data = 7
            };

            window.AddEvent(evt);

            evts = window.GetEvents().ToArray();
            Assert.Equal(1, evts.Length);
            Assert.Same(evt, evts[0]);
        }
예제 #5
0
        private void OnHostHealthCheckTimer(object state)
        {
            bool isHealthy = IsHostHealthy();

            _healthCheckWindow.AddEvent(isHealthy);

            if (!isHealthy && State == ScriptHostState.Running)
            {
                // This periodic check allows us to break out of the host run
                // loop. The health check performed in OnHostInitializing will then
                // fail and we'll enter a restart loop (exponentially backing off)
                // until the host is healthy again and we can resume host processing.
                _logger.UnhealthyRestart();
                var tIgnore = RestartHostAsync(CancellationToken.None);
            }
        }