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

Merged
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
test-assist/logging-manager-tests-fa2bb034a593d608
May 11, 2026
Merged

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

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member

Tests cover:

  • AddProvider(null) throws ArgumentNullException
  • BuildAsync with no providers returns a non-null factory
  • Non-extension provider is always included
  • IExtension provider with IsEnabledAsync()=true is included
  • IExtension provider with IsEnabledAsync()=false is excluded (not added to factory)
  • Non-extension IAsyncInitializableExtension provider has InitializeAsync() called and is included in the factory
  • Enabled IExtension + IAsyncInitializableExtension provider has InitializeAsync() called and is included in the factory
  • Disabled IExtension + IAsyncInitializableExtension provider does NOT have InitializeAsync() called
  • Factory is invoked with the correct LogLevel and IServiceProvider (parameterized across multiple log levels)

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

Tests cover:
- AddProvider(null) throws ArgumentNullException
- Non-extension provider is always included
- IExtension provider with IsEnabledAsync()=true is included
- IExtension provider with IsEnabledAsync()=false is excluded (not added to factory)
- IAsyncInitializableExtension provider has InitializeAsync() called
- Disabled extension provider does NOT have InitializeAsync() called
- Factory is invoked with the correct LogLevel and IServiceProvider
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:47

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 a focused unit-test suite for LoggingManager.BuildAsync (Microsoft.Testing.Platform logging pipeline) to validate provider registration, extension enablement filtering, async initialization behavior, and factory delegate inputs.

Changes:

  • Added unit tests validating AddProvider(null) throws and that providers are included/excluded based on IExtension.IsEnabledAsync().
  • Added unit tests validating IAsyncInitializableExtension.InitializeAsync() is invoked only for included providers.
  • Added a unit test validating the provider factory receives the expected LogLevel and IServiceProvider.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests covering LoggingManager.BuildAsync provider filtering, initialization, and factory argument passing.

Copilot's findings

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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

The new LoggingManagerTests are well-structured and cover the core scenarios cleanly. Three minor improvements stand out:

  1. Missing test (Important) — The enabled IExtension + IAsyncInitializableExtension combination isn't tested. The disabled path is covered, but the enabled path (which should call InitializeAsync()) has no corresponding test.

  2. Incomplete assertion (Minor)BuildAsync_WithInitializableProvider_CallsInitializeAsync verifies InitializeAsync() was invoked but doesn't verify the provider was included in the resulting factory. The other "include" tests check both; this one should too.

  3. Ambiguous test name (Minor)BuildAsync_WithInitializableProvider_CallsInitializeAsync doesn't communicate that the provider intentionally omits IExtension. This distinction is meaningful given the two code paths under test.

Positive Highlights

  • Consistent test structure and naming convention across all methods.
  • Good use of interface composition to isolate specific behavioural combinations (extension-only, initializable-only, both).
  • Internal test interfaces correctly follow the semicolon shorthand style (consistent with IDisposableLoggerProvider in LoggerFactoryTests.cs).
  • _mockMonitor setup in the constructor mirrors the pattern in LoggerFactoryTests.

Generated by PR Nitpick Reviewer 🔍

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Analysis

This PR adds a single new test file (LoggingManagerTests.cs) with 7 test methods covering LoggingManager.BuildAsync. I reviewed the tests against the production implementation in LoggingManager.cs and LoggerFactory.cs.

Verified Correctness

  • Null guard test: Correctly verifies that AddProvider(null!) throws ArgumentNullException — matches the production ?? throw new ArgumentNullException(...) guard.
  • Provider inclusion/exclusion: Tests for enabled/disabled IExtension providers correctly map to the if (serviceInstance is IExtension extension && !await extension.IsEnabledAsync()) branch in production.
  • Initialization ordering: BuildAsync_WithInitializableProvider_CallsInitializeAsync correctly verifies TryInitializeAsync calls InitializeAsync when the provider implements IAsyncInitializableExtension. The separate BuildAsync_WithDisabledExtensionProvider_DoesNotCallInitializeAsync correctly confirms the continue statement prevents initialization of disabled extensions.
  • Factory parameter forwarding: The capture-variable approach in BuildAsync_PassesLogLevelAndServiceProviderToFactory correctly exercises the factory(logLevel, serviceProvider) call site.
  • IMonitor mock setup: The _mockMonitor.Setup(m => m.Lock(...)).Returns(...) correctly satisfies LoggerFactory.CreateLogger's using (_monitor.Lock(_sync)) pattern.

Threading & Concurrency

Each MSTest test method gets a fresh LoggingManagerTests instance, so the readonly Mock<> fields are not shared between tests. No threading concerns.

API Compliance

All assertions use MSTest APIs (Assert.ThrowsExactly, Assert.AreEqual, Assert.AreSame) and Moq Verify() — compliant with the project's BannedSymbols.txt which bans AwesomeAssertions.

Key Findings

No issues found in any review category (correctness, threading, performance, API compat, cross-TFM, resources, security, defensive coding).


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. [Coverage] Missing test: enabled extension + initializable provider — The production code has a path where a provider implements both IExtension (enabled) and IAsyncInitializableExtension, causing InitializeAsync() to be called after the IsEnabledAsync()=true check. This path is not exercised. BuildAsync_WithInitializableProvider_CallsInitializeAsync (line 76) does not cover it because IInitializableLoggerProvider doesn't implement IExtension, so the is IExtension check is false and it takes a completely different branch. IExtensionAndInitializableLoggerProvider (line 131) exists but is only used in the disabled case.

What's Good

  • Isolation: Each test constructs a fresh LoggingManager; instance-level mocks are recreated per-test by MSTest's per-method instantiation — no shared mutable state.
  • Assertions: Moq Verify with Times.Once / Times.Never gives precise failure messages.
  • Factory capture pattern in BuildAsync_PassesLogLevelAndServiceProviderToFactory is clean and correctly verifies the parameters forwarded to the factory lambda.
  • Test interfaces declared at the bottom of the file are a neat way to compose the exact capability mix each test needs without boilerplate classes.

Recommendations

Add one test for the enabled+initializable extension case as described in the inline comment — the IExtensionAndInitializableLoggerProvider interface is already available at the bottom of the file.


Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comment

…ing enabled+initializable test
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved by merging origin/main into the branch. The conflict in LoggingManagerTests.cs was resolved by adopting the main branch's version (which was the authoritative merged version from #8124).

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

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

Merged
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
test-assist/logging-manager-tests-fa2bb034a593d608
May 11, 2026
Merged

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

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member

