< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Channels.BufferedMessageWriter
Assembly: CoreWCF.WebHttp
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.WebHttp/src/CoreWCF/Channels/BufferedMessageWriter.cs
Line coverage
87%
Covered lines: 35
Uncovered lines: 5
Coverable lines: 40
Total lines: 110
Line coverage: 87.5%
Branch coverage
75%
Covered branches: 9
Total branches: 12
Branch coverage: 75%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity NPath complexity Sequence coverage
.ctor()100%11100%
WriteMessage(...)50%6686.36%
OnWriteStartMessage(...)100%110%
OnWriteEndMessage(...)100%110%
InitMessagePredictor()100%22100%
PredictMessageSize()100%44100%
RecordActualMessageSize(...)100%11100%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.WebHttp/src/CoreWCF/Channels/BufferedMessageWriter.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;
 7
 8namespace CoreWCF.Channels
 9{
 10    internal abstract class BufferedMessageWriter
 11    {
 12        private int[] _sizeHistory;
 13        private int _sizeHistoryIndex;
 14        private const int sizeHistoryCount = 4;
 15        private const int expectedSizeVariance = 256;
 16        private readonly BufferManagerOutputStream _stream;
 17
 2418        public BufferedMessageWriter()
 19        {
 2420            _stream = new BufferManagerOutputStream(SR.MaxSentMessageSizeExceeded);
 2421            InitMessagePredictor();
 2422        }
 23
 24        protected abstract XmlDictionaryWriter TakeXmlWriter(Stream stream);
 25        protected abstract void ReturnXmlWriter(XmlDictionaryWriter writer);
 26
 27        public ArraySegment<byte> WriteMessage(Message message, BufferManager bufferManager, int initialOffset, int maxS
 28        {
 29            int effectiveMaxSize;
 30
 31            // make sure that maxSize has room for initialOffset without overflowing, since
 32            // the effective buffer size is message size + initialOffset
 2433            if (maxSizeQuota <= int.MaxValue - initialOffset)
 34            {
 2435                effectiveMaxSize = maxSizeQuota + initialOffset;
 36            }
 37            else
 38            {
 039                effectiveMaxSize = int.MaxValue;
 40            }
 41
 2442            int predictedMessageSize = PredictMessageSize();
 2443            if (predictedMessageSize > effectiveMaxSize)
 44            {
 045                predictedMessageSize = effectiveMaxSize;
 46            }
 2447            else if (predictedMessageSize < initialOffset)
 48            {
 049                predictedMessageSize = initialOffset;
 50            }
 51
 52            try
 53            {
 2454                _stream.Init(predictedMessageSize, maxSizeQuota, effectiveMaxSize, bufferManager);
 2455                _stream.Skip(initialOffset);
 56
 2457                XmlDictionaryWriter writer = TakeXmlWriter(_stream);
 2458                OnWriteStartMessage(writer);
 2459                message.WriteMessage(writer);
 2460                OnWriteEndMessage(writer);
 2461                writer.Flush();
 2462                ReturnXmlWriter(writer);
 2463                byte[] buffer = _stream.ToArray(out int size);
 2464                RecordActualMessageSize(size);
 2465                return new ArraySegment<byte>(buffer, initialOffset, size - initialOffset);
 66            }
 67            finally
 68            {
 2469                _stream.Clear();
 2470            }
 2471        }
 72
 73        protected virtual void OnWriteStartMessage(XmlDictionaryWriter writer)
 74        {
 075        }
 76
 77        protected virtual void OnWriteEndMessage(XmlDictionaryWriter writer)
 78        {
 079        }
 80
 81        private void InitMessagePredictor()
 82        {
 2483            _sizeHistory = new int[4];
 24084            for (int i = 0; i < sizeHistoryCount; i++)
 85            {
 9686                _sizeHistory[i] = 256;
 87            }
 2488        }
 89
 90        private int PredictMessageSize()
 91        {
 2492            int max = 0;
 24093            for (int i = 0; i < sizeHistoryCount; i++)
 94            {
 9695                if (_sizeHistory[i] > max)
 96                {
 2497                    max = _sizeHistory[i];
 98                }
 99            }
 100
 24101            return max + expectedSizeVariance;
 102        }
 103
 104        private void RecordActualMessageSize(int size)
 105        {
 24106            _sizeHistory[_sizeHistoryIndex] = size;
 24107            _sizeHistoryIndex = (_sizeHistoryIndex + 1) % sizeHistoryCount;
 24108        }
 109    }
 110}