From fa6c1d33918402f933dfa9e08105216c23b80411 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 3 May 2026 00:10:15 +0000 Subject: [PATCH 1/4] test: add unit tests for LoggingManager.BuildAsync Cover all key behaviors of LoggingManager: - AddProvider with null throws ArgumentNullException - BuildAsync with no providers returns a non-null factory - Factory delegate receives the correct LogLevel and IServiceProvider - Non-IExtension provider is always included - IExtension provider enabled -> included; disabled -> excluded - IAsyncInitializableExtension + enabled -> InitializeAsync called - IAsyncInitializableExtension + disabled -> InitializeAsync not called - Non-extension IAsyncInitializableExtension -> InitializeAsync called Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../Logging/LoggingManagerTests.cs | 149 ++++++++++++++++++ 1 file changed, 149 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..cab49109c0 --- /dev/null +++ b/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs @@ -0,0 +1,149 @@ +// 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_NullFactory_ThrowsArgumentNullException() + { + LoggingManager manager = new(); + Assert.ThrowsExactly(() => manager.AddProvider(null!)); + } + + [TestMethod] + public async Task BuildAsync_NoProviders_ReturnsNonNullFactory() + { + LoggingManager manager = new(); + ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + Assert.IsNotNull(factory); + } + + [TestMethod] + public async Task BuildAsync_PassesCorrectLogLevelAndServiceProviderToFactory() + { + LogLevel capturedLevel = default; + IServiceProvider? capturedServiceProvider = null; + + LoggingManager manager = new(); + Mock mockProvider = new(); + mockProvider.Setup(p => p.CreateLogger(It.IsAny())).Returns(new Mock().Object); + + manager.AddProvider((level, sp) => + { + capturedLevel = level; + capturedServiceProvider = sp; + return mockProvider.Object; + }); + + await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Warning, _mockMonitor.Object); + + Assert.AreEqual(LogLevel.Warning, capturedLevel); + Assert.AreSame(_mockServiceProvider.Object, capturedServiceProvider); + } + + [TestMethod] + public async Task BuildAsync_NonExtensionProvider_IsAlwaysIncluded() + { + LoggingManager manager = new(); + Mock mockProvider = new(); + mockProvider.Setup(p => p.CreateLogger(It.IsAny())).Returns(new Mock().Object); + manager.AddProvider((_, _) => mockProvider.Object); + + ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + factory.CreateLogger("test"); + + mockProvider.Verify(p => p.CreateLogger("test"), Times.Once); + } + + [TestMethod] + public async Task BuildAsync_EnabledExtensionProvider_IsIncluded() + { + LoggingManager manager = new(); + Mock mockProvider = new(); + mockProvider.Setup(p => p.IsEnabledAsync()).ReturnsAsync(true); + mockProvider.Setup(p => p.CreateLogger(It.IsAny())).Returns(new Mock().Object); + manager.AddProvider((_, _) => mockProvider.Object); + + ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + factory.CreateLogger("test"); + + mockProvider.Verify(p => p.CreateLogger("test"), Times.Once); + } + + [TestMethod] + public async Task BuildAsync_DisabledExtensionProvider_IsExcluded() + { + LoggingManager manager = new(); + Mock mockProvider = new(); + mockProvider.Setup(p => p.IsEnabledAsync()).ReturnsAsync(false); + manager.AddProvider((_, _) => mockProvider.Object); + + ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + factory.CreateLogger("test"); + + mockProvider.Verify(p => p.CreateLogger(It.IsAny()), Times.Never); + } + + [TestMethod] + public async Task BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync() + { + LoggingManager manager = new(); + Mock mockProvider = new(); + mockProvider.Setup(p => p.IsEnabledAsync()).ReturnsAsync(true); + mockProvider.Setup(p => p.InitializeAsync()).Returns(Task.CompletedTask); + mockProvider.Setup(p => p.CreateLogger(It.IsAny())).Returns(new Mock().Object); + manager.AddProvider((_, _) => mockProvider.Object); + + await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + + mockProvider.Verify(p => p.InitializeAsync(), Times.Once); + } + + [TestMethod] + public async Task BuildAsync_InitializableExtensionProvider_WhenDisabled_DoesNotCallInitializeAsync() + { + LoggingManager manager = new(); + Mock mockProvider = new(); + mockProvider.Setup(p => p.IsEnabledAsync()).ReturnsAsync(false); + manager.AddProvider((_, _) => mockProvider.Object); + + await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + + mockProvider.Verify(p => p.InitializeAsync(), Times.Never); + } + + [TestMethod] + public async Task BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync() + { + LoggingManager manager = new(); + Mock mockProvider = new(); + mockProvider.Setup(p => p.InitializeAsync()).Returns(Task.CompletedTask); + mockProvider.Setup(p => p.CreateLogger(It.IsAny())).Returns(new Mock().Object); + manager.AddProvider((_, _) => mockProvider.Object); + + await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + + mockProvider.Verify(p => p.InitializeAsync(), Times.Once); + } +} + +internal interface IExtensionLoggerProvider : ILoggerProvider, IExtension; + +internal interface IInitializableLoggerProvider : ILoggerProvider, IAsyncInitializableExtension; + +internal interface IInitializableExtensionLoggerProvider : ILoggerProvider, IExtension, IAsyncInitializableExtension; From 953bd4f1720cb8e48794ee6cc834835b6531ca12 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 11 May 2026 15:55:06 +0000 Subject: [PATCH 2/4] Address review feedback on LoggingManagerTests Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com> --- .../Logging/LoggingManagerTests.cs | 37 ++++++++++++++++--- 1 file changed, 31 insertions(+), 6 deletions(-) diff --git a/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs b/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs index cab49109c0..18e5d53d1b 100644 --- a/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs +++ b/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs @@ -16,7 +16,7 @@ public sealed class LoggingManagerTests private readonly Mock _mockServiceProvider = new(); public LoggingManagerTests() - => _mockMonitor.Setup(x => x.Lock(It.IsAny())).Returns(new Mock().Object); + => _mockMonitor.Setup(p => p.Lock(It.IsAny())).Returns(new Mock().Object); [TestMethod] public void AddProvider_NullFactory_ThrowsArgumentNullException() @@ -65,7 +65,7 @@ public async Task BuildAsync_NonExtensionProvider_IsAlwaysIncluded() manager.AddProvider((_, _) => mockProvider.Object); ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); - factory.CreateLogger("test"); + _ = factory.CreateLogger("test"); mockProvider.Verify(p => p.CreateLogger("test"), Times.Once); } @@ -80,7 +80,7 @@ public async Task BuildAsync_EnabledExtensionProvider_IsIncluded() manager.AddProvider((_, _) => mockProvider.Object); ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); - factory.CreateLogger("test"); + _ = factory.CreateLogger("test"); mockProvider.Verify(p => p.CreateLogger("test"), Times.Once); } @@ -94,7 +94,7 @@ public async Task BuildAsync_DisabledExtensionProvider_IsExcluded() manager.AddProvider((_, _) => mockProvider.Object); ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); - factory.CreateLogger("test"); + _ = factory.CreateLogger("test"); mockProvider.Verify(p => p.CreateLogger(It.IsAny()), Times.Never); } @@ -109,9 +109,11 @@ public async Task BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsIni mockProvider.Setup(p => p.CreateLogger(It.IsAny())).Returns(new Mock().Object); manager.AddProvider((_, _) => mockProvider.Object); - await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + _ = factory.CreateLogger("test"); mockProvider.Verify(p => p.InitializeAsync(), Times.Once); + mockProvider.Verify(p => p.CreateLogger("test"), Times.Once); } [TestMethod] @@ -136,9 +138,32 @@ public async Task BuildAsync_NonExtensionInitializableProvider_CallsInitializeAs mockProvider.Setup(p => p.CreateLogger(It.IsAny())).Returns(new Mock().Object); manager.AddProvider((_, _) => mockProvider.Object); - await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + _ = factory.CreateLogger("test"); mockProvider.Verify(p => p.InitializeAsync(), Times.Once); + mockProvider.Verify(p => p.CreateLogger("test"), Times.Once); + } + + [TestMethod] + public async Task BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes() + { + LoggingManager manager = new(); + + Mock disabledProvider = new(); + disabledProvider.Setup(p => p.IsEnabledAsync()).ReturnsAsync(false); + + Mock enabledProvider = new(); + enabledProvider.Setup(p => p.CreateLogger(It.IsAny())).Returns(new Mock().Object); + + manager.AddProvider((_, _) => disabledProvider.Object); + manager.AddProvider((_, _) => enabledProvider.Object); + + ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); + _ = factory.CreateLogger("test"); + + disabledProvider.Verify(p => p.CreateLogger(It.IsAny()), Times.Never); + enabledProvider.Verify(p => p.CreateLogger("test"), Times.Once); } } From a1a53effc2203eaec9cbed0e55788ebe710d02b7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 11 May 2026 20:51:09 +0000 Subject: [PATCH 3/4] Fix CS8625: cast null to (IRunSettings?) in DesktopTestSourceHostTests Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com> --- .../Services/DesktopTestSourceHostTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs b/test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs index 4dbd1b9025..e602b2b26d 100644 --- a/test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs +++ b/test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs @@ -104,7 +104,7 @@ public void SetupHostShouldSetChildDomainsAppBaseToTestSourceLocation() _ = new DummyClass(); string location = typeof(TestSourceHost).Assembly.Location; - Mock sourceHost = new(location, null) { CallBase = true }; + Mock sourceHost = new(location, (IRunSettings?)null) { CallBase = true }; try { @@ -161,7 +161,7 @@ public void SetupHostShouldSetResolutionsPaths() DummyClass dummyClass = new(); string location = typeof(TestSourceHost).Assembly.Location; - Mock sourceHost = new(location, null) { CallBase = true }; + Mock sourceHost = new(location, (IRunSettings?)null) { CallBase = true }; try { From 8b4d41aec4d37a5daca4088205fef54cbcba61ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Amaury=20Lev=C3=A9?= Date: Wed, 13 May 2026 13:47:48 +0200 Subject: [PATCH 4/4] Rename enabledProvider to nonExtensionProvider for clarity --- .../Logging/LoggingManagerTests.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs b/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs index d35204b2e4..c6374dd04a 100644 --- a/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs +++ b/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs @@ -158,17 +158,17 @@ public async Task BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes() Mock disabledProvider = new(); disabledProvider.Setup(p => p.IsEnabledAsync()).ReturnsAsync(false); - Mock enabledProvider = new(); - enabledProvider.Setup(p => p.CreateLogger(It.IsAny())).Returns(new Mock().Object); + Mock nonExtensionProvider = new(); + nonExtensionProvider.Setup(p => p.CreateLogger(It.IsAny())).Returns(new Mock().Object); manager.AddProvider((_, _) => disabledProvider.Object); - manager.AddProvider((_, _) => enabledProvider.Object); + manager.AddProvider((_, _) => nonExtensionProvider.Object); ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); _ = factory.CreateLogger("test"); disabledProvider.Verify(p => p.CreateLogger(It.IsAny()), Times.Never); - enabledProvider.Verify(p => p.CreateLogger("test"), Times.Once); + nonExtensionProvider.Verify(p => p.CreateLogger("test"), Times.Once); } }