Tests cover:

  • AddProvider(null) throws ArgumentNullException
  • BuildAsync with no providers returns a non-null factory
  • Non-extension provider is always included
  • IExtension provider with IsEnabledAsync()=true is included
  • IExtension provider with IsEnabledAsync()=false is excluded (not added to factory)
  • Non-extension IAsyncInitializableExtension provider has InitializeAsync() called and is included in the factory
  • Enabled IExtension + IAsyncInitializableExtension provider has InitializeAsync() called and is included in the factory
  • Disabled IExtension + IAsyncInitializableExtension provider does NOT have InitializeAsync() called
  • Factory is invoked with the correct LogLevel and IServiceProvider (parameterized across multiple log levels)

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

Tests cover:
- AddProvider(null) throws ArgumentNullException
- Non-extension provider is always included
- IExtension provider with IsEnabledAsync()=true is included
- IExtension provider with IsEnabledAsync()=false is excluded (not added to factory)
- IAsyncInitializableExtension provider has InitializeAsync() called
- Disabled extension provider does NOT have InitializeAsync() called
- Factory is invoked with the correct LogLevel and IServiceProvider
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:47

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 a focused unit-test suite for LoggingManager.BuildAsync (Microsoft.Testing.Platform logging pipeline) to validate provider registration, extension enablement filtering, async initialization behavior, and factory delegate inputs.

Changes:

  • Added unit tests validating AddProvider(null) throws and that providers are included/excluded based on IExtension.IsEnabledAsync().
  • Added unit tests validating IAsyncInitializableExtension.InitializeAsync() is invoked only for included providers.
  • Added a unit test validating the provider factory receives the expected LogLevel and IServiceProvider.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests covering LoggingManager.BuildAsync provider filtering, initialization, and factory argument passing.

Copilot's findings

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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

The new LoggingManagerTests are well-structured and cover the core scenarios cleanly. Three minor improvements stand out:

  1. Missing test (Important) — The enabled IExtension + IAsyncInitializableExtension combination isn't tested. The disabled path is covered, but the enabled path (which should call InitializeAsync()) has no corresponding test.

  2. Incomplete assertion (Minor)BuildAsync_WithInitializableProvider_CallsInitializeAsync verifies InitializeAsync() was invoked but doesn't verify the provider was included in the resulting factory. The other "include" tests check both; this one should too.

  3. Ambiguous test name (Minor)BuildAsync_WithInitializableProvider_CallsInitializeAsync doesn't communicate that the provider intentionally omits IExtension. This distinction is meaningful given the two code paths under test.

Positive Highlights

  • Consistent test structure and naming convention across all methods.
  • Good use of interface composition to isolate specific behavioural combinations (extension-only, initializable-only, both).
  • Internal test interfaces correctly follow the semicolon shorthand style (consistent with IDisposableLoggerProvider in LoggerFactoryTests.cs).
  • _mockMonitor setup in the constructor mirrors the pattern in LoggerFactoryTests.

Generated by PR Nitpick Reviewer 🔍

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Analysis

This PR adds a single new test file (LoggingManagerTests.cs) with 7 test methods covering LoggingManager.BuildAsync. I reviewed the tests against the production implementation in LoggingManager.cs and LoggerFactory.cs.

Verified Correctness

  • Null guard test: Correctly verifies that AddProvider(null!) throws ArgumentNullException — matches the production ?? throw new ArgumentNullException(...) guard.
  • Provider inclusion/exclusion: Tests for enabled/disabled IExtension providers correctly map to the if (serviceInstance is IExtension extension && !await extension.IsEnabledAsync()) branch in production.
  • Initialization ordering: BuildAsync_WithInitializableProvider_CallsInitializeAsync correctly verifies TryInitializeAsync calls InitializeAsync when the provider implements IAsyncInitializableExtension. The separate BuildAsync_WithDisabledExtensionProvider_DoesNotCallInitializeAsync correctly confirms the continue statement prevents initialization of disabled extensions.
  • Factory parameter forwarding: The capture-variable approach in BuildAsync_PassesLogLevelAndServiceProviderToFactory correctly exercises the factory(logLevel, serviceProvider) call site.
  • IMonitor mock setup: The _mockMonitor.Setup(m => m.Lock(...)).Returns(...) correctly satisfies LoggerFactory.CreateLogger's using (_monitor.Lock(_sync)) pattern.

Threading & Concurrency

Each MSTest test method gets a fresh LoggingManagerTests instance, so the readonly Mock<> fields are not shared between tests. No threading concerns.

API Compliance

All assertions use MSTest APIs (Assert.ThrowsExactly, Assert.AreEqual, Assert.AreSame) and Moq Verify() — compliant with the project's BannedSymbols.txt which bans AwesomeAssertions.

Key Findings

No issues found in any review category (correctness, threading, performance, API compat, cross-TFM, resources, security, defensive coding).


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. [Coverage] Missing test: enabled extension + initializable provider — The production code has a path where a provider implements both IExtension (enabled) and IAsyncInitializableExtension, causing InitializeAsync() to be called after the IsEnabledAsync()=true check. This path is not exercised. BuildAsync_WithInitializableProvider_CallsInitializeAsync (line 76) does not cover it because IInitializableLoggerProvider doesn't implement IExtension, so the is IExtension check is false and it takes a completely different branch. IExtensionAndInitializableLoggerProvider (line 131) exists but is only used in the disabled case.

What's Good

  • Isolation: Each test constructs a fresh LoggingManager; instance-level mocks are recreated per-test by MSTest's per-method instantiation — no shared mutable state.
  • Assertions: Moq Verify with Times.Once / Times.Never gives precise failure messages.
  • Factory capture pattern in BuildAsync_PassesLogLevelAndServiceProviderToFactory is clean and correctly verifies the parameters forwarded to the factory lambda.
  • Test interfaces declared at the bottom of the file are a neat way to compose the exact capability mix each test needs without boilerplate classes.

Recommendations

Add one test for the enabled+initializable extension case as described in the inline comment — the IExtensionAndInitializableLoggerProvider interface is already available at the bottom of the file.


Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comment

…ing enabled+initializable test
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved by merging origin/main into the branch. The conflict in LoggingManagerTests.cs was resolved by adopting the main branch's version (which was the authoritative merged version from #8124).

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

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

Merged
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
test-assist/logging-manager-tests-fa2bb034a593d608
May 11, 2026
Merged

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

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member

