cs-codex-dist-tests/Logging/BaseLog.cs

122 lines
3.2 KiB
C#
Raw Normal View History

using Utils;
2023-04-25 09:31:15 +00:00
namespace Logging
2023-04-14 12:53:39 +00:00
{
public abstract class BaseLog
{
2023-06-28 13:11:20 +00:00
private readonly NumberSource subfileNumberSource = new NumberSource(0);
private readonly bool debug;
private readonly List<BaseLogStringReplacement> replacements = new List<BaseLogStringReplacement>();
2023-04-14 12:53:39 +00:00
private bool hasFailed;
private LogFile? logFile;
2023-04-25 09:31:15 +00:00
protected BaseLog(bool debug)
{
this.debug = debug;
}
2023-06-28 13:11:20 +00:00
protected abstract string GetFullName();
2023-04-14 12:53:39 +00:00
2023-06-28 13:11:20 +00:00
public LogFile LogFile
2023-04-14 12:53:39 +00:00
{
get
{
2023-07-18 09:04:14 +00:00
if (logFile == null)
{
logFile = new LogFile(GetFullName(), "log");
WriteLogTag();
}
2023-04-14 12:53:39 +00:00
return logFile;
}
}
2023-06-28 13:11:20 +00:00
public virtual void EndTest()
{
}
2023-06-22 08:17:12 +00:00
public virtual void Log(string message)
2023-04-14 12:53:39 +00:00
{
LogFile.Write(ApplyReplacements(message));
2023-04-14 12:53:39 +00:00
}
2023-06-22 08:17:12 +00:00
public virtual void Debug(string message = "", int skipFrames = 0)
2023-04-25 09:31:15 +00:00
{
if (debug)
{
var callerName = DebugStack.GetCallerName(skipFrames);
// We don't use Log because in the debug output we should not have any replacements.
LogFile.Write($"(debug)({callerName}) {message}");
2023-04-25 09:31:15 +00:00
}
}
2023-06-22 08:17:12 +00:00
public virtual void Error(string message)
2023-04-14 12:53:39 +00:00
{
Log($"[ERROR] {message}");
}
2023-06-22 08:17:12 +00:00
public virtual void MarkAsFailed()
2023-04-14 12:53:39 +00:00
{
if (hasFailed) return;
hasFailed = true;
LogFile.ConcatToFilename("_FAILED");
}
2023-06-22 08:17:12 +00:00
public virtual void AddStringReplace(string from, string to)
{
if (string.IsNullOrWhiteSpace(from)) return;
replacements.Add(new BaseLogStringReplacement(from, to));
}
2023-06-22 08:17:12 +00:00
public virtual void Delete()
{
File.Delete(LogFile.FullFilename);
}
2023-06-28 13:11:20 +00:00
public LogFile CreateSubfile(string ext = "log")
{
return new LogFile($"{GetFullName()}_{GetSubfileNumber()}", ext);
}
2023-07-18 09:04:14 +00:00
private void WriteLogTag()
{
var runId = NameUtils.GetRunId();
var category = NameUtils.GetCategoryName();
var name = NameUtils.GetTestMethodName();
LogFile.WriteRaw($"{runId} {category} {name}");
}
private string ApplyReplacements(string str)
{
foreach (var replacement in replacements)
{
str = replacement.Apply(str);
}
return str;
}
2023-06-28 13:11:20 +00:00
private string GetSubfileNumber()
{
return subfileNumberSource.GetNextNumber().ToString().PadLeft(6, '0');
}
}
public class BaseLogStringReplacement
{
private readonly string from;
private readonly string to;
public BaseLogStringReplacement(string from, string to)
{
this.from = from;
this.to = to;
if (string.IsNullOrEmpty(from) || string.IsNullOrEmpty(to) || from == to) throw new ArgumentException();
}
public string Apply(string msg)
{
return msg.Replace(from, to);
}
2023-04-14 12:53:39 +00:00
}
}