[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension - #8126

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910
May 13, 2026
Merged

[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension#8126
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member
  • Reproduce and inspect the CS8625 failures in DesktopTestSourceHostTests
  • Apply minimal nullable-safe test fixes
  • Run targeted unit tests for MSTestAdapter.PlatformServices.UnitTests (attempted twice; blocked by transient package feed download failures)
  • Run final validation checks and reply to the PR comment

…ationHelper
Add 10 tests for LoggingManager.BuildAsync covering:
- AddProvider null validation
- Empty provider list
- Non-extension provider inclusion
- Extension provider enabled/disabled filtering
- InitializeAsync called only for enabled initializable providers
- Correct LogLevel and IServiceProvider passed to factory
- Multiple providers (all included or filtered correctly)
Add 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering:
- Null argument validation for both overloads
- Empty existing collection (no throw)
- Non-duplicate UID (no throw)
- Duplicate UID throws InvalidOperationException
- Error message contains UID
- Case-sensitive UID comparison
- Selector-based overload correctly uses selector
Extend TestExtension with UidOverride property for configurable UIDs in tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:42

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds unit test coverage in Microsoft.Testing.Platform.UnitTests for two previously untested internal helpers: LoggingManager.BuildAsync (provider filtering/initialization and factory construction) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement during extension registration). This supports the platform’s reliability by locking down branching behavior around extension enablement and duplicate registration.

Changes:

  • Added LoggingManagerTests covering provider factory argument passing, inclusion/exclusion of extension providers based on IsEnabledAsync, and conditional InitializeAsync execution.
  • Added ExtensionValidationHelperTests covering null-guard behavior, duplicate UID detection (including message content), case-sensitivity, and selector-based overload behavior.
  • Extended TestExtension with UidOverride to simplify configuring unique/duplicate UIDs in tests.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests for LoggingManager.BuildAsync provider filtering/initialization and factory wiring.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/TestExtension.csAdds UidOverride to allow configurable extension UIDs in unit tests while preserving the default UID.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew unit tests for ValidateUniqueExtension overloads, including null guards and duplicate UID behavior.

Copilot's findings

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

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


Good addition of unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension. The test structure is clear and the naming convention follows the established MethodName_Condition_ExpectedResult pattern consistently. A few minor issues are flagged below.

Key Findings

  1. Important — Dead mock setup (×2) (LoggingManagerTests.cs lines 125–126, 145–146): Two tests (BuildAsync_PassesCorrectLogLevelToFactory, BuildAsync_PassesServiceProviderToFactory) declare mockLogger and wire up CreateLogger, but neither test ever invokes factory.CreateLogger. The setup is noise that could mislead future readers.

  2. Minor — Asymmetric coverage (ExtensionValidationHelperTests.cs ~line 88): WithSelector tests cover case-sensitivity but SimpleOverload tests do not. Since both overloads share the same comparison logic, adding a parallel test would ensure parity.

  3. Minor — Unconventional section dividers (ExtensionValidationHelperTests.cs line 13): The // ---- ... ---- style banners are not used elsewhere in the test suite; a plain comment or no divider would be more consistent.

Recommendations

  • Remove the unused mockLogger variable and CreateLogger mock setup from the two capture-focused tests.
  • Consider adding ValidateUniqueExtension_SimpleOverload_UidIsCaseSensitive_DifferentCaseDoesNotThrow.
  • Replace the // ---- ... ---- dividers with a simpler comment style.

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

Key Findings

No issues found. Analysis covered:

  • Correctness: Tests accurately model LoggingManager.BuildAsync behavior — extension check via IExtension.IsEnabledAsync() is correctly bypassed for non-IExtension providers, and the IAsyncInitializableExtension + IExtension separation is properly exercised via the three composite interfaces. ExtensionValidationHelper tests correctly validate ordinal (case-sensitive) UID comparison and both overloads.

  • Threading: LoggerFactory.CreateLogger uses IMonitor.Lock for thread safety. The mock setup in the test constructor (_mockMonitor.Setup(m => m.Lock(...)).Returns(...)) correctly accounts for this.

  • API Compat: TestExtension.UidOverride (defaulting to "Uid") is a backward-compatible addition — all existing callers that relied on Uid returning "Uid" are unaffected.

  • Resources: ILoggerFactory returned by BuildAsync is not disposed in tests, but this is an accepted pattern for test code with no real handles held.

  • Cross-TFM: Test-only code. No TFM-specific APIs introduced.

  • Security / Defensive: No concerns in test helper code.

Positive Observations

  • Good coverage of edge cases: null inputs, empty collections, enabled/disabled filtering, and the case-sensitivity contract.
  • Composite interface definitions (ILoggerProviderAndExtension, ILoggerProviderExtensionAndInitializable, etc.) are well-chosen to precisely test orthogonal code paths in BuildAsync.
  • Mock setups are explicit about IsEnabledAsync() return values rather than relying on Moq defaults, making test intent clear.

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: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The tests are well-structured, isolated, and use appropriate assertion patterns (Assert.ThrowsExactly, Assert.AreEqual, Moq .Verify). No flakiness or isolation issues found. The findings are all coverage gaps:

  1. Missing: enabled extension+initializable provider path (LoggingManagerTests) — The test suite covers the disabled-extension+initializable case and the non-extension+initializable case, but not the enabled-extension+initializable case. This means a regression in TryInitializeAsync() being called for enabled extension providers would go undetected.

  2. Unclear scope of BuildAsync_WithInitializableProvider_CallsInitializeAsync — The provider under test (ILoggerProviderAndInitializable) does not implement IExtension and bypasses the extension-enablement check. The test name doesn't convey this; renaming to BuildAsync_WithNonExtensionInitializableProvider_CallsInitializeAsync would clarify the intent.

  3. Multiple-duplicate scenario untested (ExtensionValidationHelperTests) — The production code collects all duplicates and formats their type names into the error message; all tests only set up a single pre-existing duplicate, leaving the multi-duplicate formatting path uncovered.

  4. Case-sensitivity not tested for SimpleOverload — Minor consistency gap since it delegates to the generic overload, but symmetry in the test suite is useful documentation.

Recommendations

  • Add a test for BuildAsync_WithEnabledExtensionInitializableProvider_CallsInitializeAsync using ILoggerProviderExtensionAndInitializable with IsEnabledAsync()true.
  • Consider renaming BuildAsync_WithInitializableProvider_CallsInitializeAsync to reflect it tests the non-extension variant.
  • Add a multi-duplicate test case to ExtensionValidationHelperTests.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Done in commit 064f249. I addressed the actionable review feedback: removed dead mock setup, added the missing enabled extension+initializable coverage, added simple-overload case-sensitivity coverage, added a multi-duplicate validation test, and adjusted section divider comment style.

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

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 99e7312fb by merging origin/main into this branch and fixing the LoggingManagerTests.cs merge conflict.

CopilotAI review requested due to automatic review settings May 11, 2026 16:13
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 16:13
@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 commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 5c9c12b by merging the latest origin/main and fixing the ExtensionValidationHelperTests.cs merge conflict.

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
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix the following build errors

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.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.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix the following build errors

...

Fixed in commit 9690f8c by updating DesktopTestSourceHostTests to pass (IRunSettings?)null in the two Mock<TestSourceHost> constructor calls, resolving the CS8625 build errors at lines 107 and 164.

@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 work in this PR has been superseded. The LoggingManager tests landed in main via #8124 and #8130, and the ExtensionValidationHelper tests landed via #8128. This PR is a duplicate and can be safely closed.

Generated by Daily Test Improver · ● 9.5M ·

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 16b52596e by merging origin/main into this branch and fixing the merge conflicts in the affected test files.

@Evangelink
Amaury Levé (Evangelink) merged commit 59abd09 into mainMay 13, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910 branch May 13, 2026 14:15
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] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension - #8126

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910
May 13, 2026
Merged

