< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Channels.BufferedMessageData
Assembly: CoreWCF.WebHttp
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.WebHttp/src/CoreWCF/Channels/BufferedMessageData.cs
Line coverage
44%
Covered lines: 31
Uncovered lines: 38
Coverable lines: 69
Total lines: 192
Line coverage: 44.9%
Branch coverage
38%
Covered branches: 7
Total branches: 18
Branch coverage: 38.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor(...)100%11100%
EnableMultipleUsers()100%110%
Close()25%4442.85%
DoClose()50%2250%
DoReturnMessageState(...)50%2250%
DoReturnXmlReader(...)100%110%
DoTakeMessageState()50%2260%
DoTakeXmlReader()100%11100%
GetMessageReader()50%2240%
OnXmlReaderClosed(...)0%220%
OnClosed()100%110%
TakeMessageState()50%2240%
Open()100%110%
Open(...)100%11100%
ReturnMessageState(...)50%2250%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.WebHttp/src/CoreWCF/Channels/BufferedMessageData.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.Xml;
 6using CoreWCF.Runtime;
 7
 8namespace CoreWCF.Channels
 9{
 10    internal abstract class BufferedMessageData : IBufferedMessageData
 11    {
 12        private ArraySegment<byte> _buffer;
 13        private int _refCount;
 14        private int _outstandingReaders;
 15        private bool _multipleUsers;
 16        private RecycledMessageState _messageState;
 17        private readonly SynchronizedPool<RecycledMessageState> _messageStatePool;
 18
 619        public BufferedMessageData(SynchronizedPool<RecycledMessageState> messageStatePool)
 20        {
 621            _messageStatePool = messageStatePool;
 622        }
 23
 624        public ArraySegment<byte> Buffer => _buffer;
 25
 1026        public BufferManager BufferManager { get; private set; }
 27
 028        public virtual XmlDictionaryReaderQuotas Quotas => XmlDictionaryReaderQuotas.Max;
 29
 30        public abstract MessageEncoder MessageEncoder { get; }
 31
 032        private object ThisLock => this;
 33
 34        public void EnableMultipleUsers()
 35        {
 036            _multipleUsers = true;
 037        }
 38
 39        public void Close()
 40        {
 441            if (_multipleUsers)
 42            {
 043                lock (ThisLock)
 44                {
 045                    if (--_refCount == 0)
 46                    {
 047                        DoClose();
 48                    }
 049                }
 50            }
 51            else
 52            {
 453                DoClose();
 54            }
 455        }
 56
 57        private void DoClose()
 58        {
 459            BufferManager.ReturnBuffer(_buffer.Array);
 460            if (_outstandingReaders == 0)
 61            {
 062                BufferManager = null;
 063                _buffer = new ArraySegment<byte>();
 064                OnClosed();
 65            }
 466        }
 67
 68        public void DoReturnMessageState(RecycledMessageState messageState)
 69        {
 470            if (_messageState == null)
 71            {
 472                _messageState = messageState;
 73            }
 74            else
 75            {
 076                _messageStatePool.Return(messageState);
 77            }
 078        }
 79
 80        private void DoReturnXmlReader(XmlDictionaryReader reader)
 81        {
 082            ReturnXmlReader(reader);
 083            _outstandingReaders--;
 084        }
 85
 86        public RecycledMessageState DoTakeMessageState()
 87        {
 688            RecycledMessageState messageState = _messageState;
 689            if (messageState != null)
 90            {
 091                _messageState = null;
 092                return messageState;
 93            }
 94            else
 95            {
 696                return _messageStatePool.Take();
 97            }
 98        }
 99
 100        private XmlDictionaryReader DoTakeXmlReader()
 101        {
 6102            XmlDictionaryReader reader = TakeXmlReader();
 6103            _outstandingReaders++;
 104
 6105            return reader;
 106        }
 107
 108        public XmlDictionaryReader GetMessageReader()
 109        {
 6110            if (_multipleUsers)
 111            {
 0112                lock (ThisLock)
 113                {
 0114                    return DoTakeXmlReader();
 115                }
 116            }
 117            else
 118            {
 6119                return DoTakeXmlReader();
 120            }
 0121        }
 122
 123        public void OnXmlReaderClosed(XmlDictionaryReader reader)
 124        {
 0125            if (_multipleUsers)
 126            {
 0127                lock (ThisLock)
 128                {
 0129                    DoReturnXmlReader(reader);
 0130                }
 131            }
 132            else
 133            {
 0134                DoReturnXmlReader(reader);
 135            }
 0136        }
 137
 138        protected virtual void OnClosed()
 139        {
 0140        }
 141
 142        public RecycledMessageState TakeMessageState()
 143        {
 6144            if (_multipleUsers)
 145            {
 0146                lock (ThisLock)
 147                {
 0148                    return DoTakeMessageState();
 149                }
 150            }
 151            else
 152            {
 6153                return DoTakeMessageState();
 154            }
 0155        }
 156
 157        protected abstract XmlDictionaryReader TakeXmlReader();
 158
 159        public void Open()
 160        {
 0161            lock (ThisLock)
 162            {
 0163                _refCount++;
 0164            }
 0165        }
 166
 167        public void Open(ArraySegment<byte> buffer, BufferManager bufferManager)
 168        {
 6169            _refCount = 1;
 6170            BufferManager = bufferManager;
 6171            _buffer = buffer;
 6172            _multipleUsers = false;
 6173        }
 174
 175        protected abstract void ReturnXmlReader(XmlDictionaryReader xmlReader);
 176
 177        public void ReturnMessageState(RecycledMessageState messageState)
 178        {
 4179            if (_multipleUsers)
 180            {
 0181                lock (ThisLock)
 182                {
 0183                    DoReturnMessageState(messageState);
 0184                }
 185            }
 186            else
 187            {
 4188                DoReturnMessageState(messageState);
 189            }
 4190        }
 191    }
 192}