public void Should_write_drained_events() { var e = CreateLogEvent(); events.TryAdd(e); WriteEvents().Should().BeTrue(); writer.Received(1).WriteEvents(buffer, 1); }
public bool TryLog(LogEvent @event, ConsoleLogSettings settings) { if (!isInitialized) { Initialize(); } var eventInfo = new LogEventInfo(@event, settings); if (!events.TryAdd(eventInfo)) { Interlocked.Increment(ref eventsLost); return(false); } return(true); }
public void Should_not_have_race_between_Add_and_Drain_that_turns_queue_wait_task_to_inconsistent_state() { for (var j = 0; j < 10; ++j) { var queue = new ConcurrentBoundedQueue <object>(100); var o = new object(); var addTask = Task.Run( () => { for (var i = 0; i < 1000000; i++) { if (!queue.TryAdd(o)) { i--; } } }); var drainTask = Task.Run( () => { var arr = new object[1000]; while (true) { var drained = queue.Drain(arr, 0, arr.Length); if (drained == 0 && addTask.IsCompleted) { return; } } }); Task.WhenAll(drainTask, addTask).GetAwaiter().GetResult(); if (queue.WaitForNewItemsAsync().IsCompleted&& queue.Count == 0) { Assert.Fail("Queue is broken: TryWaitForNewItemsAsync is completed, but queue is empty."); } } }
public void TryAdd_should_return_true_when_queue_has_free_space() { for (var i = 0; i < Capacity; i++) { queue.TryAdd(i.ToString()).Should().BeTrue(); } }
public void All_successfully_added_items_should_be_eventually_consumed(int capacity, int writersCount) { var addedItemsCount = 0; var drainedItemsCount = 0; var queue = new ConcurrentBoundedQueue <object>(capacity); var cancellation = new CancellationTokenSource(); var cancellationToken = cancellation.Token; var trigger = new CountdownEvent(writersCount + 1); var writers = Enumerable.Range(0, writersCount) .Select( _ => Task.Run( () => { trigger.Signal(); trigger.Wait(); while (!cancellationToken.IsCancellationRequested) { var item = new object(); if (queue.TryAdd(item)) { Interlocked.Increment(ref addedItemsCount); } } })) .ToArray(); var reader = Task.Run( async() => { trigger.Signal(); trigger.Wait(); var buffer = new object[10]; while (!cancellation.IsCancellationRequested || writers.Any(w => !w.IsCompleted) || queue.Count > 0) { if (!await queue.TryWaitForNewItemsAsync(100.Milliseconds()).ConfigureAwait(false)) { if (writers.Any(w => !w.IsCompleted)) { throw new Exception("Wait seems to be stuck."); } } var count = queue.Drain(buffer, 0, buffer.Length); drainedItemsCount += count; } }); Thread.Sleep(10.Seconds()); cancellation.Cancel(); Task.WaitAll(writers); reader.Wait(); Console.WriteLine($"added: {addedItemsCount}, drained: {drainedItemsCount}"); queue.Count.Should().Be(0); drainedItemsCount.Should().Be(addedItemsCount); }