[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension#8126
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member
  • Reproduce and inspect the CS8625 failures in DesktopTestSourceHostTests
  • Apply minimal nullable-safe test fixes
  • Run targeted unit tests for MSTestAdapter.PlatformServices.UnitTests (attempted twice; blocked by transient package feed download failures)
  • Run final validation checks and reply to the PR comment

…ationHelper
Add 10 tests for LoggingManager.BuildAsync covering:
- AddProvider null validation
- Empty provider list
- Non-extension provider inclusion
- Extension provider enabled/disabled filtering
- InitializeAsync called only for enabled initializable providers
- Correct LogLevel and IServiceProvider passed to factory
- Multiple providers (all included or filtered correctly)
Add 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering:
- Null argument validation for both overloads
- Empty existing collection (no throw)
- Non-duplicate UID (no throw)
- Duplicate UID throws InvalidOperationException
- Error message contains UID
- Case-sensitive UID comparison
- Selector-based overload correctly uses selector
Extend TestExtension with UidOverride property for configurable UIDs in tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:42

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds unit test coverage in Microsoft.Testing.Platform.UnitTests for two previously untested internal helpers: LoggingManager.BuildAsync (provider filtering/initialization and factory construction) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement during extension registration). This supports the platform’s reliability by locking down branching behavior around extension enablement and duplicate registration.

Changes:

  • Added LoggingManagerTests covering provider factory argument passing, inclusion/exclusion of extension providers based on IsEnabledAsync, and conditional InitializeAsync execution.
  • Added ExtensionValidationHelperTests covering null-guard behavior, duplicate UID detection (including message content), case-sensitivity, and selector-based overload behavior.
  • Extended TestExtension with UidOverride to simplify configuring unique/duplicate UIDs in tests.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests for LoggingManager.BuildAsync provider filtering/initialization and factory wiring.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/TestExtension.csAdds UidOverride to allow configurable extension UIDs in unit tests while preserving the default UID.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew unit tests for ValidateUniqueExtension overloads, including null guards and duplicate UID behavior.

Copilot's findings

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

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


Good addition of unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension. The test structure is clear and the naming convention follows the established MethodName_Condition_ExpectedResult pattern consistently. A few minor issues are flagged below.

Key Findings

  1. Important — Dead mock setup (×2) (LoggingManagerTests.cs lines 125–126, 145–146): Two tests (BuildAsync_PassesCorrectLogLevelToFactory, BuildAsync_PassesServiceProviderToFactory) declare mockLogger and wire up CreateLogger, but neither test ever invokes factory.CreateLogger. The setup is noise that could mislead future readers.

  2. Minor — Asymmetric coverage (ExtensionValidationHelperTests.cs ~line 88): WithSelector tests cover case-sensitivity but SimpleOverload tests do not. Since both overloads share the same comparison logic, adding a parallel test would ensure parity.

  3. Minor — Unconventional section dividers (ExtensionValidationHelperTests.cs line 13): The // ---- ... ---- style banners are not used elsewhere in the test suite; a plain comment or no divider would be more consistent.

Recommendations

  • Remove the unused mockLogger variable and CreateLogger mock setup from the two capture-focused tests.
  • Consider adding ValidateUniqueExtension_SimpleOverload_UidIsCaseSensitive_DifferentCaseDoesNotThrow.
  • Replace the // ---- ... ---- dividers with a simpler comment style.

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

Key Findings

No issues found. Analysis covered:

  • Correctness: Tests accurately model LoggingManager.BuildAsync behavior — extension check via IExtension.IsEnabledAsync() is correctly bypassed for non-IExtension providers, and the IAsyncInitializableExtension + IExtension separation is properly exercised via the three composite interfaces. ExtensionValidationHelper tests correctly validate ordinal (case-sensitive) UID comparison and both overloads.

  • Threading: LoggerFactory.CreateLogger uses IMonitor.Lock for thread safety. The mock setup in the test constructor (_mockMonitor.Setup(m => m.Lock(...)).Returns(...)) correctly accounts for this.

  • API Compat: TestExtension.UidOverride (defaulting to "Uid") is a backward-compatible addition — all existing callers that relied on Uid returning "Uid" are unaffected.

  • Resources: ILoggerFactory returned by BuildAsync is not disposed in tests, but this is an accepted pattern for test code with no real handles held.

  • Cross-TFM: Test-only code. No TFM-specific APIs introduced.

  • Security / Defensive: No concerns in test helper code.

Positive Observations

  • Good coverage of edge cases: null inputs, empty collections, enabled/disabled filtering, and the case-sensitivity contract.
  • Composite interface definitions (ILoggerProviderAndExtension, ILoggerProviderExtensionAndInitializable, etc.) are well-chosen to precisely test orthogonal code paths in BuildAsync.
  • Mock setups are explicit about IsEnabledAsync() return values rather than relying on Moq defaults, making test intent clear.

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: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The tests are well-structured, isolated, and use appropriate assertion patterns (Assert.ThrowsExactly, Assert.AreEqual, Moq .Verify). No flakiness or isolation issues found. The findings are all coverage gaps:

  1. Missing: enabled extension+initializable provider path (LoggingManagerTests) — The test suite covers the disabled-extension+initializable case and the non-extension+initializable case, but not the enabled-extension+initializable case. This means a regression in TryInitializeAsync() being called for enabled extension providers would go undetected.

  2. Unclear scope of BuildAsync_WithInitializableProvider_CallsInitializeAsync — The provider under test (ILoggerProviderAndInitializable) does not implement IExtension and bypasses the extension-enablement check. The test name doesn't convey this; renaming to BuildAsync_WithNonExtensionInitializableProvider_CallsInitializeAsync would clarify the intent.

  3. Multiple-duplicate scenario untested (ExtensionValidationHelperTests) — The production code collects all duplicates and formats their type names into the error message; all tests only set up a single pre-existing duplicate, leaving the multi-duplicate formatting path uncovered.

  4. Case-sensitivity not tested for SimpleOverload — Minor consistency gap since it delegates to the generic overload, but symmetry in the test suite is useful documentation.

Recommendations

  • Add a test for BuildAsync_WithEnabledExtensionInitializableProvider_CallsInitializeAsync using ILoggerProviderExtensionAndInitializable with IsEnabledAsync()true.
  • Consider renaming BuildAsync_WithInitializableProvider_CallsInitializeAsync to reflect it tests the non-extension variant.
  • Add a multi-duplicate test case to ExtensionValidationHelperTests.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Done in commit 064f249. I addressed the actionable review feedback: removed dead mock setup, added the missing enabled extension+initializable coverage, added simple-overload case-sensitivity coverage, added a multi-duplicate validation test, and adjusted section divider comment style.

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

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 99e7312fb by merging origin/main into this branch and fixing the LoggingManagerTests.cs merge conflict.

CopilotAI review requested due to automatic review settings May 11, 2026 16:13
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 16:13
@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 commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 5c9c12b by merging the latest origin/main and fixing the ExtensionValidationHelperTests.cs merge conflict.

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
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix the following build errors

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.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.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix the following build errors

...

Fixed in commit 9690f8c by updating DesktopTestSourceHostTests to pass (IRunSettings?)null in the two Mock<TestSourceHost> constructor calls, resolving the CS8625 build errors at lines 107 and 164.

@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 work in this PR has been superseded. The LoggingManager tests landed in main via #8124 and #8130, and the ExtensionValidationHelper tests landed via #8128. This PR is a duplicate and can be safely closed.

Generated by Daily Test Improver · ● 9.5M ·

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 16b52596e by merging origin/main into this branch and fixing the merge conflicts in the affected test files.

@Evangelink
Amaury Levé (Evangelink) merged commit 59abd09 into mainMay 13, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910 branch May 13, 2026 14:15
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] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension - #8126

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910
May 13, 2026
Merged

