< Summary

Information
Class: IceRpc.Internal.MultiplexedStreamDecorator
Assembly: IceRpc
File(s): /home/runner/work/icerpc-csharp/icerpc-csharp/src/IceRpc/Internal/MultiplexedStreamDecorator.cs
Tag: 275_13775359185
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
Total methods: 31
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{
 280913    public ulong Id => _decoratee.Id;
 14
 1394715    public bool IsBidirectional => _decoratee.IsBidirectional;
 16
 017    public bool IsRemote => _decoratee.IsRemote;
 18
 2619    public bool IsStarted => _decoratee.IsStarted;
 20
 431921    public Task WritesClosed => _decoratee.WritesClosed;
 22
 426923    public PipeReader Input => _input ?? _decoratee.Input;
 24
 635725    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>
 558235    internal MultiplexedStreamDecorator(IMultiplexedStream decoratee, Action onCompleted)
 558236    {
 558237        _decoratee = decoratee;
 38
 558239        if (decoratee.IsBidirectional || decoratee.IsRemote)
 355840        {
 355841            _input = new InputDecorator(decoratee.Input, onCompleted);
 355842        }
 558243        if (decoratee.IsBidirectional || !decoratee.IsRemote)
 356244        {
 356245            _output = new OutputDecorator((ReadOnlySequencePipeWriter)decoratee.Output, onCompleted);
 356246        }
 558247    }
 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) =>
 358956            _decoratee.AdvanceTo(consumed);
 57
 58        public override void AdvanceTo(SequencePosition consumed, SequencePosition examined) =>
 859            _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)
 358669        {
 358670            if (!_isCompleted)
 355071            {
 355072                _isCompleted = true;
 355073                _decoratee.Complete(exception);
 355074                _onCompleted();
 355075            }
 358676        }
 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) =>
 358885            _decoratee.ReadAsync(cancellationToken);
 86
 7187        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
 355893        internal InputDecorator(PipeReader decoratee, Action onCompleted)
 355894        {
 355895            _decoratee = decoratee;
 355896            _onCompleted = onCompleted;
 355897        }
 98    }
 99
 100    private class OutputDecorator : ReadOnlySequencePipeWriter
 101    {
 0102        public override bool CanGetUnflushedBytes => _decoratee.CanGetUnflushedBytes;
 103
 7080104        public override long UnflushedBytes => _decoratee.UnflushedBytes;
 105
 106        private readonly ReadOnlySequencePipeWriter _decoratee;
 107        private bool _isCompleted;
 108        private readonly Action _onCompleted;
 109
 16428110        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)
 3571120        {
 3571121            if (!_isCompleted)
 3562122            {
 3562123                _isCompleted = true;
 3562124                _decoratee.Complete(exception);
 3562125                _onCompleted();
 3562126            }
 3571127        }
 128
 129        public override ValueTask<FlushResult> FlushAsync(CancellationToken cancellationToken = default) =>
 13130            _decoratee.FlushAsync(cancellationToken);
 131
 0132        public override Memory<byte> GetMemory(int sizeHint = 0) => _decoratee.GetMemory(sizeHint);
 133
 16432134        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) =>
 3532144            _decoratee.WriteAsync(source, endStream, cancellationToken);
 145
 3562146        internal OutputDecorator(ReadOnlySequencePipeWriter decoratee, Action onCompleted)
 3562147        {
 3562148            _decoratee = decoratee;
 3562149            _onCompleted = onCompleted;
 3562150        }
 151    }
 152}