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

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-buildAsync-tests-7351033ae996670b
May 14, 2026
Merged

[Test Improver] Add unit tests for LoggingManager.BuildAsync#8129
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-buildAsync-tests-7351033ae996670b

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member

Cover all key behaviors of LoggingManager:

  • AddProvider with null throws ArgumentNullException
  • BuildAsync with no providers returns a non-null factory
  • Factory delegate receives the correct LogLevel and IServiceProvider (parameterized across Trace, Warning, and Critical levels)
  • Non-IExtension provider is always included
  • IExtension provider enabled → included; disabled → excluded
  • IAsyncInitializableExtension + enabled → InitializeAsync called and provider included in factory
  • IAsyncInitializableExtension + disabled → InitializeAsync not called
  • Non-extension IAsyncInitializableExtension → InitializeAsync called and provider included in factory
  • Multiple providers registered simultaneously → only enabled ones are included (covers the foreach/continue loop)

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

Cover all key behaviors of LoggingManager:
- AddProvider with null throws ArgumentNullException
- BuildAsync with no providers returns a non-null factory
- Factory delegate receives the correct LogLevel and IServiceProvider
- Non-IExtension provider is always included
- IExtension provider enabled -> included; disabled -> excluded
- IAsyncInitializableExtension + enabled -> InitializeAsync called
- IAsyncInitializableExtension + disabled -> InitializeAsync not called
- Non-extension IAsyncInitializableExtension -> InitializeAsync called
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:46

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 focused unit test coverage for Microsoft.Testing.Platform.Logging.LoggingManager.BuildAsync, validating provider registration, enablement filtering (IExtension.IsEnabledAsync), and asynchronous initialization (IAsyncInitializableExtension.InitializeAsync) behaviors to address #7995.

Changes:

  • Added 9 unit tests covering AddProvider null-guard behavior and BuildAsync behavior across provider types.
  • Validated that BuildAsync forwards LogLevel and IServiceProvider into provider factories.
  • Covered inclusion/exclusion rules for extension-based providers and initialization rules for async-initializable providers.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests covering LoggingManager.BuildAsync provider filtering and initialization paths.

Copilot's findings

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

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

Key Findings

No correctness, threading, security, resource management, or API-compatibility issues were identified.

What was verified:

  • Correctness: All 8 test scenarios trace correctly against the LoggingManager.BuildAsync implementation. The IExtension enable/disable filtering path and the TryInitializeAsync dispatch (which internally checks is IAsyncInitializableExtension) are both exercised with appropriate combinations of mock interfaces.
  • Internal access: LoggingManager and BuildAsync are internal; access is correctly gated by the InternalsVisibleTo declaration for Microsoft.Testing.Platform.UnitTests in the main project csproj, and Moq's dynamic proxy access is similarly declared.
  • Mock fidelity: The three test-local interfaces (IExtensionLoggerProvider, IInitializableLoggerProvider, IInitializableExtensionLoggerProvider) accurately model the real interface combinations the production code branches on.
  • Threading/async: async Task test methods with proper await usage; no Task.Result/.Wait() anti-patterns.
  • No public API surface added: All additions are in test/ with internal interfaces.

Recommendations

None — the change is well-scoped, complete, and correct.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code 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: PR Nitpick Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

Good overall structure — the tests are well-focused (each verifies exactly one behavior), cover all meaningful branches of LoggingManager.BuildAsync, and follow the Moq patterns established in sibling test files. Three minor nitpicks found:

  1. Dead mock setup (line 109) — mockProvider.Setup(p => p.CreateLogger(...)) in BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync is never triggered since the test body never calls factory.CreateLogger(...). Remove to reduce noise.
  2. Implicit return-value discard (lines 68, 83, 97) — factory.CreateLogger("test") is called for its side-effect but the return is silently dropped. LoggerFactoryTests.cs uses _ = here; aligning would clarify intent.
  3. Lambda parameter naming (line 19) — Constructor setup uses x; all test-method setups use p. A consistent name (e.g., m or monitor) would read more uniformly.

Recommendations

  • Remove the unused CreateLogger setup from the WhenEnabled_CallsInitializeAsync test.
  • Prefix the three factory.CreateLogger("test") calls with _ =.
  • Rename xm (or monitor) in the constructor lambda.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick 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: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The new LoggingManagerTests are well-structured, properly isolated (new instance per test, no static mutable state), and cover the primary behaviors of LoggingManager.BuildAsync. The happy/sad path split for extension enable/disable and the initialization checks are solid. Three improvement opportunities were identified:

  1. [Structure] Dead CreateLogger mock setup (lines 109, 136) — Both BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync and BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync set up CreateLogger on the mock but never call factory.CreateLogger, so the setup is never exercised. This creates misleading test intent.

  2. [Coverage] Provider inclusion not verified after initialization (line 141) — BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync confirms InitializeAsync() is invoked, but does not confirm the provider actually ends up in the factory. A regression breaking loggerProviders.Add(serviceInstance) would go undetected.

  3. [Coverage] No multi-provider test (line 103) — The foreach loop logic in BuildAsync is only ever tested with a single provider. A scenario mixing enabled + disabled providers would catch bugs in the loop's continue logic.

Recommendations

  • Remove or complete the CreateLogger setups (either drop them or also call factory.CreateLogger + verify).
  • Add a factory.CreateLogger + Verify step to BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync.
  • Add one multi-provider test covering mixed enable/disable states.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comment

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

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. The resolved file incorporates changes from both sides: [DataRow] parameterization and Assert.IsNotNull guard from main, _ = discard prefix and BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes test from our branch. All 20 tests pass.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix the following 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.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix the following issues

azure-pipelines
...

Fixed in the latest commit. Both occurrences of new(location, null) on lines 107 and 164 are now new(location, (IRunSettings?)null) to explicitly cast the null literal and satisfy the CS8625 nullability constraint in the target-typed new context.

@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 core LoggingManager tests merged in #8130. The unique value in this PR (explicit _ = discards + BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes test) is valuable, but the CI failure stems from a DesktopTestSourceHostTests.cs change added by conflict resolution (unrelated to the test improvements themselves).

A clean patch with just the LoggingManagerTests.cs quality improvements — no DesktopTestSourceHostTests.cs changes — is available as aw-test-assist-logging-manager-quality-improvements-v1.patch in the workflow run artifacts. Closing this PR and applying the clean patch would be the simplest path forward.

Generated by Daily Test Improver · ● 9.5M ·

…anager-buildAsync-tests-7351033ae996670b
# Conflicts:
#	test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs
CopilotAI review requested due to automatic review settings May 13, 2026 11:44

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.

Copilot's findings

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

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 13, 2026 15:52
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 15:52

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. Adopted main's cleaner structure (nested interfaces, updated test names) and added [DataRow] parameterization for the log-level test (Trace, Warning, Critical). All 24 tests pass.

@Evangelink
Amaury Levé (Evangelink) merged commit 06145e5 into mainMay 14, 2026
10 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-buildAsync-tests-7351033ae996670b branch May 14, 2026 07:44
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.

3 participants

@Evangelink
, '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 - #8129

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-buildAsync-tests-7351033ae996670b
May 14, 2026
Merged