Tests cover:

  • AddProvider(null) throws ArgumentNullException
  • BuildAsync with no providers returns a non-null factory
  • Non-extension provider is always included
  • IExtension provider with IsEnabledAsync()=true is included
  • IExtension provider with IsEnabledAsync()=false is excluded (not added to factory)
  • Non-extension IAsyncInitializableExtension provider has InitializeAsync() called and is included in the factory
  • Enabled IExtension + IAsyncInitializableExtension provider has InitializeAsync() called and is included in the factory
  • Disabled IExtension + IAsyncInitializableExtension provider does NOT have InitializeAsync() called
  • Factory is invoked with the correct LogLevel and IServiceProvider (parameterized across multiple log levels)

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

Tests cover:
- AddProvider(null) throws ArgumentNullException
- Non-extension provider is always included
- IExtension provider with IsEnabledAsync()=true is included
- IExtension provider with IsEnabledAsync()=false is excluded (not added to factory)
- IAsyncInitializableExtension provider has InitializeAsync() called
- Disabled extension provider does NOT have InitializeAsync() called
- Factory is invoked with the correct LogLevel and IServiceProvider
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:47

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 a focused unit-test suite for LoggingManager.BuildAsync (Microsoft.Testing.Platform logging pipeline) to validate provider registration, extension enablement filtering, async initialization behavior, and factory delegate inputs.

Changes:

  • Added unit tests validating AddProvider(null) throws and that providers are included/excluded based on IExtension.IsEnabledAsync().
  • Added unit tests validating IAsyncInitializableExtension.InitializeAsync() is invoked only for included providers.
  • Added a unit test validating the provider factory receives the expected LogLevel and IServiceProvider.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests covering LoggingManager.BuildAsync provider filtering, initialization, and factory argument passing.

Copilot's findings

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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

The new LoggingManagerTests are well-structured and cover the core scenarios cleanly. Three minor improvements stand out:

  1. Missing test (Important) — The enabled IExtension + IAsyncInitializableExtension combination isn't tested. The disabled path is covered, but the enabled path (which should call InitializeAsync()) has no corresponding test.

  2. Incomplete assertion (Minor)BuildAsync_WithInitializableProvider_CallsInitializeAsync verifies InitializeAsync() was invoked but doesn't verify the provider was included in the resulting factory. The other "include" tests check both; this one should too.

  3. Ambiguous test name (Minor)BuildAsync_WithInitializableProvider_CallsInitializeAsync doesn't communicate that the provider intentionally omits IExtension. This distinction is meaningful given the two code paths under test.

Positive Highlights

  • Consistent test structure and naming convention across all methods.
  • Good use of interface composition to isolate specific behavioural combinations (extension-only, initializable-only, both).
  • Internal test interfaces correctly follow the semicolon shorthand style (consistent with IDisposableLoggerProvider in LoggerFactoryTests.cs).
  • _mockMonitor setup in the constructor mirrors the pattern in LoggerFactoryTests.

Generated by PR Nitpick Reviewer 🔍

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Analysis

This PR adds a single new test file (LoggingManagerTests.cs) with 7 test methods covering LoggingManager.BuildAsync. I reviewed the tests against the production implementation in LoggingManager.cs and LoggerFactory.cs.

Verified Correctness

  • Null guard test: Correctly verifies that AddProvider(null!) throws ArgumentNullException — matches the production ?? throw new ArgumentNullException(...) guard.
  • Provider inclusion/exclusion: Tests for enabled/disabled IExtension providers correctly map to the if (serviceInstance is IExtension extension && !await extension.IsEnabledAsync()) branch in production.
  • Initialization ordering: BuildAsync_WithInitializableProvider_CallsInitializeAsync correctly verifies TryInitializeAsync calls InitializeAsync when the provider implements IAsyncInitializableExtension. The separate BuildAsync_WithDisabledExtensionProvider_DoesNotCallInitializeAsync correctly confirms the continue statement prevents initialization of disabled extensions.
  • Factory parameter forwarding: The capture-variable approach in BuildAsync_PassesLogLevelAndServiceProviderToFactory correctly exercises the factory(logLevel, serviceProvider) call site.
  • IMonitor mock setup: The _mockMonitor.Setup(m => m.Lock(...)).Returns(...) correctly satisfies LoggerFactory.CreateLogger's using (_monitor.Lock(_sync)) pattern.

Threading & Concurrency

Each MSTest test method gets a fresh LoggingManagerTests instance, so the readonly Mock<> fields are not shared between tests. No threading concerns.

API Compliance

All assertions use MSTest APIs (Assert.ThrowsExactly, Assert.AreEqual, Assert.AreSame) and Moq Verify() — compliant with the project's BannedSymbols.txt which bans AwesomeAssertions.

Key Findings

No issues found in any review category (correctness, threading, performance, API compat, cross-TFM, resources, security, defensive coding).


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. [Coverage] Missing test: enabled extension + initializable provider — The production code has a path where a provider implements both IExtension (enabled) and IAsyncInitializableExtension, causing InitializeAsync() to be called after the IsEnabledAsync()=true check. This path is not exercised. BuildAsync_WithInitializableProvider_CallsInitializeAsync (line 76) does not cover it because IInitializableLoggerProvider doesn't implement IExtension, so the is IExtension check is false and it takes a completely different branch. IExtensionAndInitializableLoggerProvider (line 131) exists but is only used in the disabled case.

What's Good

  • Isolation: Each test constructs a fresh LoggingManager; instance-level mocks are recreated per-test by MSTest's per-method instantiation — no shared mutable state.
  • Assertions: Moq Verify with Times.Once / Times.Never gives precise failure messages.
  • Factory capture pattern in BuildAsync_PassesLogLevelAndServiceProviderToFactory is clean and correctly verifies the parameters forwarded to the factory lambda.
  • Test interfaces declared at the bottom of the file are a neat way to compose the exact capability mix each test needs without boilerplate classes.

Recommendations

Add one test for the enabled+initializable extension case as described in the inline comment — the IExtensionAndInitializableLoggerProvider interface is already available at the bottom of the file.


Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comment

…ing enabled+initializable test
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved by merging origin/main into the branch. The conflict in LoggingManagerTests.cs was resolved by adopting the main branch's version (which was the authoritative merged version from #8124).

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

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

Merged
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
test-assist/logging-manager-tests-fa2bb034a593d608
May 11, 2026
Merged

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

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member

