private static async Task MakeOneArchiveFile(int maxFileSizeKilobytes, RollingFileLogProvider rollingFileLogProvider)
        {
            var logEntry = GetLogEntry();

            // Write to the log file until it has exceeded the max file size.
            while (IsTooSmallForRollOver(maxFileSizeKilobytes))
            {
                await rollingFileLogProvider.WriteAsync(logEntry);
            }

            // This log entry should cause the existing log file to be archived, and a new one created.
            await rollingFileLogProvider.WriteAsync(logEntry);
        }
        public async void PrunesOldArchiveFiles()
        {
            const int maxFileSizeKilobytes = 50;

            var logProvider =
                new RollingFileLogProvider(
                    _logFilePath,
                    maxFileSizeKilobytes,
                    2,
                    logFormatter: new SerializingLogFormatter(new XmlSerializerSerializer()));

            Assert.That(GetFileCount(), Is.EqualTo(0));

            await logProvider.WriteAsync(GetLogEntry());
            Assert.That(GetFileCount(), Is.EqualTo(1));

            await MakeOneArchiveFile(maxFileSizeKilobytes, logProvider);
            Assert.That(GetFileCount(), Is.EqualTo(2));

            await MakeOneArchiveFile(maxFileSizeKilobytes, logProvider);
            Assert.That(GetFileCount(), Is.EqualTo(3));

            await MakeOneArchiveFile(maxFileSizeKilobytes, logProvider);
            Assert.That(GetFileCount(), Is.EqualTo(3));

            await MakeOneArchiveFile(maxFileSizeKilobytes, logProvider);
            Assert.That(GetFileCount(), Is.EqualTo(3));
        }
        public async Task WriteAsyncPrunesOldArchiveFiles()
        {
            const int maxFileSizeKilobytes = 50;

            var rollingFileLogProvider =
                new RollingFileLogProvider(
                    _logFilePath,
                    new JsonLogFormatter(),
                    maxFileSizeKilobytes: maxFileSizeKilobytes,
                    maxArchiveCount: 2);

            GetFileCount().Should().Be(0);

            await rollingFileLogProvider.WriteAsync(GetLogEntry());

            GetFileCount().Should().Be(1);

            await MakeOneArchiveFile(maxFileSizeKilobytes, rollingFileLogProvider);

            GetFileCount().Should().Be(2);

            await MakeOneArchiveFile(maxFileSizeKilobytes, rollingFileLogProvider);

            GetFileCount().Should().Be(3);

            await MakeOneArchiveFile(maxFileSizeKilobytes, rollingFileLogProvider);

            GetFileCount().Should().Be(3);

            await MakeOneArchiveFile(maxFileSizeKilobytes, rollingFileLogProvider);

            GetFileCount().Should().Be(3);
        }
        public async Task WriteLineAsyncFormatsTheLogEntryAndWritesItToDisk()
        {
            var rollingFileLogProvider = new RollingFileLogProvider(_logFilePath, "{level}:{message}");

            var logEntry = new LogEntry("Hello, world!", LogLevel.Info);

            await rollingFileLogProvider.WriteAsync(logEntry);

            var output = await File.ReadAllTextAsync(_logFilePath);

            output.Should().Be($"Info:Hello, world!{Environment.NewLine}");
        }
        public async void CausesTheLogFileToBeArchivedWhenItsSizeGetsTooBig()
        {
            const int maxFileSizeKilobytes = 50;

            var logProvider =
                new RollingFileLogProvider(
                    _logFilePath,
                    maxFileSizeKilobytes,
                    logFormatter: new SerializingLogFormatter(new XmlSerializerSerializer()));

            Assert.That(GetFileCount(), Is.EqualTo(0));

            await logProvider.WriteAsync(GetLogEntry());
            Assert.That(GetFileCount(), Is.EqualTo(1));

            await MakeOneArchiveFile(maxFileSizeKilobytes, logProvider);
            Assert.That(GetFileCount(), Is.EqualTo(2));
        }
        public async Task WriteAsyncCausesTheLogFileToBeArchivedWhenItsSizeGetsTooBig()
        {
            const int maxFileSizeKilobytes = 50;

            var rollingFileLogProvider =
                new RollingFileLogProvider(
                    _logFilePath,
                    new JsonLogFormatter(),
                    maxFileSizeKilobytes: maxFileSizeKilobytes);

            GetFileCount().Should().Be(0);

            await rollingFileLogProvider.WriteAsync(GetLogEntry());

            GetFileCount().Should().Be(1);

            await MakeOneArchiveFile(maxFileSizeKilobytes, rollingFileLogProvider);

            GetFileCount().Should().Be(2);
        }
        private static async Task MakeOneArchiveFile(int maxFileSizeKilobytes, RollingFileLogProvider logProvider)
        {
            var logEntry = GetLogEntry();

            // Write to the log file until it has exceeded the max file size.
            while (IsTooSmallForRollOver(maxFileSizeKilobytes))
            {
                await logProvider.WriteAsync(logEntry);
            }

            // This log entry should cause the existing log file to be archived, and a new one created.
            await logProvider.WriteAsync(logEntry);
        }