< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.ServiceModel.Channels.RabbitMqChannelFactory
Assembly: CoreWCF.RabbitMQ.Client
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.RabbitMQ.Client/src/CoreWCF/ServiceModel/Channels/RabbitMqChannelFactory.cs
Line coverage
65%
Covered lines: 28
Uncovered lines: 15
Coverable lines: 43
Total lines: 121
Line coverage: 65.1%
Branch coverage
40%
Covered branches: 4
Total branches: 10
Branch coverage: 40%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)50%22100%
InitializeSecurityTokenManager(...)50%22100%
GetProperty()50%4466.66%
OnOpen(...)100%11100%
OnBeginOpen(...)100%110%
OnEndOpen(...)100%110%
OnCreateChannel(...)100%11100%
OnClosed()100%110%
RemoteCertificateValidationCallback(...)0%220%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.RabbitMQ.Client/src/CoreWCF/ServiceModel/Channels/RabbitMqChannelFactory.cs

#LineLine coverage
 1using System;
 2using System.ServiceModel.Channels;
 3using System.ServiceModel.Security;
 4using System.Threading.Tasks;
 5using CoreWCF.Runtime;
 6using System.IdentityModel.Selectors;
 7using System.IdentityModel.Tokens;
 8using System.Net.Http;
 9using ClientCredentials = System.ServiceModel.Description.ClientCredentials;
 10using System.Net.Security;
 11using System.Security.Cryptography.X509Certificates;
 12
 13namespace CoreWCF.ServiceModel.Channels
 14{
 15    internal class RabbitMqChannelFactory : ChannelFactoryBase<IOutputChannel>
 16    {
 17        private SecurityCredentialsManager _channelCredentials;
 18        private SecurityTokenManager _securityTokenManager;
 19        private X509CertificateValidator _sslCertificateValidator;
 20        private Func<HttpRequestMessage, X509Certificate2, X509Chain, SslPolicyErrors, bool> _remoteCertificateValidatio
 21
 22        internal RabbitMqChannelFactory(RabbitMqTransportBindingElement transport, BindingContext context)
 323            : base(context.Binding)
 24        {
 325            Transport = transport;
 326            BufferManager = BufferManager.CreateBufferManager(transport.MaxBufferPoolSize, int.MaxValue);
 327            InitializeSecurityTokenManager(context);
 28
 29            // TODO: Uncomment when .GetCertificateValidator() becomes available (currently internal to System.ServiceMo
 30            //ClientCredentials credentials = context.BindingParameters.Find<ClientCredentials>();
 31            //if (credentials != null && credentials.ServiceCertificate.SslCertificateAuthentication != null)
 32            //{
 33            //    _sslCertificateValidator = credentials.ServiceCertificate.SslCertificateAuthentication.GetCertificateV
 34            //    _remoteCertificateValidationCallback = RemoteCertificateValidationCallback;
 35            //}
 36
 337            var messageEncoderBindingElement = context.BindingParameters.Find<MessageEncodingBindingElement>();
 338            MessageEncoderFactory = messageEncoderBindingElement == null
 339                ? RabbitMqDefaults.DefaultMessageEncoderFactory
 340                : messageEncoderBindingElement.CreateMessageEncoderFactory();
 341        }
 42
 43        private void InitializeSecurityTokenManager(BindingContext context)
 44        {
 345            _channelCredentials = context.BindingParameters.Find<SecurityCredentialsManager>();
 346            _channelCredentials ??= new ClientCredentials();
 347            _securityTokenManager = _channelCredentials.CreateSecurityTokenManager();
 348        }
 49
 650        public RabbitMqTransportBindingElement Transport { get; }
 51
 652        public BufferManager BufferManager { get; }
 53
 654        public MessageEncoderFactory MessageEncoderFactory { get; }
 55
 56        public override T GetProperty<T>()
 57        {
 358            T messageEncoderProperty = MessageEncoderFactory.Encoder.GetProperty<T>();
 359            if (messageEncoderProperty != null)
 60            {
 061                return messageEncoderProperty;
 62            }
 63
 364            if (typeof(T) == typeof(MessageVersion))
 65            {
 066                return (T)(object)MessageEncoderFactory.Encoder.MessageVersion;
 67            }
 68
 369            return base.GetProperty<T>();
 70        }
 71
 72        protected override void OnOpen(TimeSpan timeout)
 73        {
 374        }
 75
 76        protected override IAsyncResult OnBeginOpen(TimeSpan timeout, AsyncCallback callback, object state)
 77        {
 078            return Task.CompletedTask.ToApm(callback, state);
 79        }
 80
 81        protected override void OnEndOpen(IAsyncResult result)
 82        {
 083            result.ToApmEnd();
 084        }
 85
 86        protected override IOutputChannel OnCreateChannel(System.ServiceModel.EndpointAddress endpointAddress, Uri via)
 87        {
 388            return new RabbitMqOutputChannel(
 389                this,
 390                endpointAddress,
 391                via,
 392                Transport,
 393                _securityTokenManager,
 394                MessageEncoderFactory.Encoder);
 95        }
 96
 97        protected override void OnClosed()
 98        {
 099            base.OnClosed();
 0100            BufferManager.Clear();
 0101        }
 102
 103        private bool RemoteCertificateValidationCallback(HttpRequestMessage sender, X509Certificate2 certificate, X509Ch
 104        {
 0105            if (_sslCertificateValidator == null)
 106            {
 0107                throw new Exception(SR.SslCertificateValidatorIsNull);
 108            }
 109
 110            try
 111            {
 0112                _sslCertificateValidator.Validate(certificate);
 0113                return true;
 114            }
 0115            catch (SecurityTokenValidationException ex)
 116            {
 0117                return false;
 118            }
 0119        }
 120    }
 121}