From b1e84df1bc34e6bfdcf4ac71adddab2aabfc063a Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 11 May 2026 13:35:00 +0000 Subject: [PATCH 1/3] Initial plan From 2a1c37c7c59746bd01b898a1be62a59a5ba32f32 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 1 May 2026 00:13:28 +0000 Subject: [PATCH 2/3] Add unit tests for LoggingManager.BuildAsync Tests cover: - AddProvider with null throws ArgumentNullException - BuildAsync with no providers returns empty factory - Factory delegate receives correct LogLevel and IServiceProvider - Non-IExtension provider is always included - Enabled IExtension provider is included - Disabled IExtension provider is excluded - IAsyncInitializableExtension provider has InitializeAsync called - Disabled IAsyncInitializableExtension provider does not have InitializeAsync called Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com> --- .../Logging/LoggingManagerTests.cs | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs diff --git a/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs b/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs new file mode 100644 index 0000000000..6616da38dc --- /dev/null +++ b/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs @@ -0,0 +1,144 @@ +// Copyright (c) Microsoft Corporation. All rights reserved. +// Licensed under the MIT license. See LICENSE file in the project root for full license information. + +using Microsoft.Testing.Platform.Extensions; +using Microsoft.Testing.Platform.Helpers; +using Microsoft.Testing.Platform.Logging; + +using Moq; + +namespace Microsoft.Testing.Platform.UnitTests; + +[TestClass] +public sealed class LoggingManagerTests +{ + private readonly Mock _mockMonitor = new(); + private readonly Mock _mockServiceProvider = new(); + + public LoggingManagerTests() + => _mockMonitor.Setup(x => x.Lock(It.IsAny())).Returns(new Mock().Object); + + [TestMethod] + public void AddProvider_WithNullFactory_ThrowsArgumentNullException() + { + LoggingManager manager = new(); + + Assert.ThrowsExactly(() => manager.AddProvider(null!)); + } + + [TestMethod] + public async Task BuildAsync_WithNoProviders_ReturnsEmptyLoggerFactory() + { + LoggingManager manager = new(); + + ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + + Assert.IsNotNull(factory); + } + + [TestMethod] + public async Task BuildAsync_PassesLogLevelAndServiceProviderToFactory() + { + LoggingManager manager = new(); + LogLevel capturedLogLevel = default; + IServiceProvider? capturedServiceProvider = null; + Mock providerMock = new(); + providerMock.Setup(p => p.CreateLogger(It.IsAny())).Returns(new Mock().Object); + + manager.AddProvider((logLevel, serviceProvider) => + { + capturedLogLevel = logLevel; + capturedServiceProvider = serviceProvider; + return providerMock.Object; + }); + + await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Warning, _mockMonitor.Object); + + Assert.AreEqual(LogLevel.Warning, capturedLogLevel); + Assert.AreSame(_mockServiceProvider.Object, capturedServiceProvider); + } + + [TestMethod] + public async Task BuildAsync_WithNonExtensionProvider_IncludesProvider() + { + LoggingManager manager = new(); + Mock loggerMock = new(); + Mock providerMock = new(); + providerMock.Setup(p => p.CreateLogger("category")).Returns(loggerMock.Object); + + manager.AddProvider((_, _) => providerMock.Object); + + ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + factory.CreateLogger("category"); + + providerMock.Verify(p => p.CreateLogger("category"), Times.Once); + } + + [TestMethod] + public async Task BuildAsync_WithEnabledExtensionProvider_IncludesProvider() + { + LoggingManager manager = new(); + Mock loggerMock = new(); + Mock providerMock = new(); + providerMock.Setup(p => p.IsEnabledAsync()).ReturnsAsync(true); + providerMock.Setup(p => p.CreateLogger("category")).Returns(loggerMock.Object); + + manager.AddProvider((_, _) => providerMock.Object); + + ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + factory.CreateLogger("category"); + + providerMock.Verify(p => p.CreateLogger("category"), Times.Once); + } + + [TestMethod] + public async Task BuildAsync_WithDisabledExtensionProvider_ExcludesProvider() + { + LoggingManager manager = new(); + Mock providerMock = new(); + providerMock.Setup(p => p.IsEnabledAsync()).ReturnsAsync(false); + + manager.AddProvider((_, _) => providerMock.Object); + + ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + factory.CreateLogger("category"); + + providerMock.Verify(p => p.CreateLogger(It.IsAny()), Times.Never); + } + + [TestMethod] + public async Task BuildAsync_WithInitializableProvider_CallsInitializeAsync() + { + LoggingManager manager = new(); + Mock loggerMock = new(); + Mock providerMock = new(); + providerMock.Setup(p => p.InitializeAsync()).Returns(Task.CompletedTask); + providerMock.Setup(p => p.CreateLogger(It.IsAny())).Returns(loggerMock.Object); + + manager.AddProvider((_, _) => providerMock.Object); + + await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + + providerMock.Verify(p => p.InitializeAsync(), Times.Once); + } + + [TestMethod] + public async Task BuildAsync_WithDisabledInitializableExtensionProvider_DoesNotCallInitializeAsync() + { + LoggingManager manager = new(); + Mock providerMock = new(); + providerMock.Setup(p => p.IsEnabledAsync()).ReturnsAsync(false); + + manager.AddProvider((_, _) => providerMock.Object); + + await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + + providerMock.Verify(p => p.InitializeAsync(), Times.Never); + } +} + +internal interface IExtensionLoggerProvider : ILoggerProvider, IExtension; + +internal interface IInitializableLoggerProvider : ILoggerProvider, IAsyncInitializableExtension; + +internal interface IExtensionInitializableLoggerProvider : ILoggerProvider, IExtension, IAsyncInitializableExtension; From 74796e9812d165cbbef62ed4bf55e276a50eaebd Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 11 May 2026 13:43:25 +0000 Subject: [PATCH 3/3] Address PR 8104 logging test review feedback Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com> --- .../Logging/LoggingManagerTests.cs | 84 ++++++++++++------- 1 file changed, 52 insertions(+), 32 deletions(-) diff --git a/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs b/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs index 6616da38dc..ef67a75118 100644 --- a/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs +++ b/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs @@ -32,8 +32,9 @@ public async Task BuildAsync_WithNoProviders_ReturnsEmptyLoggerFactory() LoggingManager manager = new(); ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + ILogger logger = factory.CreateLogger("category"); - Assert.IsNotNull(factory); + Assert.IsNotNull(logger); } [TestMethod] @@ -42,14 +43,14 @@ public async Task BuildAsync_PassesLogLevelAndServiceProviderToFactory() LoggingManager manager = new(); LogLevel capturedLogLevel = default; IServiceProvider? capturedServiceProvider = null; - Mock providerMock = new(); - providerMock.Setup(p => p.CreateLogger(It.IsAny())).Returns(new Mock().Object); + Mock mockProvider = new(); + mockProvider.Setup(p => p.CreateLogger(It.IsAny())).Returns(new Mock().Object); manager.AddProvider((logLevel, serviceProvider) => { capturedLogLevel = logLevel; capturedServiceProvider = serviceProvider; - return providerMock.Object; + return mockProvider.Object; }); await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Warning, _mockMonitor.Object); @@ -62,78 +63,97 @@ public async Task BuildAsync_PassesLogLevelAndServiceProviderToFactory() public async Task BuildAsync_WithNonExtensionProvider_IncludesProvider() { LoggingManager manager = new(); - Mock loggerMock = new(); - Mock providerMock = new(); - providerMock.Setup(p => p.CreateLogger("category")).Returns(loggerMock.Object); + Mock mockLogger = new(); + Mock mockProvider = new(); + mockProvider.Setup(p => p.CreateLogger("category")).Returns(mockLogger.Object); - manager.AddProvider((_, _) => providerMock.Object); + manager.AddProvider((_, _) => mockProvider.Object); ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); - factory.CreateLogger("category"); + _ = factory.CreateLogger("category"); - providerMock.Verify(p => p.CreateLogger("category"), Times.Once); + mockProvider.Verify(p => p.CreateLogger("category"), Times.Once); } [TestMethod] public async Task BuildAsync_WithEnabledExtensionProvider_IncludesProvider() { LoggingManager manager = new(); - Mock loggerMock = new(); - Mock providerMock = new(); - providerMock.Setup(p => p.IsEnabledAsync()).ReturnsAsync(true); - providerMock.Setup(p => p.CreateLogger("category")).Returns(loggerMock.Object); + Mock mockLogger = new(); + Mock mockProvider = new(); + mockProvider.Setup(p => p.IsEnabledAsync()).ReturnsAsync(true); + mockProvider.Setup(p => p.CreateLogger("category")).Returns(mockLogger.Object); - manager.AddProvider((_, _) => providerMock.Object); + manager.AddProvider((_, _) => mockProvider.Object); ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); - factory.CreateLogger("category"); + _ = factory.CreateLogger("category"); - providerMock.Verify(p => p.CreateLogger("category"), Times.Once); + mockProvider.Verify(p => p.CreateLogger("category"), Times.Once); } [TestMethod] public async Task BuildAsync_WithDisabledExtensionProvider_ExcludesProvider() { LoggingManager manager = new(); - Mock providerMock = new(); - providerMock.Setup(p => p.IsEnabledAsync()).ReturnsAsync(false); + Mock mockProvider = new(); + mockProvider.Setup(p => p.IsEnabledAsync()).ReturnsAsync(false); - manager.AddProvider((_, _) => providerMock.Object); + manager.AddProvider((_, _) => mockProvider.Object); ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); - factory.CreateLogger("category"); + _ = factory.CreateLogger("category"); - providerMock.Verify(p => p.CreateLogger(It.IsAny()), Times.Never); + mockProvider.Verify(p => p.CreateLogger(It.IsAny()), Times.Never); } [TestMethod] public async Task BuildAsync_WithInitializableProvider_CallsInitializeAsync() { LoggingManager manager = new(); - Mock loggerMock = new(); - Mock providerMock = new(); - providerMock.Setup(p => p.InitializeAsync()).Returns(Task.CompletedTask); - providerMock.Setup(p => p.CreateLogger(It.IsAny())).Returns(loggerMock.Object); + Mock mockLogger = new(); + Mock mockProvider = new(); + mockProvider.Setup(p => p.InitializeAsync()).Returns(Task.CompletedTask); + mockProvider.Setup(p => p.CreateLogger(It.IsAny())).Returns(mockLogger.Object); - manager.AddProvider((_, _) => providerMock.Object); + manager.AddProvider((_, _) => mockProvider.Object); await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); - providerMock.Verify(p => p.InitializeAsync(), Times.Once); + mockProvider.Verify(p => p.InitializeAsync(), Times.Once); + } + + [TestMethod] + public async Task BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider() + { + LoggingManager manager = new(); + Mock mockLogger = new(); + Mock mockProvider = new(); + mockProvider.Setup(p => p.IsEnabledAsync()).ReturnsAsync(true); + mockProvider.Setup(p => p.InitializeAsync()).Returns(Task.CompletedTask); + mockProvider.Setup(p => p.CreateLogger("category")).Returns(mockLogger.Object); + + manager.AddProvider((_, _) => mockProvider.Object); + + ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + _ = factory.CreateLogger("category"); + + mockProvider.Verify(p => p.InitializeAsync(), Times.Once); + mockProvider.Verify(p => p.CreateLogger("category"), Times.Once); } [TestMethod] public async Task BuildAsync_WithDisabledInitializableExtensionProvider_DoesNotCallInitializeAsync() { LoggingManager manager = new(); - Mock providerMock = new(); - providerMock.Setup(p => p.IsEnabledAsync()).ReturnsAsync(false); + Mock mockProvider = new(); + mockProvider.Setup(p => p.IsEnabledAsync()).ReturnsAsync(false); - manager.AddProvider((_, _) => providerMock.Object); + manager.AddProvider((_, _) => mockProvider.Object); await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); - providerMock.Verify(p => p.InitializeAsync(), Times.Never); + mockProvider.Verify(p => p.InitializeAsync(), Times.Never); } }