[Test Improver] Add unit tests for LoggingManager.BuildAsync#8129
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-buildAsync-tests-7351033ae996670b

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member

Cover all key behaviors of LoggingManager:

  • AddProvider with null throws ArgumentNullException
  • BuildAsync with no providers returns a non-null factory
  • Factory delegate receives the correct LogLevel and IServiceProvider (parameterized across Trace, Warning, and Critical levels)
  • Non-IExtension provider is always included
  • IExtension provider enabled → included; disabled → excluded
  • IAsyncInitializableExtension + enabled → InitializeAsync called and provider included in factory
  • IAsyncInitializableExtension + disabled → InitializeAsync not called
  • Non-extension IAsyncInitializableExtension → InitializeAsync called and provider included in factory
  • Multiple providers registered simultaneously → only enabled ones are included (covers the foreach/continue loop)

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

Cover all key behaviors of LoggingManager:
- AddProvider with null throws ArgumentNullException
- BuildAsync with no providers returns a non-null factory
- Factory delegate receives the correct LogLevel and IServiceProvider
- Non-IExtension provider is always included
- IExtension provider enabled -> included; disabled -> excluded
- IAsyncInitializableExtension + enabled -> InitializeAsync called
- IAsyncInitializableExtension + disabled -> InitializeAsync not called
- Non-extension IAsyncInitializableExtension -> InitializeAsync called
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:46

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 focused unit test coverage for Microsoft.Testing.Platform.Logging.LoggingManager.BuildAsync, validating provider registration, enablement filtering (IExtension.IsEnabledAsync), and asynchronous initialization (IAsyncInitializableExtension.InitializeAsync) behaviors to address #7995.

Changes:

  • Added 9 unit tests covering AddProvider null-guard behavior and BuildAsync behavior across provider types.
  • Validated that BuildAsync forwards LogLevel and IServiceProvider into provider factories.
  • Covered inclusion/exclusion rules for extension-based providers and initialization rules for async-initializable providers.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests covering LoggingManager.BuildAsync provider filtering and initialization paths.

Copilot's findings

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

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

Key Findings

No correctness, threading, security, resource management, or API-compatibility issues were identified.

What was verified:

  • Correctness: All 8 test scenarios trace correctly against the LoggingManager.BuildAsync implementation. The IExtension enable/disable filtering path and the TryInitializeAsync dispatch (which internally checks is IAsyncInitializableExtension) are both exercised with appropriate combinations of mock interfaces.
  • Internal access: LoggingManager and BuildAsync are internal; access is correctly gated by the InternalsVisibleTo declaration for Microsoft.Testing.Platform.UnitTests in the main project csproj, and Moq's dynamic proxy access is similarly declared.
  • Mock fidelity: The three test-local interfaces (IExtensionLoggerProvider, IInitializableLoggerProvider, IInitializableExtensionLoggerProvider) accurately model the real interface combinations the production code branches on.
  • Threading/async: async Task test methods with proper await usage; no Task.Result/.Wait() anti-patterns.
  • No public API surface added: All additions are in test/ with internal interfaces.

Recommendations

None — the change is well-scoped, complete, and correct.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code 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: PR Nitpick Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

Good overall structure — the tests are well-focused (each verifies exactly one behavior), cover all meaningful branches of LoggingManager.BuildAsync, and follow the Moq patterns established in sibling test files. Three minor nitpicks found:

  1. Dead mock setup (line 109) — mockProvider.Setup(p => p.CreateLogger(...)) in BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync is never triggered since the test body never calls factory.CreateLogger(...). Remove to reduce noise.
  2. Implicit return-value discard (lines 68, 83, 97) — factory.CreateLogger("test") is called for its side-effect but the return is silently dropped. LoggerFactoryTests.cs uses _ = here; aligning would clarify intent.
  3. Lambda parameter naming (line 19) — Constructor setup uses x; all test-method setups use p. A consistent name (e.g., m or monitor) would read more uniformly.

Recommendations

  • Remove the unused CreateLogger setup from the WhenEnabled_CallsInitializeAsync test.
  • Prefix the three factory.CreateLogger("test") calls with _ =.
  • Rename xm (or monitor) in the constructor lambda.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick 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: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The new LoggingManagerTests are well-structured, properly isolated (new instance per test, no static mutable state), and cover the primary behaviors of LoggingManager.BuildAsync. The happy/sad path split for extension enable/disable and the initialization checks are solid. Three improvement opportunities were identified:

  1. [Structure] Dead CreateLogger mock setup (lines 109, 136) — Both BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync and BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync set up CreateLogger on the mock but never call factory.CreateLogger, so the setup is never exercised. This creates misleading test intent.

  2. [Coverage] Provider inclusion not verified after initialization (line 141) — BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync confirms InitializeAsync() is invoked, but does not confirm the provider actually ends up in the factory. A regression breaking loggerProviders.Add(serviceInstance) would go undetected.

  3. [Coverage] No multi-provider test (line 103) — The foreach loop logic in BuildAsync is only ever tested with a single provider. A scenario mixing enabled + disabled providers would catch bugs in the loop's continue logic.

Recommendations

  • Remove or complete the CreateLogger setups (either drop them or also call factory.CreateLogger + verify).
  • Add a factory.CreateLogger + Verify step to BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync.
  • Add one multi-provider test covering mixed enable/disable states.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comment

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

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. The resolved file incorporates changes from both sides: [DataRow] parameterization and Assert.IsNotNull guard from main, _ = discard prefix and BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes test from our branch. All 20 tests pass.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix the following 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.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix the following issues

azure-pipelines
...

Fixed in the latest commit. Both occurrences of new(location, null) on lines 107 and 164 are now new(location, (IRunSettings?)null) to explicitly cast the null literal and satisfy the CS8625 nullability constraint in the target-typed new context.

@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 core LoggingManager tests merged in #8130. The unique value in this PR (explicit _ = discards + BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes test) is valuable, but the CI failure stems from a DesktopTestSourceHostTests.cs change added by conflict resolution (unrelated to the test improvements themselves).

A clean patch with just the LoggingManagerTests.cs quality improvements — no DesktopTestSourceHostTests.cs changes — is available as aw-test-assist-logging-manager-quality-improvements-v1.patch in the workflow run artifacts. Closing this PR and applying the clean patch would be the simplest path forward.

Generated by Daily Test Improver · ● 9.5M ·

…anager-buildAsync-tests-7351033ae996670b
# Conflicts:
#	test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs
CopilotAI review requested due to automatic review settings May 13, 2026 11:44

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.

Copilot's findings

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

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 13, 2026 15:52
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 15:52

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. Adopted main's cleaner structure (nested interfaces, updated test names) and added [DataRow] parameterization for the log-level test (Trace, Warning, Critical). All 24 tests pass.

@Evangelink
Amaury Levé (Evangelink) merged commit 06145e5 into mainMay 14, 2026
10 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-buildAsync-tests-7351033ae996670b branch May 14, 2026 07:44
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.

3 participants

@Evangelink
, '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 - #8129

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-buildAsync-tests-7351033ae996670b
May 14, 2026
Merged

