< Summary

Information
Class: Ice.Internal.TraceUtil
Assembly: Ice
File(s): /home/runner/work/ice/ice/csharp/src/Ice/Internal/TraceUtil.cs
Tag: 71_18251537082
Line coverage
87%
Covered lines: 130
Uncovered lines: 18
Coverable lines: 148
Total lines: 337
Line coverage: 87.8%
Branch coverage
89%
Covered branches: 34
Total branches: 38
Branch coverage: 89.4%
Method coverage
92%
Covered methods: 12
Total methods: 13
Method coverage: 92.3%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
traceSend(...)100%22100%
traceRecv(...)100%22100%
trace(...)100%22100%
.cctor()100%210%
traceSlicing(...)0%620%
printIdentityFacetOperation(...)100%2.01284.62%
printRequest(...)100%22100%
printBatchRequest(...)100%22100%
printReply(...)100%22100%
printRequestHeader(...)100%6.04689.47%
printHeader(...)100%1188%
printMessage(...)90%10.021093.75%
getMessageTypeAsString(...)83.33%6.05688.89%

File(s)

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

#LineLine coverage
 1// Copyright (c) ZeroC, Inc.
 2
 3using System.Diagnostics;
 4using System.Globalization;
 5
 6namespace Ice.Internal;
 7
 8internal sealed class TraceUtil
 9{
 10    internal static void traceSend(
 11        OutputStream str,
 12        Instance instance,
 13        ConnectionI connection,
 14        Logger logger,
 15        TraceLevels tl)
 16    {
 117        if (tl.protocol >= 1)
 18        {
 119            int p = str.pos();
 120            var iss = new Ice.InputStream(instance, str.getEncoding(), str.getBuffer(), false);
 121            iss.pos(0);
 22
 123            using (var s = new System.IO.StringWriter(CultureInfo.CurrentCulture))
 24            {
 125                byte type = printMessage(s, iss, connection);
 26
 127                logger.trace(tl.protocolCat, "sending " + getMessageTypeAsString(type) + " " + s.ToString());
 128            }
 129            str.pos(p);
 30        }
 131    }
 32
 33    internal static void traceRecv(Ice.InputStream str, ConnectionI connection, Ice.Logger logger, TraceLevels tl)
 34    {
 135        if (tl.protocol >= 1)
 36        {
 137            int p = str.pos();
 138            str.pos(0);
 39
 140            using (var s = new System.IO.StringWriter(CultureInfo.CurrentCulture))
 41            {
 142                byte type = printMessage(s, str, connection);
 43
 144                logger.trace(tl.protocolCat, "received " + getMessageTypeAsString(type) + " " + s.ToString());
 145            }
 146            str.pos(p);
 47        }
 148    }
 49
 50    internal static void trace(string heading, InputStream str, ConnectionI connection, Logger logger, TraceLevels tl)
 51    {
 152        if (tl.protocol >= 1)
 53        {
 154            int p = str.pos();
 155            str.pos(0);
 56
 157            using (var s = new StringWriter(CultureInfo.CurrentCulture))
 58            {
 159                s.Write(heading);
 160                printMessage(s, str, connection);
 61
 162                logger.trace(tl.protocolCat, s.ToString());
 163            }
 164            str.pos(p);
 65        }
 166    }
 67
 068    private static readonly HashSet<string> slicingIds = new();
 69
 70    internal static void traceSlicing(string kind, string typeId, string slicingCat, Ice.Logger logger)
 71    {
 072        lock (_globalMutex)
 73        {
 074            if (slicingIds.Add(typeId))
 75            {
 076                using var s = new StringWriter(CultureInfo.CurrentCulture);
 077                s.Write("unknown " + kind + " type `" + typeId + "'");
 078                logger.trace(slicingCat, s.ToString());
 79            }
 080        }
 081    }
 82
 83    private static void printIdentityFacetOperation(System.IO.StringWriter s, Ice.InputStream str)
 84    {
 85        try
 86        {
 187            Ice.ToStringMode toStringMode = str.instance().toStringMode();
 88
 189            var identity = new Ice.Identity(str);
 190            s.Write("\nidentity = " + Ice.Util.identityToString(identity, toStringMode));
 91
 192            string[] facet = str.readStringSeq();
 193            s.Write("\nfacet = ");
 194            if (facet.Length > 0)
 95            {
 196                s.Write(Ice.UtilInternal.StringUtil.escapeString(facet[0], "", toStringMode));
 97            }
 98
 199            string operation = str.readString();
 1100            s.Write("\noperation = " + operation);
 1101        }
 0102        catch (System.IO.IOException)
 103        {
 104            Debug.Assert(false);
 0105        }
 1106    }
 107
 108    private static void printRequest(System.IO.StringWriter s, Ice.InputStream str)
 109    {
 1110        int requestId = str.readInt();
 1111        s.Write("\nrequest id = " + requestId);
 1112        if (requestId == 0)
 113        {
 1114            s.Write(" (oneway)");
 115        }
 116
 1117        printRequestHeader(s, str);
 1118    }
 119
 120    private static void printBatchRequest(System.IO.StringWriter s, Ice.InputStream str)
 121    {
 1122        int batchRequestNum = str.readInt();
 1123        s.Write("\nnumber of requests = " + batchRequestNum);
 124
 1125        for (int i = 0; i < batchRequestNum; ++i)
 126        {
 1127            s.Write("\nrequest #" + i + ':');
 1128            printRequestHeader(s, str);
 129        }
 1130    }
 131
 132    private static void printReply(System.IO.StringWriter s, Ice.InputStream str)
 133    {
 1134        int requestId = str.readInt();
 1135        s.Write("\nrequest id = " + requestId);
 136
 137        // We can't (shouldn't) use the generated code to unmarshal a possibly unknown reply status.
 1138        var replyStatus = (ReplyStatus)str.readByte();
 1139        s.Write("\nreply status = ");
 1140        s.Write(replyStatus);
 141
 142        switch (replyStatus)
 143        {
 144            case ReplyStatus.Ok:
 145            case ReplyStatus.UserException:
 1146                EncodingVersion v = str.skipEncapsulation();
 1147                if (v != Ice.Util.Encoding_1_0)
 148                {
 1149                    s.Write("\nencoding = ");
 1150                    s.Write(Ice.Util.encodingVersionToString(v));
 151                }
 1152                break;
 153
 154            case ReplyStatus.ObjectNotExist:
 155            case ReplyStatus.FacetNotExist:
 156            case ReplyStatus.OperationNotExist:
 1157                printIdentityFacetOperation(s, str);
 1158                break;
 159
 160            default:
 1161                string message = str.readString();
 1162                s.Write("\nmessage = ");
 1163                s.Write(message);
 164                break;
 165        }
 1166    }
 167
 168    private static void printRequestHeader(System.IO.StringWriter s, Ice.InputStream str)
 169    {
 1170        printIdentityFacetOperation(s, str);
 171
 172        try
 173        {
 1174            byte mode = str.readByte();
 1175            s.Write("\nmode = " + ((OperationMode)mode).ToString());
 176
 1177            int sz = str.readSize();
 1178            s.Write("\ncontext = ");
 1179            while (sz-- > 0)
 180            {
 1181                string key = str.readString();
 1182                string val = str.readString();
 1183                s.Write(key + '/' + val);
 1184                if (sz > 0)
 185                {
 1186                    s.Write(", ");
 187                }
 188            }
 189
 1190            Ice.EncodingVersion v = str.skipEncapsulation();
 1191            if (!v.Equals(Ice.Util.Encoding_1_0))
 192            {
 1193                s.Write("\nencoding = ");
 1194                s.Write(Ice.Util.encodingVersionToString(v));
 195            }
 1196        }
 0197        catch (System.IO.IOException)
 198        {
 199            Debug.Assert(false);
 0200        }
 1201    }
 202
 203    private static byte printHeader(System.IO.StringWriter s, Ice.InputStream str)
 204    {
 205        try
 206        {
 1207            str.readByte(); // Don't bother printing the magic number
 1208            str.readByte();
 1209            str.readByte();
 1210            str.readByte();
 211
 212            /* byte pMajor = */
 1213            str.readByte();
 214            /* byte pMinor = */
 1215            str.readByte();
 216            // s.Write("\nprotocol version = " + (int)pMajor + "." + (int)pMinor);
 217
 218            /* byte eMajor = */
 1219            str.readByte();
 220            /* byte eMinor = */
 1221            str.readByte();
 222            // s.Write("\nencoding version = " + (int)eMajor + "." + (int)eMinor);
 223
 1224            byte type = str.readByte();
 1225            s.Write("\nmessage type = " + (int)type + " (" + getMessageTypeAsString(type) + ')');
 226
 1227            byte compress = str.readByte();
 1228            s.Write("\ncompression status = " + (int)compress + ' ');
 229            switch (compress)
 230            {
 231                case 0:
 232                {
 1233                    s.Write("(not compressed; do not compress response, if any)");
 1234                    break;
 235                }
 236
 237                case 1:
 238                {
 1239                    s.Write("(not compressed; compress response, if any)");
 1240                    break;
 241                }
 242
 243                case 2:
 244                {
 1245                    s.Write("(compressed; compress response, if any)");
 1246                    break;
 247                }
 248
 249                default:
 250                {
 0251                    s.Write("(unknown)");
 252                    break;
 253                }
 254            }
 255
 1256            int size = str.readInt();
 1257            s.Write("\nmessage size = " + size);
 1258            return type;
 259        }
 0260        catch (System.IO.IOException)
 261        {
 262            Debug.Assert(false);
 0263            return 0;
 264        }
 1265    }
 266
 267    private static byte printMessage(System.IO.StringWriter s, Ice.InputStream str, ConnectionI connection)
 268    {
 1269        byte type = printHeader(s, str);
 270
 271        switch (type)
 272        {
 273            case Protocol.closeConnectionMsg:
 274            case Protocol.validateConnectionMsg:
 275            {
 276                // We're done.
 277                break;
 278            }
 279
 280            case Protocol.requestMsg:
 281            {
 1282                printRequest(s, str);
 1283                break;
 284            }
 285
 286            case Protocol.requestBatchMsg:
 287            {
 1288                printBatchRequest(s, str);
 1289                break;
 290            }
 291
 292            case Protocol.replyMsg:
 293            {
 1294                printReply(s, str);
 1295                break;
 296            }
 297
 298            default:
 299            {
 0300                s.Write("(unknown)");
 301                break;
 302            }
 303        }
 304
 1305        if (connection is not null)
 306        {
 1307            s.Write("\ntransport = " + connection.type() + "\n");
 1308            string connectionId = connection.endpoint().connectionId();
 1309            if (connectionId.Length > 0)
 310            {
 1311                s.Write("connection ID = " + connectionId + "\n");
 312            }
 1313            s.Write(connection.ToString());
 314        }
 315        else
 316        {
 1317            s.Write("\ncollocated = true");
 318        }
 319
 1320        return type;
 321    }
 322
 323    private static string getMessageTypeAsString(byte type)
 324    {
 1325        return type switch
 1326        {
 1327            Protocol.requestMsg => "request",
 1328            Protocol.requestBatchMsg => "batch request",
 1329            Protocol.replyMsg => "reply",
 1330            Protocol.closeConnectionMsg => "close connection",
 1331            Protocol.validateConnectionMsg => "validate connection",
 0332            _ => "unknown",
 1333        };
 334    }
 335
 0336    private static readonly object _globalMutex = new object();
 337}