blob: c9b688b377ea676b7e5cfd29600468330358d569 [file] [log] [blame]
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using log4net;
using log4net.Config;
const int NoError = 0;
const int MissingLogs = 1;
const int OverwrittenLogs = 2;
var appPath = new Uri(Assembly.GetExecutingAssembly().Location).LocalPath;
var appFolder = Path.GetDirectoryName(appPath);
if (appFolder is null)
{
throw new InvalidOperationException($"Can't determine app folder for {appPath}");
}
var logFolder = Path.Combine(appFolder, "Logs");
if (Directory.Exists(logFolder))
{
Directory.Delete(logFolder, recursive: true);
}
var configFile = Path.Combine(appFolder, "log4net.config");
if (!File.Exists(configFile))
{
throw new InvalidOperationException($"log4net.config not found at {configFile}");
}
var logCount = 10;
var identifiers = new List<Guid>();
for (var i = 0; i < 10; i++)
{
var identifier = Guid.NewGuid();
identifiers.Add(identifier);
var logged = LogWith(identifier, logCount);
if (logged != logCount)
{
Die($"Missing logs immediately for '{identifier}' - found {logged}/{logCount}", MissingLogs);
}
}
foreach (var identifier in identifiers)
{
var logged = CountIdentifierInLogs(identifier);
if (logged != logCount)
{
Die($"Logs have been overwritten for '{identifier}' - found {logged}/{logCount}", OverwrittenLogs);
}
}
Console.WriteLine("All good: LOG4NET-672 is resolved");
return NoError;
void Die(string message, int exitCode)
{
Console.Error.WriteLine(message);
Environment.Exit(exitCode);
}
int CountIdentifierInLogs(Guid id)
{
return Directory.EnumerateFiles("Logs").Select(
filePath => CountIdentifierInFile(id, filePath)
).Sum();
}
int CountIdentifierInFile(Guid id, string filePath)
{
var contents = File.ReadAllLines(filePath);
return contents.Count(line => line.Contains(id.ToString(), StringComparison.Ordinal));
}
int LogWith(Guid identifier, int howManyLogs)
{
var info = new FileInfo(configFile);
XmlConfigurator.Configure(info);
var logger = LogManager.GetLogger("main");
for (var i = 0; i < howManyLogs; i++)
{
logger.Info($"test log {i} [{identifier}]");
}
LogManager.Flush(int.MaxValue);
return CountIdentifierInLogs(identifier);
}