[Test Improver] Add unit tests for LoggingManager.BuildAsync#8129
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-buildAsync-tests-7351033ae996670b

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member

Cover all key behaviors of LoggingManager:

  • AddProvider with null throws ArgumentNullException
  • BuildAsync with no providers returns a non-null factory
  • Factory delegate receives the correct LogLevel and IServiceProvider (parameterized across Trace, Warning, and Critical levels)
  • Non-IExtension provider is always included
  • IExtension provider enabled → included; disabled → excluded
  • IAsyncInitializableExtension + enabled → InitializeAsync called and provider included in factory
  • IAsyncInitializableExtension + disabled → InitializeAsync not called
  • Non-extension IAsyncInitializableExtension → InitializeAsync called and provider included in factory
  • Multiple providers registered simultaneously → only enabled ones are included (covers the foreach/continue loop)

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

Cover all key behaviors of LoggingManager:
- AddProvider with null throws ArgumentNullException
- BuildAsync with no providers returns a non-null factory
- Factory delegate receives the correct LogLevel and IServiceProvider
- Non-IExtension provider is always included
- IExtension provider enabled -> included; disabled -> excluded
- IAsyncInitializableExtension + enabled -> InitializeAsync called
- IAsyncInitializableExtension + disabled -> InitializeAsync not called
- Non-extension IAsyncInitializableExtension -> InitializeAsync called
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:46

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 focused unit test coverage for Microsoft.Testing.Platform.Logging.LoggingManager.BuildAsync, validating provider registration, enablement filtering (IExtension.IsEnabledAsync), and asynchronous initialization (IAsyncInitializableExtension.InitializeAsync) behaviors to address #7995.

Changes:

  • Added 9 unit tests covering AddProvider null-guard behavior and BuildAsync behavior across provider types.
  • Validated that BuildAsync forwards LogLevel and IServiceProvider into provider factories.
  • Covered inclusion/exclusion rules for extension-based providers and initialization rules for async-initializable providers.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests covering LoggingManager.BuildAsync provider filtering and initialization paths.

Copilot's findings

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

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

Key Findings

No correctness, threading, security, resource management, or API-compatibility issues were identified.

What was verified:

  • Correctness: All 8 test scenarios trace correctly against the LoggingManager.BuildAsync implementation. The IExtension enable/disable filtering path and the TryInitializeAsync dispatch (which internally checks is IAsyncInitializableExtension) are both exercised with appropriate combinations of mock interfaces.
  • Internal access: LoggingManager and BuildAsync are internal; access is correctly gated by the InternalsVisibleTo declaration for Microsoft.Testing.Platform.UnitTests in the main project csproj, and Moq's dynamic proxy access is similarly declared.
  • Mock fidelity: The three test-local interfaces (IExtensionLoggerProvider, IInitializableLoggerProvider, IInitializableExtensionLoggerProvider) accurately model the real interface combinations the production code branches on.
  • Threading/async: async Task test methods with proper await usage; no Task.Result/.Wait() anti-patterns.
  • No public API surface added: All additions are in test/ with internal interfaces.

Recommendations

None — the change is well-scoped, complete, and correct.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code 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: PR Nitpick Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

Good overall structure — the tests are well-focused (each verifies exactly one behavior), cover all meaningful branches of LoggingManager.BuildAsync, and follow the Moq patterns established in sibling test files. Three minor nitpicks found:

  1. Dead mock setup (line 109) — mockProvider.Setup(p => p.CreateLogger(...)) in BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync is never triggered since the test body never calls factory.CreateLogger(...). Remove to reduce noise.
  2. Implicit return-value discard (lines 68, 83, 97) — factory.CreateLogger("test") is called for its side-effect but the return is silently dropped. LoggerFactoryTests.cs uses _ = here; aligning would clarify intent.
  3. Lambda parameter naming (line 19) — Constructor setup uses x; all test-method setups use p. A consistent name (e.g., m or monitor) would read more uniformly.

Recommendations

  • Remove the unused CreateLogger setup from the WhenEnabled_CallsInitializeAsync test.
  • Prefix the three factory.CreateLogger("test") calls with _ =.
  • Rename xm (or monitor) in the constructor lambda.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick 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: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The new LoggingManagerTests are well-structured, properly isolated (new instance per test, no static mutable state), and cover the primary behaviors of LoggingManager.BuildAsync. The happy/sad path split for extension enable/disable and the initialization checks are solid. Three improvement opportunities were identified:

  1. [Structure] Dead CreateLogger mock setup (lines 109, 136) — Both BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync and BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync set up CreateLogger on the mock but never call factory.CreateLogger, so the setup is never exercised. This creates misleading test intent.

  2. [Coverage] Provider inclusion not verified after initialization (line 141) — BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync confirms InitializeAsync() is invoked, but does not confirm the provider actually ends up in the factory. A regression breaking loggerProviders.Add(serviceInstance) would go undetected.

  3. [Coverage] No multi-provider test (line 103) — The foreach loop logic in BuildAsync is only ever tested with a single provider. A scenario mixing enabled + disabled providers would catch bugs in the loop's continue logic.

Recommendations

  • Remove or complete the CreateLogger setups (either drop them or also call factory.CreateLogger + verify).
  • Add a factory.CreateLogger + Verify step to BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync.
  • Add one multi-provider test covering mixed enable/disable states.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comment

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

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. The resolved file incorporates changes from both sides: [DataRow] parameterization and Assert.IsNotNull guard from main, _ = discard prefix and BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes test from our branch. All 20 tests pass.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix the following 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.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix the following issues

azure-pipelines
...

Fixed in the latest commit. Both occurrences of new(location, null) on lines 107 and 164 are now new(location, (IRunSettings?)null) to explicitly cast the null literal and satisfy the CS8625 nullability constraint in the target-typed new context.

@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 core LoggingManager tests merged in #8130. The unique value in this PR (explicit _ = discards + BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes test) is valuable, but the CI failure stems from a DesktopTestSourceHostTests.cs change added by conflict resolution (unrelated to the test improvements themselves).

A clean patch with just the LoggingManagerTests.cs quality improvements — no DesktopTestSourceHostTests.cs changes — is available as aw-test-assist-logging-manager-quality-improvements-v1.patch in the workflow run artifacts. Closing this PR and applying the clean patch would be the simplest path forward.

Generated by Daily Test Improver · ● 9.5M ·

…anager-buildAsync-tests-7351033ae996670b
# Conflicts:
#	test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs
CopilotAI review requested due to automatic review settings May 13, 2026 11:44

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.

Copilot's findings

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

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 13, 2026 15:52
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 15:52

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. Adopted main's cleaner structure (nested interfaces, updated test names) and added [DataRow] parameterization for the log-level test (Trace, Warning, Critical). All 24 tests pass.

@Evangelink
Amaury Levé (Evangelink) merged commit 06145e5 into mainMay 14, 2026
10 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-buildAsync-tests-7351033ae996670b branch May 14, 2026 07:44
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.

3 participants

@Evangelink
, '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 - #8129

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-buildAsync-tests-7351033ae996670b
May 14, 2026
Merged

[Test Improver] Add unit tests for LoggingManager.BuildAsync#8129
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-buildAsync-tests-7351033ae996670b

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member

