< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Queue.Common.QueuePollingService
Assembly: CoreWCF.Queue
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Queue/src/CoreWCF/Queue/Common/QueuePollingService.cs
Line coverage
93%
Covered lines: 57
Uncovered lines: 4
Coverable lines: 61
Total lines: 143
Line coverage: 93.4%
Branch coverage
95%
Covered branches: 21
Total branches: 22
Branch coverage: 95.4%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)100%11100%
StartAsync()100%22100%
StopAsync(...)100%22100%
_serviceBuilder_Opened(...)100%22100%
Init()100%1010100%
DisposeAsync()83.33%6675%
Dispose()100%110%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Queue/src/CoreWCF/Queue/Common/QueuePollingService.cs

#LineLine coverage
 1// Licensed to the .NET Foundation under one or more agreements.
 2// The .NET Foundation licenses this file to you under the MIT license.
 3
 4using System;
 5using System.Collections.Generic;
 6using System.Linq;
 7using System.Threading;
 8using System.Threading.Tasks;
 9using CoreWCF.Channels;
 10using CoreWCF.Configuration;
 11using CoreWCF.Queue.Common.Configuration;
 12using Microsoft.Extensions.DependencyInjection;
 13using Microsoft.Extensions.Hosting;
 14
 15namespace CoreWCF.Queue.Common
 16{
 17    internal class QueuePollingService : IHostedService, IDisposable, IAsyncDisposable
 18    {
 19        private readonly QueueMiddleware _queueMiddleware;
 20        private readonly IServiceProvider _services;
 21        private readonly List<QueueTransportContext> _queueTransportContexts;
 22        private readonly IServiceBuilder _serviceBuilder;
 23        private bool _stopped;
 24        private bool _initialized;
 25        private bool _startCalled;
 26
 5027        public QueuePollingService(IServiceProvider services, QueueMiddleware queueMiddleware)
 28        {
 5029            _services = services;
 5030            _queueMiddleware = queueMiddleware;
 5031            _serviceBuilder = _services.GetRequiredService<IServiceBuilder>();
 5032            _serviceBuilder.Opened += _serviceBuilder_Opened;
 5033            _queueTransportContexts = new List<QueueTransportContext>();
 5034        }
 35
 36        public async Task StartAsync(CancellationToken cancellationToken)
 37        {
 10038            _startCalled = true;
 10039            if (_initialized)
 40            {
 5041                var tasks = _queueTransportContexts.Select(queueTransport =>
 10042                    queueTransport.QueuePump.StartPumpAsync(queueTransport, cancellationToken));
 5043                await Task.WhenAll(tasks);
 44            }
 10045        }
 46
 47        public Task StopAsync(CancellationToken cancellationToken)
 48        {
 5449            if (_stopped)
 50            {
 451                return Task.CompletedTask;
 52            }
 53
 5054            _stopped = true;
 55
 5056            var tasks = _queueTransportContexts.Select(queueTransport =>
 10057                queueTransport.QueuePump.StopPumpAsync(cancellationToken));
 5058            return Task.WhenAll(tasks);
 59        }
 60
 61        private void _serviceBuilder_Opened(object sender, EventArgs e)
 62        {
 5063            Init();
 5064            _initialized = true;
 5065            if (_startCalled)
 66            {
 5067                StartAsync(default).GetAwaiter().GetResult();
 68            }
 5069        }
 70
 71        private void Init()
 72        {
 5073            IDispatcherBuilder dispatcherBuilder = _services.GetRequiredService<IDispatcherBuilder>();
 20074            foreach (Type serviceType in _serviceBuilder.Services)
 75            {
 5076                List<IServiceDispatcher> dispatchers = dispatcherBuilder.BuildDispatchers(serviceType);
 20077                foreach (IServiceDispatcher dispatcher in dispatchers)
 78                {
 5079                    if (dispatcher.BaseAddress == null)
 80                    {
 81                        continue;
 82                    }
 83
 5084                    BindingElementCollection be = dispatcher.Binding.CreateBindingElements();
 5085                    QueueBaseTransportBindingElement queueTransportBinding = be.Find<QueueBaseTransportBindingElement>()
 86
 5087                    var msgEncBindingElement = be.Find<MessageEncodingBindingElement>();
 88
 5089                    if (queueTransportBinding == null)
 90                    {
 91                        continue;
 92                    }
 93
 5094                    IServiceDispatcher serviceDispatcher = null;
 5095                    var customBinding = new CustomBinding(dispatcher.Binding);
 5096                    var parameters = new BindingParameterCollection();
 97
 5098                    parameters.Add(_services);
 5099                    if (customBinding.CanBuildServiceDispatcher<IInputChannel>(parameters))
 100                    {
 50101                        serviceDispatcher = customBinding.BuildServiceDispatcher<IInputChannel>(parameters, dispatcher);
 102                    }
 50103                    parameters.Add(serviceDispatcher);
 50104                    BindingContext bindingContext = new BindingContext(customBinding, parameters);
 50105                    QueueTransportPump queuePump = queueTransportBinding.BuildQueueTransportPump(bindingContext);
 106
 50107                    _queueTransportContexts.Add(new QueueTransportContext
 50108                    {
 50109                        QueuePump = queuePump,
 50110                        ServiceDispatcher = serviceDispatcher,
 50111                        QueueBindingElement = queueTransportBinding,
 50112                        MessageEncoderFactory = msgEncBindingElement.CreateMessageEncoderFactory(),
 50113                        QueueMessageDispatcher = _queueMiddleware.Build()
 50114                    });
 115                }
 116            }
 50117        }
 118
 119        public async ValueTask DisposeAsync()
 120        {
 50121            await StopAsync(default);
 122
 200123            foreach (var queueTransportContext in _queueTransportContexts)
 124            {
 50125                if (queueTransportContext.QueuePump is IAsyncDisposable disposable)
 126                {
 0127                    await disposable.DisposeAsync();
 0128                    continue;
 129                }
 130
 50131                if (queueTransportContext.QueuePump is IDisposable syncDisposable)
 132                {
 47133                    syncDisposable.Dispose();
 134                }
 135            }
 50136        }
 137
 138        public void Dispose()
 139        {
 0140            DisposeAsync().AsTask().GetAwaiter().GetResult();
 0141        }
 142    }
 143}