< Summary

Information
Class: IceRpc.Internal.MultiplexedStreamDecorator
Assembly: IceRpc
File(s): /home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc/Internal/MultiplexedStreamDecorator.cs
Tag: 1986_28452893481
Line coverage
89%
Covered lines: 57
Uncovered lines: 7
Coverable lines: 64
Total lines: 152
Line coverage: 89%
Branch coverage
80%
Covered branches: 16
Total branches: 20
Branch coverage: 80%
Method coverage
77%
Covered methods: 24
Fully covered methods: 24
Total methods: 31
Method coverage: 77.4%
Full method coverage: 77.4%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
get_Id()100%11100%
get_IsBidirectional()100%11100%
get_IsRemote()100%210%
get_IsStarted()100%11100%
get_WritesClosed()100%11100%
get_Input()50%22100%
get_Output()50%22100%
.ctor(...)100%88100%
AdvanceTo(...)100%11100%
AdvanceTo(...)100%11100%
AsStream(...)50%22100%
CancelPendingRead()100%210%
Complete(...)100%22100%
CopyToAsync(...)100%210%
CopyToAsync(...)100%210%
ReadAsync(...)100%11100%
TryRead(...)100%11100%
ReadAtLeastAsyncCore(...)100%11100%
.ctor(...)100%11100%
get_CanGetUnflushedBytes()100%210%
get_UnflushedBytes()100%11100%
Advance(...)100%11100%
AsStream(...)50%22100%
CancelPendingFlush()100%210%
Complete(...)100%22100%
FlushAsync(...)100%11100%
GetMemory(...)100%210%
GetSpan(...)100%11100%
WriteAsync(...)100%11100%
WriteAsync(...)100%11100%
.ctor(...)100%11100%

File(s)

/home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc/Internal/MultiplexedStreamDecorator.cs