Cover all key behaviors of LoggingManager:

  • AddProvider with null throws ArgumentNullException
  • BuildAsync with no providers returns a non-null factory
  • Factory delegate receives the correct LogLevel and IServiceProvider (parameterized across Trace, Warning, and Critical levels)
  • Non-IExtension provider is always included
  • IExtension provider enabled → included; disabled → excluded
  • IAsyncInitializableExtension + enabled → InitializeAsync called and provider included in factory
  • IAsyncInitializableExtension + disabled → InitializeAsync not called
  • Non-extension IAsyncInitializableExtension → InitializeAsync called and provider included in factory
  • Multiple providers registered simultaneously → only enabled ones are included (covers the foreach/continue loop)

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

Cover all key behaviors of LoggingManager:
- AddProvider with null throws ArgumentNullException
- BuildAsync with no providers returns a non-null factory
- Factory delegate receives the correct LogLevel and IServiceProvider
- Non-IExtension provider is always included
- IExtension provider enabled -> included; disabled -> excluded
- IAsyncInitializableExtension + enabled -> InitializeAsync called
- IAsyncInitializableExtension + disabled -> InitializeAsync not called
- Non-extension IAsyncInitializableExtension -> InitializeAsync called
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:46

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 focused unit test coverage for Microsoft.Testing.Platform.Logging.LoggingManager.BuildAsync, validating provider registration, enablement filtering (IExtension.IsEnabledAsync), and asynchronous initialization (IAsyncInitializableExtension.InitializeAsync) behaviors to address #7995.

Changes:

  • Added 9 unit tests covering AddProvider null-guard behavior and BuildAsync behavior across provider types.
  • Validated that BuildAsync forwards LogLevel and IServiceProvider into provider factories.
  • Covered inclusion/exclusion rules for extension-based providers and initialization rules for async-initializable providers.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests covering LoggingManager.BuildAsync provider filtering and initialization paths.

Copilot's findings

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

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

Key Findings

No correctness, threading, security, resource management, or API-compatibility issues were identified.

What was verified:

  • Correctness: All 8 test scenarios trace correctly against the LoggingManager.BuildAsync implementation. The IExtension enable/disable filtering path and the TryInitializeAsync dispatch (which internally checks is IAsyncInitializableExtension) are both exercised with appropriate combinations of mock interfaces.
  • Internal access: LoggingManager and BuildAsync are internal; access is correctly gated by the InternalsVisibleTo declaration for Microsoft.Testing.Platform.UnitTests in the main project csproj, and Moq's dynamic proxy access is similarly declared.
  • Mock fidelity: The three test-local interfaces (IExtensionLoggerProvider, IInitializableLoggerProvider, IInitializableExtensionLoggerProvider) accurately model the real interface combinations the production code branches on.
  • Threading/async: async Task test methods with proper await usage; no Task.Result/.Wait() anti-patterns.
  • No public API surface added: All additions are in test/ with internal interfaces.

Recommendations

None — the change is well-scoped, complete, and correct.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code 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: PR Nitpick Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

Good overall structure — the tests are well-focused (each verifies exactly one behavior), cover all meaningful branches of LoggingManager.BuildAsync, and follow the Moq patterns established in sibling test files. Three minor nitpicks found:

  1. Dead mock setup (line 109) — mockProvider.Setup(p => p.CreateLogger(...)) in BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync is never triggered since the test body never calls factory.CreateLogger(...). Remove to reduce noise.
  2. Implicit return-value discard (lines 68, 83, 97) — factory.CreateLogger("test") is called for its side-effect but the return is silently dropped. LoggerFactoryTests.cs uses _ = here; aligning would clarify intent.
  3. Lambda parameter naming (line 19) — Constructor setup uses x; all test-method setups use p. A consistent name (e.g., m or monitor) would read more uniformly.

Recommendations

  • Remove the unused CreateLogger setup from the WhenEnabled_CallsInitializeAsync test.
  • Prefix the three factory.CreateLogger("test") calls with _ =.
  • Rename xm (or monitor) in the constructor lambda.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick 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: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The new LoggingManagerTests are well-structured, properly isolated (new instance per test, no static mutable state), and cover the primary behaviors of LoggingManager.BuildAsync. The happy/sad path split for extension enable/disable and the initialization checks are solid. Three improvement opportunities were identified:

  1. [Structure] Dead CreateLogger mock setup (lines 109, 136) — Both BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync and BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync set up CreateLogger on the mock but never call factory.CreateLogger, so the setup is never exercised. This creates misleading test intent.

  2. [Coverage] Provider inclusion not verified after initialization (line 141) — BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync confirms InitializeAsync() is invoked, but does not confirm the provider actually ends up in the factory. A regression breaking loggerProviders.Add(serviceInstance) would go undetected.

  3. [Coverage] No multi-provider test (line 103) — The foreach loop logic in BuildAsync is only ever tested with a single provider. A scenario mixing enabled + disabled providers would catch bugs in the loop's continue logic.

Recommendations

  • Remove or complete the CreateLogger setups (either drop them or also call factory.CreateLogger + verify).
  • Add a factory.CreateLogger + Verify step to BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync.
  • Add one multi-provider test covering mixed enable/disable states.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comment

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

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. The resolved file incorporates changes from both sides: [DataRow] parameterization and Assert.IsNotNull guard from main, _ = discard prefix and BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes test from our branch. All 20 tests pass.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix the following 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.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix the following issues

azure-pipelines
...

Fixed in the latest commit. Both occurrences of new(location, null) on lines 107 and 164 are now new(location, (IRunSettings?)null) to explicitly cast the null literal and satisfy the CS8625 nullability constraint in the target-typed new context.

@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 core LoggingManager tests merged in #8130. The unique value in this PR (explicit _ = discards + BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes test) is valuable, but the CI failure stems from a DesktopTestSourceHostTests.cs change added by conflict resolution (unrelated to the test improvements themselves).

A clean patch with just the LoggingManagerTests.cs quality improvements — no DesktopTestSourceHostTests.cs changes — is available as aw-test-assist-logging-manager-quality-improvements-v1.patch in the workflow run artifacts. Closing this PR and applying the clean patch would be the simplest path forward.

Generated by Daily Test Improver · ● 9.5M ·

…anager-buildAsync-tests-7351033ae996670b
# Conflicts:
#	test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs
CopilotAI review requested due to automatic review settings May 13, 2026 11:44

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.

Copilot's findings

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

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 13, 2026 15:52
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 15:52

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. Adopted main's cleaner structure (nested interfaces, updated test names) and added [DataRow] parameterization for the log-level test (Trace, Warning, Critical). All 24 tests pass.

@Evangelink
Amaury Levé (Evangelink) merged commit 06145e5 into mainMay 14, 2026
10 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-buildAsync-tests-7351033ae996670b branch May 14, 2026 07:44
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.

3 participants

@Evangelink
, '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 - #8129

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-buildAsync-tests-7351033ae996670b
May 14, 2026
Merged

[Test Improver] Add unit tests for LoggingManager.BuildAsync#8129
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-buildAsync-tests-7351033ae996670b

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member