Tests cover:

  • AddProvider(null) throws ArgumentNullException
  • BuildAsync with no providers returns a non-null factory
  • Non-extension provider is always included
  • IExtension provider with IsEnabledAsync()=true is included
  • IExtension provider with IsEnabledAsync()=false is excluded (not added to factory)
  • Non-extension IAsyncInitializableExtension provider has InitializeAsync() called and is included in the factory
  • Enabled IExtension + IAsyncInitializableExtension provider has InitializeAsync() called and is included in the factory
  • Disabled IExtension + IAsyncInitializableExtension provider does NOT have InitializeAsync() called
  • Factory is invoked with the correct LogLevel and IServiceProvider (parameterized across multiple log levels)

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

Tests cover:
- AddProvider(null) throws ArgumentNullException
- Non-extension provider is always included
- IExtension provider with IsEnabledAsync()=true is included
- IExtension provider with IsEnabledAsync()=false is excluded (not added to factory)
- IAsyncInitializableExtension provider has InitializeAsync() called
- Disabled extension provider does NOT have InitializeAsync() called
- Factory is invoked with the correct LogLevel and IServiceProvider
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:47

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 a focused unit-test suite for LoggingManager.BuildAsync (Microsoft.Testing.Platform logging pipeline) to validate provider registration, extension enablement filtering, async initialization behavior, and factory delegate inputs.

Changes:

  • Added unit tests validating AddProvider(null) throws and that providers are included/excluded based on IExtension.IsEnabledAsync().
  • Added unit tests validating IAsyncInitializableExtension.InitializeAsync() is invoked only for included providers.
  • Added a unit test validating the provider factory receives the expected LogLevel and IServiceProvider.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests covering LoggingManager.BuildAsync provider filtering, initialization, and factory argument passing.

Copilot's findings

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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

The new LoggingManagerTests are well-structured and cover the core scenarios cleanly. Three minor improvements stand out:

  1. Missing test (Important) — The enabled IExtension + IAsyncInitializableExtension combination isn't tested. The disabled path is covered, but the enabled path (which should call InitializeAsync()) has no corresponding test.

  2. Incomplete assertion (Minor)BuildAsync_WithInitializableProvider_CallsInitializeAsync verifies InitializeAsync() was invoked but doesn't verify the provider was included in the resulting factory. The other "include" tests check both; this one should too.

  3. Ambiguous test name (Minor)BuildAsync_WithInitializableProvider_CallsInitializeAsync doesn't communicate that the provider intentionally omits IExtension. This distinction is meaningful given the two code paths under test.

Positive Highlights

  • Consistent test structure and naming convention across all methods.
  • Good use of interface composition to isolate specific behavioural combinations (extension-only, initializable-only, both).
  • Internal test interfaces correctly follow the semicolon shorthand style (consistent with IDisposableLoggerProvider in LoggerFactoryTests.cs).
  • _mockMonitor setup in the constructor mirrors the pattern in LoggerFactoryTests.

Generated by PR Nitpick Reviewer 🔍

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Analysis

This PR adds a single new test file (LoggingManagerTests.cs) with 7 test methods covering LoggingManager.BuildAsync. I reviewed the tests against the production implementation in LoggingManager.cs and LoggerFactory.cs.

Verified Correctness

  • Null guard test: Correctly verifies that AddProvider(null!) throws ArgumentNullException — matches the production ?? throw new ArgumentNullException(...) guard.
  • Provider inclusion/exclusion: Tests for enabled/disabled IExtension providers correctly map to the if (serviceInstance is IExtension extension && !await extension.IsEnabledAsync()) branch in production.
  • Initialization ordering: BuildAsync_WithInitializableProvider_CallsInitializeAsync correctly verifies TryInitializeAsync calls InitializeAsync when the provider implements IAsyncInitializableExtension. The separate BuildAsync_WithDisabledExtensionProvider_DoesNotCallInitializeAsync correctly confirms the continue statement prevents initialization of disabled extensions.
  • Factory parameter forwarding: The capture-variable approach in BuildAsync_PassesLogLevelAndServiceProviderToFactory correctly exercises the factory(logLevel, serviceProvider) call site.
  • IMonitor mock setup: The _mockMonitor.Setup(m => m.Lock(...)).Returns(...) correctly satisfies LoggerFactory.CreateLogger's using (_monitor.Lock(_sync)) pattern.

Threading & Concurrency

Each MSTest test method gets a fresh LoggingManagerTests instance, so the readonly Mock<> fields are not shared between tests. No threading concerns.

API Compliance

All assertions use MSTest APIs (Assert.ThrowsExactly, Assert.AreEqual, Assert.AreSame) and Moq Verify() — compliant with the project's BannedSymbols.txt which bans AwesomeAssertions.

Key Findings

No issues found in any review category (correctness, threading, performance, API compat, cross-TFM, resources, security, defensive coding).


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. [Coverage] Missing test: enabled extension + initializable provider — The production code has a path where a provider implements both IExtension (enabled) and IAsyncInitializableExtension, causing InitializeAsync() to be called after the IsEnabledAsync()=true check. This path is not exercised. BuildAsync_WithInitializableProvider_CallsInitializeAsync (line 76) does not cover it because IInitializableLoggerProvider doesn't implement IExtension, so the is IExtension check is false and it takes a completely different branch. IExtensionAndInitializableLoggerProvider (line 131) exists but is only used in the disabled case.

What's Good

  • Isolation: Each test constructs a fresh LoggingManager; instance-level mocks are recreated per-test by MSTest's per-method instantiation — no shared mutable state.
  • Assertions: Moq Verify with Times.Once / Times.Never gives precise failure messages.
  • Factory capture pattern in BuildAsync_PassesLogLevelAndServiceProviderToFactory is clean and correctly verifies the parameters forwarded to the factory lambda.
  • Test interfaces declared at the bottom of the file are a neat way to compose the exact capability mix each test needs without boilerplate classes.

Recommendations

Add one test for the enabled+initializable extension case as described in the inline comment — the IExtensionAndInitializableLoggerProvider interface is already available at the bottom of the file.


Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comment

…ing enabled+initializable test
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved by merging origin/main into the branch. The conflict in LoggingManagerTests.cs was resolved by adopting the main branch's version (which was the authoritative merged version from #8124).

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

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

Merged
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
test-assist/logging-manager-tests-fa2bb034a593d608
May 11, 2026
Merged

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

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member

