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); }
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); }
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]); }
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); } }