#LineLine coverage
 1// Copyright (c) ZeroC, Inc.
 2
 3using IceRpc.Transports;
 4using System.Buffers;
 5using System.IO.Pipelines;
 6
 7namespace IceRpc.Internal;
 8
 9/// <summary>Provides a multiplexed stream decorator that allows <see cref="IceRpcProtocolConnection" /> to intercept
 10/// the completion of the stream input and output.</summary>
 11internal sealed class MultiplexedStreamDecorator : IMultiplexedStream
 12{
 144213    public ulong Id => _decoratee.Id;
 14
 715415    public bool IsBidirectional => _decoratee.IsBidirectional;
 16
 017    public bool IsRemote => _decoratee.IsRemote;
 18
 1319    public bool IsStarted => _decoratee.IsStarted;
 20
 226621    public Task WritesClosed => _decoratee.WritesClosed;
 22
 223923    public PipeReader Input => _input ?? _decoratee.Input;
 24
 328225    public PipeWriter Output => _output ?? _decoratee.Output;
 26
 27    private readonly IMultiplexedStream _decoratee;
 28    private readonly PipeReader? _input;
 29    private readonly PipeWriter? _output;
 30
 31    /// <summary>Constructs a multiplexed stream decorator.</summary>
 32    /// <param name="decoratee">The decoratee.</param>
 33    /// <param name="onCompleted">An action that is executed when stream input or output is completed; it's executed
 34    /// up to 2 times for a bidirectional stream, and up to 1 time for a unidirectional stream.</param>
 286135    internal MultiplexedStreamDecorator(IMultiplexedStream decoratee, Action onCompleted)
 286136    {
 286137        _decoratee = decoratee;
 38
 286139        if (decoratee.IsBidirectional || decoratee.IsRemote)
 185040        {
 185041            _input = new InputDecorator(decoratee.Input, onCompleted);
 185042        }
 286143        if (decoratee.IsBidirectional || !decoratee.IsRemote)
 185244        {
 185245            _output = new OutputDecorator((ReadOnlySequencePipeWriter)decoratee.Output, onCompleted);
 185246        }
 286147    }
 48
 49    private class InputDecorator : PipeReader
 50    {
 51        private readonly PipeReader _decoratee;
 52        private bool _isCompleted;
 53        private readonly Action _onCompleted;
 54
 55        public override void AdvanceTo(SequencePosition consumed) =>
 191156            _decoratee.AdvanceTo(consumed);
 57
 58        public override void AdvanceTo(SequencePosition consumed, SequencePosition examined) =>
 559            _decoratee.AdvanceTo(consumed, examined);
 60
 61        // When leaveOpen is false, we use the default implementation of AsStream: we want the disposal of the stream
 62        // to call Complete on this decorator.
 63        public override Stream AsStream(bool leaveOpen = false) =>
 464            leaveOpen ? _decoratee.AsStream(leaveOpen) : base.AsStream(leaveOpen);
 65
 066        public override void CancelPendingRead() => _decoratee.CancelPendingRead();
 67
 68        public override void Complete(Exception? exception = null)
 188269        {
 188270            if (!_isCompleted)
 184671            {
 184672                _isCompleted = true;
 184673                _decoratee.Complete(exception);
 184674                _onCompleted();
 184675            }
 188276        }
 77
 78        public override Task CopyToAsync(PipeWriter destination, CancellationToken cancellationToken = default) =>
 079            _decoratee.CopyToAsync(destination, cancellationToken);
 80
 81        public override Task CopyToAsync(Stream destination, CancellationToken cancellationToken = default) =>
 082            _decoratee.CopyToAsync(destination, cancellationToken);
 83
 84        public override ValueTask<ReadResult> ReadAsync(CancellationToken cancellationToken = default) =>
 186785            _decoratee.ReadAsync(cancellationToken);
 86
 7687        public override bool TryRead(out ReadResult result) => _decoratee.TryRead(out result);
 88
 89        protected override ValueTask<ReadResult> ReadAtLeastAsyncCore(
 90            int minimumSize,
 2691            CancellationToken cancellationToken) => _decoratee.ReadAtLeastAsync(minimumSize, cancellationToken);
 92
 185093        internal InputDecorator(PipeReader decoratee, Action onCompleted)
 185094        {
 185095            _decoratee = decoratee;
 185096            _onCompleted = onCompleted;
 185097        }
 98    }
 99
 100    private class OutputDecorator : ReadOnlySequencePipeWriter
 101    {
 0102        public override bool CanGetUnflushedBytes => _decoratee.CanGetUnflushedBytes;
 103
 3682104        public override long UnflushedBytes => _decoratee.UnflushedBytes;
 105
 106        private readonly ReadOnlySequencePipeWriter _decoratee;
 107        private bool _isCompleted;
 108        private readonly Action _onCompleted;
 109
 8560110        public override void Advance(int bytes) => _decoratee.Advance(bytes);
 111
 112        // When leaveOpen is false, we use the default implementation of AsStream: we want the disposal of the stream
 113        // to call Complete on this decorator.
 114        public override Stream AsStream(bool leaveOpen = false) =>
 4115            leaveOpen ? _decoratee.AsStream(leaveOpen) : base.AsStream(leaveOpen);
 116
 0117        public override void CancelPendingFlush() => _decoratee.CancelPendingFlush();
 118
 119        public override void Complete(Exception? exception = null)
 1856120        {
 1856121            if (!_isCompleted)
 1852122            {
 1852123                _isCompleted = true;
 1852124                _decoratee.Complete(exception);
 1852125                _onCompleted();
 1852126            }
 1856127        }
 128
 129        public override ValueTask<FlushResult> FlushAsync(CancellationToken cancellationToken = default) =>
 9130            _decoratee.FlushAsync(cancellationToken);
 131
 0132        public override Memory<byte> GetMemory(int sizeHint = 0) => _decoratee.GetMemory(sizeHint);
 133
 8562134        public override Span<byte> GetSpan(int sizeHint = 0) => _decoratee.GetSpan(sizeHint);
 135
 136        public override ValueTask<FlushResult> WriteAsync(
 137            ReadOnlyMemory<byte> source,
 8138            CancellationToken cancellationToken = default) => _decoratee.WriteAsync(source, cancellationToken);
 139
 140        public override ValueTask<FlushResult> WriteAsync(
 141            ReadOnlySequence<byte> source,
 142            bool endStream,
 143            CancellationToken cancellationToken = default) =>
 1832144            _decoratee.WriteAsync(source, endStream, cancellationToken);
 145
 1852146        internal OutputDecorator(ReadOnlySequencePipeWriter decoratee, Action onCompleted)
 1852147        {
 1852148            _decoratee = decoratee;
 1852149            _onCompleted = onCompleted;
 1852150        }
 151    }
 152}