Cover all key behaviors of LoggingManager:

  • AddProvider with null throws ArgumentNullException
  • BuildAsync with no providers returns a non-null factory
  • Factory delegate receives the correct LogLevel and IServiceProvider (parameterized across Trace, Warning, and Critical levels)
  • Non-IExtension provider is always included
  • IExtension provider enabled → included; disabled → excluded
  • IAsyncInitializableExtension + enabled → InitializeAsync called and provider included in factory
  • IAsyncInitializableExtension + disabled → InitializeAsync not called
  • Non-extension IAsyncInitializableExtension → InitializeAsync called and provider included in factory
  • Multiple providers registered simultaneously → only enabled ones are included (covers the foreach/continue loop)

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

Cover all key behaviors of LoggingManager:
- AddProvider with null throws ArgumentNullException
- BuildAsync with no providers returns a non-null factory
- Factory delegate receives the correct LogLevel and IServiceProvider
- Non-IExtension provider is always included
- IExtension provider enabled -> included; disabled -> excluded
- IAsyncInitializableExtension + enabled -> InitializeAsync called
- IAsyncInitializableExtension + disabled -> InitializeAsync not called
- Non-extension IAsyncInitializableExtension -> InitializeAsync called
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:46

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 focused unit test coverage for Microsoft.Testing.Platform.Logging.LoggingManager.BuildAsync, validating provider registration, enablement filtering (IExtension.IsEnabledAsync), and asynchronous initialization (IAsyncInitializableExtension.InitializeAsync) behaviors to address #7995.

Changes:

  • Added 9 unit tests covering AddProvider null-guard behavior and BuildAsync behavior across provider types.
  • Validated that BuildAsync forwards LogLevel and IServiceProvider into provider factories.
  • Covered inclusion/exclusion rules for extension-based providers and initialization rules for async-initializable providers.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests covering LoggingManager.BuildAsync provider filtering and initialization paths.

Copilot's findings

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

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

Key Findings

No correctness, threading, security, resource management, or API-compatibility issues were identified.

What was verified:

  • Correctness: All 8 test scenarios trace correctly against the LoggingManager.BuildAsync implementation. The IExtension enable/disable filtering path and the TryInitializeAsync dispatch (which internally checks is IAsyncInitializableExtension) are both exercised with appropriate combinations of mock interfaces.
  • Internal access: LoggingManager and BuildAsync are internal; access is correctly gated by the InternalsVisibleTo declaration for Microsoft.Testing.Platform.UnitTests in the main project csproj, and Moq's dynamic proxy access is similarly declared.
  • Mock fidelity: The three test-local interfaces (IExtensionLoggerProvider, IInitializableLoggerProvider, IInitializableExtensionLoggerProvider) accurately model the real interface combinations the production code branches on.
  • Threading/async: async Task test methods with proper await usage; no Task.Result/.Wait() anti-patterns.
  • No public API surface added: All additions are in test/ with internal interfaces.

Recommendations

None — the change is well-scoped, complete, and correct.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code 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: PR Nitpick Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

Good overall structure — the tests are well-focused (each verifies exactly one behavior), cover all meaningful branches of LoggingManager.BuildAsync, and follow the Moq patterns established in sibling test files. Three minor nitpicks found:

  1. Dead mock setup (line 109) — mockProvider.Setup(p => p.CreateLogger(...)) in BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync is never triggered since the test body never calls factory.CreateLogger(...). Remove to reduce noise.
  2. Implicit return-value discard (lines 68, 83, 97) — factory.CreateLogger("test") is called for its side-effect but the return is silently dropped. LoggerFactoryTests.cs uses _ = here; aligning would clarify intent.
  3. Lambda parameter naming (line 19) — Constructor setup uses x; all test-method setups use p. A consistent name (e.g., m or monitor) would read more uniformly.

Recommendations

  • Remove the unused CreateLogger setup from the WhenEnabled_CallsInitializeAsync test.
  • Prefix the three factory.CreateLogger("test") calls with _ =.
  • Rename xm (or monitor) in the constructor lambda.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick 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: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The new LoggingManagerTests are well-structured, properly isolated (new instance per test, no static mutable state), and cover the primary behaviors of LoggingManager.BuildAsync. The happy/sad path split for extension enable/disable and the initialization checks are solid. Three improvement opportunities were identified:

  1. [Structure] Dead CreateLogger mock setup (lines 109, 136) — Both BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync and BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync set up CreateLogger on the mock but never call factory.CreateLogger, so the setup is never exercised. This creates misleading test intent.

  2. [Coverage] Provider inclusion not verified after initialization (line 141) — BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync confirms InitializeAsync() is invoked, but does not confirm the provider actually ends up in the factory. A regression breaking loggerProviders.Add(serviceInstance) would go undetected.

  3. [Coverage] No multi-provider test (line 103) — The foreach loop logic in BuildAsync is only ever tested with a single provider. A scenario mixing enabled + disabled providers would catch bugs in the loop's continue logic.

Recommendations

  • Remove or complete the CreateLogger setups (either drop them or also call factory.CreateLogger + verify).
  • Add a factory.CreateLogger + Verify step to BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync.
  • Add one multi-provider test covering mixed enable/disable states.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comment

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

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. The resolved file incorporates changes from both sides: [DataRow] parameterization and Assert.IsNotNull guard from main, _ = discard prefix and BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes test from our branch. All 20 tests pass.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix the following 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.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix the following issues

azure-pipelines
...

Fixed in the latest commit. Both occurrences of new(location, null) on lines 107 and 164 are now new(location, (IRunSettings?)null) to explicitly cast the null literal and satisfy the CS8625 nullability constraint in the target-typed new context.

@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 core LoggingManager tests merged in #8130. The unique value in this PR (explicit _ = discards + BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes test) is valuable, but the CI failure stems from a DesktopTestSourceHostTests.cs change added by conflict resolution (unrelated to the test improvements themselves).

A clean patch with just the LoggingManagerTests.cs quality improvements — no DesktopTestSourceHostTests.cs changes — is available as aw-test-assist-logging-manager-quality-improvements-v1.patch in the workflow run artifacts. Closing this PR and applying the clean patch would be the simplest path forward.

Generated by Daily Test Improver · ● 9.5M ·

…anager-buildAsync-tests-7351033ae996670b
# Conflicts:
#	test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs
CopilotAI review requested due to automatic review settings May 13, 2026 11:44

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.

Copilot's findings

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

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 13, 2026 15:52
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 15:52

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. Adopted main's cleaner structure (nested interfaces, updated test names) and added [DataRow] parameterization for the log-level test (Trace, Warning, Critical). All 24 tests pass.

@Evangelink
Amaury Levé (Evangelink) merged commit 06145e5 into mainMay 14, 2026
10 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-buildAsync-tests-7351033ae996670b branch May 14, 2026 07:44
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.

3 participants

@Evangelink
, '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 - #8129

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-buildAsync-tests-7351033ae996670b
May 14, 2026
Merged

[Test Improver] Add unit tests for LoggingManager.BuildAsync#8129
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-buildAsync-tests-7351033ae996670b

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member

