Reorganize EventLogExpert.Eventing folders, tighten API surface, and split unit/integration tests#516
Conversation
…ception> with specific assertions
…and explicit skips
There was a problem hiding this comment.
Pull request overview
Refactors EventLogExpert.Eventing into clearer functional folders (Interop/Models/Providers/Readers), reduces the public API surface to better match real consumers, and splits Eventing tests into separate unit vs. integration projects (with CI running them as distinct steps).
Changes:
- Moved/renamed interop + helper types (e.g.,
Interop→Win32ErrorCodes,EventMethods→NativeMethods) and relocated shared enums/models into targeted namespaces. - Tightened API visibility (internalizing/sealing types like
RegistryProvider,CompressedJsonValueConverter<T>, and parts ofEventMessageProvider), and movedInternalsVisibleToto the Eventing csproj. - Split integration tests into
EventLogExpert.Eventing.IntegrationTestsand updated the GitHub Actions workflow to run unit vs. integration tests separately.
Reviewed changes
Copilot reviewed 135 out of 138 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| src/EventLogExpert/Services/MauiMenuActionService.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert/Services/ClipboardService.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert/MauiProgram.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert/MainPage.xaml.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert/Components/Sections/SplitLogTabPane.razor.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert/Components/Sections/EventTable.razor.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert/Components/Sections/DetailsPane.razor.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert/Components/Layout/UnhandledExceptionHandler.razor.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert/App.xaml.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert/_Imports.razor | Update razor imports to new Eventing namespaces |
| src/EventLogExpert.UI/Store/LoggingMiddleware.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI/Store/FilterCache/FilterCacheReducers.cs | Formatting-only adjustment in reducer bodies |
| src/EventLogExpert.UI/Store/EventTable/EventTableReducers.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI/Store/EventLog/LiveLogWatcherService.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI/Store/EventLog/ILogReloadCoordinator.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI/Store/EventLog/EventLogReducers.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI/Store/EventLog/EventLogEffects.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI/Store/EventLog/EventLogAction.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI/Services/UpdateService.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI/Services/GitHubService.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI/Services/FilterCategoryItemsCache.cs | Update Eventing model import after folder/namespace reorg |
| src/EventLogExpert.UI/Services/DeploymentService.cs | Update Eventing namespace imports + minor formatting normalization |
| src/EventLogExpert.UI/Services/DebugLogService.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI/Services/DatabaseService.cs | Update Eventing namespace imports + minor formatting normalization |
| src/EventLogExpert.UI/Services/BannerService.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI/Services/ApplicationRestartService.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI/Models/EventTableModel.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI/Models/EventLogData.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI/LogNameMethods.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI.Tests/TestUtils/LoggerUtils.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI.Tests/TestUtils/EventUtils.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI.Tests/TestUtils/DatabaseSeedUtils.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI.Tests/Store/FilterPane/FilterPaneEffectsTests.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI.Tests/Store/EventTable/EventTableStoreTests.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI.Tests/Store/EventLog/EventLogStoreTests.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI.Tests/Store/EventLog/EventLogEffectsTests.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI.Tests/Services/UpdateServiceTests.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI.Tests/Services/GitHubServiceTests.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI.Tests/Services/FilterServiceTests.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI.Tests/Services/FilterCategoryItemsCacheTests.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI.Tests/Services/DeploymentServiceTests.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI.Tests/Services/DatabaseServiceTests.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI.Tests/Services/BannerServiceTests.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.UI.Tests/DateRangeDefaultsTests.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.slnx | Add new Eventing integration test project to the solution |
| src/EventLogExpert.Eventing/Readers/PathType.cs | New PathType enum in Readers namespace |
| src/EventLogExpert.Eventing/Readers/LogNames.cs | Move LogNames into Readers namespace |
| src/EventLogExpert.Eventing/Readers/EventLogWatcher.cs | Add per-subscriber exception isolation + callback-thread stop protection + interop renames |
| src/EventLogExpert.Eventing/Readers/EventLogSession.cs | Switch to NativeMethods and Win32ErrorCodes in interop layer |
| src/EventLogExpert.Eventing/Readers/EventLogReader.cs | Switch to NativeMethods and Win32ErrorCodes in interop layer |
| src/EventLogExpert.Eventing/Readers/EventLogInformation.cs | Fix invalid-handle error masking + add argument validation + interop renames |
| src/EventLogExpert.Eventing/Providers/RegistryProvider.cs | Internalize/seal provider + namespace updates |
| src/EventLogExpert.Eventing/Providers/ProviderMetadata.cs | Switch to NativeMethods/NativeErrorResolver + interop renames |
| src/EventLogExpert.Eventing/Providers/EventMessageProvider.cs | Internalize GetMessages + interop renames |
| src/EventLogExpert.Eventing/Properties/AssemblyInfo.cs | Remove AssemblyInfo-based InternalsVisibleTo (migrated to csproj) |
| src/EventLogExpert.Eventing/Models/SeverityLevel.cs | New SeverityLevel enum in Models namespace |
| src/EventLogExpert.Eventing/Models/Severity.cs | Move Severity into Models namespace (and split enum into separate file) |
| src/EventLogExpert.Eventing/Models/EventRecord.cs | Update imports after namespace moves |
| src/EventLogExpert.Eventing/Models/DisplayEventModel.cs | Update imports after namespace moves |
| src/EventLogExpert.Eventing/Logging/WarnLogHandler.cs | New warning-level interpolated string handler |
| src/EventLogExpert.Eventing/Logging/TraceLogHandler.cs | New trace-level interpolated string handler |
| src/EventLogExpert.Eventing/Logging/TraceLogger.cs | Move TraceLogger to Logging namespace |
| src/EventLogExpert.Eventing/Logging/LogHandlerCore.cs | New shared core for interpolated string handlers |
| src/EventLogExpert.Eventing/Logging/ITraceLogger.cs | Move ITraceLogger to Logging namespace |
| src/EventLogExpert.Eventing/Logging/InfoLogHandler.cs | New info-level interpolated string handler |
| src/EventLogExpert.Eventing/Logging/ErrorLogHandler.cs | New error-level interpolated string handler |
| src/EventLogExpert.Eventing/Logging/DebugLogHandler.cs | New debug-level interpolated string handler |
| src/EventLogExpert.Eventing/Logging/CriticalLogHandler.cs | New critical-level interpolated string handler |
| src/EventLogExpert.Eventing/Interop/Win32ErrorCodes.cs | Rename/move Win32 error constants container |
| src/EventLogExpert.Eventing/Interop/SystemTime.cs | Move SystemTime struct into Interop namespace |
| src/EventLogExpert.Eventing/Interop/NativeMethods.Evt.cs | Consolidate EVT P/Invoke and enums under Interop + rename EventMethods → NativeMethods |
| src/EventLogExpert.Eventing/Interop/NativeMethods.cs | Move remaining interop helpers under Interop + extract LoadLibraryFlags |
| src/EventLogExpert.Eventing/Interop/NativeErrorResolver.cs | Rename/move resolver to NativeErrorResolver under Interop |
| src/EventLogExpert.Eventing/Interop/MessageResourceBlock.cs | Move struct into Interop namespace |
| src/EventLogExpert.Eventing/Interop/LoadLibraryFlags.cs | New extracted LoadLibraryFlags enum file |
| src/EventLogExpert.Eventing/Interop/LibraryHandle.cs | Move LibraryHandle into Interop namespace |
| src/EventLogExpert.Eventing/Interop/HResultConverter.cs | Rename/move Converter → HResultConverter under Interop |
| src/EventLogExpert.Eventing/Interop/EvtVariant.cs | Move EvtVariant into Interop namespace |
| src/EventLogExpert.Eventing/Interop/EvtHandle.cs | Move EvtHandle into Interop namespace and use NativeMethods.EvtClose |
| src/EventLogExpert.Eventing/Interop/EvtEnums.cs | New file extracting EVT-related enums into Interop |
| src/EventLogExpert.Eventing/Helpers/TraceInterpolatedStringHandler.cs | Remove old combined interpolated string handler file (replaced by Logging/*) |
| src/EventLogExpert.Eventing/Helpers/ExtensionMethods.cs | Remove unused extension methods |
| src/EventLogExpert.Eventing/EventResolvers/EventXmlResolver.cs | Seal resolver + switch to injectable resolve strategy + interop renames |
| src/EventLogExpert.Eventing/EventResolvers/EventResolverBase.cs | Update interop/error resolver usage + formatting normalization |
| src/EventLogExpert.Eventing/EventResolvers/EventResolver.cs | Update logging namespace imports |
| src/EventLogExpert.Eventing/EventProviderDatabase/JsonValueConverter.cs | Remove unused converter |
| src/EventLogExpert.Eventing/EventProviderDatabase/EventProviderDbContext.cs | Update logging namespace imports + minor formatting normalization |
| src/EventLogExpert.Eventing/EventProviderDatabase/CompressedJsonValueConverter.cs | Internalize/seal converter type |
| src/EventLogExpert.Eventing/EventLogExpert.Eventing.csproj | Add InternalsVisibleTo entries for unit + integration test assemblies |
| src/EventLogExpert.Eventing.Tests/Readers/SmallEvtxFixture.cs | Remove fixture from unit tests (moved to integration tests) |
| src/EventLogExpert.Eventing.Tests/Readers/LogNamesTests.cs | Update namespaces to match Readers folder structure |
| src/EventLogExpert.Eventing.Tests/Providers/EventMessageProviderTests.cs | Trim unit tests to non-environmental cases + move integration behaviors out |
| src/EventLogExpert.Eventing.Tests/Interop/NativeMethodsTests.cs | Update namespaces to Interop structure |
| src/EventLogExpert.Eventing.Tests/Interop/NativeMethodsEvtTests.cs | Rename test class + update interop references |
| src/EventLogExpert.Eventing.Tests/Interop/NativeErrorResolverTests.cs | Rename/update tests for NativeErrorResolver |
| src/EventLogExpert.Eventing.Tests/EventResolvers/VersatileEventResolverTests.cs | Strengthen mixed-provider resolution coverage + convert provider loop to theory |
| src/EventLogExpert.Eventing.Tests/EventResolvers/LocalProviderEventResolverTests.cs | Update logging namespace imports |
| src/EventLogExpert.Eventing.Tests/EventResolvers/EventXmlResolverTests.cs | Switch from inheritance-based test doubles to strategy injection + adjust assertions |
| src/EventLogExpert.Eventing.Tests/EventResolvers/EventResolverCacheTests.cs | Minor formatting normalization |
| src/EventLogExpert.Eventing.Tests/EventResolvers/EventResolverBaseTests.cs | Update interop/logging imports + strengthen assertion determinism |
| src/EventLogExpert.Eventing.Tests/EventResolvers/EventProviderDatabaseEventResolverTests.cs | Update logging namespace imports |
| src/EventLogExpert.Eventing.Tests/EventProviderDatabase/EventProviderDbContextTests.cs | Update logging namespace imports + minor formatting normalization |
| src/EventLogExpert.Eventing.Tests/EventProviderDatabase/CompressedJsonValueConverterTests.cs | Tighten exception assertion to InvalidDataException |
| src/EventLogExpert.Eventing.IntegrationTests/Readers/SmallEvtxFixture.cs | New deterministic EVTX fixture for integration tests (exports bounded live-log window) |
| src/EventLogExpert.Eventing.IntegrationTests/Readers/EventLogSessionTests.cs | Move tests to integration project + tighten exception expectations |
| src/EventLogExpert.Eventing.IntegrationTests/Readers/EventLogReaderTests.cs | Replace vacuous live-log checks with deterministic fixture-backed assertions |
| src/EventLogExpert.Eventing.IntegrationTests/Readers/EventLogInformationTests.cs | Move tests to integration project + strengthen argument/exception coverage |
| src/EventLogExpert.Eventing.IntegrationTests/Providers/RegistryProviderTests.cs | Move tests to integration project + make probes deterministic/non-vacuous |
| src/EventLogExpert.Eventing.IntegrationTests/Providers/ProviderMetadataTests.cs | Move tests to integration project and trim vacuous assertions |
| src/EventLogExpert.Eventing.IntegrationTests/Providers/EventMessageProviderIntegrationTests.cs | New integration tests for environment-dependent EventMessageProvider behaviors |
| src/EventLogExpert.Eventing.IntegrationTests/GlobalUsings.cs | Add xUnit global using for integration project |
| src/EventLogExpert.Eventing.IntegrationTests/EventLogExpert.Eventing.IntegrationTests.csproj | New integration test project definition |
| src/EventLogExpert.EventDbTool/UpgradeDatabaseCommand.cs | Update logging namespace imports after folder/namespace reorg |
| src/EventLogExpert.EventDbTool/ShowCommand.cs | Update logging namespace imports after folder/namespace reorg |
| src/EventLogExpert.EventDbTool/RegexHelper.cs | Update logging namespace imports after folder/namespace reorg |
| src/EventLogExpert.EventDbTool/ProviderSource.cs | Update logging namespace imports after folder/namespace reorg |
| src/EventLogExpert.EventDbTool/Program.cs | Update logging namespace imports after folder/namespace reorg |
| src/EventLogExpert.EventDbTool/MtaProviderSource.cs | Update logging namespace imports after folder/namespace reorg |
| src/EventLogExpert.EventDbTool/MergeDatabaseCommand.cs | Update logging namespace imports after folder/namespace reorg |
| src/EventLogExpert.EventDbTool/DiffDatabaseCommand.cs | Update logging namespace imports after folder/namespace reorg |
| src/EventLogExpert.EventDbTool/DbToolCommand.cs | Update logging namespace imports after folder/namespace reorg |
| src/EventLogExpert.EventDbTool/CreateDatabaseCommand.cs | Update logging namespace imports after folder/namespace reorg |
| src/EventLogExpert.EventDbTool.Tests/UpgradeDatabaseCommandTests.cs | Update logging namespace imports after folder/namespace reorg |
| src/EventLogExpert.EventDbTool.Tests/ProviderSourceTests.cs | Update logging namespace imports after folder/namespace reorg |
| src/EventLogExpert.EventDbTool.Tests/MergeDatabaseCommandTests.cs | Update logging namespace imports after folder/namespace reorg |
| src/EventLogExpert.EventDbTool.Tests/DiffDatabaseCommandTests.cs | Update logging namespace imports after folder/namespace reorg |
| src/EventLogExpert.Components/Menu/MenuBar.razor.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.Components/Filters/SubFilterRow.razor.cs | Minor formatting-only adjustment |
| src/EventLogExpert.Components/Database/SettingsUpgradeProgressBanner.razor.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.Components/Database/DatabaseRecoveryHost.razor.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.Components/Database/DatabaseRecoveryDialog.razor.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.Components/BannerHost.razor.cs | Update Eventing namespace imports after folder/namespace reorg + minor formatting normalization |
| src/EventLogExpert.Components.Tests/Database/SettingsUpgradeProgressBannerTests.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.Components.Tests/Database/DatabaseRecoveryHostTests.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.Components.Tests/Database/DatabaseRecoveryDialogTests.cs | Update Eventing namespace imports after folder/namespace reorg |
| src/EventLogExpert.Components.Tests/BannerHostTests.cs | Update Eventing namespace imports after folder/namespace reorg |
| .github/workflows/PullRequest.yml | Split CI test execution into unit vs. integration steps |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
68f999f to
db702a6
Compare
|
Fixed by tightening the docs (option A) rather than the impl. Verified the early-return is the IDisposable.Dispose idempotency contract that callers rely on, so demoting it to "always throw from a handler" would force unnecessary coordination at every call site. Updated three XML docs in
Existing tests already cover both invariants independently ( Amended into commit |
db702a6 to
be201ac
Compare
|
Both findings addressed in commit Finding 1 —
|
|
Round 3 — addressed both XML-doc/impl mismatch findings by deleting the overstated wording rather than tightening the impl. The
Also did a global comment-discipline pass across the PR diff (10 files, -279 net lines) per AGENTS.md §3.1 hard cap of ≤ 12 words for inline comments and one-sentence cap for XML
|
…side lifecycle lock
|
Round 4 — addresses both new bot findings on top of 1. 2. The Subscribe→Dispose race during the unlocked drain is bounded by:
Verification:
|
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 135 out of 138 changed files in this pull request and generated 2 comments.
Comments suppressed due to low confidence (1)
src/EventLogExpert.Eventing/Interop/NativeMethods.Evt.cs:6
NativeMethods(Interop layer) now takes a dependency onEventLogExpert.Eventing.Readerssolely to usePathType. SincePathTypeis a Win32 interop flag used by P/Invoke signatures (EvtQuery,EvtOpenLog), keeping it in the Readers namespace couples Interop ↔ Readers and muddles the layering. Consider movingPathTypeintoEventLogExpert.Eventing.Interop(alongside the other EVT enums) and updating readers/consumers to reference it there.
…TP wait registration
|
Round 5 — addresses both new bot findings on top of 1. 2.
Result: only one thread ever runs The unlocked-drain race with concurrent
Verification:
|
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 135 out of 138 changed files in this pull request and generated no new comments.
Comments suppressed due to low confidence (1)
src/EventLogExpert.Eventing/Interop/NativeMethods.Evt.cs:682
ThrowEventLogExceptioncomputes a resolved Win32 message but discards it forUnauthorizedAccessException, which makes diagnostics much harder (and leavesmessageunused in these cases). Pass the resolved message intoUnauthorizedAccessException(and optionally include the error code) so callers get actionable context.
|
Round 6 — addresses the low-confidence reviewer note (16:31 PT) on top of
Verified that no test asserts on the empty message — both Build 0/0; format clean. |
|
Round-7 finalizer-path fix applied in 81c9daa. Problem: ~EventLogWatcher calls Dispose(false), but the original Dispose(bool disposing) only released the ThreadPool wait registration and the native EvtSubscribe handle when Fix: Added an explicit
Why no managed wait-handle disposal in the finalizer branch: Build 0/0; format clean; 58/58 EventLogWatcher tests pass. |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 135 out of 138 changed files in this pull request and generated 1 comment.
Comments suppressed due to low confidence (1)
src/EventLogExpert.Eventing.IntegrationTests/Providers/RegistryProviderTests.cs:19
RegistryProvider.GetMessageFilesForLegacyProvidertreats its argument as a provider/source subkey name under each EventLog channel (seeRegistryProvider.cswhere it doeslogSubKey?.OpenSubKey(providerName)). IncludingConstants.ApplicationLogName/Constants.SystemLogNameins_commonLegacyProviderNamesis therefore mixing log names with provider names and can makeFindAnyLegacyProviderFiles/Namefail or be host-dependent. Consider replacing these entries with stable legacy provider/source names (or skipping the test when none are found), and/or rename the array to reflect what it actually contains.
Stacked on #515 — base is
jschick/move-modals-to-componentsbecause PR-Eventing is the first slice of the 5-PR library reorganization series and #515's branch is the natural starting tree.Summary
PR1 of a 5-PR series (Eventing → UI → EventDbTool → Components → MAUI head). EventLogExpert.Eventing folder reorg, API tightening, and test project split. 138 files changed (+2,626 / −2,019). Same baseline test counts preserved end-to-end (1,872 passed + 1 env-skip).
Why now
EventLogExpert.Eventinghad grown aHelpers/catch-all folder mixing P/Invoke surface, enums, model types, and dead extension methods, with public-by-default visibility on types only consumed inside the assembly. The Tests project'sHelpers/similarly conflated unit-style tests with integration tests that touched real Windows event-log infrastructure (so unit runs were slower than they needed to be and CI signal was muddier when an environment-dependent test failed). This PR resolves both — folder structure now mirrors logical concerns (Interop / Models / Providers / Readers), public surface is reduced to genuine consumers, and integration tests live in a separate project so unit suites stay fast and environment failures stay localized.Changes
19 commits, organized bottom-up so each is independently reviewable and revertable. Producers move first, consumers track.
Folder reorganization (compile-preserving)
Interop/and renameInteropclass toWin32ErrorCodesfor clarity.NativeMethodspartials) toInterop/.Helpers/EventMethods.csinto Interop partials and extractLoadLibraryFlagsenum to its own file.PathTypeenum toReaders/namespace alongside its consumers.Helpers.ExtensionMethodsextension (zero call sites in any assembly).SeverityLevelandSeveritytoModels/namespace.Logging/andReaders/, draining theHelpers/folder completely.API tightening
EventLogExpert.Eventingsurface and sealEventXmlResolver. Per-symbol consumer-set verification; types and members with no cross-asm prod consumers demoted tointernal.RegistryProviderandCompressedJsonValueConverter<T>becomeinternal sealed.JsonValueConverter<T>deleted (was unused).EventXmlResolverstayspublic sealed(registered via DI inMauiProgram.cs).EventMessageProvider.GetMessagesstatic factory demoted tointernal static(only same-asmLoadProviderDetailsCoreplus friend-test consumers).InternalsVisibleToto csproj entries (replacesProperties/AssemblyInfo.csper repo convention). Two friends granted:EventLogExpert.Eventing.TestsandEventLogExpert.Eventing.IntegrationTests.Test project split + targeted improvements
Helpers/tests intoInterop/andReaders/mirroring the prod reorg.EventLogWatchertest sleeps with signals and cancellable delays — eliminatesThread.Sleepflakiness, makes intent explicit, drops total test runtime.EventLogInformationinvalid-handle check (SUT bug discovered during test rework —IsInvalidwas being checked AFTER first use) and replaceThrowsAny<Exception>with specific assertions.if (count > 0)partial-skip patterns that masked failures.EventLogExpert.Eventing.IntegrationTestsproject hosts the 232 tests that touch real Windows event-log infrastructure. ExistingEventing.Testskeeps the 389 fast unit tests. CI workflow updated to run both as separate steps for clearer failure signal.RegistryProviderintegration test probes — discovered SUT contract: helper treats inputs as PROVIDER names, not LOG names;ApplicationandSystemare log names that don't have anEventMessageFileof their own. Tests now probe known-legacy provider names instead, withAssert.Skipfor environment-optional cases (semicolon-split message files) and helpers (FindAnyLegacyProviderName,FindLegacyProviderWithSemicolonSplitFiles) for first-match registry scans.EventLogWatcherTests— Step 9 audit-catalog Categories C+D follow-through.[Theory]withInlineDataper provider, plus new mixed-DB-and-unknown-providers test that asserts seeded DB text appears for the DB-known provider and"No matching"appears for the unknown one.EventLogWatcher(SUT change + tests in one commit). MulticastEventRecordWrittennow invokes each handler in its own try/catch so a throwing handler can't starve the rest.Dispose(disposing=true)andEnabled = falsenow throwInvalidOperationExceptionif called from inside a callback (would otherwise deadlock); idempotentDisposefrom another thread post-disposal still succeeds. Public XML doc publishes the new contract. Cross-asmLiveLogWatcherServicealready wraps itsDisposeinTask.Runso the new throw path is unreachable from the only external consumer.Verification
dotnet build src/EventLogExpert.slnx— 0 warnings, 0 errorsdotnet test src/EventLogExpert.slnx— 1,872 / 1,873 pass, 1 env-skip (Eventing.Tests 389 / Eventing.IntegrationTests 232 + 1 env-skip / EventDbTool.Tests 19 / Components.Tests 144 / UI.Tests 1,088). Same total + same env-skip as the parent branch — pure refactor, no test additions or deletions net of the integration split.dotnet format whitespace --verify-no-changes src/EventLogExpert.slnx— cleandotnet format style --verify-no-changes src/EventLogExpert.slnx --diagnostics IDE0005 IDE0065— cleangit mv— history preserved (rename similarity ≥ 80% on every move).pre-pr-push.md. Audit produced 1 finding (EventMessageProvider.GetMessagespublic static→internal static); applied + amended into commit 7b29a46.Companion change (Azure DevOps release pipeline)
The release pipeline at
https://github-private.visualstudio.com/microsoft/_git/EventLogExpertneeds its build/test targets updated to mirror the new GH workflow split. Already pushed (commita3344b7on branchusers/jschick/eventing-integration-test-split); ADO PR creation must happen through the ADO web UI. Both PRs need to land before this branch can ship through the release pipeline.Stack note
This is PR1 of 5. Subsequent PRs (UI, EventDbTool, Components, MAUI head) are queued in
files/survey-0.mdbut will be opened one at a time as each parent merges, to avoid compounding rebase pain.