Uh oh!
There was an error while loading. Please reload this page.
[Test Improver] test: add unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension - #8126
Conversation
…ationHelper Add 10 tests for LoggingManager.BuildAsync covering: - AddProvider null validation - Empty provider list - Non-extension provider inclusion - Extension provider enabled/disabled filtering - InitializeAsync called only for enabled initializable providers - Correct LogLevel and IServiceProvider passed to factory - Multiple providers (all included or filtered correctly) Add 16 tests for ExtensionValidationHelper.ValidateUniqueExtension covering: - Null argument validation for both overloads - Empty existing collection (no throw) - Non-duplicate UID (no throw) - Duplicate UID throws InvalidOperationException - Error message contains UID - Case-sensitive UID comparison - Selector-based overload correctly uses selector Extend TestExtension with UidOverride property for configurable UIDs in tests. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Adds unit test coverage in Microsoft.Testing.Platform.UnitTests for two previously untested internal helpers: LoggingManager.BuildAsync (provider filtering/initialization and factory construction) and ExtensionValidationHelper.ValidateUniqueExtension (UID uniqueness enforcement during extension registration). This supports the platform’s reliability by locking down branching behavior around extension enablement and duplicate registration.
Changes:
- Added
LoggingManagerTestscovering provider factory argument passing, inclusion/exclusion of extension providers based onIsEnabledAsync, and conditionalInitializeAsyncexecution. - Added
ExtensionValidationHelperTestscovering null-guard behavior, duplicate UID detection (including message content), case-sensitivity, and selector-based overload behavior. - Extended
TestExtensionwithUidOverrideto simplify configuring unique/duplicate UIDs in tests.
Show a summary per file
| File | Description |
|---|---|
| test/UnitTests/Microsoft.Testing.Platform.UnitTests/Logging/LoggingManagerTests.cs | New unit tests for LoggingManager.BuildAsync provider filtering/initialization and factory wiring. |
| test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/TestExtension.cs | Adds UidOverride to allow configurable extension UIDs in unit tests while preserving the default UID. |
| test/UnitTests/Microsoft.Testing.Platform.UnitTests/Helpers/ExtensionValidationHelperTests.cs | New unit tests for ValidateUniqueExtension overloads, including null guards and duplicate UID behavior. |
Copilot's findings
- Files reviewed: 3/3 changed files
- Comments generated: 1
Uh oh!
There was an error while loading. Please reload this page.
Amaury Levé (Evangelink)
left a comment
There was a problem hiding this comment.
Summary
Workflow: PR Nitpick Reviewer 🔍
Date: 2026-05-11
Repository: microsoft/testfx
Good addition of unit tests for LoggingManager.BuildAsync and ExtensionValidationHelper.ValidateUniqueExtension. The test structure is clear and the naming convention follows the established MethodName_Condition_ExpectedResult pattern consistently. A few minor issues are flagged below.
Key Findings
Important — Dead mock setup (×2) (
LoggingManagerTests.cslines 125–126, 145–146): Two tests (BuildAsync_PassesCorrectLogLevelToFactory,BuildAsync_PassesServiceProviderToFactory) declaremockLoggerand wire upCreateLogger, but neither test ever invokesfactory.CreateLogger. The setup is noise that could mislead future readers.Minor — Asymmetric coverage (
ExtensionValidationHelperTests.cs~line 88):WithSelectortests cover case-sensitivity butSimpleOverloadtests do not. Since both overloads share the same comparison logic, adding a parallel test would ensure parity.Minor — Unconventional section dividers (
ExtensionValidationHelperTests.csline 13): The// ---- ... ----style banners are not used elsewhere in the test suite; a plain comment or no divider would be more consistent.
Recommendations
- Remove the unused
mockLoggervariable andCreateLoggermock setup from the two capture-focused tests. - Consider adding
ValidateUniqueExtension_SimpleOverload_UidIsCaseSensitive_DifferentCaseDoesNotThrow. - Replace the
// ---- ... ----dividers with a simpler comment style.
🔍 Meticulously inspected by PR Nitpick Reviewer
🔍 Meticulously inspected by PR Nitpick Reviewer 🔍
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Amaury Levé (Evangelink)
left a comment
There was a problem hiding this comment.
Summary
Workflow: Expert Code Reviewer 🧠
Date: 2026-05-11
Repository: microsoft/testfx
Key Findings
No issues found. Analysis covered:
Correctness: Tests accurately model
LoggingManager.BuildAsyncbehavior — extension check viaIExtension.IsEnabledAsync()is correctly bypassed for non-IExtensionproviders, and theIAsyncInitializableExtension+IExtensionseparation is properly exercised via the three composite interfaces.ExtensionValidationHelpertests correctly validate ordinal (case-sensitive) UID comparison and both overloads.Threading:
LoggerFactory.CreateLoggerusesIMonitor.Lockfor thread safety. The mock setup in the test constructor (_mockMonitor.Setup(m => m.Lock(...)).Returns(...)) correctly accounts for this.API Compat:
TestExtension.UidOverride(defaulting to"Uid") is a backward-compatible addition — all existing callers that relied onUidreturning"Uid"are unaffected.Resources:
ILoggerFactoryreturned byBuildAsyncis not disposed in tests, but this is an accepted pattern for test code with no real handles held.Cross-TFM: Test-only code. No TFM-specific APIs introduced.
Security / Defensive: No concerns in test helper code.
Positive Observations
- Good coverage of edge cases: null inputs, empty collections, enabled/disabled filtering, and the case-sensitivity contract.
- Composite interface definitions (
ILoggerProviderAndExtension,ILoggerProviderExtensionAndInitializable, etc.) are well-chosen to precisely test orthogonal code paths inBuildAsync. - Mock setups are explicit about
IsEnabledAsync()return values rather than relying on Moq defaults, making test intent clear.
Generated by Expert Code Reviewer
🧠 Reviewed by Expert Code Reviewer 🧠
Amaury Levé (Evangelink)
left a comment
There was a problem hiding this comment.
Summary
Workflow: Test Expert Reviewer 🧪
Date: 2026-05-11
Repository: microsoft/testfx
Key Findings
The tests are well-structured, isolated, and use appropriate assertion patterns (Assert.ThrowsExactly, Assert.AreEqual, Moq .Verify). No flakiness or isolation issues found. The findings are all coverage gaps:
Missing: enabled extension+initializable provider path (
LoggingManagerTests) — The test suite covers the disabled-extension+initializable case and the non-extension+initializable case, but not the enabled-extension+initializable case. This means a regression inTryInitializeAsync()being called for enabled extension providers would go undetected.Unclear scope of
BuildAsync_WithInitializableProvider_CallsInitializeAsync— The provider under test (ILoggerProviderAndInitializable) does not implementIExtensionand bypasses the extension-enablement check. The test name doesn't convey this; renaming toBuildAsync_WithNonExtensionInitializableProvider_CallsInitializeAsyncwould clarify the intent.Multiple-duplicate scenario untested (
ExtensionValidationHelperTests) — The production code collects all duplicates and formats their type names into the error message; all tests only set up a single pre-existing duplicate, leaving the multi-duplicate formatting path uncovered.Case-sensitivity not tested for
SimpleOverload— Minor consistency gap since it delegates to the generic overload, but symmetry in the test suite is useful documentation.
Recommendations
- Add a test for
BuildAsync_WithEnabledExtensionInitializableProvider_CallsInitializeAsyncusingILoggerProviderExtensionAndInitializablewithIsEnabledAsync()→true. - Consider renaming
BuildAsync_WithInitializableProvider_CallsInitializeAsyncto reflect it tests the non-extension variant. - Add a multi-duplicate test case to
ExtensionValidationHelperTests.
Generated by Test Expert Reviewer
🧪 Test quality reviewed by Test Expert Reviewer 🧪
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Amaury Levé (Evangelink)
commented
May 11, 2026
Copilot address review comments |
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Done in commit |
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Amaury Levé (Evangelink)
commented
May 11, 2026
Copilot resolve the merge conflicts in this pull request |
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Resolved in commit |
Amaury Levé (Evangelink)
commented
May 11, 2026
Copilot resolve the merge conflicts in this pull request |
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Resolved in commit |
Amaury Levé (Evangelink)
commented
May 11, 2026
Copilot fix the following build errors azure-pipelines test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type. azure-pipelines test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type.azure-pipelines test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(107,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type. azure-pipelines test\UnitTests\MSTestAdapter.PlatformServices.UnitTests\Services\DesktopTestSourceHostTests.cs(164,57): error CS8625: (NETCORE_ENGINEERING_TELEMETRY=Build) Cannot convert null literal to non-nullable reference type. |
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
... Fixed in commit |
Amaury Levé (Evangelink)
commented
May 12, 2026
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.
|
Amaury Levé (Evangelink)
commented
May 13, 2026
Copilot resolve the merge conflicts in this pull request |
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Resolved in commit |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.