< Summary - CoreWCF Coverage — PR #1766

Information
Class: CoreWCF.Channels.BufferedMessageWriter
Assembly: CoreWCF.Primitives
File(s): /home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/src/CoreWCF/Channels/BufferedMessageWriter.cs
Line coverage
95%
Covered lines: 38
Uncovered lines: 2
Coverable lines: 40
Total lines: 110
Line coverage: 95%
Branch coverage
83%
Covered branches: 10
Total branches: 12
Branch coverage: 83.3%
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(...)66.66%6690.9%
OnWriteStartMessage(...)100%11100%
OnWriteEndMessage(...)100%11100%
InitMessagePredictor()100%22100%
PredictMessageSize()100%44100%
RecordActualMessageSize(...)100%11100%

File(s)

/home/runner/work/CoreWCF/CoreWCF/src/CoreWCF.Primitives/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
 52618        public BufferedMessageWriter()
 19        {
 52620            _stream = new BufferManagerOutputStream(SRCommon.MaxSentMessageSizeExceeded);
 52621            InitMessagePredictor();
 52622        }
 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
 77433            if (maxSizeQuota <= int.MaxValue - initialOffset)
 34            {
 68635                effectiveMaxSize = maxSizeQuota + initialOffset;
 36            }
 37            else
 38            {
 8839                effectiveMaxSize = int.MaxValue;
 40            }
 41
 77442            int predictedMessageSize = PredictMessageSize();
 77443            if (predictedMessageSize > effectiveMaxSize)
 44            {
 045                predictedMessageSize = effectiveMaxSize;
 46            }
 77447            else if (predictedMessageSize < initialOffset)
 48            {
 049                predictedMessageSize = initialOffset;
 50            }
 51
 52            try
 53            {
 77454                _stream.Init(predictedMessageSize, maxSizeQuota, effectiveMaxSize, bufferManager);
 77455                _stream.Skip(initialOffset);
 56
 77457                XmlDictionaryWriter writer = TakeXmlWriter(_stream);
 77458                OnWriteStartMessage(writer);
 77459                message.WriteMessage(writer);
 77460                OnWriteEndMessage(writer);
 77461                writer.Flush();
 77462                ReturnXmlWriter(writer);
 77463                byte[] buffer = _stream.ToArray(out int size);
 77464                RecordActualMessageSize(size);
 77465                return new ArraySegment<byte>(buffer, initialOffset, size - initialOffset);
 66            }
 67            finally
 68            {
 77469                _stream.Clear();
 77470            }
 77471        }
 72
 73        protected virtual void OnWriteStartMessage(XmlDictionaryWriter writer)
 74        {
 10875        }
 76
 77        protected virtual void OnWriteEndMessage(XmlDictionaryWriter writer)
 78        {
 10879        }
 80
 81        private void InitMessagePredictor()
 82        {
 52683            _sizeHistory = new int[4];
 526084            for (int i = 0; i < sizeHistoryCount; i++)
 85            {
 210486                _sizeHistory[i] = 256;
 87            }
 52688        }
 89
 90        private int PredictMessageSize()
 91        {
 77492            int max = 0;
 774093            for (int i = 0; i < sizeHistoryCount; i++)
 94            {
 309695                if (_sizeHistory[i] > max)
 96                {
 86797                    max = _sizeHistory[i];
 98                }
 99            }
 100
 774101            return max + expectedSizeVariance;
 102        }
 103
 104        private void RecordActualMessageSize(int size)
 105        {
 774106            _sizeHistory[_sizeHistoryIndex] = size;
 774107            _sizeHistoryIndex = (_sizeHistoryIndex + 1) % sizeHistoryCount;
 774108        }
 109    }
 110}