Пример #1
0
        public async Task Should_not_leak_state_when_request_canceled()
        {
            var dictionary = new ConcurrentDictionary <string, RequestResponseStateLookup.State>();
            var requestResponseStateLookup = new RequestResponseStateLookup(dictionary);

            var tcs         = new TaskCompletionSource <object>();
            var adapter     = new TaskCompletionSourceAdapter <object>(tcs);
            var tokenSource = new CancellationTokenSource();
            var outgoingPhysicalMessageContext = new TestableOutgoingPhysicalMessageContext();

            outgoingPhysicalMessageContext.Extensions.Set(new RequestResponseStateLookup.State
            {
                CancellationToken    = tokenSource.Token,
                TaskCompletionSource = adapter
            });

            var behavior = new UpdateRequestResponseCorrelationTableBehavior(requestResponseStateLookup);
            await behavior.Invoke(outgoingPhysicalMessageContext, () =>
            {
                tokenSource.Cancel();
                return(Task.FromResult(0));
            });

            Assert.ThrowsAsync <TaskCanceledException>(async() => { await tcs.Task; });
            Assert.IsEmpty(dictionary);
        }
        public async Task Should_not_leak_state_when_request_canceled()
        {
            var dictionary = new ConcurrentDictionary<string, RequestResponseStateLookup.State>();
            var requestResponseStateLookup = new RequestResponseStateLookup(dictionary);

            var tcs = new TaskCompletionSource<object>();
            var adapter = new TaskCompletionSourceAdapter(tcs);
            var tokenSource = new CancellationTokenSource();
            var outgoingPhysicalMessageContext = new TestableOutgoingPhysicalMessageContext();
            outgoingPhysicalMessageContext.Extensions.Set(new RequestResponseStateLookup.State
            {
                CancellationToken = tokenSource.Token,
                TaskCompletionSource = adapter
            });

            var behavior = new UpdateRequestResponseCorrelationTableBehavior(requestResponseStateLookup);
            await behavior.Invoke(outgoingPhysicalMessageContext, () =>
            {
                tokenSource.Cancel();
                return Task.FromResult(0);
            });

            Assert.ThrowsAsync<TaskCanceledException>(async () => { await tcs.Task; });
            Assert.IsEmpty(dictionary);
        }