Cover all key behaviors of LoggingManager:

  • AddProvider with null throws ArgumentNullException
  • BuildAsync with no providers returns a non-null factory
  • Factory delegate receives the correct LogLevel and IServiceProvider (parameterized across Trace, Warning, and Critical levels)
  • Non-IExtension provider is always included
  • IExtension provider enabled → included; disabled → excluded
  • IAsyncInitializableExtension + enabled → InitializeAsync called and provider included in factory
  • IAsyncInitializableExtension + disabled → InitializeAsync not called
  • Non-extension IAsyncInitializableExtension → InitializeAsync called and provider included in factory
  • Multiple providers registered simultaneously → only enabled ones are included (covers the foreach/continue loop)

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

Cover all key behaviors of LoggingManager:
- AddProvider with null throws ArgumentNullException
- BuildAsync with no providers returns a non-null factory
- Factory delegate receives the correct LogLevel and IServiceProvider
- Non-IExtension provider is always included
- IExtension provider enabled -> included; disabled -> excluded
- IAsyncInitializableExtension + enabled -> InitializeAsync called
- IAsyncInitializableExtension + disabled -> InitializeAsync not called
- Non-extension IAsyncInitializableExtension -> InitializeAsync called
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:46

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 focused unit test coverage for Microsoft.Testing.Platform.Logging.LoggingManager.BuildAsync, validating provider registration, enablement filtering (IExtension.IsEnabledAsync), and asynchronous initialization (IAsyncInitializableExtension.InitializeAsync) behaviors to address #7995.

Changes:

  • Added 9 unit tests covering AddProvider null-guard behavior and BuildAsync behavior across provider types.
  • Validated that BuildAsync forwards LogLevel and IServiceProvider into provider factories.
  • Covered inclusion/exclusion rules for extension-based providers and initialization rules for async-initializable providers.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests covering LoggingManager.BuildAsync provider filtering and initialization paths.

Copilot's findings

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

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

Key Findings

No correctness, threading, security, resource management, or API-compatibility issues were identified.

What was verified:

  • Correctness: All 8 test scenarios trace correctly against the LoggingManager.BuildAsync implementation. The IExtension enable/disable filtering path and the TryInitializeAsync dispatch (which internally checks is IAsyncInitializableExtension) are both exercised with appropriate combinations of mock interfaces.
  • Internal access: LoggingManager and BuildAsync are internal; access is correctly gated by the InternalsVisibleTo declaration for Microsoft.Testing.Platform.UnitTests in the main project csproj, and Moq's dynamic proxy access is similarly declared.
  • Mock fidelity: The three test-local interfaces (IExtensionLoggerProvider, IInitializableLoggerProvider, IInitializableExtensionLoggerProvider) accurately model the real interface combinations the production code branches on.
  • Threading/async: async Task test methods with proper await usage; no Task.Result/.Wait() anti-patterns.
  • No public API surface added: All additions are in test/ with internal interfaces.

Recommendations

None — the change is well-scoped, complete, and correct.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code 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: PR Nitpick Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

Good overall structure — the tests are well-focused (each verifies exactly one behavior), cover all meaningful branches of LoggingManager.BuildAsync, and follow the Moq patterns established in sibling test files. Three minor nitpicks found:

  1. Dead mock setup (line 109) — mockProvider.Setup(p => p.CreateLogger(...)) in BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync is never triggered since the test body never calls factory.CreateLogger(...). Remove to reduce noise.
  2. Implicit return-value discard (lines 68, 83, 97) — factory.CreateLogger("test") is called for its side-effect but the return is silently dropped. LoggerFactoryTests.cs uses _ = here; aligning would clarify intent.
  3. Lambda parameter naming (line 19) — Constructor setup uses x; all test-method setups use p. A consistent name (e.g., m or monitor) would read more uniformly.

Recommendations

  • Remove the unused CreateLogger setup from the WhenEnabled_CallsInitializeAsync test.
  • Prefix the three factory.CreateLogger("test") calls with _ =.
  • Rename xm (or monitor) in the constructor lambda.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick 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: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The new LoggingManagerTests are well-structured, properly isolated (new instance per test, no static mutable state), and cover the primary behaviors of LoggingManager.BuildAsync. The happy/sad path split for extension enable/disable and the initialization checks are solid. Three improvement opportunities were identified:

  1. [Structure] Dead CreateLogger mock setup (lines 109, 136) — Both BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync and BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync set up CreateLogger on the mock but never call factory.CreateLogger, so the setup is never exercised. This creates misleading test intent.

  2. [Coverage] Provider inclusion not verified after initialization (line 141) — BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync confirms InitializeAsync() is invoked, but does not confirm the provider actually ends up in the factory. A regression breaking loggerProviders.Add(serviceInstance) would go undetected.

  3. [Coverage] No multi-provider test (line 103) — The foreach loop logic in BuildAsync is only ever tested with a single provider. A scenario mixing enabled + disabled providers would catch bugs in the loop's continue logic.

Recommendations

  • Remove or complete the CreateLogger setups (either drop them or also call factory.CreateLogger + verify).
  • Add a factory.CreateLogger + Verify step to BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync.
  • Add one multi-provider test covering mixed enable/disable states.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comment

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

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. The resolved file incorporates changes from both sides: [DataRow] parameterization and Assert.IsNotNull guard from main, _ = discard prefix and BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes test from our branch. All 20 tests pass.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix the following 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.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix the following issues

azure-pipelines
...

Fixed in the latest commit. Both occurrences of new(location, null) on lines 107 and 164 are now new(location, (IRunSettings?)null) to explicitly cast the null literal and satisfy the CS8625 nullability constraint in the target-typed new context.

@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 core LoggingManager tests merged in #8130. The unique value in this PR (explicit _ = discards + BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes test) is valuable, but the CI failure stems from a DesktopTestSourceHostTests.cs change added by conflict resolution (unrelated to the test improvements themselves).

A clean patch with just the LoggingManagerTests.cs quality improvements — no DesktopTestSourceHostTests.cs changes — is available as aw-test-assist-logging-manager-quality-improvements-v1.patch in the workflow run artifacts. Closing this PR and applying the clean patch would be the simplest path forward.

Generated by Daily Test Improver · ● 9.5M ·

…anager-buildAsync-tests-7351033ae996670b
# Conflicts:
#	test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs
CopilotAI review requested due to automatic review settings May 13, 2026 11:44

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.

Copilot's findings

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

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 13, 2026 15:52
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 15:52

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. Adopted main's cleaner structure (nested interfaces, updated test names) and added [DataRow] parameterization for the log-level test (Trace, Warning, Critical). All 24 tests pass.

@Evangelink
Amaury Levé (Evangelink) merged commit 06145e5 into mainMay 14, 2026
10 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-buildAsync-tests-7351033ae996670b branch May 14, 2026 07:44
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.

3 participants

@Evangelink
, '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 - #8129

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-buildAsync-tests-7351033ae996670b
May 14, 2026
Merged

[Test Improver] Add unit tests for LoggingManager.BuildAsync#8129
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-buildAsync-tests-7351033ae996670b

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member