[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension#8126
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member
  • Reproduce and inspect the CS8625 failures in DesktopTestSourceHostTests
  • Apply minimal nullable-safe test fixes
  • Run targeted unit tests for MSTestAdapter.PlatformServices.UnitTests (attempted twice; blocked by transient package feed download failures)
  • Run final validation checks and reply to the PR comment

…ationHelper
Add 10 tests for LoggingManager.BuildAsync covering:
- AddProvider null validation
- Empty provider list
- Non-extension provider inclusion
- Extension provider enabled/disabled filtering
- InitializeAsync called only for enabled initializable providers
- Correct LogLevel and IServiceProvider passed to factory
- Multiple providers (all included or filtered correctly)
Add 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering:
- Null argument validation for both overloads
- Empty existing collection (no throw)
- Non-duplicate UID (no throw)
- Duplicate UID throws InvalidOperationException
- Error message contains UID
- Case-sensitive UID comparison
- Selector-based overload correctly uses selector
Extend TestExtension with UidOverride property for configurable UIDs in tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:42

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds unit test coverage in Microsoft.Testing.Platform.UnitTests for two previously untested internal helpers: LoggingManager.BuildAsync (provider filtering/initialization and factory construction) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement during extension registration). This supports the platform’s reliability by locking down branching behavior around extension enablement and duplicate registration.

Changes:

  • Added LoggingManagerTests covering provider factory argument passing, inclusion/exclusion of extension providers based on IsEnabledAsync, and conditional InitializeAsync execution.
  • Added ExtensionValidationHelperTests covering null-guard behavior, duplicate UID detection (including message content), case-sensitivity, and selector-based overload behavior.
  • Extended TestExtension with UidOverride to simplify configuring unique/duplicate UIDs in tests.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests for LoggingManager.BuildAsync provider filtering/initialization and factory wiring.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/TestExtension.csAdds UidOverride to allow configurable extension UIDs in unit tests while preserving the default UID.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew unit tests for ValidateUniqueExtension overloads, including null guards and duplicate UID behavior.

Copilot's findings

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

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


Good addition of unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension. The test structure is clear and the naming convention follows the established MethodName_Condition_ExpectedResult pattern consistently. A few minor issues are flagged below.

Key Findings

  1. Important — Dead mock setup (×2) (LoggingManagerTests.cs lines 125–126, 145–146): Two tests (BuildAsync_PassesCorrectLogLevelToFactory, BuildAsync_PassesServiceProviderToFactory) declare mockLogger and wire up CreateLogger, but neither test ever invokes factory.CreateLogger. The setup is noise that could mislead future readers.

  2. Minor — Asymmetric coverage (ExtensionValidationHelperTests.cs ~line 88): WithSelector tests cover case-sensitivity but SimpleOverload tests do not. Since both overloads share the same comparison logic, adding a parallel test would ensure parity.

  3. Minor — Unconventional section dividers (ExtensionValidationHelperTests.cs line 13): The // ---- ... ---- style banners are not used elsewhere in the test suite; a plain comment or no divider would be more consistent.

Recommendations

  • Remove the unused mockLogger variable and CreateLogger mock setup from the two capture-focused tests.
  • Consider adding ValidateUniqueExtension_SimpleOverload_UidIsCaseSensitive_DifferentCaseDoesNotThrow.
  • Replace the // ---- ... ---- dividers with a simpler comment style.

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

Key Findings

No issues found. Analysis covered:

  • Correctness: Tests accurately model LoggingManager.BuildAsync behavior — extension check via IExtension.IsEnabledAsync() is correctly bypassed for non-IExtension providers, and the IAsyncInitializableExtension + IExtension separation is properly exercised via the three composite interfaces. ExtensionValidationHelper tests correctly validate ordinal (case-sensitive) UID comparison and both overloads.

  • Threading: LoggerFactory.CreateLogger uses IMonitor.Lock for thread safety. The mock setup in the test constructor (_mockMonitor.Setup(m => m.Lock(...)).Returns(...)) correctly accounts for this.

  • API Compat: TestExtension.UidOverride (defaulting to "Uid") is a backward-compatible addition — all existing callers that relied on Uid returning "Uid" are unaffected.

  • Resources: ILoggerFactory returned by BuildAsync is not disposed in tests, but this is an accepted pattern for test code with no real handles held.

  • Cross-TFM: Test-only code. No TFM-specific APIs introduced.

  • Security / Defensive: No concerns in test helper code.

Positive Observations

  • Good coverage of edge cases: null inputs, empty collections, enabled/disabled filtering, and the case-sensitivity contract.
  • Composite interface definitions (ILoggerProviderAndExtension, ILoggerProviderExtensionAndInitializable, etc.) are well-chosen to precisely test orthogonal code paths in BuildAsync.
  • Mock setups are explicit about IsEnabledAsync() return values rather than relying on Moq defaults, making test intent clear.

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: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The tests are well-structured, isolated, and use appropriate assertion patterns (Assert.ThrowsExactly, Assert.AreEqual, Moq .Verify). No flakiness or isolation issues found. The findings are all coverage gaps:

  1. Missing: enabled extension+initializable provider path (LoggingManagerTests) — The test suite covers the disabled-extension+initializable case and the non-extension+initializable case, but not the enabled-extension+initializable case. This means a regression in TryInitializeAsync() being called for enabled extension providers would go undetected.

  2. Unclear scope of BuildAsync_WithInitializableProvider_CallsInitializeAsync — The provider under test (ILoggerProviderAndInitializable) does not implement IExtension and bypasses the extension-enablement check. The test name doesn't convey this; renaming to BuildAsync_WithNonExtensionInitializableProvider_CallsInitializeAsync would clarify the intent.

  3. Multiple-duplicate scenario untested (ExtensionValidationHelperTests) — The production code collects all duplicates and formats their type names into the error message; all tests only set up a single pre-existing duplicate, leaving the multi-duplicate formatting path uncovered.

  4. Case-sensitivity not tested for SimpleOverload — Minor consistency gap since it delegates to the generic overload, but symmetry in the test suite is useful documentation.

Recommendations

  • Add a test for BuildAsync_WithEnabledExtensionInitializableProvider_CallsInitializeAsync using ILoggerProviderExtensionAndInitializable with IsEnabledAsync()true.
  • Consider renaming BuildAsync_WithInitializableProvider_CallsInitializeAsync to reflect it tests the non-extension variant.
  • Add a multi-duplicate test case to ExtensionValidationHelperTests.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Done in commit 064f249. I addressed the actionable review feedback: removed dead mock setup, added the missing enabled extension+initializable coverage, added simple-overload case-sensitivity coverage, added a multi-duplicate validation test, and adjusted section divider comment style.

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

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 99e7312fb by merging origin/main into this branch and fixing the LoggingManagerTests.cs merge conflict.

CopilotAI review requested due to automatic review settings May 11, 2026 16:13
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 16:13
@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 commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 5c9c12b by merging the latest origin/main and fixing the ExtensionValidationHelperTests.cs merge conflict.

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
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix the following build errors

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.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.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix the following build errors

...

Fixed in commit 9690f8c by updating DesktopTestSourceHostTests to pass (IRunSettings?)null in the two Mock<TestSourceHost> constructor calls, resolving the CS8625 build errors at lines 107 and 164.

@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 work in this PR has been superseded. The LoggingManager tests landed in main via #8124 and #8130, and the ExtensionValidationHelper tests landed via #8128. This PR is a duplicate and can be safely closed.

Generated by Daily Test Improver · ● 9.5M ·

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 16b52596e by merging origin/main into this branch and fixing the merge conflicts in the affected test files.

@Evangelink
Amaury Levé (Evangelink) merged commit 59abd09 into mainMay 13, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910 branch May 13, 2026 14:15
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] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension - #8126

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910
May 13, 2026
Merged

