[Test Improver] Add unit tests for LoggingManager.BuildAsync - #8104

Merged
Amaury Levé (Evangelink) merged 6 commits into
mainfrom
test-assist/logging-manager-tests-26f492a017011427
May 13, 2026
Merged

[Test Improver] Add unit tests for LoggingManager.BuildAsync#8104
Amaury Levé (Evangelink) merged 6 commits into
mainfrom
test-assist/logging-manager-tests-26f492a017011427

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented May 11, 2026

Copy link
Copy Markdown
Member

Tests cover:

  • AddProvider with null throws ArgumentNullException
  • BuildAsync with no providers returns a functional empty factory (verifies both factory and returned logger are non-null)
  • Factory delegate receives correct LogLevel and IServiceProvider (parameterized with multiple log levels)
  • Non-IExtension provider is always included
  • Enabled IExtension provider is included
  • Disabled IExtension provider is excluded
  • Non-extension IAsyncInitializableExtension provider has InitializeAsync called
  • Enabled IExtension + IAsyncInitializableExtension provider is included and has InitializeAsync called
  • Disabled IExtension + IAsyncInitializableExtension provider does not have InitializeAsync called

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

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>
CopilotAI review requested due to automatic review settings May 11, 2026 12:49

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

Good addition of unit tests for LoggingManager.BuildAsync — the coverage is thorough, covering no providers, enabled/disabled extension providers, and initializable providers. A few minor consistency issues worth addressing:

  1. Important — Mock naming inconsistency: Class-level fields use _mockXxx prefix while local test variables use xxxMock suffix. Picking one convention for the whole file improves readability.
  2. Minor — Silent discard of CreateLogger return value (lines 72, 89, 104): Using _ = factory.CreateLogger(...) makes the intentional discard explicit.
  3. Minor — Returns(Task.CompletedTask) vs ReturnsAsync() (line 115): All other async setups use ReturnsAsync(...); a small inconsistency worth aligning.

Positive Highlights

  • Excellent use of helper test interfaces at the bottom of the file to combine ILoggerProvider, IExtension, and IAsyncInitializableExtension — clean and reusable.
  • Test method names are descriptive and follow the Method_Condition_ExpectedResult pattern consistently.
  • Good use of Times.Once / Times.Never for precise mock verification.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds unit tests for Microsoft.Testing.Platform.Logging.LoggingManager.BuildAsync, which builds the platform ILoggerFactory by evaluating provider factories, filtering disabled extensions, and initializing async-initializable providers.

Changes:

  • Added a new LoggingManagerTests suite covering null guards, provider inclusion/exclusion, and initialization behavior.
  • Introduced lightweight internal marker interfaces in the test file to mock combinations of ILoggerProvider + IExtension + IAsyncInitializableExtension.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csAdds new unit tests targeting LoggingManager.BuildAsync behaviors around provider creation, extension enablement filtering, and async initialization.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 2

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Assertion] Near-tautological assertion in BuildAsync_WithNoProviders_ReturnsEmptyLoggerFactory (line 36): Assert.IsNotNull(factory) can never fail since BuildAsync always constructs a new LoggerFactory. The test doesn't verify the "empty" behavior its name implies.

  2. [Coverage] Missing test for enabled IExtensionInitializableLoggerProvider (line 126): The disabled case is tested, but there's no test for when IsEnabledAsync() returns true on a provider that implements both IExtension and IAsyncInitializableExtension. The production code has a distinct path where such a provider must be included AND have InitializeAsync() called — currently uncovered.

What's Well Done

  • Good isolation: fresh mock instances per test class instance, no static mutable state
  • The factory-delegate capture pattern in BuildAsync_PassesLogLevelAndServiceProviderToFactory is clean and effective
  • Correct use of Times.Never to verify exclusion paths
  • Helper interfaces at the bottom of the file (IExtensionLoggerProvider, IInitializableLoggerProvider, IExtensionInitializableLoggerProvider) are a good pattern for multi-interface mocking without polluting production code

Recommendations

  1. Strengthen the no-providers test to actually exercise the factory (e.g., call factory.CreateLogger("test") and verify a logger is returned without throwing)
  2. Add BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider to cover the enabled + initializable extension path

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Expert Code Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Review Scope

Single file added: test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs — 144 lines of unit tests for the internal LoggingManager.BuildAsync method.

Analysis

I reviewed the test code against the production logic in LoggingManager.BuildAsync and the supporting types (LoggerFactory, TryInitializeAsync, IExtension, IAsyncInitializableExtension).

Correctness ✅ All 8 tests accurately model the production branching logic:

  • The disabled-provider guard (IExtension.IsEnabledAsync()) is correctly exercised by tests 5, 6, and 8, each with properly-configured IsEnabledAsync mock setup so no await null risk.
  • The initialization path (IAsyncInitializableExtension.InitializeAsync() via TryInitializeAsync) is correctly targeted by tests 7 and 8.
  • The Times.Once / Times.Never verifications are sound — they would catch bugs in both directions.

Mock setup ✅ All mocks that implement IExtension have IsEnabledAsync() explicitly set up, avoiding the await null footgun from Moq's loose default for Task-returning members.

Threading_mockMonitor.Lock(...) is correctly wired to return a disposable, satisfying the using block in LoggerFactory.CreateLogger.

IDisposableILoggerFactory instances are not disposed after use, but this is inconsequential since all providers are mock objects with no real resources; no improvement needed here.

Internal interfaces — The three internal marker interfaces (IExtensionLoggerProvider, IInitializableLoggerProvider, IExtensionInitializableLoggerProvider) are a clean test-local pattern consistent with the existing IDisposableLoggerProvider in LoggerFactoryTests.cs.

Key Findings

No correctness, threading, performance, API compatibility, or security issues found.


Generated by Expert Code Reviewer 🧠

🧠 Reviewed by Expert Code Reviewer 🧠

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

