< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Channels.NetNamedPipeHostedService
Assembly: CoreWCF.NetNamedPipe
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.NetNamedPipe/src/CoreWCF/Channels/NetNamedPipeHostedService.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 19
Coverable lines: 19
Total lines: 73
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 10
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)0%440%
StartAsync()0%220%
StopAsync(...)0%440%
Dispose()100%110%
DisposeAsync()100%110%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.NetNamedPipe/src/CoreWCF/Channels/NetNamedPipeHostedService.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.Runtime.Versioning;
 7using System.Threading;
 8using System.Threading.Tasks;
 9using CoreWCF.Configuration;
 10using Microsoft.AspNetCore.Hosting.Server;
 11using Microsoft.Extensions.DependencyInjection;
 12using Microsoft.Extensions.Hosting;
 13using Microsoft.Extensions.Logging;
 14using Microsoft.Extensions.Options;
 15
 16namespace CoreWCF.Channels
 17{
 18    [SupportedOSPlatform("windows")]
 19    internal class NetNamedPipeHostedService : IHostedService, IAsyncDisposable, IDisposable
 20    {
 21        private NetNamedPipeOptions _serverOptions;
 22        private ILoggerFactory _loggerFactory;
 23        private IServiceBuilder _serviceBuilder;
 24        private IServiceProvider _serviceProvider;
 25        private NamedPipeTransportManager _namedPipeListener;
 26
 027        public NetNamedPipeHostedService(IOptions<NetNamedPipeOptions> options, IServiceBuilder serviceBuilder, ILoggerF
 28        {
 029            _serverOptions = options.Value ?? new NetNamedPipeOptions();
 030            _loggerFactory = loggerFactory;
 031            _serviceBuilder = serviceBuilder;
 032            _serviceProvider = serviceProvider;
 033            foreach (var listenOptions in _serverOptions.CodeBackedListenOptions)
 34            {
 035                serviceBuilder.BaseAddresses.Add(listenOptions.BaseAddress);
 36            }
 037        }
 38
 39        public async Task StartAsync(CancellationToken cancellationToken)
 40        {
 041            if (_serviceBuilder.State == CommunicationState.Opened)
 42            {
 43                // Need to resolve the UriPrefixTable as the service builder was already opened
 44                // before we could hook up NetMessageFramingConnectionHandler.OnServiceBuilderOpened
 45                // to be called when the service builder is opened. As UriPrefixTable is internal
 46                // to NetFramingBase, it was also registered as its implemented interface type which
 47                // allows us to resolve it here.
 048                _ = _serviceProvider.GetRequiredService<IEnumerable<KeyValuePair<BaseUriWithWildcard, HandshakeDelegate>
 49            }
 050            _namedPipeListener = new NamedPipeTransportManager(_loggerFactory);
 051            await _namedPipeListener.BindAsync(_serverOptions.CodeBackedListenOptions, cancellationToken);
 052        }
 53
 54        public Task StopAsync(CancellationToken cancellationToken)
 55        {
 056            var pipeListener = _namedPipeListener;
 057            _namedPipeListener = null;
 058            return pipeListener?.StopAsync(cancellationToken) ?? Task.CompletedTask;
 59        }
 60
 61        public void Dispose()
 62        {
 63            // No need to check if StopAsync has been called as it is a no-op after the first call
 064            StopAsync(default).GetAwaiter().GetResult();
 065        }
 66
 67        public ValueTask DisposeAsync()
 68        {
 69            // No need to check if StopAsync has been called as it is a no-op after the first call
 070            return new ValueTask(StopAsync(default));
 71        }
 72    }
 73}