Tests cover:

  • AddProvider(null) throws ArgumentNullException
  • BuildAsync with no providers returns a non-null factory
  • Non-extension provider is always included
  • IExtension provider with IsEnabledAsync()=true is included
  • IExtension provider with IsEnabledAsync()=false is excluded (not added to factory)
  • Non-extension IAsyncInitializableExtension provider has InitializeAsync() called and is included in the factory
  • Enabled IExtension + IAsyncInitializableExtension provider has InitializeAsync() called and is included in the factory
  • Disabled IExtension + IAsyncInitializableExtension provider does NOT have InitializeAsync() called
  • Factory is invoked with the correct LogLevel and IServiceProvider (parameterized across multiple log levels)

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

Tests cover:
- AddProvider(null) throws ArgumentNullException
- Non-extension provider is always included
- IExtension provider with IsEnabledAsync()=true is included
- IExtension provider with IsEnabledAsync()=false is excluded (not added to factory)
- IAsyncInitializableExtension provider has InitializeAsync() called
- Disabled extension provider does NOT have InitializeAsync() called
- Factory is invoked with the correct LogLevel and IServiceProvider
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:47

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 a focused unit-test suite for LoggingManager.BuildAsync (Microsoft.Testing.Platform logging pipeline) to validate provider registration, extension enablement filtering, async initialization behavior, and factory delegate inputs.

Changes:

  • Added unit tests validating AddProvider(null) throws and that providers are included/excluded based on IExtension.IsEnabledAsync().
  • Added unit tests validating IAsyncInitializableExtension.InitializeAsync() is invoked only for included providers.
  • Added a unit test validating the provider factory receives the expected LogLevel and IServiceProvider.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests covering LoggingManager.BuildAsync provider filtering, initialization, and factory argument passing.

Copilot's findings

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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

The new LoggingManagerTests are well-structured and cover the core scenarios cleanly. Three minor improvements stand out:

  1. Missing test (Important) — The enabled IExtension + IAsyncInitializableExtension combination isn't tested. The disabled path is covered, but the enabled path (which should call InitializeAsync()) has no corresponding test.

  2. Incomplete assertion (Minor)BuildAsync_WithInitializableProvider_CallsInitializeAsync verifies InitializeAsync() was invoked but doesn't verify the provider was included in the resulting factory. The other "include" tests check both; this one should too.

  3. Ambiguous test name (Minor)BuildAsync_WithInitializableProvider_CallsInitializeAsync doesn't communicate that the provider intentionally omits IExtension. This distinction is meaningful given the two code paths under test.

Positive Highlights

  • Consistent test structure and naming convention across all methods.
  • Good use of interface composition to isolate specific behavioural combinations (extension-only, initializable-only, both).
  • Internal test interfaces correctly follow the semicolon shorthand style (consistent with IDisposableLoggerProvider in LoggerFactoryTests.cs).
  • _mockMonitor setup in the constructor mirrors the pattern in LoggerFactoryTests.

Generated by PR Nitpick Reviewer 🔍

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Analysis

This PR adds a single new test file (LoggingManagerTests.cs) with 7 test methods covering LoggingManager.BuildAsync. I reviewed the tests against the production implementation in LoggingManager.cs and LoggerFactory.cs.

Verified Correctness

  • Null guard test: Correctly verifies that AddProvider(null!) throws ArgumentNullException — matches the production ?? throw new ArgumentNullException(...) guard.
  • Provider inclusion/exclusion: Tests for enabled/disabled IExtension providers correctly map to the if (serviceInstance is IExtension extension && !await extension.IsEnabledAsync()) branch in production.
  • Initialization ordering: BuildAsync_WithInitializableProvider_CallsInitializeAsync correctly verifies TryInitializeAsync calls InitializeAsync when the provider implements IAsyncInitializableExtension. The separate BuildAsync_WithDisabledExtensionProvider_DoesNotCallInitializeAsync correctly confirms the continue statement prevents initialization of disabled extensions.
  • Factory parameter forwarding: The capture-variable approach in BuildAsync_PassesLogLevelAndServiceProviderToFactory correctly exercises the factory(logLevel, serviceProvider) call site.
  • IMonitor mock setup: The _mockMonitor.Setup(m => m.Lock(...)).Returns(...) correctly satisfies LoggerFactory.CreateLogger's using (_monitor.Lock(_sync)) pattern.

Threading & Concurrency

Each MSTest test method gets a fresh LoggingManagerTests instance, so the readonly Mock<> fields are not shared between tests. No threading concerns.

API Compliance

All assertions use MSTest APIs (Assert.ThrowsExactly, Assert.AreEqual, Assert.AreSame) and Moq Verify() — compliant with the project's BannedSymbols.txt which bans AwesomeAssertions.

Key Findings

No issues found in any review category (correctness, threading, performance, API compat, cross-TFM, resources, security, defensive coding).


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. [Coverage] Missing test: enabled extension + initializable provider — The production code has a path where a provider implements both IExtension (enabled) and IAsyncInitializableExtension, causing InitializeAsync() to be called after the IsEnabledAsync()=true check. This path is not exercised. BuildAsync_WithInitializableProvider_CallsInitializeAsync (line 76) does not cover it because IInitializableLoggerProvider doesn't implement IExtension, so the is IExtension check is false and it takes a completely different branch. IExtensionAndInitializableLoggerProvider (line 131) exists but is only used in the disabled case.

What's Good

  • Isolation: Each test constructs a fresh LoggingManager; instance-level mocks are recreated per-test by MSTest's per-method instantiation — no shared mutable state.
  • Assertions: Moq Verify with Times.Once / Times.Never gives precise failure messages.
  • Factory capture pattern in BuildAsync_PassesLogLevelAndServiceProviderToFactory is clean and correctly verifies the parameters forwarded to the factory lambda.
  • Test interfaces declared at the bottom of the file are a neat way to compose the exact capability mix each test needs without boilerplate classes.

Recommendations

Add one test for the enabled+initializable extension case as described in the inline comment — the IExtensionAndInitializableLoggerProvider interface is already available at the bottom of the file.


Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comment

…ing enabled+initializable test
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved by merging origin/main into the branch. The conflict in LoggingManagerTests.cs was resolved by adopting the main branch's version (which was the authoritative merged version from #8124).

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

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

Merged
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
test-assist/logging-manager-tests-fa2bb034a593d608
May 11, 2026
Merged

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

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member