All review comments were addressed in the previous commit: mock naming standardized (mockXxx prefix), explicit discards added, Returns(Task.CompletedTask) used consistently (Moq 4.18.4 doesn't support ReturnsAsync() with no args), no-providers test strengthened with an actual CreateLogger assertion, and BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider added for the missing coverage path.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

CopilotAIand others added 2 commits May 11, 2026 16:32
…Tests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
…Tests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 16:32
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 16:32

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. The add/add conflict in LoggingManagerTests.cs was resolved by taking main's structure (shorter test names, DataRow parameterization) and applying our improvements on top (explicit _ = discards, stronger no-providers assertion).

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Already resolved in the previous commit — the add/add conflict in LoggingManagerTests.cs was resolved by adopting main's structure with our improvements applied on top.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix issues azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L107

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 164 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L164

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 107 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L107

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 164 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L164

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.

…tead of null
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 20:57
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 20:57

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix issues azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
...

Fixed in the latest commit. Both Mock<TestSourceHost> constructor calls that were passing a bare null for the run settings argument (lines 107 and 164 in the original, now 107 and 147 after minor line shifts) have been updated to use (IRunSettings?)null, which satisfies the nullable reference type annotation and resolves both CS8625 errors.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Note

The pull request was not created — a fallback review issue was created instead due to protected file changes: #8140

🤖 Test Improver here. Status update: the LoggingManager tests from this PR landed in main via #8124 and #8130. This PR is a duplicate and can be safely closed.

Generated by Daily Test Improver · ● 9.5M ·

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

…anager-tests-26f492a017011427
# Conflicts:
#	test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs
#	test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 13, 2026 13:07
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 13:07

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved in commit 0aad6c4. The two conflicted files (LoggingManagerTests.cs and DesktopTestSourceHostTests.cs) both took main's version, which includes the restructured tests (interfaces at namespace level, updated test names) and null! for the run settings arguments.

@Evangelink
Amaury Levé (Evangelink) merged commit 79111ab into mainMay 13, 2026
10 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-tests-26f492a017011427 branch May 13, 2026 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@YuliiaKovalova
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

[Test Improver] Add unit tests for LoggingManager.BuildAsync - #8104

Merged
Amaury Levé (Evangelink) merged 6 commits into
mainfrom
test-assist/logging-manager-tests-26f492a017011427
May 13, 2026
Merged

[Test Improver] Add unit tests for LoggingManager.BuildAsync#8104
Amaury Levé (Evangelink) merged 6 commits into
mainfrom
test-assist/logging-manager-tests-26f492a017011427

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented May 11, 2026

Copy link
Copy Markdown
Member

Tests cover:

  • AddProvider with null throws ArgumentNullException
  • BuildAsync with no providers returns a functional empty factory (verifies both factory and returned logger are non-null)
  • Factory delegate receives correct LogLevel and IServiceProvider (parameterized with multiple log levels)
  • Non-IExtension provider is always included
  • Enabled IExtension provider is included
  • Disabled IExtension provider is excluded
  • Non-extension IAsyncInitializableExtension provider has InitializeAsync called
  • Enabled IExtension + IAsyncInitializableExtension provider is included and has InitializeAsync called
  • Disabled IExtension + IAsyncInitializableExtension provider does not have InitializeAsync called

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

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>
CopilotAI review requested due to automatic review settings May 11, 2026 12:49

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

Good addition of unit tests for LoggingManager.BuildAsync — the coverage is thorough, covering no providers, enabled/disabled extension providers, and initializable providers. A few minor consistency issues worth addressing:

  1. Important — Mock naming inconsistency: Class-level fields use _mockXxx prefix while local test variables use xxxMock suffix. Picking one convention for the whole file improves readability.
  2. Minor — Silent discard of CreateLogger return value (lines 72, 89, 104): Using _ = factory.CreateLogger(...) makes the intentional discard explicit.
  3. Minor — Returns(Task.CompletedTask) vs ReturnsAsync() (line 115): All other async setups use ReturnsAsync(...); a small inconsistency worth aligning.

Positive Highlights

  • Excellent use of helper test interfaces at the bottom of the file to combine ILoggerProvider, IExtension, and IAsyncInitializableExtension — clean and reusable.
  • Test method names are descriptive and follow the Method_Condition_ExpectedResult pattern consistently.
  • Good use of Times.Once / Times.Never for precise mock verification.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds unit tests for Microsoft.Testing.Platform.Logging.LoggingManager.BuildAsync, which builds the platform ILoggerFactory by evaluating provider factories, filtering disabled extensions, and initializing async-initializable providers.

Changes:

  • Added a new LoggingManagerTests suite covering null guards, provider inclusion/exclusion, and initialization behavior.
  • Introduced lightweight internal marker interfaces in the test file to mock combinations of ILoggerProvider + IExtension + IAsyncInitializableExtension.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csAdds new unit tests targeting LoggingManager.BuildAsync behaviors around provider creation, extension enablement filtering, and async initialization.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 2

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Assertion] Near-tautological assertion in BuildAsync_WithNoProviders_ReturnsEmptyLoggerFactory (line 36): Assert.IsNotNull(factory) can never fail since BuildAsync always constructs a new LoggerFactory. The test doesn't verify the "empty" behavior its name implies.

  2. [Coverage] Missing test for enabled IExtensionInitializableLoggerProvider (line 126): The disabled case is tested, but there's no test for when IsEnabledAsync() returns true on a provider that implements both IExtension and IAsyncInitializableExtension. The production code has a distinct path where such a provider must be included AND have InitializeAsync() called — currently uncovered.

What's Well Done

  • Good isolation: fresh mock instances per test class instance, no static mutable state
  • The factory-delegate capture pattern in BuildAsync_PassesLogLevelAndServiceProviderToFactory is clean and effective
  • Correct use of Times.Never to verify exclusion paths
  • Helper interfaces at the bottom of the file (IExtensionLoggerProvider, IInitializableLoggerProvider, IExtensionInitializableLoggerProvider) are a good pattern for multi-interface mocking without polluting production code

Recommendations

  1. Strengthen the no-providers test to actually exercise the factory (e.g., call factory.CreateLogger("test") and verify a logger is returned without throwing)
  2. Add BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider to cover the enabled + initializable extension path

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Expert Code Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Review Scope

Single file added: test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs — 144 lines of unit tests for the internal LoggingManager.BuildAsync method.

Analysis

I reviewed the test code against the production logic in LoggingManager.BuildAsync and the supporting types (LoggerFactory, TryInitializeAsync, IExtension, IAsyncInitializableExtension).

Correctness ✅ All 8 tests accurately model the production branching logic:

  • The disabled-provider guard (IExtension.IsEnabledAsync()) is correctly exercised by tests 5, 6, and 8, each with properly-configured IsEnabledAsync mock setup so no await null risk.
  • The initialization path (IAsyncInitializableExtension.InitializeAsync() via TryInitializeAsync) is correctly targeted by tests 7 and 8.
  • The Times.Once / Times.Never verifications are sound — they would catch bugs in both directions.

Mock setup ✅ All mocks that implement IExtension have IsEnabledAsync() explicitly set up, avoiding the await null footgun from Moq's loose default for Task-returning members.

Threading_mockMonitor.Lock(...) is correctly wired to return a disposable, satisfying the using block in LoggerFactory.CreateLogger.

IDisposableILoggerFactory instances are not disposed after use, but this is inconsequential since all providers are mock objects with no real resources; no improvement needed here.

Internal interfaces — The three internal marker interfaces (IExtensionLoggerProvider, IInitializableLoggerProvider, IExtensionInitializableLoggerProvider) are a clean test-local pattern consistent with the existing IDisposableLoggerProvider in LoggerFactoryTests.cs.

Key Findings

No correctness, threading, performance, API compatibility, or security issues found.


Generated by Expert Code Reviewer 🧠

🧠 Reviewed by Expert Code Reviewer 🧠

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

All review comments were addressed in the previous commit: mock naming standardized (mockXxx prefix), explicit discards added, Returns(Task.CompletedTask) used consistently (Moq 4.18.4 doesn't support ReturnsAsync() with no args), no-providers test strengthened with an actual CreateLogger assertion, and BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider added for the missing coverage path.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

CopilotAIand others added 2 commits May 11, 2026 16:32
…Tests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
…Tests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 16:32
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 16:32

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. The add/add conflict in LoggingManagerTests.cs was resolved by taking main's structure (shorter test names, DataRow parameterization) and applying our improvements on top (explicit _ = discards, stronger no-providers assertion).

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Already resolved in the previous commit — the add/add conflict in LoggingManagerTests.cs was resolved by adopting main's structure with our improvements applied on top.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix issues azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L107

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 164 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L164

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 107 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L107

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 164 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L164

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.

…tead of null
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 20:57
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 20:57

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix issues azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
...

Fixed in the latest commit. Both Mock<TestSourceHost> constructor calls that were passing a bare null for the run settings argument (lines 107 and 164 in the original, now 107 and 147 after minor line shifts) have been updated to use (IRunSettings?)null, which satisfies the nullable reference type annotation and resolves both CS8625 errors.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Note

The pull request was not created — a fallback review issue was created instead due to protected file changes: #8140

🤖 Test Improver here. Status update: the LoggingManager tests from this PR landed in main via #8124 and #8130. This PR is a duplicate and can be safely closed.

Generated by Daily Test Improver · ● 9.5M ·

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

…anager-tests-26f492a017011427
# Conflicts:
#	test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs
#	test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 13, 2026 13:07
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 13:07

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved in commit 0aad6c4. The two conflicted files (LoggingManagerTests.cs and DesktopTestSourceHostTests.cs) both took main's version, which includes the restructured tests (interfaces at namespace level, updated test names) and null! for the run settings arguments.

@Evangelink
Amaury Levé (Evangelink) merged commit 79111ab into mainMay 13, 2026
10 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-tests-26f492a017011427 branch May 13, 2026 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@YuliiaKovalova
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Test Improver] Add unit tests for LoggingManager.BuildAsync - #8104

