2023-04-30 08:56:19 +00:00
|
|
|
|
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);
|
2023-04-30 08:56:19 +00:00
|
|
|
|
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
|
|
|
|
{
|
2023-04-30 08:56:19 +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);
|
2023-04-30 08:56:19 +00:00
|
|
|
|
// 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-04-30 08:56:19 +00:00
|
|
|
|
|
2023-06-22 08:17:12 +00:00
|
|
|
|
public virtual void AddStringReplace(string from, string to)
|
2023-04-30 08:56:19 +00:00
|
|
|
|
{
|
2023-05-31 12:49:06 +00:00
|
|
|
|
if (string.IsNullOrWhiteSpace(from)) return;
|
2023-04-30 08:56:19 +00:00
|
|
|
|
replacements.Add(new BaseLogStringReplacement(from, to));
|
|
|
|
|
}
|
|
|
|
|
|
2023-06-22 08:17:12 +00:00
|
|
|
|
public virtual void Delete()
|
2023-06-21 09:01:48 +00:00
|
|
|
|
{
|
|
|
|
|
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}");
|
|
|
|
|
}
|
|
|
|
|
|
2023-04-30 08:56:19 +00:00
|
|
|
|
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');
|
|
|
|
|
}
|
2023-04-30 08:56:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|
|
|
|
|
}
|