Repository navigation
Fix - run CI tests on windows-latest as well as ubuntu - #265
Conversation
Windows is the primary platform, but CI only tested on ubuntu, so the Windows branches of PluginPathRules, PluginContentHash, SettingsStore and SapiVoice never ran in CI. Add a windows-latest matrix leg with fail-fast off so each OS reports independently. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pre-merge checks:
|
On a case-insensitive file system (the new windows-latest CI leg) the two names are one file, so the two trees ended up with different content (a.txt=5 vs A.txt=1) and FolderHash_IsDeterministic_AndIndependentOfCreationOrder failed. Use C.txt, which still sorts ahead of the lower-case names ordinally but never collides. PluginContentHash itself is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ASecondDetach_Joins_AndReturnsOnceTheFirstHasFinished failed on the new windows-latest leg after exactly 5 s with "no exception was thrown". Both detaches block pool threads, and with the pool starved the WaitAsync(200 ms) timeout callback could not run until the host's 5 s shutdown bound let the first detach finish; by then the second had completed, so the 'not done yet' assertion saw a finished task. Run both detaches on dedicated threads (LongRunning) and probe with SpinWait.SpinUntil, which needs no pool thread. Product code unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Run 3 on
Cause: Not fixing it yet because the test name and
Generated by Claude Code |
…uming it Attach_WhileAnOlderTeardownIsStillRunning_DoesNotWaitForIt_AndTheNewRuntimeIsStillTornDownOnExit failed on windows-latest at Assert.True(fresh.Returned.IsSet). ShutdownForExit(timeout) bounds the whole teardown, including the current runtime's, so with the 150 ms bound a slow runner can return before the fresh plugin's Shutdown has run. Exit staying strictly bounded is intended; the test now waits (up to the 30 s ceiling) for Shutdown to run. App code unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…assuming it ShutdownForExit_WhenAHandlerNeverReturns_GivesUpAtTheBound_AndReturnsFalse failed on windows-latest at Assert.Null(service.Runtime): the bounded call ran its teardown on a worker and returned after 150 ms before that worker had even cleared the runtime. Same treatment as the reattach exit test: wait (up to the ceiling) for the runtime to be cleared. Applied to the two other tests that assert Runtime is null straight after a 150 ms bounded Detach. App code unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Run 5 on
Not pushing a fix yet. The likely cause is the queue's own background retry loop ( Generated by Claude Code |
…s retry A_clear_for_a_closed_game_that_fails_is_queued_and_dropped_once_acknowledged failed on windows-latest: RetryPendingAsync returned 1 instead of 0. After the first clear fails, the service's pump retries it every 2x the interval (up to MaxPublishRetries). Each retry enqueues the entry again before sending, so when the test's manual RetryPendingAsync removes it, a concurrent pump retry can re-add it and the count catches it while that clear is still in flight. On a slower runner the pump is still retrying when the test gets there. The test is about the queue's own retry (as after an app restart), so dispose the service first. Product code unchanged: the transient entry during a direct clear is by design and settles on its own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
What & why
Before: CI built and tested only on
ubuntu-latest. The Windows release job builds the installer but runs no tests, so Windows-only code paths (PluginPathRules,PluginContentHash,SettingsStore,SapiVoice, the Windows branches in the plugin storage tests) never ran in CI, even though Windows is the primary platform.After: the
build-testjob runs on a matrix ofubuntu-latestandwindows-latest, so every PR and push to main builds and tests on both.fail-fast: falsekeeps both legs running so a failure on one OS doesn't cancel the other's result.Changes
.github/workflows/ci.yml: addstrategy.matrix.os: [ubuntu-latest, windows-latest]andfail-fast: false;runs-on: ${{ matrix.os }}. Steps unchanged.PluginContentBindingTests.FolderHash_IsDeterministic_AndIndependentOfCreationOrder: the first Windows run failed it (1 of ~2,830 tests). The test wrotea.txtandA.txtinto one folder, which is a single file on NTFS, so the two trees got different content. SwappedA.txtforC.txt.PluginContentHashitself is unchanged; this was a test-only assumption of a case-sensitive file system.PluginServiceLifecycleTests.ASecondDetach_Joins_AndReturnsOnceTheFirstHasFinished: passed on the first Windows run, failed on the second after exactly 5 s ("no exception was thrown"). Both detaches block pool threads; with the pool starved, theWaitAsync(200 ms)timeout callback couldn't run until the host's 5 s shutdown bound let the first detach finish, so the "not done yet" check saw a completed task. Now both detaches run on dedicated (LongRunning) threads and the probe isSpinWait.SpinUntil, which needs no pool thread.PluginServiceitself is unchanged.PluginServiceReattachTests.Attach_WhileAnOlderTeardownIsStillRunning_..._TornDownOnExit: failed on run 3 atAssert.True(fresh.Returned.IsSet).ShutdownForExit(timeout)bounds the whole teardown, including the current runtime's, so with a 150 ms bound a slow runner returns before the fresh plugin'sShutdownhas run. Exit staying strictly bounded is intended (decided on this PR), so the test now waits up to the 30 s ceiling forShutdowninstead of assuming it already ran.PluginServiceExitTests.ShutdownForExit_WhenAHandlerNeverReturns_...: failed on run 4 atAssert.Null(service.Runtime); the bounded call returned after 150 ms before its worker had cleared the runtime. It and the two other tests that assertRuntime is nullstraight after a 150 ms boundedDetach(Detach_WithABound_WhenAHandlerNeverReturns_..., the reattach stuck-teardown helper) now wait for it withSpinWait.SpinUntil(..., Ceiling).TwitchStreamCardServiceTests.A_clear_for_a_closed_game_that_fails_is_queued_and_dropped_once_acknowledged: failed on run 5 (RetryPendingAsyncreturned 1). The service's pump keeps retrying the failed clear and re-enqueues the entry before each send, so a concurrent pump retry could be mid-flight when the test counted. The test is about the queue's retry alone, so it now disposes the service first.EbsCleanupQueueand the service are unchanged.How it was verified
Heads-up
build-testtobuild-test (ubuntu-latest)andbuild-test (windows-latest). If branch protection requiresbuild-testby name, update the required checks before merging.Checklist
Generated by Claude Code