Tests cover:

  • AddProvider(null) throws ArgumentNullException
  • BuildAsync with no providers returns a non-null factory
  • Non-extension provider is always included
  • IExtension provider with IsEnabledAsync()=true is included
  • IExtension provider with IsEnabledAsync()=false is excluded (not added to factory)
  • Non-extension IAsyncInitializableExtension provider has InitializeAsync() called and is included in the factory
  • Enabled IExtension + IAsyncInitializableExtension provider has InitializeAsync() called and is included in the factory
  • Disabled IExtension + IAsyncInitializableExtension provider does NOT have InitializeAsync() called
  • Factory is invoked with the correct LogLevel and IServiceProvider (parameterized across multiple log levels)

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

Tests cover:
- AddProvider(null) throws ArgumentNullException
- Non-extension provider is always included
- IExtension provider with IsEnabledAsync()=true is included
- IExtension provider with IsEnabledAsync()=false is excluded (not added to factory)
- IAsyncInitializableExtension provider has InitializeAsync() called
- Disabled extension provider does NOT have InitializeAsync() called
- Factory is invoked with the correct LogLevel and IServiceProvider
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:47

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 a focused unit-test suite for LoggingManager.BuildAsync (Microsoft.Testing.Platform logging pipeline) to validate provider registration, extension enablement filtering, async initialization behavior, and factory delegate inputs.

Changes:

  • Added unit tests validating AddProvider(null) throws and that providers are included/excluded based on IExtension.IsEnabledAsync().
  • Added unit tests validating IAsyncInitializableExtension.InitializeAsync() is invoked only for included providers.
  • Added a unit test validating the provider factory receives the expected LogLevel and IServiceProvider.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests covering LoggingManager.BuildAsync provider filtering, initialization, and factory argument passing.

Copilot's findings

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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

The new LoggingManagerTests are well-structured and cover the core scenarios cleanly. Three minor improvements stand out:

  1. Missing test (Important) — The enabled IExtension + IAsyncInitializableExtension combination isn't tested. The disabled path is covered, but the enabled path (which should call InitializeAsync()) has no corresponding test.

  2. Incomplete assertion (Minor)BuildAsync_WithInitializableProvider_CallsInitializeAsync verifies InitializeAsync() was invoked but doesn't verify the provider was included in the resulting factory. The other "include" tests check both; this one should too.

  3. Ambiguous test name (Minor)BuildAsync_WithInitializableProvider_CallsInitializeAsync doesn't communicate that the provider intentionally omits IExtension. This distinction is meaningful given the two code paths under test.

Positive Highlights

  • Consistent test structure and naming convention across all methods.
  • Good use of interface composition to isolate specific behavioural combinations (extension-only, initializable-only, both).
  • Internal test interfaces correctly follow the semicolon shorthand style (consistent with IDisposableLoggerProvider in LoggerFactoryTests.cs).
  • _mockMonitor setup in the constructor mirrors the pattern in LoggerFactoryTests.

Generated by PR Nitpick Reviewer 🔍

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Analysis

This PR adds a single new test file (LoggingManagerTests.cs) with 7 test methods covering LoggingManager.BuildAsync. I reviewed the tests against the production implementation in LoggingManager.cs and LoggerFactory.cs.

Verified Correctness

  • Null guard test: Correctly verifies that AddProvider(null!) throws ArgumentNullException — matches the production ?? throw new ArgumentNullException(...) guard.
  • Provider inclusion/exclusion: Tests for enabled/disabled IExtension providers correctly map to the if (serviceInstance is IExtension extension && !await extension.IsEnabledAsync()) branch in production.
  • Initialization ordering: BuildAsync_WithInitializableProvider_CallsInitializeAsync correctly verifies TryInitializeAsync calls InitializeAsync when the provider implements IAsyncInitializableExtension. The separate BuildAsync_WithDisabledExtensionProvider_DoesNotCallInitializeAsync correctly confirms the continue statement prevents initialization of disabled extensions.
  • Factory parameter forwarding: The capture-variable approach in BuildAsync_PassesLogLevelAndServiceProviderToFactory correctly exercises the factory(logLevel, serviceProvider) call site.
  • IMonitor mock setup: The _mockMonitor.Setup(m => m.Lock(...)).Returns(...) correctly satisfies LoggerFactory.CreateLogger's using (_monitor.Lock(_sync)) pattern.

Threading & Concurrency

Each MSTest test method gets a fresh LoggingManagerTests instance, so the readonly Mock<> fields are not shared between tests. No threading concerns.

API Compliance

All assertions use MSTest APIs (Assert.ThrowsExactly, Assert.AreEqual, Assert.AreSame) and Moq Verify() — compliant with the project's BannedSymbols.txt which bans AwesomeAssertions.

Key Findings

No issues found in any review category (correctness, threading, performance, API compat, cross-TFM, resources, security, defensive coding).


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. [Coverage] Missing test: enabled extension + initializable provider — The production code has a path where a provider implements both IExtension (enabled) and IAsyncInitializableExtension, causing InitializeAsync() to be called after the IsEnabledAsync()=true check. This path is not exercised. BuildAsync_WithInitializableProvider_CallsInitializeAsync (line 76) does not cover it because IInitializableLoggerProvider doesn't implement IExtension, so the is IExtension check is false and it takes a completely different branch. IExtensionAndInitializableLoggerProvider (line 131) exists but is only used in the disabled case.

What's Good

  • Isolation: Each test constructs a fresh LoggingManager; instance-level mocks are recreated per-test by MSTest's per-method instantiation — no shared mutable state.
  • Assertions: Moq Verify with Times.Once / Times.Never gives precise failure messages.
  • Factory capture pattern in BuildAsync_PassesLogLevelAndServiceProviderToFactory is clean and correctly verifies the parameters forwarded to the factory lambda.
  • Test interfaces declared at the bottom of the file are a neat way to compose the exact capability mix each test needs without boilerplate classes.

Recommendations

Add one test for the enabled+initializable extension case as described in the inline comment — the IExtensionAndInitializableLoggerProvider interface is already available at the bottom of the file.


Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comment

…ing enabled+initializable test
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved by merging origin/main into the branch. The conflict in LoggingManagerTests.cs was resolved by adopting the main branch's version (which was the authoritative merged version from #8124).

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

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

Merged
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
test-assist/logging-manager-tests-fa2bb034a593d608
May 11, 2026
Merged

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

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member

Tests cover:

  • AddProvider(null) throws ArgumentNullException
  • BuildAsync with no providers returns a non-null factory
  • Non-extension provider is always included
  • IExtension provider with IsEnabledAsync()=true is included
  • IExtension provider with IsEnabledAsync()=false is excluded (not added to factory)
  • Non-extension IAsyncInitializableExtension provider has InitializeAsync() called and is included in the factory
  • Enabled IExtension + IAsyncInitializableExtension provider has InitializeAsync() called and is included in the factory
  • Disabled IExtension + IAsyncInitializableExtension provider does NOT have InitializeAsync() called
  • Factory is invoked with the correct LogLevel and IServiceProvider (parameterized across multiple log levels)

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