Merged
Amaury Levé (Evangelink) merged 6 commits into
mainfrom
test-assist/logging-manager-tests-26f492a017011427
May 13, 2026
Merged

[Test Improver] Add unit tests for LoggingManager.BuildAsync#8104
Amaury Levé (Evangelink) merged 6 commits into
mainfrom
test-assist/logging-manager-tests-26f492a017011427

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented May 11, 2026

Copy link
Copy Markdown
Member

Tests cover:

  • AddProvider with null throws ArgumentNullException
  • BuildAsync with no providers returns a functional empty factory (verifies both factory and returned logger are non-null)
  • Factory delegate receives correct LogLevel and IServiceProvider (parameterized with multiple log levels)
  • Non-IExtension provider is always included
  • Enabled IExtension provider is included
  • Disabled IExtension provider is excluded
  • Non-extension IAsyncInitializableExtension provider has InitializeAsync called
  • Enabled IExtension + IAsyncInitializableExtension provider is included and has InitializeAsync called
  • Disabled IExtension + IAsyncInitializableExtension provider does not have InitializeAsync called

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

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>
CopilotAI review requested due to automatic review settings May 11, 2026 12:49

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

Good addition of unit tests for LoggingManager.BuildAsync — the coverage is thorough, covering no providers, enabled/disabled extension providers, and initializable providers. A few minor consistency issues worth addressing:

  1. Important — Mock naming inconsistency: Class-level fields use _mockXxx prefix while local test variables use xxxMock suffix. Picking one convention for the whole file improves readability.
  2. Minor — Silent discard of CreateLogger return value (lines 72, 89, 104): Using _ = factory.CreateLogger(...) makes the intentional discard explicit.
  3. Minor — Returns(Task.CompletedTask) vs ReturnsAsync() (line 115): All other async setups use ReturnsAsync(...); a small inconsistency worth aligning.

Positive Highlights

  • Excellent use of helper test interfaces at the bottom of the file to combine ILoggerProvider, IExtension, and IAsyncInitializableExtension — clean and reusable.
  • Test method names are descriptive and follow the Method_Condition_ExpectedResult pattern consistently.
  • Good use of Times.Once / Times.Never for precise mock verification.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds unit tests for Microsoft.Testing.Platform.Logging.LoggingManager.BuildAsync, which builds the platform ILoggerFactory by evaluating provider factories, filtering disabled extensions, and initializing async-initializable providers.

Changes:

  • Added a new LoggingManagerTests suite covering null guards, provider inclusion/exclusion, and initialization behavior.
  • Introduced lightweight internal marker interfaces in the test file to mock combinations of ILoggerProvider + IExtension + IAsyncInitializableExtension.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csAdds new unit tests targeting LoggingManager.BuildAsync behaviors around provider creation, extension enablement filtering, and async initialization.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 2

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Assertion] Near-tautological assertion in BuildAsync_WithNoProviders_ReturnsEmptyLoggerFactory (line 36): Assert.IsNotNull(factory) can never fail since BuildAsync always constructs a new LoggerFactory. The test doesn't verify the "empty" behavior its name implies.

  2. [Coverage] Missing test for enabled IExtensionInitializableLoggerProvider (line 126): The disabled case is tested, but there's no test for when IsEnabledAsync() returns true on a provider that implements both IExtension and IAsyncInitializableExtension. The production code has a distinct path where such a provider must be included AND have InitializeAsync() called — currently uncovered.

What's Well Done

  • Good isolation: fresh mock instances per test class instance, no static mutable state
  • The factory-delegate capture pattern in BuildAsync_PassesLogLevelAndServiceProviderToFactory is clean and effective
  • Correct use of Times.Never to verify exclusion paths
  • Helper interfaces at the bottom of the file (IExtensionLoggerProvider, IInitializableLoggerProvider, IExtensionInitializableLoggerProvider) are a good pattern for multi-interface mocking without polluting production code

Recommendations

  1. Strengthen the no-providers test to actually exercise the factory (e.g., call factory.CreateLogger("test") and verify a logger is returned without throwing)
  2. Add BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider to cover the enabled + initializable extension path

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Expert Code Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Review Scope

Single file added: test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs — 144 lines of unit tests for the internal LoggingManager.BuildAsync method.

Analysis

I reviewed the test code against the production logic in LoggingManager.BuildAsync and the supporting types (LoggerFactory, TryInitializeAsync, IExtension, IAsyncInitializableExtension).

Correctness ✅ All 8 tests accurately model the production branching logic:

  • The disabled-provider guard (IExtension.IsEnabledAsync()) is correctly exercised by tests 5, 6, and 8, each with properly-configured IsEnabledAsync mock setup so no await null risk.
  • The initialization path (IAsyncInitializableExtension.InitializeAsync() via TryInitializeAsync) is correctly targeted by tests 7 and 8.
  • The Times.Once / Times.Never verifications are sound — they would catch bugs in both directions.

Mock setup ✅ All mocks that implement IExtension have IsEnabledAsync() explicitly set up, avoiding the await null footgun from Moq's loose default for Task-returning members.

Threading_mockMonitor.Lock(...) is correctly wired to return a disposable, satisfying the using block in LoggerFactory.CreateLogger.

IDisposableILoggerFactory instances are not disposed after use, but this is inconsequential since all providers are mock objects with no real resources; no improvement needed here.

Internal interfaces — The three internal marker interfaces (IExtensionLoggerProvider, IInitializableLoggerProvider, IExtensionInitializableLoggerProvider) are a clean test-local pattern consistent with the existing IDisposableLoggerProvider in LoggerFactoryTests.cs.

Key Findings

No correctness, threading, performance, API compatibility, or security issues found.


Generated by Expert Code Reviewer 🧠

🧠 Reviewed by Expert Code Reviewer 🧠

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

All review comments were addressed in the previous commit: mock naming standardized (mockXxx prefix), explicit discards added, Returns(Task.CompletedTask) used consistently (Moq 4.18.4 doesn't support ReturnsAsync() with no args), no-providers test strengthened with an actual CreateLogger assertion, and BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider added for the missing coverage path.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

CopilotAIand others added 2 commits May 11, 2026 16:32
…Tests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
…Tests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 16:32
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 16:32

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. The add/add conflict in LoggingManagerTests.cs was resolved by taking main's structure (shorter test names, DataRow parameterization) and applying our improvements on top (explicit _ = discards, stronger no-providers assertion).

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Already resolved in the previous commit — the add/add conflict in LoggingManagerTests.cs was resolved by adopting main's structure with our improvements applied on top.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix issues azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L107

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 164 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L164

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 107 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L107

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 164 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L164

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.

…tead of null
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 20:57
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 20:57

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix issues azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
...

Fixed in the latest commit. Both Mock<TestSourceHost> constructor calls that were passing a bare null for the run settings argument (lines 107 and 164 in the original, now 107 and 147 after minor line shifts) have been updated to use (IRunSettings?)null, which satisfies the nullable reference type annotation and resolves both CS8625 errors.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Note

The pull request was not created — a fallback review issue was created instead due to protected file changes: #8140

🤖 Test Improver here. Status update: the LoggingManager tests from this PR landed in main via #8124 and #8130. This PR is a duplicate and can be safely closed.

Generated by Daily Test Improver · ● 9.5M ·

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

…anager-tests-26f492a017011427
# Conflicts:
#	test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs
#	test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 13, 2026 13:07
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 13:07

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved in commit 0aad6c4. The two conflicted files (LoggingManagerTests.cs and DesktopTestSourceHostTests.cs) both took main's version, which includes the restructured tests (interfaces at namespace level, updated test names) and null! for the run settings arguments.

@Evangelink
Amaury Levé (Evangelink) merged commit 79111ab into mainMay 13, 2026
10 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-tests-26f492a017011427 branch May 13, 2026 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@YuliiaKovalova
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Test Improver] Add unit tests for LoggingManager.BuildAsync - #8104

Merged
Amaury Levé (Evangelink) merged 6 commits into
mainfrom
test-assist/logging-manager-tests-26f492a017011427
May 13, 2026
Merged

