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

Merged
Amaury Levé (Evangelink) merged 5 commits into
mainfrom
test-assist/logging-manager-extension-validation-v8-d379547e7d69b258
May 13, 2026
Merged

[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension#8127
Amaury Levé (Evangelink) merged 5 commits into
mainfrom
test-assist/logging-manager-extension-validation-v8-d379547e7d69b258

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member
  • Inspect current branch state and confirm merge-conflict request
  • Fetch latest target branch history (unshallow if needed)
  • Merge target branch into PR branch and resolve conflicts surgically
  • Run targeted tests for affected test files
  • Reply to the new PR comment with the addressing commit hash
  • Run final validation checks

…ationHelper.ValidateUniqueExtension
Adds 10 tests for LoggingManager.BuildAsync covering:
- No providers case
- Non-extension provider inclusion
- Extension provider enabled/disabled filtering
- IAsyncInitializableExtension initialization
- Multiple providers handling
- Factory receives correct log level and service provider
Adds 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering:
- Null argument validation for both overloads
- Empty collection (no-throw)
- No-duplicate case (no-throw)
- Single and multiple duplicates (throw)
- Error message content (uid and type names)
- Custom selector overload
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:43

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 new unit tests to improve regression coverage for two internal helpers in Microsoft.Testing.Platform: LoggingManager.BuildAsync (provider filtering/initialization behavior) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement).

Changes:

  • Added LoggingManagerTests covering provider inclusion/exclusion, async initialization, and factory callback inputs (log level + service provider).
  • Added ExtensionValidationHelperTests covering null-guards, no-duplicate scenarios, duplicate detection, and error message content (UID + type list).
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew tests for LoggingManager.BuildAsync branching behavior and provider factory inputs.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew tests for ValidateUniqueExtension overloads, including duplicates + message validation.

Copilot's findings

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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

No actionable issues found. The new unit tests are correct and well-structured.

Correctness ✅ — Each test accurately targets the corresponding production code path:

  • LoggingManagerTests correctly distinguishes between non-extension, enabled-extension, disabled-extension, and initializable providers. The helper interface definitions (IEnabledLoggerProvider : ILoggerProvider, IExtension, IInitializableLoggerProvider : ILoggerProvider, IAsyncInitializableExtension, IEnabledInitializableLoggerProvider : ILoggerProvider, IExtension, IAsyncInitializableExtension) at the bottom of the file map precisely to the conditional branches in LoggingManager.BuildAsync.
  • ExtensionValidationHelperTests correctly verifies both overloads, null-argument guards, empty-collection no-throw, UID-duplicate detection, error message content (including dynamic proxy type names from Moq, which match how the production code uses x.GetType()), and the custom-selector overload.

Threading / Concurrency ✅ — IMonitor.Lock is properly mocked to return an IDisposable; LoggerFactory.CreateLogger uses it for thread-safe dictionary access. Tests are isolated (fresh LoggingManager per test method) with no shared mutable state.

Resources ✅ — No IDisposable/IAsyncDisposable objects introduced in tests that require explicit cleanup.

Test infrastructure ✅ — Moq is an established dependency in the test project; DynamicProxyGenAssembly2 is granted InternalsVisibleTo access, so mocking internal interfaces works correctly.

Positive Observations

  • Test helper interface definitions are concise and placed at the file scope (not nested), which is idiomatic for this codebase.
  • Assert.ThrowsExactly<T> is used rather than Assert.ThrowsException<T>, which is the correct precision for exception-type assertions.
  • Assertions on error message content use the same GetType().ToString() expression the production code uses, making them robust against Moq proxy type names.

Recommendations

No changes required.


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

  1. [Assertion] Vacuous type-name assertions in ErrorMessageContainsTypeNames tests (ExtensionValidationHelperTests.cs, lines 95-96 and 206-207)
    Both Mock<IExtension> instances share the same Moq-generated proxy type at runtime, making the two Assert.Contains(x.GetType().ToString(), ...) calls identical. The tests pass even if only one type name (or neither, in a degenerate case) appears in the error message. Using concrete IExtension implementations with distinct type names would make each assertion independently meaningful.

  2. [Coverage] Missing "enabled + initializable" test in LoggingManagerTests (LoggingManagerTests.cs)
    The disabled+initializable case is tested (BuildAsync_DisabledExtensionAndInitializable_InitializeAsyncIsNotCalled), but the affirmative complement — an enabled IExtension that is also IAsyncInitializableExtension should have InitializeAsync called — is missing. The existing BuildAsync_InitializableProvider_InitializeAsyncIsCalled uses a provider that is not an IExtension at all, so it exercises a different code path.