Tests cover:
- AddProvider(null) throws ArgumentNullException
- Non-extension provider is always included
- IExtension provider with IsEnabledAsync()=true is included
- IExtension provider with IsEnabledAsync()=false is excluded (not added to factory)
- IAsyncInitializableExtension provider has InitializeAsync() called
- Disabled extension provider does NOT have InitializeAsync() called
- Factory is invoked with the correct LogLevel and IServiceProvider
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:47

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 a focused unit-test suite for LoggingManager.BuildAsync (Microsoft.Testing.Platform logging pipeline) to validate provider registration, extension enablement filtering, async initialization behavior, and factory delegate inputs.

Changes:

  • Added unit tests validating AddProvider(null) throws and that providers are included/excluded based on IExtension.IsEnabledAsync().
  • Added unit tests validating IAsyncInitializableExtension.InitializeAsync() is invoked only for included providers.
  • Added a unit test validating the provider factory receives the expected LogLevel and IServiceProvider.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests covering LoggingManager.BuildAsync provider filtering, initialization, and factory argument passing.

Copilot's findings

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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

The new LoggingManagerTests are well-structured and cover the core scenarios cleanly. Three minor improvements stand out:

  1. Missing test (Important) — The enabled IExtension + IAsyncInitializableExtension combination isn't tested. The disabled path is covered, but the enabled path (which should call InitializeAsync()) has no corresponding test.

  2. Incomplete assertion (Minor)BuildAsync_WithInitializableProvider_CallsInitializeAsync verifies InitializeAsync() was invoked but doesn't verify the provider was included in the resulting factory. The other "include" tests check both; this one should too.

  3. Ambiguous test name (Minor)BuildAsync_WithInitializableProvider_CallsInitializeAsync doesn't communicate that the provider intentionally omits IExtension. This distinction is meaningful given the two code paths under test.

Positive Highlights

  • Consistent test structure and naming convention across all methods.
  • Good use of interface composition to isolate specific behavioural combinations (extension-only, initializable-only, both).
  • Internal test interfaces correctly follow the semicolon shorthand style (consistent with IDisposableLoggerProvider in LoggerFactoryTests.cs).
  • _mockMonitor setup in the constructor mirrors the pattern in LoggerFactoryTests.

Generated by PR Nitpick Reviewer 🔍

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Analysis

This PR adds a single new test file (LoggingManagerTests.cs) with 7 test methods covering LoggingManager.BuildAsync. I reviewed the tests against the production implementation in LoggingManager.cs and LoggerFactory.cs.

Verified Correctness

  • Null guard test: Correctly verifies that AddProvider(null!) throws ArgumentNullException — matches the production ?? throw new ArgumentNullException(...) guard.
  • Provider inclusion/exclusion: Tests for enabled/disabled IExtension providers correctly map to the if (serviceInstance is IExtension extension && !await extension.IsEnabledAsync()) branch in production.
  • Initialization ordering: BuildAsync_WithInitializableProvider_CallsInitializeAsync correctly verifies TryInitializeAsync calls InitializeAsync when the provider implements IAsyncInitializableExtension. The separate BuildAsync_WithDisabledExtensionProvider_DoesNotCallInitializeAsync correctly confirms the continue statement prevents initialization of disabled extensions.
  • Factory parameter forwarding: The capture-variable approach in BuildAsync_PassesLogLevelAndServiceProviderToFactory correctly exercises the factory(logLevel, serviceProvider) call site.
  • IMonitor mock setup: The _mockMonitor.Setup(m => m.Lock(...)).Returns(...) correctly satisfies LoggerFactory.CreateLogger's using (_monitor.Lock(_sync)) pattern.

Threading & Concurrency

Each MSTest test method gets a fresh LoggingManagerTests instance, so the readonly Mock<> fields are not shared between tests. No threading concerns.

API Compliance

All assertions use MSTest APIs (Assert.ThrowsExactly, Assert.AreEqual, Assert.AreSame) and Moq Verify() — compliant with the project's BannedSymbols.txt which bans AwesomeAssertions.

Key Findings

No issues found in any review category (correctness, threading, performance, API compat, cross-TFM, resources, security, defensive coding).


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. [Coverage] Missing test: enabled extension + initializable provider — The production code has a path where a provider implements both IExtension (enabled) and IAsyncInitializableExtension, causing InitializeAsync() to be called after the IsEnabledAsync()=true check. This path is not exercised. BuildAsync_WithInitializableProvider_CallsInitializeAsync (line 76) does not cover it because IInitializableLoggerProvider doesn't implement IExtension, so the is IExtension check is false and it takes a completely different branch. IExtensionAndInitializableLoggerProvider (line 131) exists but is only used in the disabled case.

What's Good

  • Isolation: Each test constructs a fresh LoggingManager; instance-level mocks are recreated per-test by MSTest's per-method instantiation — no shared mutable state.
  • Assertions: Moq Verify with Times.Once / Times.Never gives precise failure messages.
  • Factory capture pattern in BuildAsync_PassesLogLevelAndServiceProviderToFactory is clean and correctly verifies the parameters forwarded to the factory lambda.
  • Test interfaces declared at the bottom of the file are a neat way to compose the exact capability mix each test needs without boilerplate classes.

Recommendations

Add one test for the enabled+initializable extension case as described in the inline comment — the IExtensionAndInitializableLoggerProvider interface is already available at the bottom of the file.


Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comment

…ing enabled+initializable test
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved by merging origin/main into the branch. The conflict in LoggingManagerTests.cs was resolved by adopting the main branch's version (which was the authoritative merged version from #8124).

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

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

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

Merged
Amaury Levé (Evangelink) merged 3 commits into
mainfrom
test-assist/logging-manager-tests-fa2bb034a593d608
May 11, 2026
Merged

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

Conversation

@Evangelink

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

Copy link
Copy Markdown
Member

Tests cover:

  • AddProvider(null) throws ArgumentNullException
  • BuildAsync with no providers returns a non-null factory
  • Non-extension provider is always included
  • IExtension provider with IsEnabledAsync()=true is included
  • IExtension provider with IsEnabledAsync()=false is excluded (not added to factory)
  • Non-extension IAsyncInitializableExtension provider has InitializeAsync() called and is included in the factory
  • Enabled IExtension + IAsyncInitializableExtension provider has InitializeAsync() called and is included in the factory
  • Disabled IExtension + IAsyncInitializableExtension provider does NOT have InitializeAsync() called
  • Factory is invoked with the correct LogLevel and IServiceProvider (parameterized across multiple log levels)

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