[Test Improver] Add unit tests for LoggingManager.BuildAsync#8104
Amaury Levé (Evangelink) merged 6 commits into
mainfrom
test-assist/logging-manager-tests-26f492a017011427

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented May 11, 2026

Copy link
Copy Markdown
Member

Tests cover:

  • AddProvider with null throws ArgumentNullException
  • BuildAsync with no providers returns a functional empty factory (verifies both factory and returned logger are non-null)
  • Factory delegate receives correct LogLevel and IServiceProvider (parameterized with multiple log levels)
  • Non-IExtension provider is always included
  • Enabled IExtension provider is included
  • Disabled IExtension provider is excluded
  • Non-extension IAsyncInitializableExtension provider has InitializeAsync called
  • Enabled IExtension + IAsyncInitializableExtension provider is included and has InitializeAsync called
  • Disabled IExtension + IAsyncInitializableExtension provider does not have InitializeAsync called

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

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>
CopilotAI review requested due to automatic review settings May 11, 2026 12:49

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

Good addition of unit tests for LoggingManager.BuildAsync — the coverage is thorough, covering no providers, enabled/disabled extension providers, and initializable providers. A few minor consistency issues worth addressing:

  1. Important — Mock naming inconsistency: Class-level fields use _mockXxx prefix while local test variables use xxxMock suffix. Picking one convention for the whole file improves readability.
  2. Minor — Silent discard of CreateLogger return value (lines 72, 89, 104): Using _ = factory.CreateLogger(...) makes the intentional discard explicit.
  3. Minor — Returns(Task.CompletedTask) vs ReturnsAsync() (line 115): All other async setups use ReturnsAsync(...); a small inconsistency worth aligning.

Positive Highlights

  • Excellent use of helper test interfaces at the bottom of the file to combine ILoggerProvider, IExtension, and IAsyncInitializableExtension — clean and reusable.
  • Test method names are descriptive and follow the Method_Condition_ExpectedResult pattern consistently.
  • Good use of Times.Once / Times.Never for precise mock verification.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds unit tests for Microsoft.Testing.Platform.Logging.LoggingManager.BuildAsync, which builds the platform ILoggerFactory by evaluating provider factories, filtering disabled extensions, and initializing async-initializable providers.

Changes:

  • Added a new LoggingManagerTests suite covering null guards, provider inclusion/exclusion, and initialization behavior.
  • Introduced lightweight internal marker interfaces in the test file to mock combinations of ILoggerProvider + IExtension + IAsyncInitializableExtension.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csAdds new unit tests targeting LoggingManager.BuildAsync behaviors around provider creation, extension enablement filtering, and async initialization.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 2

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Assertion] Near-tautological assertion in BuildAsync_WithNoProviders_ReturnsEmptyLoggerFactory (line 36): Assert.IsNotNull(factory) can never fail since BuildAsync always constructs a new LoggerFactory. The test doesn't verify the "empty" behavior its name implies.

  2. [Coverage] Missing test for enabled IExtensionInitializableLoggerProvider (line 126): The disabled case is tested, but there's no test for when IsEnabledAsync() returns true on a provider that implements both IExtension and IAsyncInitializableExtension. The production code has a distinct path where such a provider must be included AND have InitializeAsync() called — currently uncovered.

What's Well Done

  • Good isolation: fresh mock instances per test class instance, no static mutable state
  • The factory-delegate capture pattern in BuildAsync_PassesLogLevelAndServiceProviderToFactory is clean and effective
  • Correct use of Times.Never to verify exclusion paths
  • Helper interfaces at the bottom of the file (IExtensionLoggerProvider, IInitializableLoggerProvider, IExtensionInitializableLoggerProvider) are a good pattern for multi-interface mocking without polluting production code

Recommendations

  1. Strengthen the no-providers test to actually exercise the factory (e.g., call factory.CreateLogger("test") and verify a logger is returned without throwing)
  2. Add BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider to cover the enabled + initializable extension path

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Expert Code Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Review Scope

Single file added: test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs — 144 lines of unit tests for the internal LoggingManager.BuildAsync method.

Analysis

I reviewed the test code against the production logic in LoggingManager.BuildAsync and the supporting types (LoggerFactory, TryInitializeAsync, IExtension, IAsyncInitializableExtension).

Correctness ✅ All 8 tests accurately model the production branching logic:

  • The disabled-provider guard (IExtension.IsEnabledAsync()) is correctly exercised by tests 5, 6, and 8, each with properly-configured IsEnabledAsync mock setup so no await null risk.
  • The initialization path (IAsyncInitializableExtension.InitializeAsync() via TryInitializeAsync) is correctly targeted by tests 7 and 8.
  • The Times.Once / Times.Never verifications are sound — they would catch bugs in both directions.

Mock setup ✅ All mocks that implement IExtension have IsEnabledAsync() explicitly set up, avoiding the await null footgun from Moq's loose default for Task-returning members.

Threading_mockMonitor.Lock(...) is correctly wired to return a disposable, satisfying the using block in LoggerFactory.CreateLogger.

IDisposableILoggerFactory instances are not disposed after use, but this is inconsequential since all providers are mock objects with no real resources; no improvement needed here.

Internal interfaces — The three internal marker interfaces (IExtensionLoggerProvider, IInitializableLoggerProvider, IExtensionInitializableLoggerProvider) are a clean test-local pattern consistent with the existing IDisposableLoggerProvider in LoggerFactoryTests.cs.

Key Findings

No correctness, threading, performance, API compatibility, or security issues found.


Generated by Expert Code Reviewer 🧠

🧠 Reviewed by Expert Code Reviewer 🧠

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