Strengths

  • Good overall coverage of LoggingManager.BuildAsync scenarios (no-providers, non-extension, enabled/disabled extension, mixed).
  • Guard-clause tests (ArgumentNullException paths) for both overloads of ValidateUniqueExtension are thorough.
  • Correct use of MSTest assertions throughout (consistent with the project's BannedSymbols policy).
  • Helper interfaces (IEnabledLoggerProvider, IInitializableLoggerProvider, IEnabledInitializableLoggerProvider) are a clean pattern for constructing typed mocks.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

  1. [Important] Duplicate Arrange+Act in adjacent test pairs — Both ExtensionValidationHelperTests sections (Generic and Simple) have pairs of tests (ThrowsInvalidOperationException + ErrorMessageContainsTypeNames) with completely identical setup and method invocation, differing only in assertions. Extracting a shared helper that returns the exception would eliminate the duplication.

  2. [Important] Asymmetric test coverage — The Generic overload section covers MultipleDuplicates but the Simple overload section does not, leaving a potential regression path untested.

  3. [Minor] Named mockLogger variables never verified — In BuildAsync_NonExtensionProvider_IsAlwaysIncluded and BuildAsync_EnabledExtensionProvider_IsIncluded, a named Mock<ILogger> is used only to satisfy a Returns() call. Using Mock.Of<ILogger>() inline better communicates intent.

  4. [Minor] Single-character variable name inside multi-line lambda — The BuildAsync_FactoryReceivesCorrectLogLevel lambda uses p for an internal mock, inconsistent with the descriptive names (mockProvider, etc.) used elsewhere.

Positive Highlights

  • Excellent test structure overall: clear naming, logical grouping with section comments, and good coverage of null-argument edge cases.
  • Good use of Assert.ThrowsExactly<T> (over ThrowsException) for precise exception-type checks.
  • The helper interfaces (IEnabledLoggerProvider, IInitializableLoggerProvider, IEnabledInitializableLoggerProvider) are well-designed to isolate specific code paths in LoggingManager.BuildAsync.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

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 96ae881. I addressed the review feedback, reran targeted unit tests for the updated test classes, and validation is passing.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 7b7116c and 96ae881. The requested review feedback is applied (deduplicated duplicate Arrange/Act via shared helpers, added simple-overload multiple-duplicates coverage, inlined Mock.Of<ILogger>() where appropriate, and renamed lambda-local mock variables for readability).

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in 21bd85e: I merged origin/main into this branch and resolved the add/add conflicts in the two test files (LoggingManagerTests.cs and ExtensionValidationHelperTests.cs).

@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 commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in 8de1f3f: I merged the latest origin/main into this branch and fixed the conflicts in LoggingManagerTests.cs and ExtensionValidationHelperTests.cs.

CopilotAI review requested due to automatic review settings May 13, 2026 13:06
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 13:06
@Evangelink
Amaury Levé (Evangelink) merged commit e324aa7 into mainMay 13, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-extension-validation-v8-d379547e7d69b258 branch May 13, 2026 14:13
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 - #8127

Merged
Amaury Levé (Evangelink) merged 5 commits into
mainfrom
test-assist/logging-manager-extension-validation-v8-d379547e7d69b258
May 13, 2026
Merged

[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension#8127
Amaury Levé (Evangelink) merged 5 commits into
mainfrom
test-assist/logging-manager-extension-validation-v8-d379547e7d69b258

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member
  • Inspect current branch state and confirm merge-conflict request
  • Fetch latest target branch history (unshallow if needed)
  • Merge target branch into PR branch and resolve conflicts surgically
  • Run targeted tests for affected test files
  • Reply to the new PR comment with the addressing commit hash
  • Run final validation checks

…ationHelper.ValidateUniqueExtension
Adds 10 tests for LoggingManager.BuildAsync covering:
- No providers case
- Non-extension provider inclusion
- Extension provider enabled/disabled filtering
- IAsyncInitializableExtension initialization
- Multiple providers handling
- Factory receives correct log level and service provider
Adds 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering:
- Null argument validation for both overloads
- Empty collection (no-throw)
- No-duplicate case (no-throw)
- Single and multiple duplicates (throw)
- Error message content (uid and type names)
- Custom selector overload
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:43

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 new unit tests to improve regression coverage for two internal helpers in Microsoft.Testing.Platform: LoggingManager.BuildAsync (provider filtering/initialization behavior) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement).

Changes:

  • Added LoggingManagerTests covering provider inclusion/exclusion, async initialization, and factory callback inputs (log level + service provider).
  • Added ExtensionValidationHelperTests covering null-guards, no-duplicate scenarios, duplicate detection, and error message content (UID + type list).
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew tests for LoggingManager.BuildAsync branching behavior and provider factory inputs.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew tests for ValidateUniqueExtension overloads, including duplicates + message validation.

Copilot's findings

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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

No actionable issues found. The new unit tests are correct and well-structured.

Correctness ✅ — Each test accurately targets the corresponding production code path:

  • LoggingManagerTests correctly distinguishes between non-extension, enabled-extension, disabled-extension, and initializable providers. The helper interface definitions (IEnabledLoggerProvider : ILoggerProvider, IExtension, IInitializableLoggerProvider : ILoggerProvider, IAsyncInitializableExtension, IEnabledInitializableLoggerProvider : ILoggerProvider, IExtension, IAsyncInitializableExtension) at the bottom of the file map precisely to the conditional branches in LoggingManager.BuildAsync.
  • ExtensionValidationHelperTests correctly verifies both overloads, null-argument guards, empty-collection no-throw, UID-duplicate detection, error message content (including dynamic proxy type names from Moq, which match how the production code uses x.GetType()), and the custom-selector overload.

Threading / Concurrency ✅ — IMonitor.Lock is properly mocked to return an IDisposable; LoggerFactory.CreateLogger uses it for thread-safe dictionary access. Tests are isolated (fresh LoggingManager per test method) with no shared mutable state.

Resources ✅ — No IDisposable/IAsyncDisposable objects introduced in tests that require explicit cleanup.

Test infrastructure ✅ — Moq is an established dependency in the test project; DynamicProxyGenAssembly2 is granted InternalsVisibleTo access, so mocking internal interfaces works correctly.

Positive Observations

  • Test helper interface definitions are concise and placed at the file scope (not nested), which is idiomatic for this codebase.
  • Assert.ThrowsExactly<T> is used rather than Assert.ThrowsException<T>, which is the correct precision for exception-type assertions.
  • Assertions on error message content use the same GetType().ToString() expression the production code uses, making them robust against Moq proxy type names.

Recommendations

No changes required.


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

  1. [Assertion] Vacuous type-name assertions in ErrorMessageContainsTypeNames tests (ExtensionValidationHelperTests.cs, lines 95-96 and 206-207)
    Both Mock<IExtension> instances share the same Moq-generated proxy type at runtime, making the two Assert.Contains(x.GetType().ToString(), ...) calls identical. The tests pass even if only one type name (or neither, in a degenerate case) appears in the error message. Using concrete IExtension implementations with distinct type names would make each assertion independently meaningful.

  2. [Coverage] Missing "enabled + initializable" test in LoggingManagerTests (LoggingManagerTests.cs)
    The disabled+initializable case is tested (BuildAsync_DisabledExtensionAndInitializable_InitializeAsyncIsNotCalled), but the affirmative complement — an enabled IExtension that is also IAsyncInitializableExtension should have InitializeAsync called — is missing. The existing BuildAsync_InitializableProvider_InitializeAsyncIsCalled uses a provider that is not an IExtension at all, so it exercises a different code path.

Strengths

  • Good overall coverage of LoggingManager.BuildAsync scenarios (no-providers, non-extension, enabled/disabled extension, mixed).
  • Guard-clause tests (ArgumentNullException paths) for both overloads of ValidateUniqueExtension are thorough.
  • Correct use of MSTest assertions throughout (consistent with the project's BannedSymbols policy).
  • Helper interfaces (IEnabledLoggerProvider, IInitializableLoggerProvider, IEnabledInitializableLoggerProvider) are a clean pattern for constructing typed mocks.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

  1. [Important] Duplicate Arrange+Act in adjacent test pairs — Both ExtensionValidationHelperTests sections (Generic and Simple) have pairs of tests (ThrowsInvalidOperationException + ErrorMessageContainsTypeNames) with completely identical setup and method invocation, differing only in assertions. Extracting a shared helper that returns the exception would eliminate the duplication.

  2. [Important] Asymmetric test coverage — The Generic overload section covers MultipleDuplicates but the Simple overload section does not, leaving a potential regression path untested.

  3. [Minor] Named mockLogger variables never verified — In BuildAsync_NonExtensionProvider_IsAlwaysIncluded and BuildAsync_EnabledExtensionProvider_IsIncluded, a named Mock<ILogger> is used only to satisfy a Returns() call. Using Mock.Of<ILogger>() inline better communicates intent.

  4. [Minor] Single-character variable name inside multi-line lambda — The BuildAsync_FactoryReceivesCorrectLogLevel lambda uses p for an internal mock, inconsistent with the descriptive names (mockProvider, etc.) used elsewhere.

Positive Highlights

  • Excellent test structure overall: clear naming, logical grouping with section comments, and good coverage of null-argument edge cases.
  • Good use of Assert.ThrowsExactly<T> (over ThrowsException) for precise exception-type checks.
  • The helper interfaces (IEnabledLoggerProvider, IInitializableLoggerProvider, IEnabledInitializableLoggerProvider) are well-designed to isolate specific code paths in LoggingManager.BuildAsync.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

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 96ae881. I addressed the review feedback, reran targeted unit tests for the updated test classes, and validation is passing.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 7b7116c and 96ae881. The requested review feedback is applied (deduplicated duplicate Arrange/Act via shared helpers, added simple-overload multiple-duplicates coverage, inlined Mock.Of<ILogger>() where appropriate, and renamed lambda-local mock variables for readability).

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in 21bd85e: I merged origin/main into this branch and resolved the add/add conflicts in the two test files (LoggingManagerTests.cs and ExtensionValidationHelperTests.cs).

@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 commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in 8de1f3f: I merged the latest origin/main into this branch and fixed the conflicts in LoggingManagerTests.cs and ExtensionValidationHelperTests.cs.

CopilotAI review requested due to automatic review settings May 13, 2026 13:06
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 13:06
@Evangelink
Amaury Levé (Evangelink) merged commit e324aa7 into mainMay 13, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-extension-validation-v8-d379547e7d69b258 branch May 13, 2026 14:13
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 - #8127

Merged
Amaury Levé (Evangelink) merged 5 commits into
mainfrom
test-assist/logging-manager-extension-validation-v8-d379547e7d69b258
May 13, 2026
Merged

[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension#8127
Amaury Levé (Evangelink) merged 5 commits into
mainfrom
test-assist/logging-manager-extension-validation-v8-d379547e7d69b258

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member
  • Inspect current branch state and confirm merge-conflict request
  • Fetch latest target branch history (unshallow if needed)
  • Merge target branch into PR branch and resolve conflicts surgically
  • Run targeted tests for affected test files
  • Reply to the new PR comment with the addressing commit hash
  • Run final validation checks

…ationHelper.ValidateUniqueExtension
Adds 10 tests for LoggingManager.BuildAsync covering:
- No providers case
- Non-extension provider inclusion
- Extension provider enabled/disabled filtering
- IAsyncInitializableExtension initialization
- Multiple providers handling
- Factory receives correct log level and service provider
Adds 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering:
- Null argument validation for both overloads
- Empty collection (no-throw)
- No-duplicate case (no-throw)
- Single and multiple duplicates (throw)
- Error message content (uid and type names)
- Custom selector overload
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:43

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 new unit tests to improve regression coverage for two internal helpers in Microsoft.Testing.Platform: LoggingManager.BuildAsync (provider filtering/initialization behavior) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement).

Changes:

  • Added LoggingManagerTests covering provider inclusion/exclusion, async initialization, and factory callback inputs (log level + service provider).
  • Added ExtensionValidationHelperTests covering null-guards, no-duplicate scenarios, duplicate detection, and error message content (UID + type list).
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew tests for LoggingManager.BuildAsync branching behavior and provider factory inputs.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew tests for ValidateUniqueExtension overloads, including duplicates + message validation.

Copilot's findings

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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

No actionable issues found. The new unit tests are correct and well-structured.

Correctness ✅ — Each test accurately targets the corresponding production code path:

  • LoggingManagerTests correctly distinguishes between non-extension, enabled-extension, disabled-extension, and initializable providers. The helper interface definitions (IEnabledLoggerProvider : ILoggerProvider, IExtension, IInitializableLoggerProvider : ILoggerProvider, IAsyncInitializableExtension, IEnabledInitializableLoggerProvider : ILoggerProvider, IExtension, IAsyncInitializableExtension) at the bottom of the file map precisely to the conditional branches in LoggingManager.BuildAsync.
  • ExtensionValidationHelperTests correctly verifies both overloads, null-argument guards, empty-collection no-throw, UID-duplicate detection, error message content (including dynamic proxy type names from Moq, which match how the production code uses x.GetType()), and the custom-selector overload.

Threading / Concurrency ✅ — IMonitor.Lock is properly mocked to return an IDisposable; LoggerFactory.CreateLogger uses it for thread-safe dictionary access. Tests are isolated (fresh LoggingManager per test method) with no shared mutable state.

Resources ✅ — No IDisposable/IAsyncDisposable objects introduced in tests that require explicit cleanup.

Test infrastructure ✅ — Moq is an established dependency in the test project; DynamicProxyGenAssembly2 is granted InternalsVisibleTo access, so mocking internal interfaces works correctly.

Positive Observations

  • Test helper interface definitions are concise and placed at the file scope (not nested), which is idiomatic for this codebase.
  • Assert.ThrowsExactly<T> is used rather than Assert.ThrowsException<T>, which is the correct precision for exception-type assertions.
  • Assertions on error message content use the same GetType().ToString() expression the production code uses, making them robust against Moq proxy type names.

Recommendations

No changes required.


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

  1. [Assertion] Vacuous type-name assertions in ErrorMessageContainsTypeNames tests (ExtensionValidationHelperTests.cs, lines 95-96 and 206-207)
    Both Mock<IExtension> instances share the same Moq-generated proxy type at runtime, making the two Assert.Contains(x.GetType().ToString(), ...) calls identical. The tests pass even if only one type name (or neither, in a degenerate case) appears in the error message. Using concrete IExtension implementations with distinct type names would make each assertion independently meaningful.

  2. [Coverage] Missing "enabled + initializable" test in LoggingManagerTests (LoggingManagerTests.cs)
    The disabled+initializable case is tested (BuildAsync_DisabledExtensionAndInitializable_InitializeAsyncIsNotCalled), but the affirmative complement — an enabled IExtension that is also IAsyncInitializableExtension should have InitializeAsync called — is missing. The existing BuildAsync_InitializableProvider_InitializeAsyncIsCalled uses a provider that is not an IExtension at all, so it exercises a different code path.

Strengths

  • Good overall coverage of LoggingManager.BuildAsync scenarios (no-providers, non-extension, enabled/disabled extension, mixed).
  • Guard-clause tests (ArgumentNullException paths) for both overloads of ValidateUniqueExtension are thorough.
  • Correct use of MSTest assertions throughout (consistent with the project's BannedSymbols policy).
  • Helper interfaces (IEnabledLoggerProvider, IInitializableLoggerProvider, IEnabledInitializableLoggerProvider) are a clean pattern for constructing typed mocks.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

  1. [Important] Duplicate Arrange+Act in adjacent test pairs — Both ExtensionValidationHelperTests sections (Generic and Simple) have pairs of tests (ThrowsInvalidOperationException + ErrorMessageContainsTypeNames) with completely identical setup and method invocation, differing only in assertions. Extracting a shared helper that returns the exception would eliminate the duplication.

  2. [Important] Asymmetric test coverage — The Generic overload section covers MultipleDuplicates but the Simple overload section does not, leaving a potential regression path untested.

  3. [Minor] Named mockLogger variables never verified — In BuildAsync_NonExtensionProvider_IsAlwaysIncluded and BuildAsync_EnabledExtensionProvider_IsIncluded, a named Mock<ILogger> is used only to satisfy a Returns() call. Using Mock.Of<ILogger>() inline better communicates intent.

  4. [Minor] Single-character variable name inside multi-line lambda — The BuildAsync_FactoryReceivesCorrectLogLevel lambda uses p for an internal mock, inconsistent with the descriptive names (mockProvider, etc.) used elsewhere.

Positive Highlights

  • Excellent test structure overall: clear naming, logical grouping with section comments, and good coverage of null-argument edge cases.
  • Good use of Assert.ThrowsExactly<T> (over ThrowsException) for precise exception-type checks.
  • The helper interfaces (IEnabledLoggerProvider, IInitializableLoggerProvider, IEnabledInitializableLoggerProvider) are well-designed to isolate specific code paths in LoggingManager.BuildAsync.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

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 96ae881. I addressed the review feedback, reran targeted unit tests for the updated test classes, and validation is passing.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 7b7116c and 96ae881. The requested review feedback is applied (deduplicated duplicate Arrange/Act via shared helpers, added simple-overload multiple-duplicates coverage, inlined Mock.Of<ILogger>() where appropriate, and renamed lambda-local mock variables for readability).

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in 21bd85e: I merged origin/main into this branch and resolved the add/add conflicts in the two test files (LoggingManagerTests.cs and ExtensionValidationHelperTests.cs).

@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 commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in 8de1f3f: I merged the latest origin/main into this branch and fixed the conflicts in LoggingManagerTests.cs and ExtensionValidationHelperTests.cs.

CopilotAI review requested due to automatic review settings May 13, 2026 13:06
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 13:06
@Evangelink
Amaury Levé (Evangelink) merged commit e324aa7 into mainMay 13, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-extension-validation-v8-d379547e7d69b258 branch May 13, 2026 14:13
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 - #8127

Merged
Amaury Levé (Evangelink) merged 5 commits into
mainfrom
test-assist/logging-manager-extension-validation-v8-d379547e7d69b258
May 13, 2026
Merged

[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension#8127
Amaury Levé (Evangelink) merged 5 commits into
mainfrom
test-assist/logging-manager-extension-validation-v8-d379547e7d69b258

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member
  • Inspect current branch state and confirm merge-conflict request
  • Fetch latest target branch history (unshallow if needed)
  • Merge target branch into PR branch and resolve conflicts surgically
  • Run targeted tests for affected test files
  • Reply to the new PR comment with the addressing commit hash
  • Run final validation checks

…ationHelper.ValidateUniqueExtension
Adds 10 tests for LoggingManager.BuildAsync covering:
- No providers case
- Non-extension provider inclusion
- Extension provider enabled/disabled filtering
- IAsyncInitializableExtension initialization
- Multiple providers handling
- Factory receives correct log level and service provider
Adds 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering:
- Null argument validation for both overloads
- Empty collection (no-throw)
- No-duplicate case (no-throw)
- Single and multiple duplicates (throw)
- Error message content (uid and type names)
- Custom selector overload
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:43

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 new unit tests to improve regression coverage for two internal helpers in Microsoft.Testing.Platform: LoggingManager.BuildAsync (provider filtering/initialization behavior) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement).

Changes:

  • Added LoggingManagerTests covering provider inclusion/exclusion, async initialization, and factory callback inputs (log level + service provider).
  • Added ExtensionValidationHelperTests covering null-guards, no-duplicate scenarios, duplicate detection, and error message content (UID + type list).
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew tests for LoggingManager.BuildAsync branching behavior and provider factory inputs.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew tests for ValidateUniqueExtension overloads, including duplicates + message validation.

Copilot's findings

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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

No actionable issues found. The new unit tests are correct and well-structured.

Correctness ✅ — Each test accurately targets the corresponding production code path:

  • LoggingManagerTests correctly distinguishes between non-extension, enabled-extension, disabled-extension, and initializable providers. The helper interface definitions (IEnabledLoggerProvider : ILoggerProvider, IExtension, IInitializableLoggerProvider : ILoggerProvider, IAsyncInitializableExtension, IEnabledInitializableLoggerProvider : ILoggerProvider, IExtension, IAsyncInitializableExtension) at the bottom of the file map precisely to the conditional branches in LoggingManager.BuildAsync.
  • ExtensionValidationHelperTests correctly verifies both overloads, null-argument guards, empty-collection no-throw, UID-duplicate detection, error message content (including dynamic proxy type names from Moq, which match how the production code uses x.GetType()), and the custom-selector overload.

Threading / Concurrency ✅ — IMonitor.Lock is properly mocked to return an IDisposable; LoggerFactory.CreateLogger uses it for thread-safe dictionary access. Tests are isolated (fresh LoggingManager per test method) with no shared mutable state.

Resources ✅ — No IDisposable/IAsyncDisposable objects introduced in tests that require explicit cleanup.

Test infrastructure ✅ — Moq is an established dependency in the test project; DynamicProxyGenAssembly2 is granted InternalsVisibleTo access, so mocking internal interfaces works correctly.

Positive Observations

  • Test helper interface definitions are concise and placed at the file scope (not nested), which is idiomatic for this codebase.
  • Assert.ThrowsExactly<T> is used rather than Assert.ThrowsException<T>, which is the correct precision for exception-type assertions.
  • Assertions on error message content use the same GetType().ToString() expression the production code uses, making them robust against Moq proxy type names.

Recommendations

No changes required.


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

  1. [Assertion] Vacuous type-name assertions in ErrorMessageContainsTypeNames tests (ExtensionValidationHelperTests.cs, lines 95-96 and 206-207)
    Both Mock<IExtension> instances share the same Moq-generated proxy type at runtime, making the two Assert.Contains(x.GetType().ToString(), ...) calls identical. The tests pass even if only one type name (or neither, in a degenerate case) appears in the error message. Using concrete IExtension implementations with distinct type names would make each assertion independently meaningful.

  2. [Coverage] Missing "enabled + initializable" test in LoggingManagerTests (LoggingManagerTests.cs)
    The disabled+initializable case is tested (BuildAsync_DisabledExtensionAndInitializable_InitializeAsyncIsNotCalled), but the affirmative complement — an enabled IExtension that is also IAsyncInitializableExtension should have InitializeAsync called — is missing. The existing BuildAsync_InitializableProvider_InitializeAsyncIsCalled uses a provider that is not an IExtension at all, so it exercises a different code path.

Strengths

  • Good overall coverage of LoggingManager.BuildAsync scenarios (no-providers, non-extension, enabled/disabled extension, mixed).
  • Guard-clause tests (ArgumentNullException paths) for both overloads of ValidateUniqueExtension are thorough.
  • Correct use of MSTest assertions throughout (consistent with the project's BannedSymbols policy).
  • Helper interfaces (IEnabledLoggerProvider, IInitializableLoggerProvider, IEnabledInitializableLoggerProvider) are a clean pattern for constructing typed mocks.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

  1. [Important] Duplicate Arrange+Act in adjacent test pairs — Both ExtensionValidationHelperTests sections (Generic and Simple) have pairs of tests (ThrowsInvalidOperationException + ErrorMessageContainsTypeNames) with completely identical setup and method invocation, differing only in assertions. Extracting a shared helper that returns the exception would eliminate the duplication.

  2. [Important] Asymmetric test coverage — The Generic overload section covers MultipleDuplicates but the Simple overload section does not, leaving a potential regression path untested.

  3. [Minor] Named mockLogger variables never verified — In BuildAsync_NonExtensionProvider_IsAlwaysIncluded and BuildAsync_EnabledExtensionProvider_IsIncluded, a named Mock<ILogger> is used only to satisfy a Returns() call. Using Mock.Of<ILogger>() inline better communicates intent.

  4. [Minor] Single-character variable name inside multi-line lambda — The BuildAsync_FactoryReceivesCorrectLogLevel lambda uses p for an internal mock, inconsistent with the descriptive names (mockProvider, etc.) used elsewhere.

Positive Highlights

  • Excellent test structure overall: clear naming, logical grouping with section comments, and good coverage of null-argument edge cases.
  • Good use of Assert.ThrowsExactly<T> (over ThrowsException) for precise exception-type checks.
  • The helper interfaces (IEnabledLoggerProvider, IInitializableLoggerProvider, IEnabledInitializableLoggerProvider) are well-designed to isolate specific code paths in LoggingManager.BuildAsync.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

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 96ae881. I addressed the review feedback, reran targeted unit tests for the updated test classes, and validation is passing.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 7b7116c and 96ae881. The requested review feedback is applied (deduplicated duplicate Arrange/Act via shared helpers, added simple-overload multiple-duplicates coverage, inlined Mock.Of<ILogger>() where appropriate, and renamed lambda-local mock variables for readability).

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in 21bd85e: I merged origin/main into this branch and resolved the add/add conflicts in the two test files (LoggingManagerTests.cs and ExtensionValidationHelperTests.cs).

@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 commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in 8de1f3f: I merged the latest origin/main into this branch and fixed the conflicts in LoggingManagerTests.cs and ExtensionValidationHelperTests.cs.

CopilotAI review requested due to automatic review settings May 13, 2026 13:06
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 13:06
@Evangelink
Amaury Levé (Evangelink) merged commit e324aa7 into mainMay 13, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-extension-validation-v8-d379547e7d69b258 branch May 13, 2026 14:13
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 - #8127

Merged
Amaury Levé (Evangelink) merged 5 commits into
mainfrom
test-assist/logging-manager-extension-validation-v8-d379547e7d69b258
May 13, 2026
Merged

[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension#8127
Amaury Levé (Evangelink) merged 5 commits into
mainfrom
test-assist/logging-manager-extension-validation-v8-d379547e7d69b258

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member
  • Inspect current branch state and confirm merge-conflict request
  • Fetch latest target branch history (unshallow if needed)
  • Merge target branch into PR branch and resolve conflicts surgically
  • Run targeted tests for affected test files
  • Reply to the new PR comment with the addressing commit hash
  • Run final validation checks

…ationHelper.ValidateUniqueExtension
Adds 10 tests for LoggingManager.BuildAsync covering:
- No providers case
- Non-extension provider inclusion
- Extension provider enabled/disabled filtering
- IAsyncInitializableExtension initialization
- Multiple providers handling
- Factory receives correct log level and service provider
Adds 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering:
- Null argument validation for both overloads
- Empty collection (no-throw)
- No-duplicate case (no-throw)
- Single and multiple duplicates (throw)
- Error message content (uid and type names)
- Custom selector overload
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:43

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 new unit tests to improve regression coverage for two internal helpers in Microsoft.Testing.Platform: LoggingManager.BuildAsync (provider filtering/initialization behavior) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement).

Changes:

  • Added LoggingManagerTests covering provider inclusion/exclusion, async initialization, and factory callback inputs (log level + service provider).
  • Added ExtensionValidationHelperTests covering null-guards, no-duplicate scenarios, duplicate detection, and error message content (UID + type list).
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew tests for LoggingManager.BuildAsync branching behavior and provider factory inputs.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew tests for ValidateUniqueExtension overloads, including duplicates + message validation.

Copilot's findings

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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

No actionable issues found. The new unit tests are correct and well-structured.

Correctness ✅ — Each test accurately targets the corresponding production code path:

  • LoggingManagerTests correctly distinguishes between non-extension, enabled-extension, disabled-extension, and initializable providers. The helper interface definitions (IEnabledLoggerProvider : ILoggerProvider, IExtension, IInitializableLoggerProvider : ILoggerProvider, IAsyncInitializableExtension, IEnabledInitializableLoggerProvider : ILoggerProvider, IExtension, IAsyncInitializableExtension) at the bottom of the file map precisely to the conditional branches in LoggingManager.BuildAsync.
  • ExtensionValidationHelperTests correctly verifies both overloads, null-argument guards, empty-collection no-throw, UID-duplicate detection, error message content (including dynamic proxy type names from Moq, which match how the production code uses x.GetType()), and the custom-selector overload.

Threading / Concurrency ✅ — IMonitor.Lock is properly mocked to return an IDisposable; LoggerFactory.CreateLogger uses it for thread-safe dictionary access. Tests are isolated (fresh LoggingManager per test method) with no shared mutable state.

Resources ✅ — No IDisposable/IAsyncDisposable objects introduced in tests that require explicit cleanup.

Test infrastructure ✅ — Moq is an established dependency in the test project; DynamicProxyGenAssembly2 is granted InternalsVisibleTo access, so mocking internal interfaces works correctly.

Positive Observations

  • Test helper interface definitions are concise and placed at the file scope (not nested), which is idiomatic for this codebase.
  • Assert.ThrowsExactly<T> is used rather than Assert.ThrowsException<T>, which is the correct precision for exception-type assertions.
  • Assertions on error message content use the same GetType().ToString() expression the production code uses, making them robust against Moq proxy type names.

Recommendations

No changes required.


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

  1. [Assertion] Vacuous type-name assertions in ErrorMessageContainsTypeNames tests (ExtensionValidationHelperTests.cs, lines 95-96 and 206-207)
    Both Mock<IExtension> instances share the same Moq-generated proxy type at runtime, making the two Assert.Contains(x.GetType().ToString(), ...) calls identical. The tests pass even if only one type name (or neither, in a degenerate case) appears in the error message. Using concrete IExtension implementations with distinct type names would make each assertion independently meaningful.

  2. [Coverage] Missing "enabled + initializable" test in LoggingManagerTests (LoggingManagerTests.cs)
    The disabled+initializable case is tested (BuildAsync_DisabledExtensionAndInitializable_InitializeAsyncIsNotCalled), but the affirmative complement — an enabled IExtension that is also IAsyncInitializableExtension should have InitializeAsync called — is missing. The existing BuildAsync_InitializableProvider_InitializeAsyncIsCalled uses a provider that is not an IExtension at all, so it exercises a different code path.

Strengths

  • Good overall coverage of LoggingManager.BuildAsync scenarios (no-providers, non-extension, enabled/disabled extension, mixed).
  • Guard-clause tests (ArgumentNullException paths) for both overloads of ValidateUniqueExtension are thorough.
  • Correct use of MSTest assertions throughout (consistent with the project's BannedSymbols policy).
  • Helper interfaces (IEnabledLoggerProvider, IInitializableLoggerProvider, IEnabledInitializableLoggerProvider) are a clean pattern for constructing typed mocks.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

  1. [Important] Duplicate Arrange+Act in adjacent test pairs — Both ExtensionValidationHelperTests sections (Generic and Simple) have pairs of tests (ThrowsInvalidOperationException + ErrorMessageContainsTypeNames) with completely identical setup and method invocation, differing only in assertions. Extracting a shared helper that returns the exception would eliminate the duplication.

  2. [Important] Asymmetric test coverage — The Generic overload section covers MultipleDuplicates but the Simple overload section does not, leaving a potential regression path untested.

  3. [Minor] Named mockLogger variables never verified — In BuildAsync_NonExtensionProvider_IsAlwaysIncluded and BuildAsync_EnabledExtensionProvider_IsIncluded, a named Mock<ILogger> is used only to satisfy a Returns() call. Using Mock.Of<ILogger>() inline better communicates intent.

  4. [Minor] Single-character variable name inside multi-line lambda — The BuildAsync_FactoryReceivesCorrectLogLevel lambda uses p for an internal mock, inconsistent with the descriptive names (mockProvider, etc.) used elsewhere.

Positive Highlights

  • Excellent test structure overall: clear naming, logical grouping with section comments, and good coverage of null-argument edge cases.
  • Good use of Assert.ThrowsExactly<T> (over ThrowsException) for precise exception-type checks.
  • The helper interfaces (IEnabledLoggerProvider, IInitializableLoggerProvider, IEnabledInitializableLoggerProvider) are well-designed to isolate specific code paths in LoggingManager.BuildAsync.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

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 96ae881. I addressed the review feedback, reran targeted unit tests for the updated test classes, and validation is passing.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 7b7116c and 96ae881. The requested review feedback is applied (deduplicated duplicate Arrange/Act via shared helpers, added simple-overload multiple-duplicates coverage, inlined Mock.Of<ILogger>() where appropriate, and renamed lambda-local mock variables for readability).

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in 21bd85e: I merged origin/main into this branch and resolved the add/add conflicts in the two test files (LoggingManagerTests.cs and ExtensionValidationHelperTests.cs).

@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 commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in 8de1f3f: I merged the latest origin/main into this branch and fixed the conflicts in LoggingManagerTests.cs and ExtensionValidationHelperTests.cs.

CopilotAI review requested due to automatic review settings May 13, 2026 13:06
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 13:06
@Evangelink
Amaury Levé (Evangelink) merged commit e324aa7 into mainMay 13, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-extension-validation-v8-d379547e7d69b258 branch May 13, 2026 14:13
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 - #8127

Merged
Amaury Levé (Evangelink) merged 5 commits into
mainfrom
test-assist/logging-manager-extension-validation-v8-d379547e7d69b258
May 13, 2026
Merged

[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension#8127
Amaury Levé (Evangelink) merged 5 commits into
mainfrom
test-assist/logging-manager-extension-validation-v8-d379547e7d69b258

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member
  • Inspect current branch state and confirm merge-conflict request
  • Fetch latest target branch history (unshallow if needed)
  • Merge target branch into PR branch and resolve conflicts surgically
  • Run targeted tests for affected test files
  • Reply to the new PR comment with the addressing commit hash
  • Run final validation checks

…ationHelper.ValidateUniqueExtension
Adds 10 tests for LoggingManager.BuildAsync covering:
- No providers case
- Non-extension provider inclusion
- Extension provider enabled/disabled filtering
- IAsyncInitializableExtension initialization
- Multiple providers handling
- Factory receives correct log level and service provider
Adds 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering:
- Null argument validation for both overloads
- Empty collection (no-throw)
- No-duplicate case (no-throw)
- Single and multiple duplicates (throw)
- Error message content (uid and type names)
- Custom selector overload
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:43

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 new unit tests to improve regression coverage for two internal helpers in Microsoft.Testing.Platform: LoggingManager.BuildAsync (provider filtering/initialization behavior) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement).

Changes:

  • Added LoggingManagerTests covering provider inclusion/exclusion, async initialization, and factory callback inputs (log level + service provider).
  • Added ExtensionValidationHelperTests covering null-guards, no-duplicate scenarios, duplicate detection, and error message content (UID + type list).
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew tests for LoggingManager.BuildAsync branching behavior and provider factory inputs.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew tests for ValidateUniqueExtension overloads, including duplicates + message validation.

Copilot's findings

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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

No actionable issues found. The new unit tests are correct and well-structured.

Correctness ✅ — Each test accurately targets the corresponding production code path:

  • LoggingManagerTests correctly distinguishes between non-extension, enabled-extension, disabled-extension, and initializable providers. The helper interface definitions (IEnabledLoggerProvider : ILoggerProvider, IExtension, IInitializableLoggerProvider : ILoggerProvider, IAsyncInitializableExtension, IEnabledInitializableLoggerProvider : ILoggerProvider, IExtension, IAsyncInitializableExtension) at the bottom of the file map precisely to the conditional branches in LoggingManager.BuildAsync.
  • ExtensionValidationHelperTests correctly verifies both overloads, null-argument guards, empty-collection no-throw, UID-duplicate detection, error message content (including dynamic proxy type names from Moq, which match how the production code uses x.GetType()), and the custom-selector overload.

Threading / Concurrency ✅ — IMonitor.Lock is properly mocked to return an IDisposable; LoggerFactory.CreateLogger uses it for thread-safe dictionary access. Tests are isolated (fresh LoggingManager per test method) with no shared mutable state.

Resources ✅ — No IDisposable/IAsyncDisposable objects introduced in tests that require explicit cleanup.

Test infrastructure ✅ — Moq is an established dependency in the test project; DynamicProxyGenAssembly2 is granted InternalsVisibleTo access, so mocking internal interfaces works correctly.

Positive Observations

  • Test helper interface definitions are concise and placed at the file scope (not nested), which is idiomatic for this codebase.
  • Assert.ThrowsExactly<T> is used rather than Assert.ThrowsException<T>, which is the correct precision for exception-type assertions.
  • Assertions on error message content use the same GetType().ToString() expression the production code uses, making them robust against Moq proxy type names.

Recommendations

No changes required.


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

  1. [Assertion] Vacuous type-name assertions in ErrorMessageContainsTypeNames tests (ExtensionValidationHelperTests.cs, lines 95-96 and 206-207)
    Both Mock<IExtension> instances share the same Moq-generated proxy type at runtime, making the two Assert.Contains(x.GetType().ToString(), ...) calls identical. The tests pass even if only one type name (or neither, in a degenerate case) appears in the error message. Using concrete IExtension implementations with distinct type names would make each assertion independently meaningful.

  2. [Coverage] Missing "enabled + initializable" test in LoggingManagerTests (LoggingManagerTests.cs)
    The disabled+initializable case is tested (BuildAsync_DisabledExtensionAndInitializable_InitializeAsyncIsNotCalled), but the affirmative complement — an enabled IExtension that is also IAsyncInitializableExtension should have InitializeAsync called — is missing. The existing BuildAsync_InitializableProvider_InitializeAsyncIsCalled uses a provider that is not an IExtension at all, so it exercises a different code path.

Strengths

  • Good overall coverage of LoggingManager.BuildAsync scenarios (no-providers, non-extension, enabled/disabled extension, mixed).
  • Guard-clause tests (ArgumentNullException paths) for both overloads of ValidateUniqueExtension are thorough.
  • Correct use of MSTest assertions throughout (consistent with the project's BannedSymbols policy).
  • Helper interfaces (IEnabledLoggerProvider, IInitializableLoggerProvider, IEnabledInitializableLoggerProvider) are a clean pattern for constructing typed mocks.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

  1. [Important] Duplicate Arrange+Act in adjacent test pairs — Both ExtensionValidationHelperTests sections (Generic and Simple) have pairs of tests (ThrowsInvalidOperationException + ErrorMessageContainsTypeNames) with completely identical setup and method invocation, differing only in assertions. Extracting a shared helper that returns the exception would eliminate the duplication.

  2. [Important] Asymmetric test coverage — The Generic overload section covers MultipleDuplicates but the Simple overload section does not, leaving a potential regression path untested.

  3. [Minor] Named mockLogger variables never verified — In BuildAsync_NonExtensionProvider_IsAlwaysIncluded and BuildAsync_EnabledExtensionProvider_IsIncluded, a named Mock<ILogger> is used only to satisfy a Returns() call. Using Mock.Of<ILogger>() inline better communicates intent.

  4. [Minor] Single-character variable name inside multi-line lambda — The BuildAsync_FactoryReceivesCorrectLogLevel lambda uses p for an internal mock, inconsistent with the descriptive names (mockProvider, etc.) used elsewhere.

Positive Highlights

  • Excellent test structure overall: clear naming, logical grouping with section comments, and good coverage of null-argument edge cases.
  • Good use of Assert.ThrowsExactly<T> (over ThrowsException) for precise exception-type checks.
  • The helper interfaces (IEnabledLoggerProvider, IInitializableLoggerProvider, IEnabledInitializableLoggerProvider) are well-designed to isolate specific code paths in LoggingManager.BuildAsync.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

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 96ae881. I addressed the review feedback, reran targeted unit tests for the updated test classes, and validation is passing.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 7b7116c and 96ae881. The requested review feedback is applied (deduplicated duplicate Arrange/Act via shared helpers, added simple-overload multiple-duplicates coverage, inlined Mock.Of<ILogger>() where appropriate, and renamed lambda-local mock variables for readability).

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in 21bd85e: I merged origin/main into this branch and resolved the add/add conflicts in the two test files (LoggingManagerTests.cs and ExtensionValidationHelperTests.cs).

@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 commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in 8de1f3f: I merged the latest origin/main into this branch and fixed the conflicts in LoggingManagerTests.cs and ExtensionValidationHelperTests.cs.

CopilotAI review requested due to automatic review settings May 13, 2026 13:06
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 13:06
@Evangelink
Amaury Levé (Evangelink) merged commit e324aa7 into mainMay 13, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-extension-validation-v8-d379547e7d69b258 branch May 13, 2026 14:13
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 - #8127

Merged
Amaury Levé (Evangelink) merged 5 commits into
mainfrom
test-assist/logging-manager-extension-validation-v8-d379547e7d69b258
May 13, 2026
Merged

[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension#8127
Amaury Levé (Evangelink) merged 5 commits into
mainfrom
test-assist/logging-manager-extension-validation-v8-d379547e7d69b258

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member
  • Inspect current branch state and confirm merge-conflict request
  • Fetch latest target branch history (unshallow if needed)
  • Merge target branch into PR branch and resolve conflicts surgically
  • Run targeted tests for affected test files
  • Reply to the new PR comment with the addressing commit hash
  • Run final validation checks

…ationHelper.ValidateUniqueExtension
Adds 10 tests for LoggingManager.BuildAsync covering:
- No providers case
- Non-extension provider inclusion
- Extension provider enabled/disabled filtering
- IAsyncInitializableExtension initialization
- Multiple providers handling
- Factory receives correct log level and service provider
Adds 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering:
- Null argument validation for both overloads
- Empty collection (no-throw)
- No-duplicate case (no-throw)
- Single and multiple duplicates (throw)
- Error message content (uid and type names)
- Custom selector overload
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:43

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 new unit tests to improve regression coverage for two internal helpers in Microsoft.Testing.Platform: LoggingManager.BuildAsync (provider filtering/initialization behavior) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement).

Changes:

  • Added LoggingManagerTests covering provider inclusion/exclusion, async initialization, and factory callback inputs (log level + service provider).
  • Added ExtensionValidationHelperTests covering null-guards, no-duplicate scenarios, duplicate detection, and error message content (UID + type list).
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew tests for LoggingManager.BuildAsync branching behavior and provider factory inputs.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew tests for ValidateUniqueExtension overloads, including duplicates + message validation.

Copilot's findings

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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

No actionable issues found. The new unit tests are correct and well-structured.

Correctness ✅ — Each test accurately targets the corresponding production code path:

  • LoggingManagerTests correctly distinguishes between non-extension, enabled-extension, disabled-extension, and initializable providers. The helper interface definitions (IEnabledLoggerProvider : ILoggerProvider, IExtension, IInitializableLoggerProvider : ILoggerProvider, IAsyncInitializableExtension, IEnabledInitializableLoggerProvider : ILoggerProvider, IExtension, IAsyncInitializableExtension) at the bottom of the file map precisely to the conditional branches in LoggingManager.BuildAsync.
  • ExtensionValidationHelperTests correctly verifies both overloads, null-argument guards, empty-collection no-throw, UID-duplicate detection, error message content (including dynamic proxy type names from Moq, which match how the production code uses x.GetType()), and the custom-selector overload.

Threading / Concurrency ✅ — IMonitor.Lock is properly mocked to return an IDisposable; LoggerFactory.CreateLogger uses it for thread-safe dictionary access. Tests are isolated (fresh LoggingManager per test method) with no shared mutable state.

Resources ✅ — No IDisposable/IAsyncDisposable objects introduced in tests that require explicit cleanup.

Test infrastructure ✅ — Moq is an established dependency in the test project; DynamicProxyGenAssembly2 is granted InternalsVisibleTo access, so mocking internal interfaces works correctly.

Positive Observations

  • Test helper interface definitions are concise and placed at the file scope (not nested), which is idiomatic for this codebase.
  • Assert.ThrowsExactly<T> is used rather than Assert.ThrowsException<T>, which is the correct precision for exception-type assertions.
  • Assertions on error message content use the same GetType().ToString() expression the production code uses, making them robust against Moq proxy type names.

Recommendations

No changes required.


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

  1. [Assertion] Vacuous type-name assertions in ErrorMessageContainsTypeNames tests (ExtensionValidationHelperTests.cs, lines 95-96 and 206-207)
    Both Mock<IExtension> instances share the same Moq-generated proxy type at runtime, making the two Assert.Contains(x.GetType().ToString(), ...) calls identical. The tests pass even if only one type name (or neither, in a degenerate case) appears in the error message. Using concrete IExtension implementations with distinct type names would make each assertion independently meaningful.

  2. [Coverage] Missing "enabled + initializable" test in LoggingManagerTests (LoggingManagerTests.cs)
    The disabled+initializable case is tested (BuildAsync_DisabledExtensionAndInitializable_InitializeAsyncIsNotCalled), but the affirmative complement — an enabled IExtension that is also IAsyncInitializableExtension should have InitializeAsync called — is missing. The existing BuildAsync_InitializableProvider_InitializeAsyncIsCalled uses a provider that is not an IExtension at all, so it exercises a different code path.

Strengths

  • Good overall coverage of LoggingManager.BuildAsync scenarios (no-providers, non-extension, enabled/disabled extension, mixed).
  • Guard-clause tests (ArgumentNullException paths) for both overloads of ValidateUniqueExtension are thorough.
  • Correct use of MSTest assertions throughout (consistent with the project's BannedSymbols policy).
  • Helper interfaces (IEnabledLoggerProvider, IInitializableLoggerProvider, IEnabledInitializableLoggerProvider) are a clean pattern for constructing typed mocks.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

  1. [Important] Duplicate Arrange+Act in adjacent test pairs — Both ExtensionValidationHelperTests sections (Generic and Simple) have pairs of tests (ThrowsInvalidOperationException + ErrorMessageContainsTypeNames) with completely identical setup and method invocation, differing only in assertions. Extracting a shared helper that returns the exception would eliminate the duplication.

  2. [Important] Asymmetric test coverage — The Generic overload section covers MultipleDuplicates but the Simple overload section does not, leaving a potential regression path untested.

  3. [Minor] Named mockLogger variables never verified — In BuildAsync_NonExtensionProvider_IsAlwaysIncluded and BuildAsync_EnabledExtensionProvider_IsIncluded, a named Mock<ILogger> is used only to satisfy a Returns() call. Using Mock.Of<ILogger>() inline better communicates intent.

  4. [Minor] Single-character variable name inside multi-line lambda — The BuildAsync_FactoryReceivesCorrectLogLevel lambda uses p for an internal mock, inconsistent with the descriptive names (mockProvider, etc.) used elsewhere.

Positive Highlights

  • Excellent test structure overall: clear naming, logical grouping with section comments, and good coverage of null-argument edge cases.
  • Good use of Assert.ThrowsExactly<T> (over ThrowsException) for precise exception-type checks.
  • The helper interfaces (IEnabledLoggerProvider, IInitializableLoggerProvider, IEnabledInitializableLoggerProvider) are well-designed to isolate specific code paths in LoggingManager.BuildAsync.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

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 96ae881. I addressed the review feedback, reran targeted unit tests for the updated test classes, and validation is passing.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 7b7116c and 96ae881. The requested review feedback is applied (deduplicated duplicate Arrange/Act via shared helpers, added simple-overload multiple-duplicates coverage, inlined Mock.Of<ILogger>() where appropriate, and renamed lambda-local mock variables for readability).

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in 21bd85e: I merged origin/main into this branch and resolved the add/add conflicts in the two test files (LoggingManagerTests.cs and ExtensionValidationHelperTests.cs).

@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 commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in 8de1f3f: I merged the latest origin/main into this branch and fixed the conflicts in LoggingManagerTests.cs and ExtensionValidationHelperTests.cs.

CopilotAI review requested due to automatic review settings May 13, 2026 13:06
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 13:06
@Evangelink
Amaury Levé (Evangelink) merged commit e324aa7 into mainMay 13, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-extension-validation-v8-d379547e7d69b258 branch May 13, 2026 14:13
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 - #8127

Merged
Amaury Levé (Evangelink) merged 5 commits into
mainfrom
test-assist/logging-manager-extension-validation-v8-d379547e7d69b258
May 13, 2026
Merged

[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension#8127
Amaury Levé (Evangelink) merged 5 commits into
mainfrom
test-assist/logging-manager-extension-validation-v8-d379547e7d69b258

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member
  • Inspect current branch state and confirm merge-conflict request
  • Fetch latest target branch history (unshallow if needed)
  • Merge target branch into PR branch and resolve conflicts surgically
  • Run targeted tests for affected test files
  • Reply to the new PR comment with the addressing commit hash
  • Run final validation checks

…ationHelper.ValidateUniqueExtension
Adds 10 tests for LoggingManager.BuildAsync covering:
- No providers case
- Non-extension provider inclusion
- Extension provider enabled/disabled filtering
- IAsyncInitializableExtension initialization
- Multiple providers handling
- Factory receives correct log level and service provider
Adds 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering:
- Null argument validation for both overloads
- Empty collection (no-throw)
- No-duplicate case (no-throw)
- Single and multiple duplicates (throw)
- Error message content (uid and type names)
- Custom selector overload
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:43

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 new unit tests to improve regression coverage for two internal helpers in Microsoft.Testing.Platform: LoggingManager.BuildAsync (provider filtering/initialization behavior) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement).

Changes:

  • Added LoggingManagerTests covering provider inclusion/exclusion, async initialization, and factory callback inputs (log level + service provider).
  • Added ExtensionValidationHelperTests covering null-guards, no-duplicate scenarios, duplicate detection, and error message content (UID + type list).
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew tests for LoggingManager.BuildAsync branching behavior and provider factory inputs.
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.csNew tests for ValidateUniqueExtension overloads, including duplicates + message validation.

Copilot's findings

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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

No actionable issues found. The new unit tests are correct and well-structured.

Correctness ✅ — Each test accurately targets the corresponding production code path:

  • LoggingManagerTests correctly distinguishes between non-extension, enabled-extension, disabled-extension, and initializable providers. The helper interface definitions (IEnabledLoggerProvider : ILoggerProvider, IExtension, IInitializableLoggerProvider : ILoggerProvider, IAsyncInitializableExtension, IEnabledInitializableLoggerProvider : ILoggerProvider, IExtension, IAsyncInitializableExtension) at the bottom of the file map precisely to the conditional branches in LoggingManager.BuildAsync.
  • ExtensionValidationHelperTests correctly verifies both overloads, null-argument guards, empty-collection no-throw, UID-duplicate detection, error message content (including dynamic proxy type names from Moq, which match how the production code uses x.GetType()), and the custom-selector overload.

Threading / Concurrency ✅ — IMonitor.Lock is properly mocked to return an IDisposable; LoggerFactory.CreateLogger uses it for thread-safe dictionary access. Tests are isolated (fresh LoggingManager per test method) with no shared mutable state.

Resources ✅ — No IDisposable/IAsyncDisposable objects introduced in tests that require explicit cleanup.

Test infrastructure ✅ — Moq is an established dependency in the test project; DynamicProxyGenAssembly2 is granted InternalsVisibleTo access, so mocking internal interfaces works correctly.

Positive Observations

  • Test helper interface definitions are concise and placed at the file scope (not nested), which is idiomatic for this codebase.
  • Assert.ThrowsExactly<T> is used rather than Assert.ThrowsException<T>, which is the correct precision for exception-type assertions.
  • Assertions on error message content use the same GetType().ToString() expression the production code uses, making them robust against Moq proxy type names.

Recommendations

No changes required.


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

  1. [Assertion] Vacuous type-name assertions in ErrorMessageContainsTypeNames tests (ExtensionValidationHelperTests.cs, lines 95-96 and 206-207)
    Both Mock<IExtension> instances share the same Moq-generated proxy type at runtime, making the two Assert.Contains(x.GetType().ToString(), ...) calls identical. The tests pass even if only one type name (or neither, in a degenerate case) appears in the error message. Using concrete IExtension implementations with distinct type names would make each assertion independently meaningful.

  2. [Coverage] Missing "enabled + initializable" test in LoggingManagerTests (LoggingManagerTests.cs)
    The disabled+initializable case is tested (BuildAsync_DisabledExtensionAndInitializable_InitializeAsyncIsNotCalled), but the affirmative complement — an enabled IExtension that is also IAsyncInitializableExtension should have InitializeAsync called — is missing. The existing BuildAsync_InitializableProvider_InitializeAsyncIsCalled uses a provider that is not an IExtension at all, so it exercises a different code path.

Strengths

  • Good overall coverage of LoggingManager.BuildAsync scenarios (no-providers, non-extension, enabled/disabled extension, mixed).
  • Guard-clause tests (ArgumentNullException paths) for both overloads of ValidateUniqueExtension are thorough.
  • Correct use of MSTest assertions throughout (consistent with the project's BannedSymbols policy).
  • Helper interfaces (IEnabledLoggerProvider, IInitializableLoggerProvider, IEnabledInitializableLoggerProvider) are a clean pattern for constructing typed mocks.

Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comments

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

  1. [Important] Duplicate Arrange+Act in adjacent test pairs — Both ExtensionValidationHelperTests sections (Generic and Simple) have pairs of tests (ThrowsInvalidOperationException + ErrorMessageContainsTypeNames) with completely identical setup and method invocation, differing only in assertions. Extracting a shared helper that returns the exception would eliminate the duplication.

  2. [Important] Asymmetric test coverage — The Generic overload section covers MultipleDuplicates but the Simple overload section does not, leaving a potential regression path untested.

  3. [Minor] Named mockLogger variables never verified — In BuildAsync_NonExtensionProvider_IsAlwaysIncluded and BuildAsync_EnabledExtensionProvider_IsIncluded, a named Mock<ILogger> is used only to satisfy a Returns() call. Using Mock.Of<ILogger>() inline better communicates intent.

  4. [Minor] Single-character variable name inside multi-line lambda — The BuildAsync_FactoryReceivesCorrectLogLevel lambda uses p for an internal mock, inconsistent with the descriptive names (mockProvider, etc.) used elsewhere.

Positive Highlights

  • Excellent test structure overall: clear naming, logical grouping with section comments, and good coverage of null-argument edge cases.
  • Good use of Assert.ThrowsExactly<T> (over ThrowsException) for precise exception-type checks.
  • The helper interfaces (IEnabledLoggerProvider, IInitializableLoggerProvider, IEnabledInitializableLoggerProvider) are well-designed to isolate specific code paths in LoggingManager.BuildAsync.

Generated by PR Nitpick Reviewer

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

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 96ae881. I addressed the review feedback, reran targeted unit tests for the updated test classes, and validation is passing.

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot address review comments

Addressed in 7b7116c and 96ae881. The requested review feedback is applied (deduplicated duplicate Arrange/Act via shared helpers, added simple-overload multiple-duplicates coverage, inlined Mock.Of<ILogger>() where appropriate, and renamed lambda-local mock variables for readability).

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in 21bd85e: I merged origin/main into this branch and resolved the add/add conflicts in the two test files (LoggingManagerTests.cs and ExtensionValidationHelperTests.cs).

@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 commented May 13, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved in 8de1f3f: I merged the latest origin/main into this branch and fixed the conflicts in LoggingManagerTests.cs and ExtensionValidationHelperTests.cs.

CopilotAI review requested due to automatic review settings May 13, 2026 13:06
@Evangelink
Amaury Levé (Evangelink) removed the request for review from CopilotMay 13, 2026 13:06
@Evangelink
Amaury Levé (Evangelink) merged commit e324aa7 into mainMay 13, 2026
2 checks passed
@Evangelink
Amaury Levé (Evangelink) deleted the test-assist/logging-manager-extension-validation-v8-d379547e7d69b258 branch May 13, 2026 14:13
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