[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension#8126
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member
  • Reproduce and inspect the CS8625 failures in DesktopTestSourceHostTests
  • Apply minimal nullable-safe test fixes
  • Run targeted unit tests for MSTestAdapter.PlatformServices.UnitTests (attempted twice; blocked by transient package feed download failures)
  • Run final validation checks and reply to the PR comment

…ationHelper
Add 10 tests for LoggingManager.BuildAsync covering:
- AddProvider null validation
- Empty provider list
- Non-extension provider inclusion
- Extension provider enabled/disabled filtering
- InitializeAsync called only for enabled initializable providers
- Correct LogLevel and IServiceProvider passed to factory
- Multiple providers (all included or filtered correctly)
Add 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering:
- Null argument validation for both overloads
- Empty existing collection (no throw)
- Non-duplicate UID (no throw)
- Duplicate UID throws InvalidOperationException
- Error message contains UID
- Case-sensitive UID comparison
- Selector-based overload correctly uses selector
Extend TestExtension with UidOverride property for configurable UIDs in tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:42

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds unit test coverage in Microsoft.Testing.Platform.UnitTests for two previously untested internal helpers: LoggingManager.BuildAsync (provider filtering/initialization and factory construction) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement during extension registration). This supports the platform’s reliability by locking down branching behavior around extension enablement and duplicate registration.

Changes:

  • Added LoggingManagerTests covering provider factory argument passing, inclusion/exclusion of extension providers based on IsEnabledAsync, and conditional InitializeAsync execution.
  • Added ExtensionValidationHelperTests covering null-guard behavior, duplicate UID detection (including message content), case-sensitivity, and selector-based overload behavior.
  • Extended TestExtension with UidOverride to simplify configuring unique/duplicate UIDs in tests.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests for LoggingManager.BuildAsync provider filtering/initialization and factory wiring.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/TestExtension.csAdds UidOverride to allow configurable extension UIDs in unit tests while preserving the default UID.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew unit tests for ValidateUniqueExtension overloads, including null guards and duplicate UID behavior.

Copilot's findings

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

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


Good addition of unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension. The test structure is clear and the naming convention follows the established MethodName_Condition_ExpectedResult pattern consistently. A few minor issues are flagged below.

Key Findings

  1. Important — Dead mock setup (×2) (LoggingManagerTests.cs lines 125–126, 145–146): Two tests (BuildAsync_PassesCorrectLogLevelToFactory, BuildAsync_PassesServiceProviderToFactory) declare mockLogger and wire up CreateLogger, but neither test ever invokes factory.CreateLogger. The setup is noise that could mislead future readers.

  2. Minor — Asymmetric coverage (ExtensionValidationHelperTests.cs ~line 88): WithSelector tests cover case-sensitivity but SimpleOverload tests do not. Since both overloads share the same comparison logic, adding a parallel test would ensure parity.

  3. Minor — Unconventional section dividers (ExtensionValidationHelperTests.cs line 13): The // ---- ... ---- style banners are not used elsewhere in the test suite; a plain comment or no divider would be more consistent.

Recommendations

  • Remove the unused mockLogger variable and CreateLogger mock setup from the two capture-focused tests.
  • Consider adding ValidateUniqueExtension_SimpleOverload_UidIsCaseSensitive_DifferentCaseDoesNotThrow.
  • Replace the // ---- ... ---- dividers with a simpler comment style.

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

Key Findings

No issues found. Analysis covered:

  • Correctness: Tests accurately model LoggingManager.BuildAsync behavior — extension check via IExtension.IsEnabledAsync() is correctly bypassed for non-IExtension providers, and the IAsyncInitializableExtension + IExtension separation is properly exercised via the three composite interfaces. ExtensionValidationHelper tests correctly validate ordinal (case-sensitive) UID comparison and both overloads.

  • Threading: LoggerFactory.CreateLogger uses IMonitor.Lock for thread safety. The mock setup in the test constructor (_mockMonitor.Setup(m => m.Lock(...)).Returns(...)) correctly accounts for this.

  • API Compat: TestExtension.UidOverride (defaulting to "Uid") is a backward-compatible addition — all existing callers that relied on Uid returning "Uid" are unaffected.

  • Resources: ILoggerFactory returned by BuildAsync is not disposed in tests, but this is an accepted pattern for test code with no real handles held.

  • Cross-TFM: Test-only code. No TFM-specific APIs introduced.

  • Security / Defensive: No concerns in test helper code.

Positive Observations

  • Good coverage of edge cases: null inputs, empty collections, enabled/disabled filtering, and the case-sensitivity contract.
  • Composite interface definitions (ILoggerProviderAndExtension, ILoggerProviderExtensionAndInitializable, etc.) are well-chosen to precisely test orthogonal code paths in BuildAsync.
  • Mock setups are explicit about IsEnabledAsync() return values rather than relying on Moq defaults, making test intent clear.

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: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The tests are well-structured, isolated, and use appropriate assertion patterns (Assert.ThrowsExactly, Assert.AreEqual, Moq .Verify). No flakiness or isolation issues found. The findings are all coverage gaps:

  1. Missing: enabled extension+initializable provider path (LoggingManagerTests) — The test suite covers the disabled-extension+initializable case and the non-extension+initializable case, but not the enabled-extension+initializable case. This means a regression in TryInitializeAsync() being called for enabled extension providers would go undetected.

  2. Unclear scope of BuildAsync_WithInitializableProvider_CallsInitializeAsync — The provider under test (ILoggerProviderAndInitializable) does not implement IExtension and bypasses the extension-enablement check. The test name doesn't convey this; renaming to BuildAsync_WithNonExtensionInitializableProvider_CallsInitializeAsync would clarify the intent.

  3. Multiple-duplicate scenario untested (ExtensionValidationHelperTests) — The production code collects all duplicates and formats their type names into the error message; all tests only set up a single pre-existing duplicate, leaving the multi-duplicate formatting path uncovered.

  4. Case-sensitivity not tested for SimpleOverload — Minor consistency gap since it delegates to the generic overload, but symmetry in the test suite is useful documentation.

Recommendations

  • Add a test for BuildAsync_WithEnabledExtensionInitializableProvider_CallsInitializeAsync using ILoggerProviderExtensionAndInitializable with IsEnabledAsync()true.
  • Consider renaming BuildAsync_WithInitializableProvider_CallsInitializeAsync to reflect it tests the non-extension variant.
  • Add a multi-duplicate test case to ExtensionValidationHelperTests.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Done in commit 064f249. I addressed the actionable review feedback: removed dead mock setup, added the missing enabled extension+initializable coverage, added simple-overload case-sensitivity coverage, added a multi-duplicate validation test, and adjusted section divider comment style.

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

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 99e7312fb by merging origin/main into this branch and fixing the LoggingManagerTests.cs merge conflict.

CopilotAI review requested due to automatic review settings May 11, 2026 16:13
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 16:13
@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 commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 5c9c12b by merging the latest origin/main and fixing the ExtensionValidationHelperTests.cs merge conflict.

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
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix the following build errors

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.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.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix the following build errors

...

Fixed in commit 9690f8c by updating DesktopTestSourceHostTests to pass (IRunSettings?)null in the two Mock<TestSourceHost> constructor calls, resolving the CS8625 build errors at lines 107 and 164.

@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 work in this PR has been superseded. The LoggingManager tests landed in main via #8124 and #8130, and the ExtensionValidationHelper tests landed via #8128. This PR is a duplicate and can be safely closed.

Generated by Daily Test Improver · ● 9.5M ·

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 16b52596e by merging origin/main into this branch and fixing the merge conflicts in the affected test files.

@Evangelink
Amaury Levé (Evangelink) merged commit 59abd09 into mainMay 13, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910 branch May 13, 2026 14:15
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] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension - #8126

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910
May 13, 2026
Merged

