From f8fc6acbe77ac6fa0f415e696cd3d2e1757865b7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 1 May 2026 00:13:28 +0000 Subject: [PATCH 1/4] 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> --- .../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 6fd7687818fa7deb71e3600d122f3a6c3c2bfd54 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 11 May 2026 14:18:43 +0000 Subject: [PATCH 2/4] Address review comments in LoggingManagerTests 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..822a8de92d 100644 --- a/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs +++ b/test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs @@ -33,7 +33,8 @@ public async Task BuildAsync_WithNoProviders_ReturnsEmptyLoggerFactory() ILoggerFactory factory = await manager.BuildAsync(_mockServiceProvider.Object, LogLevel.Information, _mockMonitor.Object); - Assert.IsNotNull(factory); + ILogger logger = factory.CreateLogger("test"); + 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_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); + } + + [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); } } From 1bbdc8e8db46354ccda8f7ec9192ebcff607ed35 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 11 May 2026 16:32:45 +0000 Subject: [PATCH 3/4] Merge main into branch and resolve add/add conflict in LoggingManagerTests.cs Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com> --- NuGet.config | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/NuGet.config b/NuGet.config index 96df359ba1..11279f255b 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,4 +1,4 @@ - + @@ -18,6 +18,7 @@ + From c8aefbfe94533ac335a701cf0b42a6d3b3c50472 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 11 May 2026 20:57:50 +0000 Subject: [PATCH 4/4] Fix CS8625 in DesktopTestSourceHostTests: use (IRunSettings?)null instead of null Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com> --- .../Services/DesktopTestSourceHostTests.cs | 29 ++----------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs b/test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs index 4dbd1b9025..d4f7cb46e6 100644 --- a/test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs +++ b/test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs @@ -104,24 +104,7 @@ public void SetupHostShouldSetChildDomainsAppBaseToTestSourceLocation() _ = new DummyClass(); string location = typeof(TestSourceHost).Assembly.Location; - Mock sourceHost = new(location, null) { CallBase = true }; - - try - { - // Act - sourceHost.Object.SetupHost(); - var expectedObject = sourceHost.Object.CreateInstanceForType(typeof(DummyClass), null) as DummyClass; - - // Assert - expectedObject?.AppDomainAppBase.Should().Be(Path.GetDirectoryName(typeof(DesktopTestSourceHostTests).Assembly.Location)); - } - finally - { - sourceHost.Object.Dispose(); - } - } - - public void SetupHostShouldHaveParentDomainsAppBaseSetToTestSourceLocation() + Mock sourceHost = new(location, (IRunSettings?)null) { CallBase = true }; { // Arrange DummyClass dummyClass = new(); @@ -161,15 +144,7 @@ public void SetupHostShouldSetResolutionsPaths() DummyClass dummyClass = new(); string location = typeof(TestSourceHost).Assembly.Location; - Mock sourceHost = new(location, null) { CallBase = true }; - - try - { - // Act - sourceHost.Object.SetupHost(); - - // Assert - sourceHost.Verify(sh => sh.GetResolutionPaths(location, It.IsAny()), Times.Once); + Mock sourceHost = new(location, (IRunSettings?)null) { CallBase = true }; } finally {