InternalTrace
InternalTrace provides facilities for tracing the execution
of the NUnit framework. Tests and classes under test may make use
of Console writes, System.Diagnostics.Trace or various loggers and
NUnit itself traps and processes each of them. For that reason, a
separate internal trace is needed.
Note:
InternalTrace uses a global lock to allow multiple threads to write
trace messages. This can easily make it a bottleneck so it must be
used sparingly. Keep the trace Level as low as possible and only
insert InternalTrace writes where they are needed.
TODO: add some buffering and a separate writer thread as an option.
TODO: figure out a way to turn on trace in specific classes only.
using System;
using System.IO;
using System.Runtime.CompilerServices;
namespace NUnit.Framework.Internal
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(0)]
public static class InternalTrace
{
private static InternalTraceLevel _traceLevel;
[System.Runtime.CompilerServices.Nullable(2)]
private static InternalTraceWriter _traceWriter;
public static bool Initialized => _traceWriter != null;
public static void Initialize(string logName, InternalTraceLevel level)
{
if (_traceWriter == null) {
_traceLevel = level;
if (_traceLevel > InternalTraceLevel.Off) {
_traceWriter = new InternalTraceWriter(logName);
_traceWriter.WriteLine("InternalTrace: Initializing to level {0}", _traceLevel);
}
} else {
InternalTraceWriter traceWriter = _traceWriter;
DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(73, 2);
defaultInterpolatedStringHandler.AppendLiteral("InternalTrace: Ignoring attempted re-initialization from level ");
defaultInterpolatedStringHandler.AppendFormatted(_traceLevel);
defaultInterpolatedStringHandler.AppendLiteral(" to level ");
defaultInterpolatedStringHandler.AppendFormatted(level);
traceWriter.WriteLine(defaultInterpolatedStringHandler.ToStringAndClear());
}
}
public static void Initialize(TextWriter writer, InternalTraceLevel level)
{
DefaultInterpolatedStringHandler defaultInterpolatedStringHandler;
if (_traceWriter == null) {
_traceLevel = level;
if (_traceLevel > InternalTraceLevel.Off) {
_traceWriter = new InternalTraceWriter(writer);
InternalTraceWriter traceWriter = _traceWriter;
defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(37, 1);
defaultInterpolatedStringHandler.AppendLiteral("InternalTrace: Initializing to level ");
defaultInterpolatedStringHandler.AppendFormatted(_traceLevel);
traceWriter.WriteLine(defaultInterpolatedStringHandler.ToStringAndClear());
}
} else {
InternalTraceWriter traceWriter2 = _traceWriter;
defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(73, 2);
defaultInterpolatedStringHandler.AppendLiteral("InternalTrace: Ignoring attempted re-initialization from level ");
defaultInterpolatedStringHandler.AppendFormatted(_traceLevel);
defaultInterpolatedStringHandler.AppendLiteral(" to level ");
defaultInterpolatedStringHandler.AppendFormatted(level);
traceWriter2.WriteLine(defaultInterpolatedStringHandler.ToStringAndClear());
}
}
public static Logger GetLogger(string name)
{
return new Logger(name, _traceLevel, _traceWriter);
}
public static Logger GetLogger(Type type)
{
return GetLogger(type.FullName());
}
}
}