[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension#8126
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member
  • Reproduce and inspect the CS8625 failures in DesktopTestSourceHostTests
  • Apply minimal nullable-safe test fixes
  • Run targeted unit tests for MSTestAdapter.PlatformServices.UnitTests (attempted twice; blocked by transient package feed download failures)
  • Run final validation checks and reply to the PR comment

…ationHelper
Add 10 tests for LoggingManager.BuildAsync covering:
- AddProvider null validation
- Empty provider list
- Non-extension provider inclusion
- Extension provider enabled/disabled filtering
- InitializeAsync called only for enabled initializable providers
- Correct LogLevel and IServiceProvider passed to factory
- Multiple providers (all included or filtered correctly)
Add 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering:
- Null argument validation for both overloads
- Empty existing collection (no throw)
- Non-duplicate UID (no throw)
- Duplicate UID throws InvalidOperationException
- Error message contains UID
- Case-sensitive UID comparison
- Selector-based overload correctly uses selector
Extend TestExtension with UidOverride property for configurable UIDs in tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:42

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds unit test coverage in Microsoft.Testing.Platform.UnitTests for two previously untested internal helpers: LoggingManager.BuildAsync (provider filtering/initialization and factory construction) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement during extension registration). This supports the platform’s reliability by locking down branching behavior around extension enablement and duplicate registration.

Changes:

  • Added LoggingManagerTests covering provider factory argument passing, inclusion/exclusion of extension providers based on IsEnabledAsync, and conditional InitializeAsync execution.
  • Added ExtensionValidationHelperTests covering null-guard behavior, duplicate UID detection (including message content), case-sensitivity, and selector-based overload behavior.
  • Extended TestExtension with UidOverride to simplify configuring unique/duplicate UIDs in tests.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests for LoggingManager.BuildAsync provider filtering/initialization and factory wiring.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/TestExtension.csAdds UidOverride to allow configurable extension UIDs in unit tests while preserving the default UID.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew unit tests for ValidateUniqueExtension overloads, including null guards and duplicate UID behavior.

Copilot's findings

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

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


Good addition of unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension. The test structure is clear and the naming convention follows the established MethodName_Condition_ExpectedResult pattern consistently. A few minor issues are flagged below.

Key Findings

  1. Important — Dead mock setup (×2) (LoggingManagerTests.cs lines 125–126, 145–146): Two tests (BuildAsync_PassesCorrectLogLevelToFactory, BuildAsync_PassesServiceProviderToFactory) declare mockLogger and wire up CreateLogger, but neither test ever invokes factory.CreateLogger. The setup is noise that could mislead future readers.

  2. Minor — Asymmetric coverage (ExtensionValidationHelperTests.cs ~line 88): WithSelector tests cover case-sensitivity but SimpleOverload tests do not. Since both overloads share the same comparison logic, adding a parallel test would ensure parity.

  3. Minor — Unconventional section dividers (ExtensionValidationHelperTests.cs line 13): The // ---- ... ---- style banners are not used elsewhere in the test suite; a plain comment or no divider would be more consistent.

Recommendations

  • Remove the unused mockLogger variable and CreateLogger mock setup from the two capture-focused tests.
  • Consider adding ValidateUniqueExtension_SimpleOverload_UidIsCaseSensitive_DifferentCaseDoesNotThrow.
  • Replace the // ---- ... ---- dividers with a simpler comment style.

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

Key Findings

No issues found. Analysis covered:

  • Correctness: Tests accurately model LoggingManager.BuildAsync behavior — extension check via IExtension.IsEnabledAsync() is correctly bypassed for non-IExtension providers, and the IAsyncInitializableExtension + IExtension separation is properly exercised via the three composite interfaces. ExtensionValidationHelper tests correctly validate ordinal (case-sensitive) UID comparison and both overloads.

  • Threading: LoggerFactory.CreateLogger uses IMonitor.Lock for thread safety. The mock setup in the test constructor (_mockMonitor.Setup(m => m.Lock(...)).Returns(...)) correctly accounts for this.

  • API Compat: TestExtension.UidOverride (defaulting to "Uid") is a backward-compatible addition — all existing callers that relied on Uid returning "Uid" are unaffected.

  • Resources: ILoggerFactory returned by BuildAsync is not disposed in tests, but this is an accepted pattern for test code with no real handles held.

  • Cross-TFM: Test-only code. No TFM-specific APIs introduced.

  • Security / Defensive: No concerns in test helper code.

Positive Observations

  • Good coverage of edge cases: null inputs, empty collections, enabled/disabled filtering, and the case-sensitivity contract.
  • Composite interface definitions (ILoggerProviderAndExtension, ILoggerProviderExtensionAndInitializable, etc.) are well-chosen to precisely test orthogonal code paths in BuildAsync.
  • Mock setups are explicit about IsEnabledAsync() return values rather than relying on Moq defaults, making test intent clear.

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: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The tests are well-structured, isolated, and use appropriate assertion patterns (Assert.ThrowsExactly, Assert.AreEqual, Moq .Verify). No flakiness or isolation issues found. The findings are all coverage gaps:

  1. Missing: enabled extension+initializable provider path (LoggingManagerTests) — The test suite covers the disabled-extension+initializable case and the non-extension+initializable case, but not the enabled-extension+initializable case. This means a regression in TryInitializeAsync() being called for enabled extension providers would go undetected.

  2. Unclear scope of BuildAsync_WithInitializableProvider_CallsInitializeAsync — The provider under test (ILoggerProviderAndInitializable) does not implement IExtension and bypasses the extension-enablement check. The test name doesn't convey this; renaming to BuildAsync_WithNonExtensionInitializableProvider_CallsInitializeAsync would clarify the intent.

  3. Multiple-duplicate scenario untested (ExtensionValidationHelperTests) — The production code collects all duplicates and formats their type names into the error message; all tests only set up a single pre-existing duplicate, leaving the multi-duplicate formatting path uncovered.

  4. Case-sensitivity not tested for SimpleOverload — Minor consistency gap since it delegates to the generic overload, but symmetry in the test suite is useful documentation.

Recommendations

  • Add a test for BuildAsync_WithEnabledExtensionInitializableProvider_CallsInitializeAsync using ILoggerProviderExtensionAndInitializable with IsEnabledAsync()true.
  • Consider renaming BuildAsync_WithInitializableProvider_CallsInitializeAsync to reflect it tests the non-extension variant.
  • Add a multi-duplicate test case to ExtensionValidationHelperTests.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Done in commit 064f249. I addressed the actionable review feedback: removed dead mock setup, added the missing enabled extension+initializable coverage, added simple-overload case-sensitivity coverage, added a multi-duplicate validation test, and adjusted section divider comment style.

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

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 99e7312fb by merging origin/main into this branch and fixing the LoggingManagerTests.cs merge conflict.

CopilotAI review requested due to automatic review settings May 11, 2026 16:13
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 16:13
@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 commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 5c9c12b by merging the latest origin/main and fixing the ExtensionValidationHelperTests.cs merge conflict.

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
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix the following build errors

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.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.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix the following build errors

...

Fixed in commit 9690f8c by updating DesktopTestSourceHostTests to pass (IRunSettings?)null in the two Mock<TestSourceHost> constructor calls, resolving the CS8625 build errors at lines 107 and 164.

@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 work in this PR has been superseded. The LoggingManager tests landed in main via #8124 and #8130, and the ExtensionValidationHelper tests landed via #8128. This PR is a duplicate and can be safely closed.

Generated by Daily Test Improver · ● 9.5M ·

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 16b52596e by merging origin/main into this branch and fixing the merge conflicts in the affected test files.

@Evangelink
Amaury Levé (Evangelink) merged commit 59abd09 into mainMay 13, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910 branch May 13, 2026 14:15
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] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension - #8126

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910
May 13, 2026
Merged

