diff --git a/src/LogExpert.Core/Classes/Log/LogfileReader.cs b/src/LogExpert.Core/Classes/Log/LogfileReader.cs index 9e2495d9..e520102a 100644 --- a/src/LogExpert.Core/Classes/Log/LogfileReader.cs +++ b/src/LogExpert.Core/Classes/Log/LogfileReader.cs @@ -150,7 +150,7 @@ private LogfileReader ( ILogFileInfo fileInfo = null; - IsMultiFile = multiFile || fileNames.Length == 1; + IsMultiFile = multiFile; _fileName = fileNames[0]; IEnumerable names = IsMultiFile @@ -1964,4 +1964,4 @@ PinHandle IBufferPinning.PinRange (int startLine, int endLine) } #endregion -} \ No newline at end of file +} diff --git a/src/LogExpert.Tests/LogExpert.Tests.csproj b/src/LogExpert.Tests/LogExpert.Tests.csproj index d8bfb785..6747becb 100644 --- a/src/LogExpert.Tests/LogExpert.Tests.csproj +++ b/src/LogExpert.Tests/LogExpert.Tests.csproj @@ -101,10 +101,16 @@ PreserveNewest - - PreserveNewest - - + + PreserveNewest + + + PreserveNewest + + + PreserveNewest + + PreserveNewest diff --git a/src/LogExpert.Tests/StreamReaderTests/LogfileReaderMultiFileFlagTests.cs b/src/LogExpert.Tests/StreamReaderTests/LogfileReaderMultiFileFlagTests.cs new file mode 100644 index 00000000..5522313d --- /dev/null +++ b/src/LogExpert.Tests/StreamReaderTests/LogfileReaderMultiFileFlagTests.cs @@ -0,0 +1,109 @@ +using System.Text; + +using LogExpert.Core.Classes.Log; +using LogExpert.Core.Classes.Log.ProgressReporters; +using LogExpert.Core.Entities; +using LogExpert.Core.Enums; + +using NUnit.Framework; + +namespace LogExpert.Tests.StreamReaderTests; + +[TestFixture] +internal sealed class LogfileReaderMultiFileFlagTests +{ + private static readonly string _testDataDirectory = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "TestData"); + + private string _testDirectory = null!; + private string _logFile = null!; + + [SetUp] + public void SetUp () + { + _testDirectory = Path.Combine(Path.GetTempPath(), "LogExpertTests", Guid.NewGuid().ToString()); + _ = Directory.CreateDirectory(_testDirectory); + _logFile = Path.Combine(_testDirectory, "app.log"); + + File.Copy(Path.Combine(_testDataDirectory, "app.log"), _logFile); + File.Copy(Path.Combine(_testDataDirectory, "app.log.1"), _logFile + ".1"); + + _ = PluginRegistry.PluginRegistry.Create(_testDirectory, 500); + } + + [TearDown] + public void TearDown () + { + if (Directory.Exists(_testDirectory)) + { + Directory.Delete(_testDirectory, recursive: true); + } + } + + [Test] + public void SingleFileCtor_MultiFileFalse_DoesNotExpandRollover () + { + using var reader = CreateSingleFileReader(multiFile: false); + + reader.ReadFiles(); + + Assert.Multiple(() => + { + Assert.That(reader.IsMultiFile, Is.False); + Assert.That(reader.GetLogFileInfoList(), Has.Count.EqualTo(1)); + Assert.That(reader.LineCount, Is.EqualTo(1)); + }); + } + + [Test] + public void SingleFileCtor_MultiFileTrue_ExpandsRollover () + { + using var reader = CreateSingleFileReader(multiFile: true); + + reader.ReadFiles(); + + Assert.Multiple(() => + { + Assert.That(reader.IsMultiFile, Is.True); + Assert.That(reader.GetLogFileInfoList(), Has.Count.EqualTo(2)); + }); + } + + [Test] + public void MultiFileCtor_AlwaysMultiFile () + { + using var reader = new LogfileReader( + [_logFile], + new EncodingOptions { Encoding = Encoding.UTF8 }, + bufferCount: 40, + linesPerBuffer: 50, + new MultiFileOptions(), + ReaderType.System, + PluginRegistry.PluginRegistry.Instance, + maximumLineLength: 500, + progressReporter: NullProgressReporter.Instance); + + reader.ReadFiles(); + + Assert.Multiple(() => + { + Assert.That(reader.IsMultiFile, Is.True); + Assert.That(reader.GetLogFileInfoList(), Has.Count.EqualTo(2)); + }); + } + + private LogfileReader CreateSingleFileReader (bool multiFile) + { + return new LogfileReader( + _logFile, + new EncodingOptions { Encoding = Encoding.UTF8 }, + multiFile, + bufferCount: 40, + linesPerBuffer: 50, + new MultiFileOptions(), + ReaderType.System, + PluginRegistry.PluginRegistry.Instance, + maximumLineLength: 500, + progressReporter: NullProgressReporter.Instance); + } + +} diff --git a/src/LogExpert.Tests/StreamReaderTests/LogfileReaderSingleFileMonitoringTests.cs b/src/LogExpert.Tests/StreamReaderTests/LogfileReaderSingleFileMonitoringTests.cs new file mode 100644 index 00000000..cad47c6c --- /dev/null +++ b/src/LogExpert.Tests/StreamReaderTests/LogfileReaderSingleFileMonitoringTests.cs @@ -0,0 +1,76 @@ +using System.Text; + +using LogExpert.Core.Classes.Log; +using LogExpert.Core.Entities; +using LogExpert.Core.Enums; +using LogExpert.Core.Interfaces; + +using Moq; + +using NUnit.Framework; + +namespace LogExpert.Tests.StreamReaderTests; + +[TestFixture] +internal sealed class LogfileReaderSingleFileMonitoringTests +{ + private string _testDirectory = null!; + private string _logFile = null!; + + [SetUp] + public void SetUp () + { + _testDirectory = Path.Combine(Path.GetTempPath(), "LogExpertTests", Guid.NewGuid().ToString()); + _ = Directory.CreateDirectory(_testDirectory); + _logFile = Path.Combine(_testDirectory, "app.log"); + File.WriteAllLines(_logFile, Enumerable.Range(1, 100).Select(index => $"Line {index}"), Encoding.UTF8); + + _ = PluginRegistry.PluginRegistry.Create(_testDirectory, 500); + } + + [TearDown] + public void TearDown () + { + if (Directory.Exists(_testDirectory)) + { + Directory.Delete(_testDirectory, recursive: true); + } + } + + [Test] + public void SingleFileReader_OnTruncation_ReportsNewFileNotRollover () + { + using var loadingFinished = new ManualResetEventSlim(false); + using var newFileReported = new ManualResetEventSlim(false); + var progressReporterMock = new Mock(); + progressReporterMock + .Setup(reporter => reporter.ReportLoadingFinished()) + .Callback(() => loadingFinished.Set()); + progressReporterMock + .Setup(reporter => reporter.ReportNewFile(It.IsAny(), It.IsAny(), It.IsAny())) + .Callback(() => newFileReported.Set()); + + using var reader = new LogfileReader( + _logFile, + new EncodingOptions { Encoding = Encoding.UTF8 }, + multiFile: false, + bufferCount: 40, + linesPerBuffer: 50, + new MultiFileOptions(), + ReaderType.System, + PluginRegistry.PluginRegistry.Instance, + maximumLineLength: 500, + progressReporter: progressReporterMock.Object); + + var rolloverReported = false; + reader.FileSizeChanged += (_, args) => rolloverReported |= args.IsRollover; + + reader.StartMonitoring(); + Assert.That(loadingFinished.Wait(TimeSpan.FromSeconds(5)), Is.True, "Initial load did not finish"); + + File.WriteAllText(_logFile, "replacement\n", Encoding.UTF8); + + Assert.That(newFileReported.Wait(TimeSpan.FromSeconds(5)), Is.True, "Truncation did not report a new file"); + Assert.That(rolloverReported, Is.False); + } +} diff --git a/src/LogExpert.Tests/TestData/app.log b/src/LogExpert.Tests/TestData/app.log new file mode 100644 index 00000000..c69b11e7 --- /dev/null +++ b/src/LogExpert.Tests/TestData/app.log @@ -0,0 +1 @@ +app.log \ No newline at end of file diff --git a/src/LogExpert.Tests/TestData/app.log.1 b/src/LogExpert.Tests/TestData/app.log.1 new file mode 100644 index 00000000..e17d75d3 --- /dev/null +++ b/src/LogExpert.Tests/TestData/app.log.1 @@ -0,0 +1 @@ +app.log.1 \ No newline at end of file