< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Dispatcher.MessageBodyStream
Assembly: CoreWCF.Primitives
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Dispatcher/MessageBodyStream.cs
Line coverage
66%
Covered lines: 44
Uncovered lines: 22
Coverable lines: 66
Total lines: 155
Line coverage: 66.6%
Branch coverage
66%
Covered branches: 20
Total branches: 30
Branch coverage: 66.6%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)100%11100%
Read(...)65%202066.66%
EnsureStreamIsOpen()25%4450%
Exhaust(...)100%44100%
Dispose(...)100%22100%
Flush()100%110%
Seek(...)100%110%
SetLength(...)100%110%
Write(...)100%110%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Dispatcher/MessageBodyStream.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.IO;
 6using System.Xml;
 7using CoreWCF.Channels;
 8using CoreWCF.Diagnostics;
 9using CoreWCF.Runtime;
 10
 11namespace CoreWCF.Dispatcher
 12{
 13    public class MessageBodyStream : Stream
 14    {
 15        private readonly Message _message;
 16        private XmlDictionaryReader _reader;
 17        private long _position;
 18        private readonly string _wrapperName, _wrapperNs;
 19        private readonly string _elementName, _elementNs;
 20        private readonly bool _isRequest;
 1721        public MessageBodyStream(Message message, string wrapperName, string wrapperNs, string elementName, string eleme
 22        {
 1723            _message = message;
 1724            _position = 0;
 1725            _wrapperName = wrapperName;
 1726            _wrapperNs = wrapperNs;
 1727            _elementName = elementName;
 1728            _elementNs = elementNs;
 1729            _isRequest = isRequest;
 1730        }
 31
 32        public override int Read(byte[] buffer, int offset, int count)
 33        {
 14334            EnsureStreamIsOpen();
 14335            if (buffer == null)
 36            {
 037                throw TraceUtility.ThrowHelperError(new ArgumentNullException(nameof(buffer)), _message);
 38            }
 39
 14340            if (offset < 0)
 41            {
 042                throw TraceUtility.ThrowHelperError(new ArgumentOutOfRangeException(nameof(offset), offset,
 043                                                SRCommon.ValueMustBeNonNegative), _message);
 44            }
 45
 14346            if (count < 0)
 47            {
 048                throw TraceUtility.ThrowHelperError(new ArgumentOutOfRangeException(nameof(count), count,
 049                                                SRCommon.ValueMustBeNonNegative), _message);
 50            }
 51
 14352            if (buffer.Length - offset < count)
 53            {
 054                throw TraceUtility.ThrowHelperError(new ArgumentException(SR.Format(SR.SFxInvalidStreamOffsetLength, off
 55            }
 56
 57            try
 58            {
 14359                if (_reader == null)
 60                {
 1661                    _reader = _message.GetReaderAtBodyContents();
 1662                    if (_wrapperName != null)
 63                    {
 1564                        _reader.MoveToContent();
 1565                        _reader.ReadStartElement(_wrapperName, _wrapperNs);
 66                    }
 1667                    _reader.MoveToContent();
 1668                    if (_reader.NodeType == XmlNodeType.EndElement)
 69                    {
 070                        return 0;
 71                    }
 72
 1673                    _reader.ReadStartElement(_elementName, _elementNs);
 74                }
 14375                if (_reader.MoveToContent() != XmlNodeType.Text)
 76                {
 1377                    Exhaust(_reader);
 1378                    return 0;
 79                }
 13080                int bytesRead = _reader.ReadContentAsBase64(buffer, offset, count);
 13081                _position += bytesRead;
 13082                if (bytesRead == 0)
 83                {
 284                    Exhaust(_reader);
 85                }
 13086                return bytesRead;
 87            }
 088            catch (Exception ex)
 89            {
 090                if (Fx.IsFatal(ex))
 91                {
 092                    throw;
 93                }
 94
 095                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new IOException(SR.SFxStreamIOException, ex));
 96            }
 14397        }
 98
 99        private void EnsureStreamIsOpen()
 100        {
 143101            if (_message.State == MessageState.Closed)
 102            {
 0103                throw DiagnosticUtility.ExceptionUtility.ThrowHelperError(new ObjectDisposedException(
 0104                    _isRequest ? SR.SFxStreamRequestMessageClosed : SR.SFxStreamResponseMessageClosed));
 105            }
 143106        }
 107
 108        private static void Exhaust(XmlDictionaryReader reader)
 109        {
 15110            if (reader != null)
 111            {
 57112                while (reader.Read())
 113                {
 114                    // drain
 115                }
 116            }
 15117        }
 118
 119        public override long Position
 120        {
 121            get
 122            {
 0123                EnsureStreamIsOpen();
 0124                return _position;
 125            }
 0126            set { throw TraceUtility.ThrowHelperError(new NotSupportedException(), _message); }
 127        }
 128
 129        protected override void Dispose(bool isDisposing)
 130        {
 13131            _message.Close();
 13132            if (_reader != null)
 133            {
 10134                _reader.Dispose();
 10135                _reader = null;
 136            }
 13137            base.Dispose(isDisposing);
 13138        }
 139
 10140        public override bool CanRead { get { return _message.State != MessageState.Closed; } }
 1141        public override bool CanSeek { get { return false; } }
 0142        public override bool CanWrite { get { return false; } }
 143        public override long Length
 144        {
 145            get
 146            {
 0147                throw TraceUtility.ThrowHelperError(new NotSupportedException(), _message);
 148            }
 149        }
 0150        public override void Flush() { throw TraceUtility.ThrowHelperError(new NotSupportedException(), _message); }
 0151        public override long Seek(long offset, SeekOrigin origin) { throw TraceUtility.ThrowHelperError(new NotSupported
 0152        public override void SetLength(long value) { throw TraceUtility.ThrowHelperError(new NotSupportedException(), _m
 0153        public override void Write(byte[] buffer, int offset, int count) { throw TraceUtility.ThrowHelperError(new NotSu
 154    }
 155}