[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension#8126
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member
  • Reproduce and inspect the CS8625 failures in DesktopTestSourceHostTests
  • Apply minimal nullable-safe test fixes
  • Run targeted unit tests for MSTestAdapter.PlatformServices.UnitTests (attempted twice; blocked by transient package feed download failures)
  • Run final validation checks and reply to the PR comment

…ationHelper
Add 10 tests for LoggingManager.BuildAsync covering:
- AddProvider null validation
- Empty provider list
- Non-extension provider inclusion
- Extension provider enabled/disabled filtering
- InitializeAsync called only for enabled initializable providers
- Correct LogLevel and IServiceProvider passed to factory
- Multiple providers (all included or filtered correctly)
Add 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering:
- Null argument validation for both overloads
- Empty existing collection (no throw)
- Non-duplicate UID (no throw)
- Duplicate UID throws InvalidOperationException
- Error message contains UID
- Case-sensitive UID comparison
- Selector-based overload correctly uses selector
Extend TestExtension with UidOverride property for configurable UIDs in tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:42

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds unit test coverage in Microsoft.Testing.Platform.UnitTests for two previously untested internal helpers: LoggingManager.BuildAsync (provider filtering/initialization and factory construction) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement during extension registration). This supports the platform’s reliability by locking down branching behavior around extension enablement and duplicate registration.

Changes:

  • Added LoggingManagerTests covering provider factory argument passing, inclusion/exclusion of extension providers based on IsEnabledAsync, and conditional InitializeAsync execution.
  • Added ExtensionValidationHelperTests covering null-guard behavior, duplicate UID detection (including message content), case-sensitivity, and selector-based overload behavior.
  • Extended TestExtension with UidOverride to simplify configuring unique/duplicate UIDs in tests.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests for LoggingManager.BuildAsync provider filtering/initialization and factory wiring.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/TestExtension.csAdds UidOverride to allow configurable extension UIDs in unit tests while preserving the default UID.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew unit tests for ValidateUniqueExtension overloads, including null guards and duplicate UID behavior.

Copilot's findings

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

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


Good addition of unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension. The test structure is clear and the naming convention follows the established MethodName_Condition_ExpectedResult pattern consistently. A few minor issues are flagged below.

Key Findings

  1. Important — Dead mock setup (×2) (LoggingManagerTests.cs lines 125–126, 145–146): Two tests (BuildAsync_PassesCorrectLogLevelToFactory, BuildAsync_PassesServiceProviderToFactory) declare mockLogger and wire up CreateLogger, but neither test ever invokes factory.CreateLogger. The setup is noise that could mislead future readers.

  2. Minor — Asymmetric coverage (ExtensionValidationHelperTests.cs ~line 88): WithSelector tests cover case-sensitivity but SimpleOverload tests do not. Since both overloads share the same comparison logic, adding a parallel test would ensure parity.

  3. Minor — Unconventional section dividers (ExtensionValidationHelperTests.cs line 13): The // ---- ... ---- style banners are not used elsewhere in the test suite; a plain comment or no divider would be more consistent.

Recommendations

  • Remove the unused mockLogger variable and CreateLogger mock setup from the two capture-focused tests.
  • Consider adding ValidateUniqueExtension_SimpleOverload_UidIsCaseSensitive_DifferentCaseDoesNotThrow.
  • Replace the // ---- ... ---- dividers with a simpler comment style.

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

Key Findings

No issues found. Analysis covered:

  • Correctness: Tests accurately model LoggingManager.BuildAsync behavior — extension check via IExtension.IsEnabledAsync() is correctly bypassed for non-IExtension providers, and the IAsyncInitializableExtension + IExtension separation is properly exercised via the three composite interfaces. ExtensionValidationHelper tests correctly validate ordinal (case-sensitive) UID comparison and both overloads.

  • Threading: LoggerFactory.CreateLogger uses IMonitor.Lock for thread safety. The mock setup in the test constructor (_mockMonitor.Setup(m => m.Lock(...)).Returns(...)) correctly accounts for this.

  • API Compat: TestExtension.UidOverride (defaulting to "Uid") is a backward-compatible addition — all existing callers that relied on Uid returning "Uid" are unaffected.

  • Resources: ILoggerFactory returned by BuildAsync is not disposed in tests, but this is an accepted pattern for test code with no real handles held.

  • Cross-TFM: Test-only code. No TFM-specific APIs introduced.

  • Security / Defensive: No concerns in test helper code.

Positive Observations

  • Good coverage of edge cases: null inputs, empty collections, enabled/disabled filtering, and the case-sensitivity contract.
  • Composite interface definitions (ILoggerProviderAndExtension, ILoggerProviderExtensionAndInitializable, etc.) are well-chosen to precisely test orthogonal code paths in BuildAsync.
  • Mock setups are explicit about IsEnabledAsync() return values rather than relying on Moq defaults, making test intent clear.

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: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The tests are well-structured, isolated, and use appropriate assertion patterns (Assert.ThrowsExactly, Assert.AreEqual, Moq .Verify). No flakiness or isolation issues found. The findings are all coverage gaps:

  1. Missing: enabled extension+initializable provider path (LoggingManagerTests) — The test suite covers the disabled-extension+initializable case and the non-extension+initializable case, but not the enabled-extension+initializable case. This means a regression in TryInitializeAsync() being called for enabled extension providers would go undetected.

  2. Unclear scope of BuildAsync_WithInitializableProvider_CallsInitializeAsync — The provider under test (ILoggerProviderAndInitializable) does not implement IExtension and bypasses the extension-enablement check. The test name doesn't convey this; renaming to BuildAsync_WithNonExtensionInitializableProvider_CallsInitializeAsync would clarify the intent.

  3. Multiple-duplicate scenario untested (ExtensionValidationHelperTests) — The production code collects all duplicates and formats their type names into the error message; all tests only set up a single pre-existing duplicate, leaving the multi-duplicate formatting path uncovered.

  4. Case-sensitivity not tested for SimpleOverload — Minor consistency gap since it delegates to the generic overload, but symmetry in the test suite is useful documentation.

Recommendations

  • Add a test for BuildAsync_WithEnabledExtensionInitializableProvider_CallsInitializeAsync using ILoggerProviderExtensionAndInitializable with IsEnabledAsync()true.
  • Consider renaming BuildAsync_WithInitializableProvider_CallsInitializeAsync to reflect it tests the non-extension variant.
  • Add a multi-duplicate test case to ExtensionValidationHelperTests.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Done in commit 064f249. I addressed the actionable review feedback: removed dead mock setup, added the missing enabled extension+initializable coverage, added simple-overload case-sensitivity coverage, added a multi-duplicate validation test, and adjusted section divider comment style.

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

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 99e7312fb by merging origin/main into this branch and fixing the LoggingManagerTests.cs merge conflict.

CopilotAI review requested due to automatic review settings May 11, 2026 16:13
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 16:13
@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 commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 5c9c12b by merging the latest origin/main and fixing the ExtensionValidationHelperTests.cs merge conflict.

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
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix the following build errors

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.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.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix the following build errors

...

Fixed in commit 9690f8c by updating DesktopTestSourceHostTests to pass (IRunSettings?)null in the two Mock<TestSourceHost> constructor calls, resolving the CS8625 build errors at lines 107 and 164.

@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 work in this PR has been superseded. The LoggingManager tests landed in main via #8124 and #8130, and the ExtensionValidationHelper tests landed via #8128. This PR is a duplicate and can be safely closed.

Generated by Daily Test Improver · ● 9.5M ·

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 16b52596e by merging origin/main into this branch and fixing the merge conflicts in the affected test files.

@Evangelink
Amaury Levé (Evangelink) merged commit 59abd09 into mainMay 13, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910 branch May 13, 2026 14:15
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] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension - #8126

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910
May 13, 2026
Merged

