예제 #1
0
        public async Task Wait_Cancels_WhenAnySubscriptionWaitsCancels()
        {
            var message = new Amqp.Message();

            IDelivery[] subscriptions = Enumerable
                                        .Range(0, 3)
                                        .Select((_, index) =>
            {
                IDelivery subscription = Substitute.For <IDelivery>();
                subscription
                .WaitAsync(Arg.Any <TimeSpan>(), Arg.Any <CancellationToken>())
                .Returns(async call =>
                {
                    TimeSpan delay = index != 1 ? call.ArgAt <TimeSpan>(0) : TimeSpan.FromSeconds(15);
                    CancellationToken cancellationToken = call.ArgAt <CancellationToken>(1);
                    await Task.Delay(delay.Add(TimeSpan.FromMilliseconds(1)), cancellationToken);
                    cancellationToken.ThrowIfCancellationRequested();
                    return(true);
                });
                return(subscription);
            })
                                        .ToArray();
            var         delivery = new TopicDelivery(message, subscriptions);
            var         cts      = new CancellationTokenSource(TimeSpan.FromMilliseconds(10));
            Task <bool> task     = delivery.WaitAsync(TimeSpan.FromMilliseconds(1), cts.Token);

            await task.ShouldCancelOperationAsync();
        }
예제 #2
0
        public void Wait_Throws_WhenObjectDisposed()
        {
            var delivery = new TopicDelivery(new Amqp.Message(), new List <IDelivery>());

            delivery.Dispose();

            Should.ThrowAsync <ObjectDisposedException>(delivery.WaitAsync(TimeSpan.Zero));
        }
예제 #3
0
        public void Dispose_DoesNotThrow_WhenSubscriptionNotDisposable()
        {
            IDelivery subscription = Substitute.For <IDelivery>();
            var       delivery     = new TopicDelivery(new Amqp.Message(), new List <IDelivery> {
                subscription
            });

            Should.NotThrow(() => delivery.Dispose());
        }
예제 #4
0
        public async Task Wait_ReturnsTrue_WhenSubscriptionsEmpty()
        {
            var message       = new Amqp.Message();
            var subscriptions = new IDelivery[0];
            var delivery      = new TopicDelivery(message, subscriptions);

            var result = await delivery.WaitAsync(TimeSpan.FromMilliseconds(1));

            result.ShouldBeTrue();
        }
예제 #5
0
        public void Dispose_CanBeCalledMultipleTimes()
        {
            var delivery = new TopicDelivery(new Amqp.Message(), new List <IDelivery>());

            Should.NotThrow(() =>
            {
                delivery.Dispose();
                delivery.Dispose();
            });
        }
예제 #6
0
        public void Dispose_DisposesSubscriptions()
        {
            IDisposable subscription = Substitute.For <IDisposable, IDelivery>();
            var         delivery     = new TopicDelivery(new Amqp.Message(), new List <IDelivery> {
                (IDelivery)subscription
            });

            delivery.Dispose();

            subscription.Received(1).Dispose();
        }
예제 #7
0
        public void Constructor_InitializesInstance()
        {
            var message = new Amqp.Message();

            IDelivery[] subscriptions = Enumerable.Empty <IDelivery>().ToArray();
            var         delivery      = new TopicDelivery(message, subscriptions);

            delivery.ShouldSatisfyAllConditions(
                () => delivery.Posted.Kind.ShouldBe(DateTimeKind.Utc),
                () => delivery.Posted.ShouldBeLessThanOrEqualTo(DateTime.UtcNow),
                () => delivery.Message.ShouldBeSameAs(message),
                () => delivery.Subscriptions.ShouldBeSameAs(subscriptions)
                );
        }
예제 #8
0
        public ITopicDelivery Post(Message message)
        {
            if (_disposed)
            {
                throw new ObjectDisposedException(typeof(TopicEntity).Name);
            }
            if (message == null)
            {
                throw new ArgumentNullException(nameof(message));
            }
            var delivery = new TopicDelivery(message, PostToSubscriptions(message));

            _deliveries.Add(delivery);
            return(delivery);
        }
예제 #9
0
        public async Task Wait_ReturnsFalse_WhenAnySubscriptionWaitsReturnFalseWithinTimeout()
        {
            var message = new Amqp.Message();

            IDelivery[] subscriptions = Enumerable
                                        .Range(0, 3)
                                        .Select((_, index) =>
            {
                IDelivery subscription = Substitute.For <IDelivery>();
                subscription.WaitAsync(Arg.Any <TimeSpan>()).Returns(index != 1);
                return(subscription);
            })
                                        .ToArray();
            var delivery = new TopicDelivery(message, subscriptions);

            var result = await delivery.WaitAsync(TimeSpan.FromMilliseconds(1));

            result.ShouldBeFalse();
        }