All review comments were addressed in the previous commit: mock naming standardized (mockXxx prefix), explicit discards added, Returns(Task.CompletedTask) used consistently (Moq 4.18.4 doesn't support ReturnsAsync() with no args), no-providers test strengthened with an actual CreateLogger assertion, and BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider added for the missing coverage path.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

CopilotAIand others added 2 commits May 11, 2026 16:32
…Tests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
…Tests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 16:32
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 16:32

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. The add/add conflict in LoggingManagerTests.cs was resolved by taking main's structure (shorter test names, DataRow parameterization) and applying our improvements on top (explicit _ = discards, stronger no-providers assertion).

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Already resolved in the previous commit — the add/add conflict in LoggingManagerTests.cs was resolved by adopting main's structure with our improvements applied on top.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix issues azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L107

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 164 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L164

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 107 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L107

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 164 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L164

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.

…tead of null
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 20:57
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 20:57

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix issues azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
...

Fixed in the latest commit. Both Mock<TestSourceHost> constructor calls that were passing a bare null for the run settings argument (lines 107 and 164 in the original, now 107 and 147 after minor line shifts) have been updated to use (IRunSettings?)null, which satisfies the nullable reference type annotation and resolves both CS8625 errors.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Note

The pull request was not created — a fallback review issue was created instead due to protected file changes: #8140

🤖 Test Improver here. Status update: the LoggingManager tests from this PR landed in main via #8124 and #8130. This PR is a duplicate and can be safely closed.

Generated by Daily Test Improver · ● 9.5M ·

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

…anager-tests-26f492a017011427
# Conflicts:
#	test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs
#	test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 13, 2026 13:07
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 13:07

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved in commit 0aad6c4. The two conflicted files (LoggingManagerTests.cs and DesktopTestSourceHostTests.cs) both took main's version, which includes the restructured tests (interfaces at namespace level, updated test names) and null! for the run settings arguments.

@Evangelink
Amaury Levé (Evangelink) merged commit 79111ab into mainMay 13, 2026
10 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-tests-26f492a017011427 branch May 13, 2026 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@YuliiaKovalova
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

[Test Improver] Add unit tests for LoggingManager.BuildAsync - #8104

Merged
Amaury Levé (Evangelink) merged 6 commits into
mainfrom
test-assist/logging-manager-tests-26f492a017011427
May 13, 2026
Merged

[Test Improver] Add unit tests for LoggingManager.BuildAsync#8104
Amaury Levé (Evangelink) merged 6 commits into
mainfrom
test-assist/logging-manager-tests-26f492a017011427

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented May 11, 2026

Copy link
Copy Markdown
Member

Tests cover:

  • AddProvider with null throws ArgumentNullException
  • BuildAsync with no providers returns a functional empty factory (verifies both factory and returned logger are non-null)
  • Factory delegate receives correct LogLevel and IServiceProvider (parameterized with multiple log levels)
  • Non-IExtension provider is always included
  • Enabled IExtension provider is included
  • Disabled IExtension provider is excluded
  • Non-extension IAsyncInitializableExtension provider has InitializeAsync called
  • Enabled IExtension + IAsyncInitializableExtension provider is included and has InitializeAsync called
  • Disabled IExtension + IAsyncInitializableExtension provider does not have InitializeAsync called

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

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>
CopilotAI review requested due to automatic review settings May 11, 2026 12:49

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

Good addition of unit tests for LoggingManager.BuildAsync — the coverage is thorough, covering no providers, enabled/disabled extension providers, and initializable providers. A few minor consistency issues worth addressing:

  1. Important — Mock naming inconsistency: Class-level fields use _mockXxx prefix while local test variables use xxxMock suffix. Picking one convention for the whole file improves readability.
  2. Minor — Silent discard of CreateLogger return value (lines 72, 89, 104): Using _ = factory.CreateLogger(...) makes the intentional discard explicit.
  3. Minor — Returns(Task.CompletedTask) vs ReturnsAsync() (line 115): All other async setups use ReturnsAsync(...); a small inconsistency worth aligning.

Positive Highlights

  • Excellent use of helper test interfaces at the bottom of the file to combine ILoggerProvider, IExtension, and IAsyncInitializableExtension — clean and reusable.
  • Test method names are descriptive and follow the Method_Condition_ExpectedResult pattern consistently.
  • Good use of Times.Once / Times.Never for precise mock verification.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds unit tests for Microsoft.Testing.Platform.Logging.LoggingManager.BuildAsync, which builds the platform ILoggerFactory by evaluating provider factories, filtering disabled extensions, and initializing async-initializable providers.

Changes:

  • Added a new LoggingManagerTests suite covering null guards, provider inclusion/exclusion, and initialization behavior.
  • Introduced lightweight internal marker interfaces in the test file to mock combinations of ILoggerProvider + IExtension + IAsyncInitializableExtension.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csAdds new unit tests targeting LoggingManager.BuildAsync behaviors around provider creation, extension enablement filtering, and async initialization.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 2

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Assertion] Near-tautological assertion in BuildAsync_WithNoProviders_ReturnsEmptyLoggerFactory (line 36): Assert.IsNotNull(factory) can never fail since BuildAsync always constructs a new LoggerFactory. The test doesn't verify the "empty" behavior its name implies.

  2. [Coverage] Missing test for enabled IExtensionInitializableLoggerProvider (line 126): The disabled case is tested, but there's no test for when IsEnabledAsync() returns true on a provider that implements both IExtension and IAsyncInitializableExtension. The production code has a distinct path where such a provider must be included AND have InitializeAsync() called — currently uncovered.

What's Well Done

  • Good isolation: fresh mock instances per test class instance, no static mutable state
  • The factory-delegate capture pattern in BuildAsync_PassesLogLevelAndServiceProviderToFactory is clean and effective
  • Correct use of Times.Never to verify exclusion paths
  • Helper interfaces at the bottom of the file (IExtensionLoggerProvider, IInitializableLoggerProvider, IExtensionInitializableLoggerProvider) are a good pattern for multi-interface mocking without polluting production code

Recommendations

  1. Strengthen the no-providers test to actually exercise the factory (e.g., call factory.CreateLogger("test") and verify a logger is returned without throwing)
  2. Add BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider to cover the enabled + initializable extension path

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Expert Code Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Review Scope

Single file added: test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs — 144 lines of unit tests for the internal LoggingManager.BuildAsync method.

Analysis

I reviewed the test code against the production logic in LoggingManager.BuildAsync and the supporting types (LoggerFactory, TryInitializeAsync, IExtension, IAsyncInitializableExtension).

Correctness ✅ All 8 tests accurately model the production branching logic:

  • The disabled-provider guard (IExtension.IsEnabledAsync()) is correctly exercised by tests 5, 6, and 8, each with properly-configured IsEnabledAsync mock setup so no await null risk.
  • The initialization path (IAsyncInitializableExtension.InitializeAsync() via TryInitializeAsync) is correctly targeted by tests 7 and 8.
  • The Times.Once / Times.Never verifications are sound — they would catch bugs in both directions.

Mock setup ✅ All mocks that implement IExtension have IsEnabledAsync() explicitly set up, avoiding the await null footgun from Moq's loose default for Task-returning members.

Threading_mockMonitor.Lock(...) is correctly wired to return a disposable, satisfying the using block in LoggerFactory.CreateLogger.

IDisposableILoggerFactory instances are not disposed after use, but this is inconsequential since all providers are mock objects with no real resources; no improvement needed here.

Internal interfaces — The three internal marker interfaces (IExtensionLoggerProvider, IInitializableLoggerProvider, IExtensionInitializableLoggerProvider) are a clean test-local pattern consistent with the existing IDisposableLoggerProvider in LoggerFactoryTests.cs.

Key Findings

No correctness, threading, performance, API compatibility, or security issues found.


Generated by Expert Code Reviewer 🧠

🧠 Reviewed by Expert Code Reviewer 🧠

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

All review comments were addressed in the previous commit: mock naming standardized (mockXxx prefix), explicit discards added, Returns(Task.CompletedTask) used consistently (Moq 4.18.4 doesn't support ReturnsAsync() with no args), no-providers test strengthened with an actual CreateLogger assertion, and BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider added for the missing coverage path.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

CopilotAIand others added 2 commits May 11, 2026 16:32
…Tests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
…Tests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 16:32
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 16:32

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. The add/add conflict in LoggingManagerTests.cs was resolved by taking main's structure (shorter test names, DataRow parameterization) and applying our improvements on top (explicit _ = discards, stronger no-providers assertion).

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Already resolved in the previous commit — the add/add conflict in LoggingManagerTests.cs was resolved by adopting main's structure with our improvements applied on top.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix issues azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L107

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 164 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L164

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 107 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L107

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 164 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L164

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.

…tead of null
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 20:57
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 20:57

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix issues azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
...

Fixed in the latest commit. Both Mock<TestSourceHost> constructor calls that were passing a bare null for the run settings argument (lines 107 and 164 in the original, now 107 and 147 after minor line shifts) have been updated to use (IRunSettings?)null, which satisfies the nullable reference type annotation and resolves both CS8625 errors.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Note

The pull request was not created — a fallback review issue was created instead due to protected file changes: #8140

🤖 Test Improver here. Status update: the LoggingManager tests from this PR landed in main via #8124 and #8130. This PR is a duplicate and can be safely closed.

Generated by Daily Test Improver · ● 9.5M ·

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

…anager-tests-26f492a017011427
# Conflicts:
#	test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs
#	test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 13, 2026 13:07
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 13:07

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved in commit 0aad6c4. The two conflicted files (LoggingManagerTests.cs and DesktopTestSourceHostTests.cs) both took main's version, which includes the restructured tests (interfaces at namespace level, updated test names) and null! for the run settings arguments.

@Evangelink
Amaury Levé (Evangelink) merged commit 79111ab into mainMay 13, 2026
10 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-tests-26f492a017011427 branch May 13, 2026 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@YuliiaKovalova
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Test Improver] Add unit tests for LoggingManager.BuildAsync - #8104

Merged
Amaury Levé (Evangelink) merged 6 commits into
mainfrom
test-assist/logging-manager-tests-26f492a017011427
May 13, 2026
Merged