[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension#8126
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member
  • Reproduce and inspect the CS8625 failures in DesktopTestSourceHostTests
  • Apply minimal nullable-safe test fixes
  • Run targeted unit tests for MSTestAdapter.PlatformServices.UnitTests (attempted twice; blocked by transient package feed download failures)
  • Run final validation checks and reply to the PR comment

…ationHelper
Add 10 tests for LoggingManager.BuildAsync covering:
- AddProvider null validation
- Empty provider list
- Non-extension provider inclusion
- Extension provider enabled/disabled filtering
- InitializeAsync called only for enabled initializable providers
- Correct LogLevel and IServiceProvider passed to factory
- Multiple providers (all included or filtered correctly)
Add 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering:
- Null argument validation for both overloads
- Empty existing collection (no throw)
- Non-duplicate UID (no throw)
- Duplicate UID throws InvalidOperationException
- Error message contains UID
- Case-sensitive UID comparison
- Selector-based overload correctly uses selector
Extend TestExtension with UidOverride property for configurable UIDs in tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:42

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds unit test coverage in Microsoft.Testing.Platform.UnitTests for two previously untested internal helpers: LoggingManager.BuildAsync (provider filtering/initialization and factory construction) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement during extension registration). This supports the platform’s reliability by locking down branching behavior around extension enablement and duplicate registration.

Changes:

  • Added LoggingManagerTests covering provider factory argument passing, inclusion/exclusion of extension providers based on IsEnabledAsync, and conditional InitializeAsync execution.
  • Added ExtensionValidationHelperTests covering null-guard behavior, duplicate UID detection (including message content), case-sensitivity, and selector-based overload behavior.
  • Extended TestExtension with UidOverride to simplify configuring unique/duplicate UIDs in tests.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests for LoggingManager.BuildAsync provider filtering/initialization and factory wiring.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/TestExtension.csAdds UidOverride to allow configurable extension UIDs in unit tests while preserving the default UID.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew unit tests for ValidateUniqueExtension overloads, including null guards and duplicate UID behavior.

Copilot's findings

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

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


Good addition of unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension. The test structure is clear and the naming convention follows the established MethodName_Condition_ExpectedResult pattern consistently. A few minor issues are flagged below.

Key Findings

  1. Important — Dead mock setup (×2) (LoggingManagerTests.cs lines 125–126, 145–146): Two tests (BuildAsync_PassesCorrectLogLevelToFactory, BuildAsync_PassesServiceProviderToFactory) declare mockLogger and wire up CreateLogger, but neither test ever invokes factory.CreateLogger. The setup is noise that could mislead future readers.

  2. Minor — Asymmetric coverage (ExtensionValidationHelperTests.cs ~line 88): WithSelector tests cover case-sensitivity but SimpleOverload tests do not. Since both overloads share the same comparison logic, adding a parallel test would ensure parity.

  3. Minor — Unconventional section dividers (ExtensionValidationHelperTests.cs line 13): The // ---- ... ---- style banners are not used elsewhere in the test suite; a plain comment or no divider would be more consistent.

Recommendations

  • Remove the unused mockLogger variable and CreateLogger mock setup from the two capture-focused tests.
  • Consider adding ValidateUniqueExtension_SimpleOverload_UidIsCaseSensitive_DifferentCaseDoesNotThrow.
  • Replace the // ---- ... ---- dividers with a simpler comment style.

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

Key Findings

No issues found. Analysis covered:

  • Correctness: Tests accurately model LoggingManager.BuildAsync behavior — extension check via IExtension.IsEnabledAsync() is correctly bypassed for non-IExtension providers, and the IAsyncInitializableExtension + IExtension separation is properly exercised via the three composite interfaces. ExtensionValidationHelper tests correctly validate ordinal (case-sensitive) UID comparison and both overloads.

  • Threading: LoggerFactory.CreateLogger uses IMonitor.Lock for thread safety. The mock setup in the test constructor (_mockMonitor.Setup(m => m.Lock(...)).Returns(...)) correctly accounts for this.

  • API Compat: TestExtension.UidOverride (defaulting to "Uid") is a backward-compatible addition — all existing callers that relied on Uid returning "Uid" are unaffected.

  • Resources: ILoggerFactory returned by BuildAsync is not disposed in tests, but this is an accepted pattern for test code with no real handles held.

  • Cross-TFM: Test-only code. No TFM-specific APIs introduced.

  • Security / Defensive: No concerns in test helper code.

Positive Observations

  • Good coverage of edge cases: null inputs, empty collections, enabled/disabled filtering, and the case-sensitivity contract.
  • Composite interface definitions (ILoggerProviderAndExtension, ILoggerProviderExtensionAndInitializable, etc.) are well-chosen to precisely test orthogonal code paths in BuildAsync.
  • Mock setups are explicit about IsEnabledAsync() return values rather than relying on Moq defaults, making test intent clear.

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: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The tests are well-structured, isolated, and use appropriate assertion patterns (Assert.ThrowsExactly, Assert.AreEqual, Moq .Verify). No flakiness or isolation issues found. The findings are all coverage gaps:

  1. Missing: enabled extension+initializable provider path (LoggingManagerTests) — The test suite covers the disabled-extension+initializable case and the non-extension+initializable case, but not the enabled-extension+initializable case. This means a regression in TryInitializeAsync() being called for enabled extension providers would go undetected.

  2. Unclear scope of BuildAsync_WithInitializableProvider_CallsInitializeAsync — The provider under test (ILoggerProviderAndInitializable) does not implement IExtension and bypasses the extension-enablement check. The test name doesn't convey this; renaming to BuildAsync_WithNonExtensionInitializableProvider_CallsInitializeAsync would clarify the intent.

  3. Multiple-duplicate scenario untested (ExtensionValidationHelperTests) — The production code collects all duplicates and formats their type names into the error message; all tests only set up a single pre-existing duplicate, leaving the multi-duplicate formatting path uncovered.

  4. Case-sensitivity not tested for SimpleOverload — Minor consistency gap since it delegates to the generic overload, but symmetry in the test suite is useful documentation.

Recommendations

  • Add a test for BuildAsync_WithEnabledExtensionInitializableProvider_CallsInitializeAsync using ILoggerProviderExtensionAndInitializable with IsEnabledAsync()true.
  • Consider renaming BuildAsync_WithInitializableProvider_CallsInitializeAsync to reflect it tests the non-extension variant.
  • Add a multi-duplicate test case to ExtensionValidationHelperTests.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Done in commit 064f249. I addressed the actionable review feedback: removed dead mock setup, added the missing enabled extension+initializable coverage, added simple-overload case-sensitivity coverage, added a multi-duplicate validation test, and adjusted section divider comment style.

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

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 99e7312fb by merging origin/main into this branch and fixing the LoggingManagerTests.cs merge conflict.

CopilotAI review requested due to automatic review settings May 11, 2026 16:13
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 16:13
@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 commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 5c9c12b by merging the latest origin/main and fixing the ExtensionValidationHelperTests.cs merge conflict.

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
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix the following build errors

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.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.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix the following build errors

...

Fixed in commit 9690f8c by updating DesktopTestSourceHostTests to pass (IRunSettings?)null in the two Mock<TestSourceHost> constructor calls, resolving the CS8625 build errors at lines 107 and 164.

@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 work in this PR has been superseded. The LoggingManager tests landed in main via #8124 and #8130, and the ExtensionValidationHelper tests landed via #8128. This PR is a duplicate and can be safely closed.

Generated by Daily Test Improver · ● 9.5M ·

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 16b52596e by merging origin/main into this branch and fixing the merge conflicts in the affected test files.

@Evangelink
Amaury Levé (Evangelink) merged commit 59abd09 into mainMay 13, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910 branch May 13, 2026 14:15
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] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension - #8126

Merged
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910
May 13, 2026
Merged

