File: TestW3CLoggerProcessor.cs
Web Access
Project: src\src\Middleware\HttpLogging\test\Microsoft.AspNetCore.HttpLogging.Tests.csproj (Microsoft.AspNetCore.HttpLogging.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
 
namespace Microsoft.AspNetCore.HttpLogging;
 
internal sealed class TestW3CLoggerProcessor : W3CLoggerProcessor
{
    private int _writeCount = 0;
    private int _expectedWrites;
    private TaskCompletionSource _tcs;
    private bool _hasWritten;
    private readonly object _writeCountLock = new object();
 
    public TestW3CLoggerProcessor(IOptionsMonitor<W3CLoggerOptions> options, IHostEnvironment environment, ILoggerFactory factory) : base(options, environment, factory)
    {
        Lines = new List<string>();
    }
 
    public List<string> Lines { get; }
 
    internal override StreamWriter GetStreamWriter(string fileName)
    {
        return StreamWriter.Null;
    }
 
    internal override void OnWrite(string message)
    {
        Lines.Add(message);
        lock (_writeCountLock)
        {
            _writeCount++;
            if (_tcs != null && _writeCount >= _expectedWrites)
            {
                _tcs.SetResult();
            }
        }
    }
 
    public Task WaitForWrites(int numWrites)
    {
        lock (_writeCountLock)
        {
            if (_writeCount >= numWrites)
            {
                return Task.CompletedTask;
            }
            _expectedWrites = numWrites;
            _tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously);
        }
        return _tcs.Task;
    }
 
    public override async Task OnFirstWrite(StreamWriter streamWriter, CancellationToken cancellationToken)
    {
        if (!_hasWritten)
        {
            await base.OnFirstWrite(streamWriter, cancellationToken);
            _hasWritten = true;
        }
    }
}