[Test Improver] Add unit tests for LoggingManager.BuildAsync#8104
Amaury Levé (Evangelink) merged 6 commits into
mainfrom
test-assist/logging-manager-tests-26f492a017011427

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented May 11, 2026

Copy link
Copy Markdown
Member

Tests cover:

  • AddProvider with null throws ArgumentNullException
  • BuildAsync with no providers returns a functional empty factory (verifies both factory and returned logger are non-null)
  • Factory delegate receives correct LogLevel and IServiceProvider (parameterized with multiple log levels)
  • Non-IExtension provider is always included
  • Enabled IExtension provider is included
  • Disabled IExtension provider is excluded
  • Non-extension IAsyncInitializableExtension provider has InitializeAsync called
  • Enabled IExtension + IAsyncInitializableExtension provider is included and has InitializeAsync called
  • Disabled IExtension + IAsyncInitializableExtension provider does not have InitializeAsync called

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

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>
CopilotAI review requested due to automatic review settings May 11, 2026 12:49

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

Good addition of unit tests for LoggingManager.BuildAsync — the coverage is thorough, covering no providers, enabled/disabled extension providers, and initializable providers. A few minor consistency issues worth addressing:

  1. Important — Mock naming inconsistency: Class-level fields use _mockXxx prefix while local test variables use xxxMock suffix. Picking one convention for the whole file improves readability.
  2. Minor — Silent discard of CreateLogger return value (lines 72, 89, 104): Using _ = factory.CreateLogger(...) makes the intentional discard explicit.
  3. Minor — Returns(Task.CompletedTask) vs ReturnsAsync() (line 115): All other async setups use ReturnsAsync(...); a small inconsistency worth aligning.

Positive Highlights

  • Excellent use of helper test interfaces at the bottom of the file to combine ILoggerProvider, IExtension, and IAsyncInitializableExtension — clean and reusable.
  • Test method names are descriptive and follow the Method_Condition_ExpectedResult pattern consistently.
  • Good use of Times.Once / Times.Never for precise mock verification.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds unit tests for Microsoft.Testing.Platform.Logging.LoggingManager.BuildAsync, which builds the platform ILoggerFactory by evaluating provider factories, filtering disabled extensions, and initializing async-initializable providers.

Changes:

  • Added a new LoggingManagerTests suite covering null guards, provider inclusion/exclusion, and initialization behavior.
  • Introduced lightweight internal marker interfaces in the test file to mock combinations of ILoggerProvider + IExtension + IAsyncInitializableExtension.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csAdds new unit tests targeting LoggingManager.BuildAsync behaviors around provider creation, extension enablement filtering, and async initialization.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 2

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Assertion] Near-tautological assertion in BuildAsync_WithNoProviders_ReturnsEmptyLoggerFactory (line 36): Assert.IsNotNull(factory) can never fail since BuildAsync always constructs a new LoggerFactory. The test doesn't verify the "empty" behavior its name implies.

  2. [Coverage] Missing test for enabled IExtensionInitializableLoggerProvider (line 126): The disabled case is tested, but there's no test for when IsEnabledAsync() returns true on a provider that implements both IExtension and IAsyncInitializableExtension. The production code has a distinct path where such a provider must be included AND have InitializeAsync() called — currently uncovered.

What's Well Done

  • Good isolation: fresh mock instances per test class instance, no static mutable state
  • The factory-delegate capture pattern in BuildAsync_PassesLogLevelAndServiceProviderToFactory is clean and effective
  • Correct use of Times.Never to verify exclusion paths
  • Helper interfaces at the bottom of the file (IExtensionLoggerProvider, IInitializableLoggerProvider, IExtensionInitializableLoggerProvider) are a good pattern for multi-interface mocking without polluting production code

Recommendations

  1. Strengthen the no-providers test to actually exercise the factory (e.g., call factory.CreateLogger("test") and verify a logger is returned without throwing)
  2. Add BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider to cover the enabled + initializable extension path

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Expert Code Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Review Scope

Single file added: test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs — 144 lines of unit tests for the internal LoggingManager.BuildAsync method.

Analysis

I reviewed the test code against the production logic in LoggingManager.BuildAsync and the supporting types (LoggerFactory, TryInitializeAsync, IExtension, IAsyncInitializableExtension).

Correctness ✅ All 8 tests accurately model the production branching logic:

  • The disabled-provider guard (IExtension.IsEnabledAsync()) is correctly exercised by tests 5, 6, and 8, each with properly-configured IsEnabledAsync mock setup so no await null risk.
  • The initialization path (IAsyncInitializableExtension.InitializeAsync() via TryInitializeAsync) is correctly targeted by tests 7 and 8.
  • The Times.Once / Times.Never verifications are sound — they would catch bugs in both directions.

Mock setup ✅ All mocks that implement IExtension have IsEnabledAsync() explicitly set up, avoiding the await null footgun from Moq's loose default for Task-returning members.

Threading_mockMonitor.Lock(...) is correctly wired to return a disposable, satisfying the using block in LoggerFactory.CreateLogger.

IDisposableILoggerFactory instances are not disposed after use, but this is inconsequential since all providers are mock objects with no real resources; no improvement needed here.

Internal interfaces — The three internal marker interfaces (IExtensionLoggerProvider, IInitializableLoggerProvider, IExtensionInitializableLoggerProvider) are a clean test-local pattern consistent with the existing IDisposableLoggerProvider in LoggerFactoryTests.cs.

Key Findings

No correctness, threading, performance, API compatibility, or security issues found.


Generated by Expert Code Reviewer 🧠

🧠 Reviewed by Expert Code Reviewer 🧠

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