Tests cover:
- AddProvider(null) throws ArgumentNullException
- Non-extension provider is always included
- IExtension provider with IsEnabledAsync()=true is included
- IExtension provider with IsEnabledAsync()=false is excluded (not added to factory)
- IAsyncInitializableExtension provider has InitializeAsync() called
- Disabled extension provider does NOT have InitializeAsync() called
- Factory is invoked with the correct LogLevel and IServiceProvider
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings May 11, 2026 14:47

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 a focused unit-test suite for LoggingManager.BuildAsync (Microsoft.Testing.Platform logging pipeline) to validate provider registration, extension enablement filtering, async initialization behavior, and factory delegate inputs.

Changes:

  • Added unit tests validating AddProvider(null) throws and that providers are included/excluded based on IExtension.IsEnabledAsync().
  • Added unit tests validating IAsyncInitializableExtension.InitializeAsync() is invoked only for included providers.
  • Added a unit test validating the provider factory receives the expected LogLevel and IServiceProvider.
Show a summary per file
FileDescription
test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.csNew unit tests covering LoggingManager.BuildAsync provider filtering, initialization, and factory argument passing.

Copilot's findings

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

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Key Findings

The new LoggingManagerTests are well-structured and cover the core scenarios cleanly. Three minor improvements stand out:

  1. Missing test (Important) — The enabled IExtension + IAsyncInitializableExtension combination isn't tested. The disabled path is covered, but the enabled path (which should call InitializeAsync()) has no corresponding test.

  2. Incomplete assertion (Minor)BuildAsync_WithInitializableProvider_CallsInitializeAsync verifies InitializeAsync() was invoked but doesn't verify the provider was included in the resulting factory. The other "include" tests check both; this one should too.

  3. Ambiguous test name (Minor)BuildAsync_WithInitializableProvider_CallsInitializeAsync doesn't communicate that the provider intentionally omits IExtension. This distinction is meaningful given the two code paths under test.

Positive Highlights

  • Consistent test structure and naming convention across all methods.
  • Good use of interface composition to isolate specific behavioural combinations (extension-only, initializable-only, both).
  • Internal test interfaces correctly follow the semicolon shorthand style (consistent with IDisposableLoggerProvider in LoggerFactoryTests.cs).
  • _mockMonitor setup in the constructor mirrors the pattern in LoggerFactoryTests.

Generated by PR Nitpick Reviewer 🔍

🔍 Meticulously inspected by PR Nitpick Reviewer 🔍

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

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

Summary

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

Analysis

This PR adds a single new test file (LoggingManagerTests.cs) with 7 test methods covering LoggingManager.BuildAsync. I reviewed the tests against the production implementation in LoggingManager.cs and LoggerFactory.cs.

Verified Correctness

  • Null guard test: Correctly verifies that AddProvider(null!) throws ArgumentNullException — matches the production ?? throw new ArgumentNullException(...) guard.
  • Provider inclusion/exclusion: Tests for enabled/disabled IExtension providers correctly map to the if (serviceInstance is IExtension extension && !await extension.IsEnabledAsync()) branch in production.
  • Initialization ordering: BuildAsync_WithInitializableProvider_CallsInitializeAsync correctly verifies TryInitializeAsync calls InitializeAsync when the provider implements IAsyncInitializableExtension. The separate BuildAsync_WithDisabledExtensionProvider_DoesNotCallInitializeAsync correctly confirms the continue statement prevents initialization of disabled extensions.
  • Factory parameter forwarding: The capture-variable approach in BuildAsync_PassesLogLevelAndServiceProviderToFactory correctly exercises the factory(logLevel, serviceProvider) call site.
  • IMonitor mock setup: The _mockMonitor.Setup(m => m.Lock(...)).Returns(...) correctly satisfies LoggerFactory.CreateLogger's using (_monitor.Lock(_sync)) pattern.

Threading & Concurrency

Each MSTest test method gets a fresh LoggingManagerTests instance, so the readonly Mock<> fields are not shared between tests. No threading concerns.

API Compliance

All assertions use MSTest APIs (Assert.ThrowsExactly, Assert.AreEqual, Assert.AreSame) and Moq Verify() — compliant with the project's BannedSymbols.txt which bans AwesomeAssertions.

Key Findings

No issues found in any review category (correctness, threading, performance, API compat, cross-TFM, resources, security, defensive coding).


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. [Coverage] Missing test: enabled extension + initializable provider — The production code has a path where a provider implements both IExtension (enabled) and IAsyncInitializableExtension, causing InitializeAsync() to be called after the IsEnabledAsync()=true check. This path is not exercised. BuildAsync_WithInitializableProvider_CallsInitializeAsync (line 76) does not cover it because IInitializableLoggerProvider doesn't implement IExtension, so the is IExtension check is false and it takes a completely different branch. IExtensionAndInitializableLoggerProvider (line 131) exists but is only used in the disabled case.

What's Good

  • Isolation: Each test constructs a fresh LoggingManager; instance-level mocks are recreated per-test by MSTest's per-method instantiation — no shared mutable state.
  • Assertions: Moq Verify with Times.Once / Times.Never gives precise failure messages.
  • Factory capture pattern in BuildAsync_PassesLogLevelAndServiceProviderToFactory is clean and correctly verifies the parameters forwarded to the factory lambda.
  • Test interfaces declared at the bottom of the file are a neat way to compose the exact capability mix each test needs without boilerplate classes.

Recommendations

Add one test for the enabled+initializable extension case as described in the inline comment — the IExtensionAndInitializableLoggerProvider interface is already available at the bottom of the file.


Generated by Test Expert Reviewer

🧪 Test quality reviewed by Test Expert Reviewer 🧪

@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot address review comment

…ing enabled+initializable test
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
@Evangelink

Copy link
Copy Markdown
MemberAuthor

Copilot resolve the merge conflicts in this pull request

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

CopilotAI commented May 11, 2026

Copy link
Copy Markdown
Contributor

Copilot resolve the merge conflicts in this pull request

Resolved by merging origin/main into the branch. The conflict in LoggingManagerTests.cs was resolved by adopting the main branch's version (which was the authoritative merged version from #8124).

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