[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
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 🔍
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 🧠
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 🧪
|
@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>
|
@copilot resolve the merge conflicts in this pull request |
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Resolved in commit |
|
@copilot resolve the merge conflicts in this pull request |
Co-authored-by: Evangelink <11340282+Evangelink@users.noreply.github.com>
Resolved in commit |
|
@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 |
|
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.
|
Uh oh!
There was an error while loading. Please reload this page.