File: Pipelines\PipelineLoggerProviderTests.cs
Web Access
Project: src\tests\Aspire.Hosting.Tests\Aspire.Hosting.Tests.csproj (Aspire.Hosting.Tests)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#pragma warning disable ASPIREPUBLISHERS001
#pragma warning disable ASPIREPIPELINES001
 
using Aspire.Hosting.Pipelines;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Logging.Testing;
 
namespace Aspire.Hosting.Tests.Pipelines;
 
public class PipelineLoggerProviderTests
{
    [Fact]
    public void CurrentLogger_WhenNotSet_ReturnsNullLogger()
    {
        // Arrange & Act
        var currentLogger = PipelineLoggerProvider.CurrentLogger;
 
        // Assert
        Assert.Same(NullLogger.Instance, currentLogger);
    }
 
    [Fact]
    public void CurrentLogger_WhenSetToValidLogger_ReturnsSetLogger()
    {
        // Arrange
        var testLogger = new FakeLogger();
 
        try
        {
            // Act
            PipelineLoggerProvider.CurrentLogger = testLogger;
            var retrievedLogger = PipelineLoggerProvider.CurrentLogger;
 
            // Assert
            Assert.Same(testLogger, retrievedLogger);
        }
        finally
        {
            // Cleanup
            PipelineLoggerProvider.CurrentLogger = NullLogger.Instance;
        }
    }
 
    [Fact]
    public void CurrentLogger_WhenSetToNull_ReturnsNullLogger()
    {
        // Arrange
        var testLogger = new FakeLogger();
        PipelineLoggerProvider.CurrentLogger = testLogger;
 
        try
        {
            // Act
            PipelineLoggerProvider.CurrentLogger = NullLogger.Instance;
            var retrievedLogger = PipelineLoggerProvider.CurrentLogger;
 
            // Assert
            Assert.Same(NullLogger.Instance, retrievedLogger);
        }
        finally
        {
            // Cleanup
            PipelineLoggerProvider.CurrentLogger = NullLogger.Instance;
        }
    }
 
    [Fact]
    public void CreateLogger_ReturnsValidLogger()
    {
        // Arrange
        var provider = new PipelineLoggerProvider();
 
        // Act
        var logger = provider.CreateLogger("TestCategory");
 
        // Assert
        Assert.NotNull(logger);
    }
 
    [Fact]
    public async Task CurrentLogger_IsAsyncLocal_IsolatedBetweenTasks()
    {
        // Arrange
        var fakeLogger1 = new FakeLogger();
        var fakeLogger2 = new FakeLogger();
        var provider = new PipelineLoggerProvider();
 
        // Act
        var task1 = Task.Run(async () =>
        {
            PipelineLoggerProvider.CurrentLogger = fakeLogger1;
            var logger = provider.CreateLogger("Task1");
 
            logger.LogInformation("Task 1 message");
        });
 
        var task2 = Task.Run(async () =>
        {
            PipelineLoggerProvider.CurrentLogger = fakeLogger2;
            var logger = provider.CreateLogger("Task2");
 
            logger.LogInformation("Task 2 message");
        });
 
        await Task.WhenAll(task1, task2);
 
        // Assert
        var logs1 = fakeLogger1.Collector.GetSnapshot();
        var logEntry1 = Assert.Single(logs1);
        Assert.Equal(LogLevel.Information, logEntry1.Level);
        Assert.Equal("Task 1 message", logEntry1.Message);
 
        var logs2 = fakeLogger2.Collector.GetSnapshot();
        var logEntry2 = Assert.Single(logs2);
        Assert.Equal(LogLevel.Information, logEntry2.Level);
        Assert.Equal("Task 2 message", logEntry2.Message);
    }
}