All review comments were addressed in the previous commit: mock naming standardized (mockXxx prefix), explicit discards added, Returns(Task.CompletedTask) used consistently (Moq 4.18.4 doesn't support ReturnsAsync() with no args), no-providers test strengthened with an actual CreateLogger assertion, and BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider added for the missing coverage path.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

CopilotAIand others added 2 commits May 11, 2026 16:32
…Tests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
…Tests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 16:32
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 16:32

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. The add/add conflict in LoggingManagerTests.cs was resolved by taking main's structure (shorter test names, DataRow parameterization) and applying our improvements on top (explicit _ = discards, stronger no-providers assertion).

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Already resolved in the previous commit — the add/add conflict in LoggingManagerTests.cs was resolved by adopting main's structure with our improvements applied on top.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix issues azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L107

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 164 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L164

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 107 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L107

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 164 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L164

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.

…tead of null
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 20:57
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 20:57

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix issues azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
...

Fixed in the latest commit. Both Mock<TestSourceHost> constructor calls that were passing a bare null for the run settings argument (lines 107 and 164 in the original, now 107 and 147 after minor line shifts) have been updated to use (IRunSettings?)null, which satisfies the nullable reference type annotation and resolves both CS8625 errors.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Note

The pull request was not created — a fallback review issue was created instead due to protected file changes: #8140

🤖 Test Improver here. Status update: the LoggingManager tests from this PR landed in main via #8124 and #8130. This PR is a duplicate and can be safely closed.

Generated by Daily Test Improver · ● 9.5M ·

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

…anager-tests-26f492a017011427
# Conflicts:
#	test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs
#	test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 13, 2026 13:07
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 13:07

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved in commit 0aad6c4. The two conflicted files (LoggingManagerTests.cs and DesktopTestSourceHostTests.cs) both took main's version, which includes the restructured tests (interfaces at namespace level, updated test names) and null! for the run settings arguments.

@Evangelink
Amaury Levé (Evangelink) merged commit 79111ab into mainMay 13, 2026
10 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-tests-26f492a017011427 branch May 13, 2026 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@YuliiaKovalova
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

[Test Improver] Add unit tests for LoggingManager.BuildAsync - #8104

Merged
Amaury Levé (Evangelink) merged 6 commits into
mainfrom
test-assist/logging-manager-tests-26f492a017011427
May 13, 2026
Merged

[Test Improver] Add unit tests for LoggingManager.BuildAsync#8104
Amaury Levé (Evangelink) merged 6 commits into
mainfrom
test-assist/logging-manager-tests-26f492a017011427

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented May 11, 2026

Copy link
Copy Markdown
Member

Tests cover:

  • AddProvider with null throws ArgumentNullException
  • BuildAsync with no providers returns a functional empty factory (verifies both factory and returned logger are non-null)
  • Factory delegate receives correct LogLevel and IServiceProvider (parameterized with multiple log levels)
  • Non-IExtension provider is always included
  • Enabled IExtension provider is included
  • Disabled IExtension provider is excluded
  • Non-extension IAsyncInitializableExtension provider has InitializeAsync called
  • Enabled IExtension + IAsyncInitializableExtension provider is included and has InitializeAsync called
  • Disabled IExtension + IAsyncInitializableExtension provider does not have InitializeAsync called

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

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>
CopilotAI review requested due to automatic review settings May 11, 2026 12:49

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

Good addition of unit tests for LoggingManager.BuildAsync — the coverage is thorough, covering no providers, enabled/disabled extension providers, and initializable providers. A few minor consistency issues worth addressing:

  1. Important — Mock naming inconsistency: Class-level fields use _mockXxx prefix while local test variables use xxxMock suffix. Picking one convention for the whole file improves readability.
  2. Minor — Silent discard of CreateLogger return value (lines 72, 89, 104): Using _ = factory.CreateLogger(...) makes the intentional discard explicit.
  3. Minor — Returns(Task.CompletedTask) vs ReturnsAsync() (line 115): All other async setups use ReturnsAsync(...); a small inconsistency worth aligning.

Positive Highlights

  • Excellent use of helper test interfaces at the bottom of the file to combine ILoggerProvider, IExtension, and IAsyncInitializableExtension — clean and reusable.
  • Test method names are descriptive and follow the Method_Condition_ExpectedResult pattern consistently.
  • Good use of Times.Once / Times.Never for precise mock verification.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds unit tests for Microsoft.Testing.Platform.Logging.LoggingManager.BuildAsync, which builds the platform ILoggerFactory by evaluating provider factories, filtering disabled extensions, and initializing async-initializable providers.

Changes:

  • Added a new LoggingManagerTests suite covering null guards, provider inclusion/exclusion, and initialization behavior.
  • Introduced lightweight internal marker interfaces in the test file to mock combinations of ILoggerProvider + IExtension + IAsyncInitializableExtension.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csAdds new unit tests targeting LoggingManager.BuildAsync behaviors around provider creation, extension enablement filtering, and async initialization.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 2

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Assertion] Near-tautological assertion in BuildAsync_WithNoProviders_ReturnsEmptyLoggerFactory (line 36): Assert.IsNotNull(factory) can never fail since BuildAsync always constructs a new LoggerFactory. The test doesn't verify the "empty" behavior its name implies.

  2. [Coverage] Missing test for enabled IExtensionInitializableLoggerProvider (line 126): The disabled case is tested, but there's no test for when IsEnabledAsync() returns true on a provider that implements both IExtension and IAsyncInitializableExtension. The production code has a distinct path where such a provider must be included AND have InitializeAsync() called — currently uncovered.

What's Well Done

  • Good isolation: fresh mock instances per test class instance, no static mutable state
  • The factory-delegate capture pattern in BuildAsync_PassesLogLevelAndServiceProviderToFactory is clean and effective
  • Correct use of Times.Never to verify exclusion paths
  • Helper interfaces at the bottom of the file (IExtensionLoggerProvider, IInitializableLoggerProvider, IExtensionInitializableLoggerProvider) are a good pattern for multi-interface mocking without polluting production code

Recommendations

  1. Strengthen the no-providers test to actually exercise the factory (e.g., call factory.CreateLogger("test") and verify a logger is returned without throwing)
  2. Add BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider to cover the enabled + initializable extension path

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Expert Code Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Review Scope

Single file added: test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs — 144 lines of unit tests for the internal LoggingManager.BuildAsync method.

Analysis

I reviewed the test code against the production logic in LoggingManager.BuildAsync and the supporting types (LoggerFactory, TryInitializeAsync, IExtension, IAsyncInitializableExtension).

Correctness ✅ All 8 tests accurately model the production branching logic:

  • The disabled-provider guard (IExtension.IsEnabledAsync()) is correctly exercised by tests 5, 6, and 8, each with properly-configured IsEnabledAsync mock setup so no await null risk.
  • The initialization path (IAsyncInitializableExtension.InitializeAsync() via TryInitializeAsync) is correctly targeted by tests 7 and 8.
  • The Times.Once / Times.Never verifications are sound — they would catch bugs in both directions.

Mock setup ✅ All mocks that implement IExtension have IsEnabledAsync() explicitly set up, avoiding the await null footgun from Moq's loose default for Task-returning members.

Threading_mockMonitor.Lock(...) is correctly wired to return a disposable, satisfying the using block in LoggerFactory.CreateLogger.

IDisposableILoggerFactory instances are not disposed after use, but this is inconsequential since all providers are mock objects with no real resources; no improvement needed here.

Internal interfaces — The three internal marker interfaces (IExtensionLoggerProvider, IInitializableLoggerProvider, IExtensionInitializableLoggerProvider) are a clean test-local pattern consistent with the existing IDisposableLoggerProvider in LoggerFactoryTests.cs.

Key Findings

No correctness, threading, performance, API compatibility, or security issues found.


Generated by Expert Code Reviewer 🧠

🧠 Reviewed by Expert Code Reviewer 🧠

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