Cover all key behaviors of LoggingManager:

  • AddProvider with null throws ArgumentNullException
  • BuildAsync with no providers returns a non-null factory
  • Factory delegate receives the correct LogLevel and IServiceProvider (parameterized across Trace, Warning, and Critical levels)
  • Non-IExtension provider is always included
  • IExtension provider enabled → included; disabled → excluded
  • IAsyncInitializableExtension + enabled → InitializeAsync called and provider included in factory
  • IAsyncInitializableExtension + disabled → InitializeAsync not called
  • Non-extension IAsyncInitializableExtension → InitializeAsync called and provider included in factory
  • Multiple providers registered simultaneously → only enabled ones are included (covers the foreach/continue loop)

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

Cover all key behaviors of LoggingManager:
- AddProvider with null throws ArgumentNullException
- BuildAsync with no providers returns a non-null factory
- Factory delegate receives the correct LogLevel and IServiceProvider
- Non-IExtension provider is always included
- IExtension provider enabled -> included; disabled -> excluded
- IAsyncInitializableExtension + enabled -> InitializeAsync called
- IAsyncInitializableExtension + disabled -> InitializeAsync not called
- Non-extension IAsyncInitializableExtension -> InitializeAsync called
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:46

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 focused unit test coverage for Microsoft.Testing.Platform.Logging.LoggingManager.BuildAsync, validating provider registration, enablement filtering (IExtension.IsEnabledAsync), and asynchronous initialization (IAsyncInitializableExtension.InitializeAsync) behaviors to address #7995.

Changes:

  • Added 9 unit tests covering AddProvider null-guard behavior and BuildAsync behavior across provider types.
  • Validated that BuildAsync forwards LogLevel and IServiceProvider into provider factories.
  • Covered inclusion/exclusion rules for extension-based providers and initialization rules for async-initializable providers.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests covering LoggingManager.BuildAsync provider filtering and initialization paths.

Copilot's findings

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

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

Key Findings

No correctness, threading, security, resource management, or API-compatibility issues were identified.

What was verified:

  • Correctness: All 8 test scenarios trace correctly against the LoggingManager.BuildAsync implementation. The IExtension enable/disable filtering path and the TryInitializeAsync dispatch (which internally checks is IAsyncInitializableExtension) are both exercised with appropriate combinations of mock interfaces.
  • Internal access: LoggingManager and BuildAsync are internal; access is correctly gated by the InternalsVisibleTo declaration for Microsoft.Testing.Platform.UnitTests in the main project csproj, and Moq's dynamic proxy access is similarly declared.
  • Mock fidelity: The three test-local interfaces (IExtensionLoggerProvider, IInitializableLoggerProvider, IInitializableExtensionLoggerProvider) accurately model the real interface combinations the production code branches on.
  • Threading/async: async Task test methods with proper await usage; no Task.Result/.Wait() anti-patterns.
  • No public API surface added: All additions are in test/ with internal interfaces.

Recommendations

None — the change is well-scoped, complete, and correct.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code 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: PR Nitpick Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

Good overall structure — the tests are well-focused (each verifies exactly one behavior), cover all meaningful branches of LoggingManager.BuildAsync, and follow the Moq patterns established in sibling test files. Three minor nitpicks found:

  1. Dead mock setup (line 109) — mockProvider.Setup(p => p.CreateLogger(...)) in BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync is never triggered since the test body never calls factory.CreateLogger(...). Remove to reduce noise.
  2. Implicit return-value discard (lines 68, 83, 97) — factory.CreateLogger("test") is called for its side-effect but the return is silently dropped. LoggerFactoryTests.cs uses _ = here; aligning would clarify intent.
  3. Lambda parameter naming (line 19) — Constructor setup uses x; all test-method setups use p. A consistent name (e.g., m or monitor) would read more uniformly.

Recommendations

  • Remove the unused CreateLogger setup from the WhenEnabled_CallsInitializeAsync test.
  • Prefix the three factory.CreateLogger("test") calls with _ =.
  • Rename xm (or monitor) in the constructor lambda.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick 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: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The new LoggingManagerTests are well-structured, properly isolated (new instance per test, no static mutable state), and cover the primary behaviors of LoggingManager.BuildAsync. The happy/sad path split for extension enable/disable and the initialization checks are solid. Three improvement opportunities were identified:

  1. [Structure] Dead CreateLogger mock setup (lines 109, 136) — Both BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync and BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync set up CreateLogger on the mock but never call factory.CreateLogger, so the setup is never exercised. This creates misleading test intent.

  2. [Coverage] Provider inclusion not verified after initialization (line 141) — BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync confirms InitializeAsync() is invoked, but does not confirm the provider actually ends up in the factory. A regression breaking loggerProviders.Add(serviceInstance) would go undetected.

  3. [Coverage] No multi-provider test (line 103) — The foreach loop logic in BuildAsync is only ever tested with a single provider. A scenario mixing enabled + disabled providers would catch bugs in the loop's continue logic.

Recommendations

  • Remove or complete the CreateLogger setups (either drop them or also call factory.CreateLogger + verify).
  • Add a factory.CreateLogger + Verify step to BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync.
  • Add one multi-provider test covering mixed enable/disable states.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comment

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

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. The resolved file incorporates changes from both sides: [DataRow] parameterization and Assert.IsNotNull guard from main, _ = discard prefix and BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes test from our branch. All 20 tests pass.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix the following 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.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix the following issues

azure-pipelines
...

Fixed in the latest commit. Both occurrences of new(location, null) on lines 107 and 164 are now new(location, (IRunSettings?)null) to explicitly cast the null literal and satisfy the CS8625 nullability constraint in the target-typed new context.

@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 core LoggingManager tests merged in #8130. The unique value in this PR (explicit _ = discards + BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes test) is valuable, but the CI failure stems from a DesktopTestSourceHostTests.cs change added by conflict resolution (unrelated to the test improvements themselves).

A clean patch with just the LoggingManagerTests.cs quality improvements — no DesktopTestSourceHostTests.cs changes — is available as aw-test-assist-logging-manager-quality-improvements-v1.patch in the workflow run artifacts. Closing this PR and applying the clean patch would be the simplest path forward.

Generated by Daily Test Improver · ● 9.5M ·

…anager-buildAsync-tests-7351033ae996670b
# Conflicts:
#	test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs
CopilotAI review requested due to automatic review settings May 13, 2026 11:44

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.

Copilot's findings

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

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 13, 2026 15:52
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 15:52

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. Adopted main's cleaner structure (nested interfaces, updated test names) and added [DataRow] parameterization for the log-level test (Trace, Warning, Critical). All 24 tests pass.

@Evangelink
Amaury Levé (Evangelink) merged commit 06145e5 into mainMay 14, 2026
10 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-buildAsync-tests-7351033ae996670b branch May 14, 2026 07:44
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.

3 participants

@Evangelink
, '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 - #8129

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-buildAsync-tests-7351033ae996670b
May 14, 2026
Merged

[Test Improver] Add unit tests for LoggingManager.BuildAsync#8129
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-buildAsync-tests-7351033ae996670b

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member

