< Summary

Information
Class: Ice.Internal.ObserverMiddleware
Assembly: Ice
File(s): /home/runner/work/ice/ice/csharp/src/Ice/Internal/ObserverMiddleware.cs
Tag: 71_18251537082
Line coverage
100%
Covered lines: 22
Uncovered lines: 0
Coverable lines: 22
Total lines: 71
Line coverage: 100%
Branch coverage
90%
Covered branches: 9
Total branches: 10
Branch coverage: 90%
Method coverage
100%
Covered methods: 3
Total methods: 3
Method coverage: 100%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
dispatchAsync(...)100%22100%
performDispatchAsync()87.5%88100%
.ctor(...)100%11100%

File(s)

/home/runner/work/ice/ice/csharp/src/Ice/Internal/ObserverMiddleware.cs

#LineLine coverage
 1// Copyright (c) ZeroC, Inc.
 2
 3#nullable enable
 4
 5using Ice.Instrumentation;
 6
 7namespace Ice.Internal;
 8
 9/// <summary>A middleware that observes dispatches.</summary>
 10internal sealed class ObserverMiddleware : Object
 11{
 12    private readonly Object _next;
 13    private readonly CommunicatorObserver _communicatorObserver;
 14
 15    public ValueTask<OutgoingResponse> dispatchAsync(IncomingRequest request)
 16    {
 117        return _communicatorObserver.getDispatchObserver(request.current, request.size) is DispatchObserver observer ?
 118            performDispatchAsync(observer) :
 119            _next.dispatchAsync(request);
 20
 21        async ValueTask<OutgoingResponse> performDispatchAsync(DispatchObserver observer)
 22        {
 123            observer.attach();
 24            try
 25            {
 26                OutgoingResponse response;
 27                try
 28                {
 129                    response = await _next.dispatchAsync(request).ConfigureAwait(false);
 130                }
 131                catch (System.Exception ex)
 32                {
 33                    // We need to marshal the exception into the response immediately to observe the response size.
 134                    response = request.current.createOutgoingResponse(ex);
 135                }
 36
 137                switch (response.replyStatus)
 38                {
 39                    case ReplyStatus.Ok:
 40                        // don't do anything
 41                        break;
 42
 43                    case ReplyStatus.UserException:
 144                        observer.userException();
 145                        break;
 46
 47                    default:
 148                        observer.failed(response.exceptionId ?? "");
 49                        break;
 50                }
 51
 152                if (request.current.requestId != 0)
 53                {
 154                    observer.reply(response.size);
 55                }
 56
 157                return response;
 58            }
 59            finally
 60            {
 161                observer.detach();
 62            }
 163        }
 64    }
 65
 166    internal ObserverMiddleware(Object next, CommunicatorObserver communicatorObserver)
 67    {
 168        _next = next;
 169        _communicatorObserver = communicatorObserver;
 170    }
 71}