[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension#8126
Amaury Levé (Evangelink) merged 7 commits into
mainfrom
test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member
  • Reproduce and inspect the CS8625 failures in DesktopTestSourceHostTests
  • Apply minimal nullable-safe test fixes
  • Run targeted unit tests for MSTestAdapter.PlatformServices.UnitTests (attempted twice; blocked by transient package feed download failures)
  • Run final validation checks and reply to the PR comment

…ationHelper
Add 10 tests for LoggingManager.BuildAsync covering:
- AddProvider null validation
- Empty provider list
- Non-extension provider inclusion
- Extension provider enabled/disabled filtering
- InitializeAsync called only for enabled initializable providers
- Correct LogLevel and IServiceProvider passed to factory
- Multiple providers (all included or filtered correctly)
Add 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering:
- Null argument validation for both overloads
- Empty existing collection (no throw)
- Non-duplicate UID (no throw)
- Duplicate UID throws InvalidOperationException
- Error message contains UID
- Case-sensitive UID comparison
- Selector-based overload correctly uses selector
Extend TestExtension with UidOverride property for configurable UIDs in tests.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:42

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Adds unit test coverage in Microsoft.Testing.Platform.UnitTests for two previously untested internal helpers: LoggingManager.BuildAsync (provider filtering/initialization and factory construction) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement during extension registration). This supports the platform’s reliability by locking down branching behavior around extension enablement and duplicate registration.

Changes:

  • Added LoggingManagerTests covering provider factory argument passing, inclusion/exclusion of extension providers based on IsEnabledAsync, and conditional InitializeAsync execution.
  • Added ExtensionValidationHelperTests covering null-guard behavior, duplicate UID detection (including message content), case-sensitivity, and selector-based overload behavior.
  • Extended TestExtension with UidOverride to simplify configuring unique/duplicate UIDs in tests.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests for LoggingManager.BuildAsync provider filtering/initialization and factory wiring.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/TestExtension.csAdds UidOverride to allow configurable extension UIDs in unit tests while preserving the default UID.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew unit tests for ValidateUniqueExtension overloads, including null guards and duplicate UID behavior.

Copilot's findings

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

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


Good addition of unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension. The test structure is clear and the naming convention follows the established MethodName_Condition_ExpectedResult pattern consistently. A few minor issues are flagged below.

Key Findings

  1. Important — Dead mock setup (×2) (LoggingManagerTests.cs lines 125–126, 145–146): Two tests (BuildAsync_PassesCorrectLogLevelToFactory, BuildAsync_PassesServiceProviderToFactory) declare mockLogger and wire up CreateLogger, but neither test ever invokes factory.CreateLogger. The setup is noise that could mislead future readers.

  2. Minor — Asymmetric coverage (ExtensionValidationHelperTests.cs ~line 88): WithSelector tests cover case-sensitivity but SimpleOverload tests do not. Since both overloads share the same comparison logic, adding a parallel test would ensure parity.

  3. Minor — Unconventional section dividers (ExtensionValidationHelperTests.cs line 13): The // ---- ... ---- style banners are not used elsewhere in the test suite; a plain comment or no divider would be more consistent.

Recommendations

  • Remove the unused mockLogger variable and CreateLogger mock setup from the two capture-focused tests.
  • Consider adding ValidateUniqueExtension_SimpleOverload_UidIsCaseSensitive_DifferentCaseDoesNotThrow.
  • Replace the // ---- ... ---- dividers with a simpler comment style.

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

Key Findings

No issues found. Analysis covered:

  • Correctness: Tests accurately model LoggingManager.BuildAsync behavior — extension check via IExtension.IsEnabledAsync() is correctly bypassed for non-IExtension providers, and the IAsyncInitializableExtension + IExtension separation is properly exercised via the three composite interfaces. ExtensionValidationHelper tests correctly validate ordinal (case-sensitive) UID comparison and both overloads.

  • Threading: LoggerFactory.CreateLogger uses IMonitor.Lock for thread safety. The mock setup in the test constructor (_mockMonitor.Setup(m => m.Lock(...)).Returns(...)) correctly accounts for this.

  • API Compat: TestExtension.UidOverride (defaulting to "Uid") is a backward-compatible addition — all existing callers that relied on Uid returning "Uid" are unaffected.

  • Resources: ILoggerFactory returned by BuildAsync is not disposed in tests, but this is an accepted pattern for test code with no real handles held.

  • Cross-TFM: Test-only code. No TFM-specific APIs introduced.

  • Security / Defensive: No concerns in test helper code.

Positive Observations

  • Good coverage of edge cases: null inputs, empty collections, enabled/disabled filtering, and the case-sensitivity contract.
  • Composite interface definitions (ILoggerProviderAndExtension, ILoggerProviderExtensionAndInitializable, etc.) are well-chosen to precisely test orthogonal code paths in BuildAsync.
  • Mock setups are explicit about IsEnabledAsync() return values rather than relying on Moq defaults, making test intent clear.

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: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx

Key Findings

The tests are well-structured, isolated, and use appropriate assertion patterns (Assert.ThrowsExactly, Assert.AreEqual, Moq .Verify). No flakiness or isolation issues found. The findings are all coverage gaps:

  1. Missing: enabled extension+initializable provider path (LoggingManagerTests) — The test suite covers the disabled-extension+initializable case and the non-extension+initializable case, but not the enabled-extension+initializable case. This means a regression in TryInitializeAsync() being called for enabled extension providers would go undetected.

  2. Unclear scope of BuildAsync_WithInitializableProvider_CallsInitializeAsync — The provider under test (ILoggerProviderAndInitializable) does not implement IExtension and bypasses the extension-enablement check. The test name doesn't convey this; renaming to BuildAsync_WithNonExtensionInitializableProvider_CallsInitializeAsync would clarify the intent.

  3. Multiple-duplicate scenario untested (ExtensionValidationHelperTests) — The production code collects all duplicates and formats their type names into the error message; all tests only set up a single pre-existing duplicate, leaving the multi-duplicate formatting path uncovered.

  4. Case-sensitivity not tested for SimpleOverload — Minor consistency gap since it delegates to the generic overload, but symmetry in the test suite is useful documentation.

Recommendations

  • Add a test for BuildAsync_WithEnabledExtensionInitializableProvider_CallsInitializeAsync using ILoggerProviderExtensionAndInitializable with IsEnabledAsync()true.
  • Consider renaming BuildAsync_WithInitializableProvider_CallsInitializeAsync to reflect it tests the non-extension variant.
  • Add a multi-duplicate test case to ExtensionValidationHelperTests.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Done in commit 064f249. I addressed the actionable review feedback: removed dead mock setup, added the missing enabled extension+initializable coverage, added simple-overload case-sensitivity coverage, added a multi-duplicate validation test, and adjusted section divider comment style.

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

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 99e7312fb by merging origin/main into this branch and fixing the LoggingManagerTests.cs merge conflict.

CopilotAI review requested due to automatic review settings May 11, 2026 16:13
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 11, 2026 16:13
@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 commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 5c9c12b by merging the latest origin/main and fixing the ExtensionValidationHelperTests.cs merge conflict.

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
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot fix the following build errors

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.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.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot fix the following build errors

...

Fixed in commit 9690f8c by updating DesktopTestSourceHostTests to pass (IRunSettings?)null in the two Mock<TestSourceHost> constructor calls, resolving the CS8625 build errors at lines 107 and 164.

@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 work in this PR has been superseded. The LoggingManager tests landed in main via #8124 and #8130, and the ExtensionValidationHelper tests landed via #8128. This PR is a duplicate and can be safely closed.

Generated by Daily Test Improver · ● 9.5M ·

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in commit 16b52596e by merging origin/main into this branch and fixing the merge conflicts in the affected test files.

@Evangelink
Amaury Levé (Evangelink) merged commit 59abd09 into mainMay 13, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-and-extension-validation-tests-v9-6c0eb31b457c1910 branch May 13, 2026 14:15
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