< Summary

Information
Class: Ice.LoggerI
Assembly: Ice
File(s): /home/runner/work/ice/ice/csharp/src/Ice/LoggerI.cs
Tag: 71_18251537082
Line coverage
75%
Covered lines: 30
Uncovered lines: 10
Coverable lines: 40
Total lines: 226
Line coverage: 75%
Branch coverage
100%
Covered branches: 2
Total branches: 2
Branch coverage: 100%
Method coverage
62%
Covered methods: 5
Total methods: 8
Method coverage: 62.5%

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
print(...)100%210%
trace(...)100%11100%
warning(...)100%11100%
error(...)100%210%
getPrefix()100%210%
.ctor(...)100%22100%
format(...)100%11100%
.cctor()100%11100%

File(s)

/home/runner/work/ice/ice/csharp/src/Ice/LoggerI.cs

#LineLine coverage
 1// Copyright (c) ZeroC, Inc.
 2
 3#nullable enable
 4
 5using System.Diagnostics;
 6using System.Globalization;
 7
 8namespace Ice;
 9
 10internal abstract class LoggerI : Logger
 11{
 12    public void print(string message)
 13    {
 014        lock (_globalMutex)
 15        {
 016            write(message);
 017        }
 018    }
 19
 20    public virtual void trace(string category, string message)
 21    {
 122        string s = format("--", category, message);
 123        lock (_globalMutex)
 24        {
 125            write(s);
 126        }
 127    }
 28
 29    public virtual void warning(string message)
 30    {
 131        string s = format("-!", "warning", message);
 132        lock (_globalMutex)
 33        {
 134            write(s);
 135        }
 136    }
 37
 38    public virtual void error(string message)
 39    {
 040        string s = format("!!", "error", message);
 041        lock (_globalMutex)
 42        {
 043            write(s);
 044        }
 045    }
 46
 047    public string getPrefix() => _prefix;
 48
 49    public abstract Logger cloneWithPrefix(string prefix);
 50
 51    protected abstract void write(string message);
 52
 153    internal LoggerI(string prefix)
 54    {
 155        _prefix = prefix;
 56
 157        if (prefix.Length > 0)
 58        {
 159            _formattedPrefix = prefix + ": ";
 60        }
 61
 162        _date = "d";
 163        _time = "HH:mm:ss:fff";
 164    }
 65
 66    private string format(string prefix, string category, string message)
 67    {
 168        var s = new System.Text.StringBuilder(prefix);
 169        s.Append(' ');
 170        s.Append(System.DateTime.Now.ToString(_date, CultureInfo.CurrentCulture));
 171        s.Append(' ');
 172        s.Append(System.DateTime.Now.ToString(_time, CultureInfo.CurrentCulture));
 173        s.Append(' ');
 174        s.Append(_formattedPrefix);
 175        s.Append(category);
 176        s.Append(": ");
 177        s.Append(message);
 178        s.Replace("\n", "\n   ");
 179        return s.ToString();
 80    }
 81
 182    internal static object _globalMutex = new object();
 83    internal readonly string _prefix;
 84    internal readonly string? _formattedPrefix;
 85    internal string _date;
 86    internal string _time;
 87}
 88
 89internal sealed class ConsoleLoggerI : LoggerI
 90{
 91    public override Logger cloneWithPrefix(string prefix) => new ConsoleLoggerI(prefix);
 92
 93    protected override void write(string message) => System.Console.Error.WriteLine(message);
 94
 95    internal ConsoleLoggerI(string prefix)
 96        : base(prefix)
 97    {
 98        _date = "d";
 99        _time = "HH:mm:ss:fff";
 100    }
 101}
 102
 103#pragma warning disable CA1001 // _writer is disposed by destroy.
 104internal sealed class FileLoggerI : LoggerI
 105#pragma warning restore CA1001
 106{
 107    public override Logger cloneWithPrefix(string prefix) => new FileLoggerI(prefix, _file);
 108
 109    public void destroy()
 110    {
 111        _writer.Close();
 112        _writer.Dispose();
 113    }
 114
 115    protected override void write(string message)
 116    {
 117        _writer.WriteLine(message);
 118        _writer.Flush();
 119    }
 120
 121    internal FileLoggerI(string prefix, string file)
 122        : base(prefix)
 123    {
 124        _file = file;
 125        _writer = new StreamWriter(new FileStream(file, FileMode.Append, FileAccess.Write, FileShare.ReadWrite));
 126    }
 127
 128    private readonly string _file;
 129    private readonly TextWriter _writer;
 130}
 131
 132internal class ConsoleListener : TraceListener
 133{
 134    public override bool IsThreadSafe => true;
 135
 136    public override void TraceEvent(
 137        TraceEventCache? cache,
 138        string source,
 139        TraceEventType type,
 140        int id,
 141        string? message)
 142    {
 143        System.Text.StringBuilder s;
 144        if (type == TraceEventType.Error)
 145        {
 146            s = new System.Text.StringBuilder("!!");
 147        }
 148        else if (type == TraceEventType.Warning)
 149        {
 150            s = new System.Text.StringBuilder("-!");
 151        }
 152        else
 153        {
 154            s = new System.Text.StringBuilder("--");
 155        }
 156        s.Append(' ');
 157        s.Append(System.DateTime.Now.ToString(_date, CultureInfo.CurrentCulture));
 158        s.Append(' ');
 159        s.Append(System.DateTime.Now.ToString(_time, CultureInfo.CurrentCulture));
 160        s.Append(' ');
 161        s.Append(message);
 162        WriteLine(s.ToString());
 163    }
 164
 165    public override void Write(string? message) => System.Console.Error.Write(message);
 166
 167    public override void WriteLine(string? message) => System.Console.Error.WriteLine(message);
 168
 169    internal const string _date = "d";
 170    internal const string _time = "HH:mm:ss:fff";
 171}
 172
 173internal sealed class TraceLoggerI : LoggerI
 174{
 175    public override void trace(string category, string message)
 176    {
 177        Trace.TraceInformation(format(category, message));
 178        Trace.Flush();
 179    }
 180
 181    public override void warning(string message)
 182    {
 183        Trace.TraceWarning(format("warning", message));
 184        Trace.Flush();
 185    }
 186
 187    public override void error(string message)
 188    {
 189        string s = format("error", message);
 190        {
 191            Trace.TraceError(s);
 192            Trace.Flush();
 193        }
 194    }
 195
 196    public override Logger cloneWithPrefix(string prefix) => new TraceLoggerI(prefix, _console);
 197
 198    protected override void write(string message)
 199    {
 200        Trace.WriteLine(message);
 201        Trace.Flush();
 202    }
 203
 204    internal TraceLoggerI(string prefix, bool console)
 205        : base(prefix)
 206    {
 207        _console = console;
 208        if (console && !Trace.Listeners.Contains(_consoleListener))
 209        {
 210            Trace.Listeners.Add(_consoleListener);
 211        }
 212    }
 213
 214    private string format(string category, string message)
 215    {
 216        var s = new System.Text.StringBuilder(_formattedPrefix);
 217        s.Append(category);
 218        s.Append(": ");
 219        s.Append(message);
 220        s.Replace("\n", "\n   ");
 221        return s.ToString();
 222    }
 223
 224    private readonly bool _console;
 225    internal static ConsoleListener _consoleListener = new ConsoleListener();
 226}