Cover all key behaviors of LoggingManager:

  • AddProvider with null throws ArgumentNullException
  • BuildAsync with no providers returns a non-null factory
  • Factory delegate receives the correct LogLevel and IServiceProvider (parameterized across Trace, Warning, and Critical levels)
  • Non-IExtension provider is always included
  • IExtension provider enabled → included; disabled → excluded
  • IAsyncInitializableExtension + enabled → InitializeAsync called and provider included in factory
  • IAsyncInitializableExtension + disabled → InitializeAsync not called
  • Non-extension IAsyncInitializableExtension → InitializeAsync called and provider included in factory
  • Multiple providers registered simultaneously → only enabled ones are included (covers the foreach/continue loop)

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

Cover all key behaviors of LoggingManager:
- AddProvider with null throws ArgumentNullException
- BuildAsync with no providers returns a non-null factory
- Factory delegate receives the correct LogLevel and IServiceProvider
- Non-IExtension provider is always included
- IExtension provider enabled -> included; disabled -> excluded
- IAsyncInitializableExtension + enabled -> InitializeAsync called
- IAsyncInitializableExtension + disabled -> InitializeAsync not called
- Non-extension IAsyncInitializableExtension -> InitializeAsync called
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:46

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 focused unit test coverage for Microsoft.Testing.Platform.Logging.LoggingManager.BuildAsync, validating provider registration, enablement filtering (IExtension.IsEnabledAsync), and asynchronous initialization (IAsyncInitializableExtension.InitializeAsync) behaviors to address #7995.

Changes:

  • Added 9 unit tests covering AddProvider null-guard behavior and BuildAsync behavior across provider types.
  • Validated that BuildAsync forwards LogLevel and IServiceProvider into provider factories.
  • Covered inclusion/exclusion rules for extension-based providers and initialization rules for async-initializable providers.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests covering LoggingManager.BuildAsync provider filtering and initialization paths.

Copilot's findings

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

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

Key Findings

No correctness, threading, security, resource management, or API-compatibility issues were identified.

What was verified:

  • Correctness: All 8 test scenarios trace correctly against the LoggingManager.BuildAsync implementation. The IExtension enable/disable filtering path and the TryInitializeAsync dispatch (which internally checks is IAsyncInitializableExtension) are both exercised with appropriate combinations of mock interfaces.
  • Internal access: LoggingManager and BuildAsync are internal; access is correctly gated by the InternalsVisibleTo declaration for Microsoft.Testing.Platform.UnitTests in the main project csproj, and Moq's dynamic proxy access is similarly declared.
  • Mock fidelity: The three test-local interfaces (IExtensionLoggerProvider, IInitializableLoggerProvider, IInitializableExtensionLoggerProvider) accurately model the real interface combinations the production code branches on.
  • Threading/async: async Task test methods with proper await usage; no Task.Result/.Wait() anti-patterns.
  • No public API surface added: All additions are in test/ with internal interfaces.

Recommendations

None — the change is well-scoped, complete, and correct.


Generated by Expert Code Reviewer

🧠 Reviewed by Expert Code 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: PR Nitpick Reviewer
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

Good overall structure — the tests are well-focused (each verifies exactly one behavior), cover all meaningful branches of LoggingManager.BuildAsync, and follow the Moq patterns established in sibling test files. Three minor nitpicks found:

  1. Dead mock setup (line 109) — mockProvider.Setup(p => p.CreateLogger(...)) in BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync is never triggered since the test body never calls factory.CreateLogger(...). Remove to reduce noise.
  2. Implicit return-value discard (lines 68, 83, 97) — factory.CreateLogger("test") is called for its side-effect but the return is silently dropped. LoggerFactoryTests.cs uses _ = here; aligning would clarify intent.
  3. Lambda parameter naming (line 19) — Constructor setup uses x; all test-method setups use p. A consistent name (e.g., m or monitor) would read more uniformly.

Recommendations

  • Remove the unused CreateLogger setup from the WhenEnabled_CallsInitializeAsync test.
  • Prefix the three factory.CreateLogger("test") calls with _ =.
  • Rename xm (or monitor) in the constructor lambda.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick 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: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The new LoggingManagerTests are well-structured, properly isolated (new instance per test, no static mutable state), and cover the primary behaviors of LoggingManager.BuildAsync. The happy/sad path split for extension enable/disable and the initialization checks are solid. Three improvement opportunities were identified:

  1. [Structure] Dead CreateLogger mock setup (lines 109, 136) — Both BuildAsync_InitializableExtensionProvider_WhenEnabled_CallsInitializeAsync and BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync set up CreateLogger on the mock but never call factory.CreateLogger, so the setup is never exercised. This creates misleading test intent.

  2. [Coverage] Provider inclusion not verified after initialization (line 141) — BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync confirms InitializeAsync() is invoked, but does not confirm the provider actually ends up in the factory. A regression breaking loggerProviders.Add(serviceInstance) would go undetected.

  3. [Coverage] No multi-provider test (line 103) — The foreach loop logic in BuildAsync is only ever tested with a single provider. A scenario mixing enabled + disabled providers would catch bugs in the loop's continue logic.

Recommendations

  • Remove or complete the CreateLogger setups (either drop them or also call factory.CreateLogger + verify).
  • Add a factory.CreateLogger + Verify step to BuildAsync_NonExtensionInitializableProvider_CallsInitializeAsync.
  • Add one multi-provider test covering mixed enable/disable states.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comment

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

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. The resolved file incorporates changes from both sides: [DataRow] parameterization and Assert.IsNotNull guard from main, _ = discard prefix and BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes test from our branch. All 20 tests pass.

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix the following 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.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix the following issues

azure-pipelines
...

Fixed in the latest commit. Both occurrences of new(location, null) on lines 107 and 164 are now new(location, (IRunSettings?)null) to explicitly cast the null literal and satisfy the CS8625 nullability constraint in the target-typed new context.

@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 core LoggingManager tests merged in #8130. The unique value in this PR (explicit _ = discards + BuildAsync_MultipleProviders_OnlyIncludesEnabledOnes test) is valuable, but the CI failure stems from a DesktopTestSourceHostTests.cs change added by conflict resolution (unrelated to the test improvements themselves).

A clean patch with just the LoggingManagerTests.cs quality improvements — no DesktopTestSourceHostTests.cs changes — is available as aw-test-assist-logging-manager-quality-improvements-v1.patch in the workflow run artifacts. Closing this PR and applying the clean patch would be the simplest path forward.

Generated by Daily Test Improver · ● 9.5M ·

…anager-buildAsync-tests-7351033ae996670b
# Conflicts:
#	test/UnitTests/MSTestAdapter.PlatformServices.UnitTests/Services/DesktopTestSourceHostTests.cs
CopilotAI review requested due to automatic review settings May 13, 2026 11:44

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.

Copilot's findings

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

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 13, 2026 15:52
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 15:52

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Merge conflicts resolved. Adopted main's cleaner structure (nested interfaces, updated test names) and added [DataRow] parameterization for the log-level test (Trace, Warning, Critical). All 24 tests pass.

@Evangelink
Amaury Levé (Evangelink) merged commit 06145e5 into mainMay 14, 2026
10 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-buildAsync-tests-7351033ae996670b branch May 14, 2026 07:44
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.

3 participants

@Evangelink