All review comments were addressed in the previous commit: mock naming standardized (mockXxx prefix), explicit discards added, Returns(Task.CompletedTask) used consistently (Moq 4.18.4 doesn't support ReturnsAsync() with no args), no-providers test strengthened with an actual CreateLogger assertion, and BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider added for the missing coverage path.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

CopilotAIand others added 2 commits May 11, 2026 16:32
…Tests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
…Tests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 16:32
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 16:32

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. The add/add conflict in LoggingManagerTests.cs was resolved by taking main's structure (shorter test names, DataRow parameterization) and applying our improvements on top (explicit _ = discards, stronger no-providers assertion).

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Already resolved in the previous commit — the add/add conflict in LoggingManagerTests.cs was resolved by adopting main's structure with our improvements applied on top.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix issues azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L107

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 164 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L164

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 107 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L107

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 164 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L164

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.

…tead of null
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 20:57
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 20:57

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix issues azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
...

Fixed in the latest commit. Both Mock<TestSourceHost> constructor calls that were passing a bare null for the run settings argument (lines 107 and 164 in the original, now 107 and 147 after minor line shifts) have been updated to use (IRunSettings?)null, which satisfies the nullable reference type annotation and resolves both CS8625 errors.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Note

The pull request was not created — a fallback review issue was created instead due to protected file changes: #8140

🤖 Test Improver here. Status update: the LoggingManager tests from this PR landed in main via #8124 and #8130. This PR is a duplicate and can be safely closed.

Generated by Daily Test Improver · ● 9.5M ·

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

…anager-tests-26f492a017011427
# Conflicts:
#	test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs
#	test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 13, 2026 13:07
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 13:07

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved in commit 0aad6c4. The two conflicted files (LoggingManagerTests.cs and DesktopTestSourceHostTests.cs) both took main's version, which includes the restructured tests (interfaces at namespace level, updated test names) and null! for the run settings arguments.

@Evangelink
Amaury Levé (Evangelink) merged commit 79111ab into mainMay 13, 2026
10 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-tests-26f492a017011427 branch May 13, 2026 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@YuliiaKovalova
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

[Test Improver] Add unit tests for LoggingManager.BuildAsync - #8104

Merged
Amaury Levé (Evangelink) merged 6 commits into
mainfrom
test-assist/logging-manager-tests-26f492a017011427
May 13, 2026
Merged

[Test Improver] Add unit tests for LoggingManager.BuildAsync#8104
Amaury Levé (Evangelink) merged 6 commits into
mainfrom
test-assist/logging-manager-tests-26f492a017011427

Conversation

@Evangelink

@EvangelinkAmaury Levé (Evangelink) commented May 11, 2026

Copy link
Copy Markdown
Member

Tests cover:

  • AddProvider with null throws ArgumentNullException
  • BuildAsync with no providers returns a functional empty factory (verifies both factory and returned logger are non-null)
  • Factory delegate receives correct LogLevel and IServiceProvider (parameterized with multiple log levels)
  • Non-IExtension provider is always included
  • Enabled IExtension provider is included
  • Disabled IExtension provider is excluded
  • Non-extension IAsyncInitializableExtension provider has InitializeAsync called
  • Enabled IExtension + IAsyncInitializableExtension provider is included and has InitializeAsync called
  • Disabled IExtension + IAsyncInitializableExtension provider does not have InitializeAsync called

Co-authored-by: Copilot 223556219+Copilot@users.noreply.github.com

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>
CopilotAI review requested due to automatic review settings May 11, 2026 12:49

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

Good addition of unit tests for LoggingManager.BuildAsync — the coverage is thorough, covering no providers, enabled/disabled extension providers, and initializable providers. A few minor consistency issues worth addressing:

  1. Important — Mock naming inconsistency: Class-level fields use _mockXxx prefix while local test variables use xxxMock suffix. Picking one convention for the whole file improves readability.
  2. Minor — Silent discard of CreateLogger return value (lines 72, 89, 104): Using _ = factory.CreateLogger(...) makes the intentional discard explicit.
  3. Minor — Returns(Task.CompletedTask) vs ReturnsAsync() (line 115): All other async setups use ReturnsAsync(...); a small inconsistency worth aligning.

Positive Highlights

  • Excellent use of helper test interfaces at the bottom of the file to combine ILoggerProvider, IExtension, and IAsyncInitializableExtension — clean and reusable.
  • Test method names are descriptive and follow the Method_Condition_ExpectedResult pattern consistently.
  • Good use of Times.Once / Times.Never for precise mock verification.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds unit tests for Microsoft.Testing.Platform.Logging.LoggingManager.BuildAsync, which builds the platform ILoggerFactory by evaluating provider factories, filtering disabled extensions, and initializing async-initializable providers.

Changes:

  • Added a new LoggingManagerTests suite covering null guards, provider inclusion/exclusion, and initialization behavior.
  • Introduced lightweight internal marker interfaces in the test file to mock combinations of ILoggerProvider + IExtension + IAsyncInitializableExtension.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csAdds new unit tests targeting LoggingManager.BuildAsync behaviors around provider creation, extension enablement filtering, and async initialization.

Copilot's findings

  • Files reviewed: 1/1 changed files
  • Comments generated: 2

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

  1. [Assertion] Near-tautological assertion in BuildAsync_WithNoProviders_ReturnsEmptyLoggerFactory (line 36): Assert.IsNotNull(factory) can never fail since BuildAsync always constructs a new LoggerFactory. The test doesn't verify the "empty" behavior its name implies.

  2. [Coverage] Missing test for enabled IExtensionInitializableLoggerProvider (line 126): The disabled case is tested, but there's no test for when IsEnabledAsync() returns true on a provider that implements both IExtension and IAsyncInitializableExtension. The production code has a distinct path where such a provider must be included AND have InitializeAsync() called — currently uncovered.

What's Well Done

  • Good isolation: fresh mock instances per test class instance, no static mutable state
  • The factory-delegate capture pattern in BuildAsync_PassesLogLevelAndServiceProviderToFactory is clean and effective
  • Correct use of Times.Never to verify exclusion paths
  • Helper interfaces at the bottom of the file (IExtensionLoggerProvider, IInitializableLoggerProvider, IExtensionInitializableLoggerProvider) are a good pattern for multi-interface mocking without polluting production code

Recommendations

  1. Strengthen the no-providers test to actually exercise the factory (e.g., call factory.CreateLogger("test") and verify a logger is returned without throwing)
  2. Add BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider to cover the enabled + initializable extension path

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Summary

Workflow: Expert Code Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Review Scope

Single file added: test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs — 144 lines of unit tests for the internal LoggingManager.BuildAsync method.

Analysis

I reviewed the test code against the production logic in LoggingManager.BuildAsync and the supporting types (LoggerFactory, TryInitializeAsync, IExtension, IAsyncInitializableExtension).

Correctness ✅ All 8 tests accurately model the production branching logic:

  • The disabled-provider guard (IExtension.IsEnabledAsync()) is correctly exercised by tests 5, 6, and 8, each with properly-configured IsEnabledAsync mock setup so no await null risk.
  • The initialization path (IAsyncInitializableExtension.InitializeAsync() via TryInitializeAsync) is correctly targeted by tests 7 and 8.
  • The Times.Once / Times.Never verifications are sound — they would catch bugs in both directions.

Mock setup ✅ All mocks that implement IExtension have IsEnabledAsync() explicitly set up, avoiding the await null footgun from Moq's loose default for Task-returning members.

Threading_mockMonitor.Lock(...) is correctly wired to return a disposable, satisfying the using block in LoggerFactory.CreateLogger.

IDisposableILoggerFactory instances are not disposed after use, but this is inconsequential since all providers are mock objects with no real resources; no improvement needed here.

Internal interfaces — The three internal marker interfaces (IExtensionLoggerProvider, IInitializableLoggerProvider, IExtensionInitializableLoggerProvider) are a clean test-local pattern consistent with the existing IDisposableLoggerProvider in LoggerFactoryTests.cs.

Key Findings

No correctness, threading, performance, API compatibility, or security issues found.


Generated by Expert Code Reviewer 🧠

🧠 Reviewed by Expert Code Reviewer 🧠

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

All review comments were addressed in the previous commit: mock naming standardized (mockXxx prefix), explicit discards added, Returns(Task.CompletedTask) used consistently (Moq 4.18.4 doesn't support ReturnsAsync() with no args), no-providers test strengthened with an actual CreateLogger assertion, and BuildAsync_WithEnabledInitializableExtensionProvider_IncludesAndInitializesProvider added for the missing coverage path.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

CopilotAIand others added 2 commits May 11, 2026 16:32
…Tests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
…Tests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 16:32
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 16:32

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. The add/add conflict in LoggingManagerTests.cs was resolved by taking main's structure (shorter test names, DataRow parameterization) and applying our improvements on top (explicit _ = discards, stronger no-providers assertion).

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Already resolved in the previous commit — the add/add conflict in LoggingManagerTests.cs was resolved by adopting main's structure with our improvements applied on top.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix issues azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L107

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 164 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L164

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 107 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L107

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.
Check failure on line 164 in test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs

azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs#L164

test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.

…tead of null
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 20:57
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 20:57

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix issues azure-pipelines
azure-pipelines
/ microsoft.testfx (Build Windows Debug)
...

Fixed in the latest commit. Both Mock<TestSourceHost> constructor calls that were passing a bare null for the run settings argument (lines 107 and 164 in the original, now 107 and 147 after minor line shifts) have been updated to use (IRunSettings?)null, which satisfies the nullable reference type annotation and resolves both CS8625 errors.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Note

The pull request was not created — a fallback review issue was created instead due to protected file changes: #8140

🤖 Test Improver here. Status update: the LoggingManager tests from this PR landed in main via #8124 and #8130. This PR is a duplicate and can be safely closed.

Generated by Daily Test Improver · ● 9.5M ·

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

…anager-tests-26f492a017011427
# Conflicts:
#	test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs
#	test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 13, 2026 13:07
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 13:07

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved in commit 0aad6c4. The two conflicted files (LoggingManagerTests.cs and DesktopTestSourceHostTests.cs) both took main's version, which includes the restructured tests (interfaces at namespace level, updated test names) and null! for the run settings arguments.

@Evangelink
Amaury Levé (Evangelink) merged commit 79111ab into mainMay 13, 2026
10 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-tests-26f492a017011427 branch May 13, 2026 16:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@Evangelink@YuliiaKovalova