Ejemplo n.º 1
0
        public void Should_write_drained_events()
        {
            var e = CreateLogEvent();

            events.TryAdd(e);

            WriteEvents().Should().BeTrue();

            writer.Received(1).WriteEvents(buffer, 1);
        }
Ejemplo n.º 2
0
        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);
        }