Skip to content

fix(test): full de-flake sweep — parallel-starvation deadline-polls → deterministic joins#1319

Merged
mauricecarrier7 merged 16 commits into
developfrom
fix/deflake-full-sweep
Jul 21, 2026
Merged

fix(test): full de-flake sweep — parallel-starvation deadline-polls → deterministic joins#1319
mauricecarrier7 merged 16 commits into
developfrom
fix/deflake-full-sweep

Conversation

@mauricecarrier7

Copy link
Copy Markdown
Contributor

What

Swarm de-flake of the parallel-only starvation-timeout flakes across the whole PalaceTests tree. Every test that waited for a fire-and-forget async op on a FIXED WALL-CLOCK DEADLINE (awaitCondition/fulfillment(of:timeout:)/wait(for:timeout:)/Task.sleep loop/Timer/RunLoop poll) — which starves under CI's 2-clone oversubscription and hits the 120s executionTimeAllowance — is converted to a DETERMINISTIC JOIN of the actual work unit (retained-Task handle / serial-queue barrier / withTaskGroup / mock continuation seam / main-actor drain).

Coverage (6 swarm batches + #1315's skipped joins)

Catalog, Audiobook, Network/SignIn, Reader, MyBooks, Accounts/Platform. Supersedes PR #1315 (folded in its SignOut/MultiLibrary joins that the swarm skipped; kept the mybooks Borrow-slice fix).

Guarantees

  • No XCTSkip, no raised executionTimeAllowance, no loosened/removed assertions, no disabled parallelism — every assertion preserved.
  • Production changes are minimal behavior-identical test-join seams (retained Task handles, gated/defaulted so prod is unchanged), spread across CatalogRepository, CatalogViewModel, AppLaunchTracker, AppHealthViewModel, TPPLastReadPositionPoster, TPPReaderTOCBusinessLogic, TypographyService, AudiobookBookmarkBusinessLogic, NowPlayingCoordinator, and the MyBooks download/borrow services. Money-path (borrow/download/return/DRM/sign-in) LOGIC untouched — only test-join seams; DRM-adjacent AudiobookLoader/LCP-adapter tests deliberately deferred.

Verified

  • Full consolidated bundle compiles clean (** TEST BUILD SUCCEEDED **).
  • Representative fixed classes pass in isolation in ms (e.g. CatalogCacheKeyAndIsolationTests 30s-poll → 0.1s). CI is the authoritative parallel verifier for the full board.

🤖 Generated with Claude Code

t and others added 14 commits July 21, 2026 14:12
…g the actual work

Four tests waited for fire-and-forget async work via a fixed wall-clock
deadline (asyncAfter probes / Task.sleep settle windows) and starved under
CI parallel oversubscription — the deadline elapses before the awaited work
lands and the test times out even though the work DID complete. Replaced each
poll with a deterministic JOIN of the real work; assertions unchanged.

- TPPSignInBusinessLogicStateMachineTests.testLogIn_racingAuthDocLoad_firesRequestOnceReady:
  dropped the 0.5s/1.5s asyncAfter probes; wake the instant the mock records
  the credential request via a new join seam.
- UnifiedOPDSServiceStateMachineTests.testFetchLoansFeed_blocksUntilLoaded_thenFetches
  & OPDSFeedServiceStateMachineTests (same name): dropped the 80ms settle sleep
  and joined the held fetch Task with `await fetchTask.value`. Mid-flight
  negatives hold without a settle — the awaitReady gate can't fire HTTP or
  complete while state is .detailsLoading.
- NotificationServiceStateMachineTests.testHoldNotification_blocksUntilLoaded_thenNavigates:
  dropped the 30ms subscribe-settle sleep; the state stream is a
  CurrentValueSubject so a late subscriber replays the terminal state — no
  lost-wakeup race, `await outcomeTask` is the join.

Added a test-only `onExecuteRequest` join seam to TPPRequestExecutorMock
(fires synchronously as executeRequest records a URL; cleared in reset()).

**Scope:** test-only. Zero production LOC changed — all edits under
PalaceTests/. The sign-in test is money-path but its production path
(logIn/awaitReadyThenRetryLogIn) is untouched; only the mock and the test's
wait mechanism changed, and the prod-behavior assertions (request fires,
carries /patrons/me) are preserved.
**Not done:** did not touch SignInWebSheetIntegrationTests (real WKWebView
cold-start, already documented FLAKE-003-OK — env-bound, not a deadline poll).
**Deferred:** none.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…nit joins

CI runs PalaceTests with sim-clone oversubscription; tests that waited on a
fire-and-forget async op (Task.detached refresh, load()'s currentLoadTask) via
a fixed wall-clock deadline (awaitCondition / fulfillment(timeout:) / Task.sleep
poll) starved past the 120s executionTimeAllowance. Fix: join the actual work
unit instead of polling a deadline.

CatalogCacheKeyAndIsolationTests:
  - testConcurrentStaleReads_AcrossDistinctURLs_EachURLGetsItsOwnRefresh — join
    all 3 concurrent .utility refreshes via _awaitAllBackgroundRefreshesForTesting
  - testConcurrentStaleReads_BackgroundRefreshDoesNotPoisonNeighborKey — join the
    single refresh via _awaitBackgroundRefreshForTesting
  - testInMemoryCache_AfterSystemMemoryWarning_... + testMemoryWarning_ClearsBoth
    — handler evicts synchronously under NotificationCenter.post; assert directly
  - removed the now-orphaned awaitCondition wall-clock poll helper
CatalogDomainTests: dropped two stale "give cache queue time" Task.sleep(100ms)
  waits — invalidateCache is a synchronous lock mutation (no queue since the SWR
  refactor).
CatalogViewModelTests: 8 sites (load error/nil/offline, forceRefresh, SWR A→B→A
  waitUntilLoaded) now join currentLoadTask via _awaitLoadForTesting. Reconnect
  auto-reload left as a bounded observable-effect poll (documented un-joinable:
  the reload hops through two untracked bare Tasks off the reachability
  publisher).
SideloadedLaneTests: awaitLoaded/awaitFailure join currentLoadTask instead of a
  20s $state fulfillment.

Production seams (additive, behavior-identical, gated/defaulted — prod path
unchanged):
  - CatalogRepository._trackRefreshTasksForTesting() +
    _awaitAllBackgroundRefreshesForTesting() (refreshTracking flag defaults off;
    prod never appends/grows the tracked-task array)
  - CatalogViewModel._awaitLoadForTesting() (reads the already-retained
    currentLoadTask handle)

No assertions weakened; no XCTSkip, no raised executionTimeAllowance, no disabled
parallelism. Both production files pass `swiftc -parse`.

**Scope:** test-only de-flake batch (CATALOG). Prod change is 2 files / 66 LOC,
all additive underscore-prefixed test seams + doc comments — zero runtime
behavior change on any production path (new tracking is opt-in and defaults off;
the load seam only reads an existing handle). No money-path (borrow/DRM/sign-in)
code touched. Not done: the reconnect-auto-reload connectivity-publisher hop
still lacks a retained-handle join seam (deferred to the connectivity owner);
its test keeps a bounded observable-effect poll.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…l-clock deadlines (ACCOUNTS/PLATFORM batch)

De-flakes fixed-deadline polls that starve under CI sim-clone oversubscription
(2 clones on a small runner) and blow the 120s executionTimeAllowance. Every
change replaces a wall-clock deadline (Task.sleep-then-assert, RunLoop.run(until:)
spin, tight fulfillment ceiling) with a deterministic JOIN on the actual work.

Test-side conversions:
- AppLaunchTracker{,Extended}Tests: join the fire-and-forget catalogLoaded metrics
  report via new tracker.awaitPendingMetricsReport() seam (was: sleep 100/200ms).
- AppHealthViewModelTests: join loadData() via new viewModel.awaitLoadForTesting()
  seam (was: 5× sleep 200ms); offline-queue status update now joins the ViewModel's
  main-hopped $offlineQueueStatus sink via fulfillment (was: sleep 200ms).
- AccountStateMachineTests.testStateStream_emitsCurrentThenTransitions: subscription
  barrier on the stream's first (CurrentValueSubject current-value) emission before
  driving transitions (was: 2× sleep 30ms; genuine intermediate-state ordering hazard).
- AppContainerResetTests: join presenter $hasActiveSession @published emission (was:
  2s RunLoop.main.run(until:) spin).
- AccountDetailViewModelTests: settle() joins $isLoadingAuth reaching false (was:
  yield×3 + sleep 50ms).
- ViewModelComputedPropertyTests: drainMainQueueAsync() for the other-book no-react
  case (was: sleep 200ms).
- ActiveSessionsViewModelTests: widen 3 genuine-join fulfillment ceilings 0.5s->5.0s
  to match the already-fixed site 185 precedent (join mechanism unchanged; only the
  failure-bound widened so a real join can't starve under oversubscription).

Production seams (test-only join points, behavior-identical in production):
- AppLaunchTracker: retain the metrics-report Task in metricsReportTask + expose
  awaitPendingMetricsReport(). Same task still runs detached; we only keep its handle.
- AppHealthViewModel: retain the loadData() Task in loadTask + expose
  awaitLoadForTesting(). Same task still runs; we only keep its handle.

No assertions weakened; no XCTSkip; no disabled parallelism. Left as-is (correctly):
callback-fulfilled expectations, condition-driven bounded spins (UserAccountPublisher
deinit-cancel loop, AccountsManagerCancellation suspend-point spin), negative-assertion
settle windows (AccountsManagerFirstRunDecode 0.5s no-second-decode; bounded, not a
120s risk), and awaitReady() slow-path tests (CurrentValueSubject replay makes
resolution ordering-independent). RemoteFeatureFlags 10s sleep is a withTimeout
cancellation probe, not a deadline poll.

**Scope:** 7 target test dirs (Accounts/Platform/Crawl/ViewModels/Migrations/
ImageLoading/AppInfrastructure). Crawl + Migrations had no deadline-polls. Skip-list
files (OfflineQueueService/PositionSync/Accessibility/PerformanceMonitor/
StateMachineWiring/AccountDetailsURL/PoolResponsivenessProbe) untouched.
**Not done:** no build/verify run (CI verifies per batch brief); no push/merge.
**Deferred:** none. No money/critical-path production behavior changed — the two
prod seams only retain an existing Task handle for a test join.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…k deadlines (de-flake)

De-flakes parallel-starvation deadline-poll tests in the reader/PDF/bookmark
areas. Under CI's 2-sim-clone oversubscription, tests that waited a FIXED
wall-clock interval (Task.sleep / debounce-deadline poll) for a fire-and-forget
async op could starve past the deadline and hit the 120s executionTimeAllowance.
Fix: JOIN the actual work via retained-Task seams / a persist-completion signal
instead of racing a deadline. Also fixes one shared-state root (mock defaulting
to the production singleton registry).

Prod seams added (all behavior-identical; nil/uncalled in production):
- TPPLastReadPositionPoster: retain spawned server-post Tasks + awaitPendingWrites()
- TPPReaderTOCBusinessLogic: retain the init TOC-load Task + awaitTOCLoad()
- TypographyService: onDidPersistForTesting callback fired after each debounced persist

Shared-state root fixed:
- MockPDFDocumentMetadata now injects an isolated TPPBookRegistryMock per instance
  instead of letting the parent init default to AppContainer.production().bookRegistry
  (every mock was touching the shared singleton — cross-test pollution). Behavior
  the tests assert (bookmark-set membership) is unchanged.

Tests converted from deadline-polls to deterministic joins:
- TPPLastReadPositionPosterTests (5 Task.sleep -> awaitPendingWrites)
- TPPReaderTOCBusinessLogicTests (4 XCTNSPredicate 10s polls -> awaitTOCLoad)
- TypographyServiceTests.testSettingsPersistedAfterDebounce (predicate poll -> persist-signal join)

No assertions weakened; no XCTSkip/raised allowances/loosened asserts.

**Scope:** Reader2/PDF/Bookmark de-flake only. Left genuine event-driven waits
untouched (spy-navigator/completion-fulfilled expectations, count-matched
concurrency joins, main-actor-drain barriers) — those already join real work.
**Not done:** TypographyServiceIntegrationTests.swift is present in the project
group but NOT compiled (no PBXSourcesBuildPhase entry; references a
TypographyPersistence protocol that does not exist in prod) — its debounce
Task.sleep polls are inert (never run in CI), so left as-is.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…warm AUDIOBOOK)

CI runs PalaceTests with 2 sim clones on a small runner; tests that wait for
a fire-and-forget async op via a FIXED WALL-CLOCK deadline starve under
oversubscription and hit the 120s executionTimeAllowance. This converts those
waits to deterministic JOINS of the actual work unit.

Fixed:
- AudiobookBookmarkBusinessLogic{,PositionWrite}Tests: position-write detached
  Task now joined via a new `_awaitPositionWriteForTesting()` seam (retained
  Task-handle) instead of `wait(for:timeout:)` on the completion.
- NowPlayingCoordinator{,Background}Tests: debounced `Task.sleep` update now
  joined via a new `_awaitPendingUpdateForTesting()` seam instead of
  `awaitCondition(timeout:5)` polling MPNowPlayingInfoCenter.
- AudiobookSessionPresenterTests: replaced the fixed-50ms
  `RunLoop.main.run(until:)` publisher-delivery spin with the deterministic
  FIFO `drainMainQueue()` (16 sites via the shared helper).
- AudiobookDataManagerSyncTests: mock POST completions moved off
  `.global().asyncAfter` onto a serial completion queue + `drainCompletions()`
  barrier; predicate-poll expectations replaced with `syncQueue.sync {}` +
  `drainCompletions()` joins.

Production seams added are underscore-prefixed, test-only, and behavior-
identical (no production call path invokes them; the write Task runs exactly
as before, only its handle is now retained).

Left as-is (genuine event-joins / un-joinable, noted): AudiobookLoader{,Dispatch,
OPDSShapeMatrix}Tests + vendor adapter tests (real AppContainer.production()
pipeline / @MainActor-Task hops driven by runloop spin, no clean seam without
a DRM-path refactor); AudiobookOpenStateRace / FirstOpenHang (event-firing
gate waits); AudioEngineWrapper / LoaderFinalizeBuild (synchronous completions);
the debounce-dealloc crash-survival test (no work unit to await by design).

**Scope:** test-only de-flake + two underscore-prefixed test-join seams on
AudiobookBookmarkBusinessLogic + NowPlayingCoordinator. No behavior change.
**Not done:** vendor-adapter (LCP/Bearer/OpenAccess) and AudiobookLoader Task
joins — those hit the real fulfillment/DRM pipeline and warrant a swarm, not a
lone seam; left with inline reasoning.
**Deferred:** none.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…join, don't poll)

Convert wall-clock deadline-polls on fire-and-forget async to deterministic
joins across the return / auth / download-fulfillment money-path tests. Under
CI oversubscription (2 sim clones, small runner) these polls
(awaitConditionAsync / Task.sleep loops / asyncAfter+wait / while-Date loops)
starve and hit the 120s executionTimeAllowance.

Join patterns used:
- Retained-Task join: await inFlightTasksSnapshotForTesting() Task.value
  (BookReturnService + DownloadAuthRetryHandler both retain their fire-and-
  forget Tasks; the auto-removal is the tail of each tracked body, so
  await task.value joins body+cleanup deterministically).
- Synchronous retention insert -> direct assert (returnBook / handleAuth insert
  the tracked Task synchronously before returning; count is deterministically
  >=1 with no poll).
- Prompt-firing expectation: fulfil an XCTestExpectation from the effect edge
  (error-publisher sink, reauthenticator.onAuthenticate, delegate.onStartDownload)
  instead of polling a captured-array count behind a fixed asyncAfter delay.
- Main-actor barrier flush (await Task { @mainactor }.value) for all-@mainactor
  chains and absence-assertions, replacing fixed settle sleeps.

Prod seam added (test-only behavior, behavior-identical):
- DownloadAuthRetryHandler.inFlightTasksSnapshotForTesting() — a @mainactor
  read-only copy of the existing inFlightTasks set, mirroring the established
  BookReturnService seam. Mutates nothing; no production path changes.

Un-joinable sites left with an inline note + kept as loud-on-timeout waits (no
retention handle available without a larger prod change):
- BookSignInRedirectHandler SAML-cookies-expired retry (background Task { }).
- LCPFulfillmentHandler stored-fulfillment-task (untracked Task in a void method).
- BookReturnService deinit observation (ARC last-release, not awaitable).
- TokenRefreshInterceptor coordinator paths — barrier-flush (no retention seam
  on the interceptor yet; flagged as the complete follow-up).

No assertions weakened; no XCTSkip; no raised allowances; parallelism untouched.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…(join, don't poll)

Convert fixed-wall-clock deadline polls (awaitCondition / awaitConditionAsync /
Task.sleep loops / RunLoop.run(until:)) that waited on fire-and-forget async
work into deterministic joins. Under CI oversubscription (2 sim clones) those
polls starve and blow the 120s executionTimeAllowance; joining the actual work
removes the wall-clock race entirely.

Test-side: await the SUT's own async entry points / retained-Task seams,
drain-then-assert for synchronous registry+notification effects, and use
prompt-firing NotificationCenter expectations (fulfilled by the SUT's own
post) in place of RunLoop deadline polls. Publisher joins via a shared
awaitPublished/awaitPublishedAsync helper.

Prod: add behavior-identical join seams only — fire-and-forget `Task {}` bodies
extracted verbatim into `...Async()` siblings whose sync wrapper is
`Task { await ...Async() }` (enqueuePendingAsync, startBorrowAsync,
limitActiveDownloadsAsync, pauseAllDownloadsAsync, processAsync), plus
retained-Task `private(set) var last...Task` handles for tests to await. Same
calls, same order, same side effects; no logic, branch, or state-transition
change. Mirrors the existing schedulePendingStartsIfPossible→Async split.

No assertions weakened, no XCTSkip, no raised allowance, parallelism untouched.

**Scope:** de-flake pass over PalaceTests/MyBooks, PalaceTests/Book,
PalaceTests/BookStateManagement (return/auth/fulfillment slice committed
separately in the preceding commit). Prod seams are money-path
(borrow/download) and confirmed test-only-behavior (behavior-identical joins).
**Deferred:** a full retention seam for TokenRefreshInterceptor's ~20
fire-and-forget Task sites (too broad for a de-flake pass; two interceptor
poll sites left with UNJOINABLE notes). Genuinely un-joinable sites (real
debounce timers, ARC-deinit observation, absence-of-effect settles, SAML
retry background Tasks with no handle) left in place with inline UNJOINABLE
notes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The full-sweep swarm branched off develop (which lacked #1315), so its Network
batch skipped TPPSignInBusinessLogicSignOutTests + MultiLibraryTokenIsolationTests
believing they were already on develop. They were only in #1315. Bring those two
join fixes + the TPPDRMAuthorizingMock._awaitDeauthorizeCalledForTesting seam they
need, so the sweep supersedes #1315 completely (BorrowOperationContractTests kept
from the mybooks batch, which fixed the whole Borrow slice).

**Scope:** test-only (2 test files + 1 test mock); no production change here.
The reader batch's `awaitPendingWrites() async` seam, called on the @mainactor
test's non-Sendable poster, tripped Swift 6 'sending self.poster'. Reshaped to a
synchronous `pendingWriteTasksForTesting() -> [Task]` snapshot (a sync call sends
nothing; Task is Sendable) and the test awaits the returned handles. Behavior
identical; consolidated sweep now builds clean.

**Scope:** compile fix for the consolidated de-flake sweep; no behavior change.
@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown

🏗️ CodeAtlas Ledger Analysis

✅ All Checks Passed


♿ Accessibility (via AccessLint)

💡 Static analysis against WCAG 2.1 AA guidelines for iOS accessibility.

No accessibility issues detected


🧪 Test Coverage (via QAAtlas)

⚠️ No coverage data available - QAAtlas requires an OpenAI API key.
Set OPENAI_API_KEY in repository secrets to enable AI-powered test coverage analysis.


🏛️ Architecture Analysis

Metric Value ℹ️ What This Means
Components 12 Distinct modules/layers detected in your codebase
Dependency Cycles 0 Circular dependencies (A→B→C→A). Goal: 0
Layer Violations 1 Dependencies that break architectural boundaries
Hotspots 0 Files with high complexity + frequent changes
Avg Coupling 1.00 How interconnected modules are (lower is better, <1.0 is good)

🔍 Reachability Analysis

💡 Detects code that cannot be reached from entry points (dead code).

No dead code detected


📊 0 files analyzed | 📦 Download Full Report

Powered by CodeAtlas Ledger
• Accessibility: AccessLint

@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown

🧪 Unit Test Results

📊 View Full Interactive Report

✅ ALL TESTS PASSED

7872 tests | 7737 passed | 0 failed | 133 skipped | ⏱️ 12m 57s | 📊 98.3% | 📈 45.5% coverage

Tests by Class — 902 classes (click to expand)
Class Tests Passed Failed Duration
✅ AccessLintComplianceTests 11 11 0 8ms
✅ AccessibilityAnnouncementCenterTests 20 20 0 1.58s
✅ AccessibilityLabelTests 9 9 0 699ms
✅ AccessibilityPreferencesTests 26 26 0 862ms
✅ AccessibilityServiceTests 11 11 0 233ms
✅ AccountAuthDocCarryoverTests 5 5 0 3.35s
✅ AccountAuthSurfaceHostsTests 7 7 0 93ms
✅ AccountAwareNetworkTests 10 10 0 138ms
✅ AccountDetailCredentialStateTests 7 0 0 40ms
✅ AccountDetailPINVisibilityTests 25 0 0 1.39s
✅ AccountDetailSignOutConfirmationTests 2 0 0 9ms
✅ AccountDetailViewModelGapTests 1 1 0 49ms
✅ AccountDetailViewModelLeakTests 1 1 0 122ms
✅ AccountDetailViewModelSignedInDerivationTests 5 0 0 88ms
✅ AccountDetailViewModelTests 19 0 0 155ms
✅ AccountDetailsAuthenticationIsBrowserBasedTests 10 10 0 165ms
✅ AccountDetailsNeedsAuthAggregateTests 10 10 0 154ms
✅ AccountDetailsURLTests 17 17 0 122ms
✅ AccountModelGapTests 9 9 0 654ms
✅ AccountModelTests 20 20 0 21ms
✅ AccountProfileDocumentTests 3 3 0 63ms
✅ AccountStateMachineTests 10 10 0 134ms
✅ AccountSwitchCleanupTests 8 8 0 348ms
✅ AccountSwitchIntegrationTests 8 8 0 85ms
✅ AccountSwitchLifecycleTests 9 0 0 246ms
✅ AccountsManagerAccountIndexTests 7 7 0 200ms
✅ AccountsManagerCacheReadTests 4 4 0 499ms
✅ AccountsManagerCacheTests 16 16 0 148ms
✅ AccountsManagerCancellationTests 5 5 0 2.05s
✅ AccountsManagerFirstRunDecodeTests 3 3 0 688ms
✅ AccountsManagerGapTests 3 3 0 46ms
✅ AccountsManagerHelpersTests 12 12 0 71ms
✅ AccountsManagerIsolationLintTests 4 4 0 1.17s
✅ AccountsManagerLaunchSnapshotTests 13 13 0 2.08s
✅ AccountsManagerStateMachineWiringTests 16 16 0 3.78s
✅ AccountsManagerTests 51 48 0 9.58s
✅ ActiveSessionsViewModelTests 12 12 0 301ms
✅ AdobeActivationTests 6 6 0 12ms
✅ AdobeCertificateGapTests 7 7 0 218ms
✅ AdobeDRMCharacterizationTests 21 21 0 226ms
✅ AdobeDRMErrorGapTests 3 3 0 79ms
✅ AdobeDRMHandlerTests 12 12 0 787ms
✅ AdobeDRMServiceGapTests 2 2 0 3ms
✅ AlertModelCoverageTests 6 6 0 4ms
✅ AlertModelRetryTests 7 7 0 363ms
✅ AlertModelTests 2 2 0 304ms
✅ AlertPresentationRawGuardLintTests 6 6 0 37ms
✅ AlertUtilsTests 20 20 0 559ms
✅ AnnotationContractTests 3 3 0 21ms
✅ AnnotationDeviceIDTests 2 2 0 5ms
✅ AnnotationPostResponseContractTests 1 1 0 2ms
✅ AnnouncementChainTests 5 5 0 7ms
✅ AnnouncementTests 3 3 0 2ms
✅ AnonymousBorrowBaselineFixtureTests 13 13 0 44ms
✅ AnonymousBorrowCandidateFixtureTests 6 6 0 17ms
✅ AnonymousBorrowDeltaTests 2 2 0 36ms
✅ AppContainerAudiobookFactoryTests 3 3 0 119ms
✅ AppContainerAuthCoordinatorRegistrationTests 3 3 0 2.68s
✅ AppContainerImageLoaderInjectionTests 4 4 0 30ms
✅ AppContainerIsolationLintTests 7 7 0 1.73s
✅ AppContainerResetTests 5 5 0 138ms
✅ AppContainerTests 4 4 0 3ms
✅ AppContainerWithSignInModalSheetPresenterTests 2 2 0 3.46s
✅ AppHealthViewModelTests 8 8 0 66ms
✅ AppLaunchTrackerExtendedTests 16 16 0 227ms
✅ AppLaunchTrackerTests 10 10 0 256ms
✅ AppLaunchTrackerWiringTests 2 2 0 845ms
✅ AppRatingServiceOverrideTests 3 3 0 3.32s
✅ AppRatingServiceTests 9 9 0 148ms
✅ AppRouteTests 5 5 0 14ms
✅ AppTabHostMiniPlayerIntegrationTests 6 6 0 193ms
✅ AppTabHostViewBadgeCountTests 10 10 0 63ms
✅ AppTabRouterCoverageTests 4 4 0 539ms
✅ AppTabRouterGapTests 3 3 0 164ms
✅ ArrayExtensionsTests 6 6 0 974ms
✅ AudioBookmarkGapTests 6 6 0 172ms
✅ AudioEngineWrapperTests 8 8 0 882ms
✅ AudioInterruptionLogicTests 6 6 0 937ms
✅ AudioSessionActivatorTests 8 8 0 275ms
✅ AudiobookAccessibilityTests 7 7 0 12ms
✅ AudiobookBackgroundAudioTests 2 2 0 30ms
✅ AudiobookBookmarkBusinessLogicConcurrencyTests 3 3 0 4.74s
✅ AudiobookBookmarkBusinessLogicPositionWriteTests 6 6 0 1.03s
✅ AudiobookBookmarkBusinessLogicTests 21 21 0 3.87s
✅ AudiobookChapterTOCNormalizationTests 6 6 0 43ms
✅ AudiobookColdLoadRecoveryTests 4 4 0 4ms
✅ AudiobookCrossVendorSmokeTests 4 4 0 1.18s
✅ AudiobookDataManagerEmptyQueueTests 1 1 0 2ms
✅ AudiobookDataManagerErrorHandlingTests 5 5 0 485ms
✅ AudiobookDataManagerModelsTests 20 20 0 665ms
✅ AudiobookDataManagerNetworkSyncTests 5 5 0 58ms
✅ AudiobookDataManagerSaveTests 4 4 0 52ms
✅ AudiobookDataManagerStoreRecoveryTests 5 5 0 71ms
✅ AudiobookFileLoggerTests 14 14 0 235ms
✅ AudiobookFirstOpenHangTests 14 14 0 1.48s
✅ AudiobookLoadFailureSAMLReauthTests 10 10 0 1.09s
✅ AudiobookLoaderDispatchTests 7 7 0 162ms
✅ AudiobookLoaderFinalizeBuildTests 11 11 0 180ms
✅ AudiobookLoaderOPDSShapeMatrixTests 8 0 0 330ms
✅ AudiobookLoaderPredicateTests 11 11 0 150ms
✅ AudiobookLoaderTests 2 2 0 602ms
✅ AudiobookMorphingPlayerViewTests 10 10 0 1.49s
✅ AudiobookNetworkValidationTests 3 3 0 3ms
✅ AudiobookOpenStateRaceTests 3 3 0 401ms
✅ AudiobookPhoneAlertContentTests 3 3 0 7ms
✅ AudiobookPlaybackStateTests 3 3 0 34ms
✅ AudiobookPlaybackTests 26 26 0 115ms
✅ AudiobookPlaytimesLifecycleTests 6 6 0 287ms
✅ AudiobookPositionAdapterContractTests 3 3 0 376ms
✅ AudiobookPositionPolicyValidatorTests 14 14 0 49ms
✅ AudiobookPositionRestoreTests 18 18 0 364ms
✅ AudiobookSAMLReauthTests 6 6 0 6.70s
✅ AudiobookSessionErrorDescriptionTests 4 4 0 4ms
✅ AudiobookSessionErrorExtTests 4 4 0 48ms
✅ AudiobookSessionErrorTests 3 3 0 99ms
✅ AudiobookSessionManagerErrorMappingTests 6 6 0 19ms
✅ AudiobookSessionManagerFlagGatePresentationTests 4 4 0 226ms
✅ AudiobookSessionManagerPresenterMigrationTests 10 10 0 86ms
✅ AudiobookSessionManagerShutdownTests 12 12 0 336ms
✅ AudiobookSessionPresenterTests 31 31 0 373ms
✅ AudiobookSessionStateTests 6 6 0 6ms
✅ AudiobookSessionStateTransitionTests 22 22 0 12.81s
✅ AudiobookSkipIntervalSettingsTests 7 7 0 200ms
✅ AudiobookSleepTimerIntegrationTests 5 5 0 516ms
✅ AudiobookStorageLocationTests 3 3 0 24ms
✅ AudiobookTOCTests 18 18 0 261ms
✅ AudiobookTimeEntryTests 6 6 0 14ms
✅ AudiobookTimeTrackerEdgeTests 8 8 0 49ms
✅ AudiobookTimeTrackerLifecycleTests 5 5 0 1.07s
✅ AudiobookTimeTrackerTests 9 9 0 136ms
✅ AudiobookTrackCompletionTests 2 2 0 16ms
✅ AudiobookTypeRoutingTests 5 5 0 47ms
✅ AudiobookVendorAdapterTests 5 5 0 17ms
✅ AudiobookmarkTests 4 4 0 62ms
✅ AuthCoordinatorTelemetryTests 5 5 0 98ms
✅ AuthDecisionEventEmissionTests 7 7 0 20ms
✅ AuthDocumentContractTests 2 2 0 13ms
✅ AuthDocumentVariantsContractTests 5 5 0 21ms
✅ AuthErrorCategoryTests 12 12 0 38ms
✅ AuthErrorProblemDocSeamTests 6 6 0 45ms
✅ AuthFlowSecurityTests 3 0 0 29ms
✅ AuthReducerTests 21 21 0 764ms
✅ AuthTypeTests 7 7 0 62ms
✅ AuthenticationTests 16 16 0 72ms
✅ BackgroundDownloadHandlerTests 28 28 0 1.53s
✅ BackgroundListenerTests 2 2 0 117ms
✅ BackgroundSessionRoutingTests 6 6 0 179ms
✅ BackupExclusionMigrationTests 3 3 0 19ms
✅ BadgeDefinitionTests 33 33 0 15.44s
✅ BadgeServiceTests 16 16 0 212ms
✅ BadgeUnlockPhaseTests 4 4 0 5ms
✅ BadgesViewModelTests 14 14 0 1.18s
✅ BasicAuthEmptyCredentialTests 4 4 0 458ms
✅ BearerTokenAdapterTests 5 4 0 30ms
✅ BearerTokenFulfillFlowTests 4 4 0 27ms
✅ BearerTokenRefreshTests 4 4 0 51ms
✅ BearerTokenResponseDetectionTests 7 7 0 61ms
✅ BeginningPositionPolicyTests 8 8 0 16ms
✅ BookAvailabilityFormatterTests 18 18 0 116ms
✅ BookButtonMapperHoldReadyTests 10 10 0 171ms
✅ BookButtonMapperTests 21 21 0 375ms
✅ BookButtonMapperViewModelTests 18 18 0 726ms
✅ BookButtonStateTests 8 8 0 74ms
✅ BookButtonTypeMetaTests 4 4 0 11ms
✅ BookButtonTypeTests 13 13 0 154ms
✅ BookCellModelActionTests 18 18 0 613ms
✅ BookCellModelCacheInvalidationTests 8 8 0 141ms
✅ BookCellModelCachePrefetchSafetyTests 9 9 0 226ms
✅ BookCellModelCacheTests 22 22 0 17.76s
✅ BookCellModelComputedPropertyTests 19 19 0 938ms
✅ BookCellModelOfflineTests 9 9 0 168ms
✅ BookCellModelRegistryBindingTests 4 4 0 1.47s
✅ BookCellModelStateTests 16 16 0 244ms
✅ BookCellModelStreamingHTMLTests 2 2 0 285ms
✅ BookCellStateComprehensiveTests 14 14 0 797ms
✅ BookContentResetServiceTests 2 2 0 19ms
✅ BookDetailMetadataHydrationTests 6 6 0 92ms
✅ BookDetailViewModelAudiobookDismissTests 1 1 0 18ms
✅ BookDetailViewModelTests 91 91 0 2.13s
✅ BookFileManagerSideloadResolutionTests 4 4 0 746ms
✅ BookFileManagerTests 8 8 0 142ms
✅ BookListViewAccessibilityTests 9 9 0 1.44s
✅ BookPreviewTests 4 4 0 49ms
✅ BookRegistryStoreTests 26 26 0 1.34s
✅ BookRegistrySyncReadinessTests 3 2 0 762ms
✅ BookRegistrySyncReentrancyTests 6 6 0 164ms
✅ BookRegistrySyncSideloadExemptionTests 2 0 0 1.35s
✅ BookRegistrySyncTests 35 30 0 1.71s
✅ BookReturnCleverReauthTests 1 1 0 135ms
✅ BookReturnServiceAuthCoordinatorTests 3 3 0 160ms
✅ BookReturnServiceContractTests 6 6 0 191ms
✅ BookReturnServiceTests 16 16 0 334ms
✅ BookServiceAudiobookOpenTests 2 2 0 6ms
✅ BookSignInRedirectHandlerTests 8 8 0 109ms
✅ BookStateIntegrationTests 8 8 0 93ms
✅ BookmarkBusinessLogicExtendedTests 6 6 0 638ms
✅ BookmarkDeletionLogTests 3 3 0 109ms
✅ BookmarkDeviceIdMatchingTests 3 3 0 101ms
✅ BookmarkExistenceTests 4 4 0 139ms
✅ BookmarkManagerTests 24 24 0 540ms
✅ BookmarkSortingTests 1 1 0 385ms
✅ BookmarkSyncTests 3 3 0 806ms
✅ BorrowAndDownloadIntegrationTests 7 7 0 303ms
✅ BorrowErrorMessageTests 13 13 0 235ms
✅ BorrowErrorPresenterTests 6 6 0 244ms
✅ BorrowOperationAuthCoordinatorTests 6 6 0 211ms
✅ BorrowOperationCleverReauthTests 2 2 0 277ms
✅ BorrowOperationContractTests 6 6 0 1.62s
✅ BorrowOperationStreamingHTMLTests 3 3 0 16ms
✅ BorrowOperationTests 13 13 0 193ms
✅ BorrowOperationTimeoutTests 3 3 0 114ms
✅ BorrowReducerContractTests 2 2 0 33ms
✅ BorrowReducerTests 21 21 0 112ms
✅ BundledRegistrySnapshotTests 5 5 0 177ms
✅ ButtonStateMonotonicClampTests 10 10 0 3.50s
✅ ButtonStateTests 16 16 0 170ms
✅ ButtonStyleTypeTests 2 2 0 3ms
✅ C64ConversionTests 6 6 0 12ms
✅ CarPlayAudiobookBridgePresenterMigrationTests 2 2 0 533ms
✅ CarPlayAuthHelperReadinessTests 3 3 0 1.56s
✅ CarPlayChapterListTests 3 3 0 42ms
✅ CarPlayIntegrationTests 2 2 0 22ms
✅ CarPlayLibraryRefreshTests 3 3 0 10ms
✅ CarPlayNowPlayingTemplateTests 4 4 0 525ms
✅ CarPlayOpenAppAlertTests 6 6 0 4.91s
✅ CarPlayPlaybackErrorTests 8 8 0 22ms
✅ CarPlayTests 12 12 0 88ms
✅ CarPlayTimeTrackingTests 3 3 0 172ms
✅ CatalogAPIDedupeTests 3 3 0 445ms
✅ CatalogAPIEntryPointTests 1 1 0 3ms
✅ CatalogAccessibilityTests 8 8 0 104ms
✅ CatalogCacheKeyAndIsolationTests 12 12 0 2.63s
✅ CatalogCacheMetadataExactBoundaryTests 4 4 0 3ms
✅ CatalogCacheMetadataTests 21 21 0 100ms
✅ CatalogFeedModelTests 4 4 0 666ms
✅ CatalogFilterGroupModelTests 17 17 0 29ms
✅ CatalogFilterModelTests 17 17 0 373ms
✅ CatalogFilterServiceTests 29 29 0 43ms
✅ CatalogFilterTests 1 1 0 <1ms
✅ CatalogLaneAssemblyTests 7 7 0 166ms
✅ CatalogLaneModelStructTests 20 20 0 320ms
✅ CatalogLaneModelTests 3 3 0 7ms
✅ CatalogLaneMoreFilterStateTests 8 8 0 37ms
✅ CatalogLaneMoreViewModelTests 43 43 0 219ms
✅ CatalogLaneRowViewAccessibilityTests 11 11 0 134ms
✅ CatalogLaneSortingTests 5 5 0 30ms
✅ CatalogLoadIntegrationTests 6 6 0 33ms
✅ CatalogOPDS2NegotiationTests 12 12 0 474ms
✅ CatalogPreloaderTests 6 6 0 31ms
✅ CatalogProblemDocumentTests 6 6 0 107ms
✅ CatalogRepositoryCoreTests 9 9 0 505ms
✅ CatalogRepositoryStaleWhileRevalidateTests 12 12 0 359ms
✅ CatalogRepositoryTests 19 19 0 5.75s
✅ CatalogSearchViewModelRegistryUpdateTests 5 5 0 107ms
✅ CatalogSearchViewModelTests 67 67 0 7.06s
✅ CatalogSelectorsTests 2 2 0 2ms
✅ CatalogSortServiceTests 14 14 0 290ms
✅ CatalogStateTests 7 7 0 21ms
✅ CatalogViewContinueRowsIntegrationTests 3 3 0 64ms
✅ CatalogViewModelStateMachineTests 19 19 0 2.61s
✅ ChaosFaultInjectionTests 5 5 0 37ms
✅ ChapterChangeDetectorTests 5 5 0 5ms
✅ ChapterTOCNormalizerTests 7 7 0 129ms
✅ CirculationAnalyticsTests 4 4 0 59ms
✅ ColdStartResumeIntegrationTests 10 10 0 987ms
✅ ColorExtensionTests 5 5 0 11ms
✅ ConcurrentBookStateTests 3 3 0 12ms
✅ ConcurrentDownloadStateTests 3 3 0 17ms
✅ ConcurrentTokenRefreshTests 2 2 0 24ms
✅ ContinueRowSectionTests 6 6 0 69ms
✅ ContinuousPlaybackTrackingTests 3 3 0 1.46s
✅ CookiePersistenceTests 10 10 0 2.70s
✅ CrawlStateTests 16 16 0 2.40s
✅ CrawlableFeedAnalysisTests 17 17 0 600ms
✅ CrawlerFallbackTests 12 12 0 8.71s
✅ CredentialEdgeCaseTests 6 6 0 9ms
✅ CredentialPrivacyTests 4 4 0 6ms
✅ CredentialPromptCoordinatorTests 4 4 0 56ms
✅ CredentialSnapshotInvalidationTests 5 0 0 84ms
✅ CrossDeviceBookmarkSyncTests 12 12 0 296ms
✅ CrossDeviceSyncE2ETests 5 5 0 209ms
✅ CrossDomain401Tests 8 8 0 40ms
✅ CrossFormatMappingTests 14 14 0 103ms
✅ DPLAErrorTests 3 3 0 19ms
✅ DRMAdversarialTests 4 1 0 84ms
✅ DRMFulfilledPublicationTests 6 6 0 5ms
✅ DataBase64Tests 3 3 0 5ms
✅ DataReceptionComparisonTests 2 2 0 26ms
✅ DateExtensionTests 9 9 0 1.58s
✅ DateFormattingTests 4 4 0 25ms
✅ Date_NYPLAdditionsTests 7 7 0 2.80s
✅ DebugSettingsForceSkeletonsTests 4 4 0 19ms
✅ DebugSettingsGapTests 4 4 0 27ms
✅ DebugSettingsTests 31 31 0 1.64s
✅ DefaultCatalogAPITests 31 31 0 163ms
✅ DefaultRecentlyReadingServiceTests 13 13 0 4.43s
✅ DeriveInitialStateTests 4 4 0 7ms
✅ DeveloperSettingsEngineeringTierTests 4 4 0 9ms
✅ DeveloperSettingsViewModelOverrideTests 3 0 0 56ms
✅ DeviceLogCollectorGapTests 2 2 0 12ms
✅ DeviceLogCollectorTests 13 13 0 223ms
✅ DeviceOrientationTests 7 7 0 139ms
✅ DeviceSpecificErrorMonitorTests 11 11 0 356ms
✅ DictionaryExtensionsTests 5 5 0 1.14s
✅ DiskBudgetManagerTests 7 7 0 21ms
✅ DiskBudgetTests 2 2 0 2.26s
✅ DownloadAlertPresenterTests 8 8 0 120ms
✅ DownloadAnnouncementServiceTests 12 12 0 148ms
✅ DownloadAuthRetryHandlerAuthCoordinatorTests 6 6 0 2.60s
✅ DownloadAuthRetryHandlerTaskLifecycleTests 4 4 0 399ms
✅ DownloadAuthRetryHandlerTests 17 17 0 1.91s
✅ DownloadCancellationHandlerTests 5 5 0 210ms
✅ DownloadCompleteMomentTests 6 6 0 5ms
✅ DownloadCompletionParserTests 9 9 0 195ms
✅ DownloadCoordinatorIntegrationTests 10 10 0 238ms
✅ DownloadCoordinatorTests 11 11 0 45ms
✅ DownloadDiskSpaceTests 2 2 0 11ms
✅ DownloadErrorInfoTests 3 3 0 833ms
✅ DownloadErrorRecoveryPolicyTests 11 11 0 355ms
✅ DownloadErrorRecoveryTests 3 3 0 170ms
✅ DownloadFreeSpaceExhaustionTests 11 11 0 2.60s
✅ DownloadInfoTests 5 5 0 15ms
✅ DownloadIntegrityTests 10 10 0 678ms
✅ DownloadOnlyOnWiFiTests 10 10 0 314ms
✅ DownloadPersistenceStoreTests 5 5 0 974ms
✅ DownloadProgressPublisherCoreTests 19 19 0 780ms
✅ DownloadProgressPublisherTests 2 2 0 6ms
✅ DownloadQueueIntegrationTests 3 3 0 143ms
✅ DownloadQueueOrchestratorTests 9 9 0 85ms
✅ DownloadRMSDKHandoffTests 1 1 0 2ms
✅ DownloadReconciliationLaunchOrderContractTests 2 2 0 30ms
✅ DownloadReconciliationTests 17 17 0 155ms
✅ DownloadRedirectTests 7 7 0 97ms
✅ DownloadResumeAfterKillTests 7 7 0 282ms
✅ DownloadSlotManagementTests 5 5 0 639ms
✅ DownloadStartCoordinatorContractTests 5 5 0 3.08s
✅ DownloadStartCoordinatorTests 9 9 0 144ms
✅ DownloadStartDispatcherTests 26 26 0 106ms
✅ DownloadStateMachineIntegrationTests 15 15 0 33ms
✅ DownloadStateMachineTests 5 5 0 22ms
✅ DownloadStateManagerTests 16 16 0 58ms
✅ DownloadTaskLifecycleServiceTests 9 9 0 98ms
✅ DownloadTaskPersistenceTests 14 14 0 131ms
✅ DownloadThrottlingServiceTests 10 10 0 186ms
✅ DownloadTransferRetryTests 6 6 0 2.05s
✅ DownloadWatchdogTests 3 3 0 23ms
✅ EPUBKeyCommandsPP4289Tests 4 4 0 8ms
✅ EPUBModuleTests 4 4 0 23ms
✅ EPUBPositionTests 10 10 0 126ms
✅ EPUBSearchViewModelTests 18 18 0 70ms
✅ EPUBToolbarToggleTests 11 11 0 14ms
✅ EmailAddressTests 16 16 0 178ms
✅ EpubSampleFactoryTests 5 5 0 9ms
✅ ErrorActivityTrackerTests 12 12 0 137ms
✅ ErrorDetailTests 12 12 0 316ms
✅ ErrorDetailViewControllerGapTests 3 3 0 112ms
✅ ErrorDetailViewControllerTests 14 14 0 62ms
✅ ErrorLogExporterTests 5 5 0 155ms
✅ ExecutorNetworkHermeticityTests 1 1 0 21ms
✅ ExpiredLoanStringsTests 5 5 0 105ms
✅ FacetEnumTests 3 3 0 36ms
✅ FacetToolbarAccessibilityTests 5 5 0 213ms
✅ FacetViewModelLogoDelegateTests 4 4 0 1.28s
✅ FacetViewModelTests 18 18 0 88ms
✅ FetchManifestWithBearerTokenLCPSafetyTests 1 1 0 19ms
✅ FetchManifestWithBearerTokenTests 9 9 0 456ms
✅ FetchOpenAccessManifestLCPSafetyTests 4 4 0 21ms
✅ FileURLGenerationTests 3 3 0 85ms
✅ FindawayChapterStatusGuardTests 1 1 0 2ms
✅ FindawaySavedVsPlayedTests 1 1 0 24ms
✅ FloatTPPAdditionsTests 5 5 0 16ms
✅ FocusIndicationTests 7 7 0 418ms
✅ FontManagerTests 17 17 0 92ms
✅ ForceResetTests 6 6 0 43ms
✅ GeneralCacheClearOnUpdateTests 3 3 0 12ms
✅ GeneralCacheTests 20 20 0 287ms
✅ GroupEnumTests 1 1 0 2ms
✅ HTMLTextViewTests 70 70 0 14.03s
✅ HoldNotificationClassificationTests 2 2 0 3ms
✅ HoldsBadgeCountTests 9 9 0 139ms
✅ HoldsBookViewModelTests 8 8 0 108ms
✅ HoldsReducerTests 11 11 0 285ms
✅ HoldsSyncFailureTests 12 12 0 97ms
✅ HoldsViewModelTests 23 23 0 1.28s
✅ HostFailureTrackerTests 2 2 0 6ms
✅ ImageCacheContinuationTests 1 1 0 16ms
✅ ImageCacheTypeTests 1 1 0 259ms
✅ ImageCoverKeyUnificationTests 2 2 0 1ms
✅ ImageLoaderTests 14 14 0 427ms
✅ InflightFeedFetchesTimeoutTests 4 4 0 10.38s
✅ IntExtensionsTests 4 4 0 66ms
✅ IsReaderActiveTrackingModifierTests 4 4 0 25ms
✅ KeyboardNavigationFKATests 11 11 0 41ms
✅ KeyboardNavigationHandlerTests 16 16 0 397ms
✅ KeyboardVoiceOverTests 5 5 0 40ms
✅ LCPAcquisitionPredicateTests 4 4 0 7ms
✅ LCPAdapterTests 8 8 0 79ms
✅ LCPAudiobookURLSchemeTests 4 4 0 54ms
✅ LCPAudiobooksTests 21 21 0 325ms
✅ LCPBotanCRLGuardTests 5 5 0 106ms
✅ LCPCharacterizationTests 31 31 0 393ms
✅ LCPClientTests 8 8 0 55ms
✅ LCPFulfillmentHandlerTests 8 8 0 498ms
✅ LCPKeychainMigrationTests 3 3 0 687ms
✅ LCPLibraryServiceTests 20 20 0 382ms
✅ LCPLicenseDocumentDetectionTests 5 5 0 10ms
✅ LCPLicenseFilePathTests 3 3 0 8ms
✅ LCPOrphanedDownloadRegistryTests 4 4 0 382ms
✅ LCPPDFAcquisitionPredicateTests 5 5 0 1.60s
✅ LCPPDFDiskExtractTests 5 5 0 142ms
✅ LCPPDFOpenProgressTests 13 13 0 78ms
✅ LCPPassphraseReadinessTests 2 2 0 57ms
✅ LCPSessionIdentifierTests 3 3 0 4ms
✅ LegacySAMLProblemDocumentPropagationTests 7 7 0 336ms
✅ LibrariesSectionViewModelTests 16 16 0 875ms
✅ LibraryCatalogMergerTests 9 9 0 18ms
✅ LibraryRegistryCrawlerTests 15 15 0 1.23s
✅ LicensesServiceTests 4 4 0 244ms
✅ LiveCrawlableParsingTest 4 0 0 74ms
✅ LoanEvictionPolicyTests 13 13 0 12ms
✅ LoanRenewalServiceTests 9 9 0 137ms
✅ LocalBookContentServiceTests 7 7 0 66ms
✅ LocalFileAdapterTests 6 5 0 24ms
✅ LogTests 13 13 0 313ms
✅ LoginKeyboardTests 8 8 0 18ms
✅ MainActorHelpersTests 22 22 0 699ms
✅ MappedCatalogBridgeTests 3 3 0 43ms
✅ MappedCatalogModelTests 11 11 0 507ms
✅ MockBackendExpiredCredentialsTests 3 3 0 53ms
✅ MockBackendHoldsTests 3 3 0 207ms
✅ MockBackendIntegrationTests 4 4 0 180ms
✅ MockBackendLoanLimitTests 2 2 0 30ms
✅ MockBackendRouteMatchingTests 4 4 0 28ms
✅ MockBackendServerDownTests 1 1 0 19ms
✅ MockIsolationLintTests 5 5 0 3.49s
✅ MultiLibraryTokenIsolationTests 14 14 0 105ms
✅ MyBooksDownloadCenterAccountIdThreadingTests 7 7 0 168ms
✅ MyBooksDownloadCenterAdeptGapTests 3 3 0 36ms
✅ MyBooksDownloadCenterConcurrencyTests 22 22 0 599ms
✅ MyBooksDownloadCenterEvictionTests 7 7 0 442ms
✅ MyBooksDownloadCenterOfflineTests 8 8 0 334ms
✅ MyBooksDownloadSessionInvalidationTests 3 3 0 8ms
✅ MyBooksSimplifiedBearerTokenTests 17 17 0 197ms
✅ MyBooksViewModelBooksPublisherTests 3 3 0 55ms
✅ MyBooksViewModelConcurrencyTests 4 4 0 338ms
✅ MyBooksViewModelDownloadStateTests 3 3 0 38ms
✅ MyBooksViewModelEmptyArrayTests 3 3 0 4ms
✅ MyBooksViewModelEmptyStateTests 4 4 0 19ms
✅ MyBooksViewModelExtendedTests 15 15 0 129ms
✅ MyBooksViewModelFacetIntegrationTests 4 4 0 1.45s
✅ MyBooksViewModelFacetPublisherTests 5 5 0 258ms
✅ MyBooksViewModelFilterSortInteractionTests 2 2 0 9ms
✅ MyBooksViewModelFilterTests 9 9 0 168ms
✅ MyBooksViewModelGuardConditionsTests 2 2 0 9ms
✅ MyBooksViewModelLargeDatasetTests 2 2 0 327ms
✅ MyBooksViewModelLoadAccountTests 2 2 0 204ms
✅ MyBooksViewModelLoginStateTests 4 4 0 532ms
✅ MyBooksViewModelMultipleAuthorSortingTests 3 3 0 14ms
✅ MyBooksViewModelNotificationTests 4 4 0 352ms
✅ MyBooksViewModelOfflineFilteringTests 3 3 0 9ms
✅ MyBooksViewModelPublisherTests 7 7 0 3.24s
✅ MyBooksViewModelSearchEdgeCaseTests 6 6 0 66ms
✅ MyBooksViewModelSearchQueryTests 3 3 0 329ms
✅ MyBooksViewModelSortPersistenceTests 3 3 0 30ms
✅ MyBooksViewModelSortingIntegrationTests 5 5 0 340ms
✅ MyBooksViewModelSortingTests 6 6 0 228ms
✅ MyBooksViewModelStateTransitionTests 3 3 0 352ms
✅ MyBooksViewModelUIBindingTests 3 3 0 25ms
✅ NSErrorAdditionsTests 7 7 0 9ms
✅ NSNotificationTPPTests 3 3 0 19ms
✅ NavigationCoordinatorTests 18 18 0 59ms
✅ NavigationFreezePreventionTests 5 5 0 5ms
✅ NetworkCacheClearRoutingTests 3 3 0 1.52s
✅ NetworkExecutorCredentialGuardTests 8 8 0 62ms
✅ NetworkExecutorResponseRegressionTests 4 4 0 144ms
✅ NetworkExecutorTaskTypeTests 3 3 0 152ms
✅ NetworkOfflineDetectionTests 3 3 0 111ms
✅ NetworkQueueTests 11 11 0 72ms
✅ NetworkRequestQueueTests 2 2 0 10.10s
✅ NetworkRetryLogicTests 7 7 0 52ms
✅ NetworkTimeoutTests 2 2 0 5ms
✅ NotificationEventTypeContractTests 7 7 0 48ms
✅ NotificationPayloadContractTests 10 10 0 137ms
✅ NotificationServiceStateMachineTests 9 9 0 532ms
✅ NotificationServiceTests 16 16 0 558ms
✅ NotificationServiceTokenTests 13 13 0 282ms
✅ NotificationSyncThrottleTests 5 5 0 82ms
✅ NotificationTokenDataTests 4 4 0 11ms
✅ NotificationTokenRegistrationTests 10 10 0 43ms
✅ NowPlayingCoordinatorBackgroundTests 6 6 0 1.29s
✅ NowPlayingCoordinatorTests 19 19 0 6.13s
✅ OAuthSAMLRedirectRegressionTests 4 4 0 1.30s
✅ OIDCAuthDocumentParsingTests 4 4 0 503ms
✅ OIDCAuthTypeTests 5 5 0 21ms
✅ OIDCAuthenticationPropertyTests 8 8 0 2.11s
✅ OIDCCallbackEdgeCaseTests 9 9 0 1.25s
✅ OIDCCallbackHandlingTests 5 5 0 504ms
✅ OIDCCallbackSchemeTests 3 3 0 54ms
✅ OIDCIsolationRegressionTests 6 6 0 1.01s
✅ OIDCLoginRoutingTests 3 3 0 232ms
✅ OIDCMakeRequestTests 3 3 0 116ms
✅ OIDCNSCodingTests 1 1 0 141ms
✅ OIDCNetworkLayer401Tests 5 5 0 237ms
✅ OIDCReauthOnExpiredTokenTests 5 5 0 127ms
✅ OIDCRedirectURIConstructionTests 6 6 0 243ms
✅ OIDCRegressionTests 9 9 0 292ms
✅ OIDCSelectedAuthenticationTests 2 2 0 50ms
✅ OIDCSignOutRegressionTests 6 6 0 777ms
✅ OIDCTokenRefreshRegressionTests 6 6 0 312ms
✅ OIDCUpdateUserAccountTests 5 5 0 287ms
✅ OIDCViewModelRegressionTests 1 1 0 97ms
✅ OIDCViewModelSignInTests 2 2 0 8ms
✅ OPDS1BorrowEntryContractTests 4 4 0 39ms
✅ OPDS1CatalogGroupedContractTests 3 3 0 7ms
✅ OPDS1HoldEntriesContractTests 4 4 0 879ms
✅ OPDS1LoansFeedContractTests 6 6 0 21ms
✅ OPDS1ParsingTests 34 34 0 562ms
✅ OPDS1RevokeResponseContractTests 2 2 0 64ms
✅ OPDS2AuthenticationDocumentTests 18 18 0 931ms
✅ OPDS2AvailabilityTests 4 4 0 150ms
✅ OPDS2BookBridgeTests 44 44 0 116ms
✅ OPDS2BorrowResponseContractTests 3 3 0 3ms
✅ OPDS2CatalogWiringTests 21 21 0 322ms
✅ OPDS2CatalogsFeedTests 3 3 0 92ms
✅ OPDS2ContributorTests 2 2 0 2ms
✅ OPDS2EmptyFeedContractTests 1 1 0 8ms
✅ OPDS2FeedContractTests 4 4 0 40ms
✅ OPDS2FeedParsingTests 11 11 0 295ms
✅ OPDS2FeedTests 14 14 0 80ms
✅ OPDS2FullMetadataTests 4 4 0 11ms
✅ OPDS2FullPublicationTests 13 13 0 219ms
✅ OPDS2IntegrationTests 18 18 0 162ms
✅ OPDS2LinkArrayTests 5 5 0 79ms
✅ OPDS2LinkComputedPropertyTests 20 20 0 6.86s
✅ OPDS2LinkRelTests 1 1 0 <1ms
✅ OPDS2LinkTests 2 2 0 51ms
✅ OPDS2ParsingTests 38 38 0 438ms
✅ OPDS2PublicationExtendedTests 53 53 0 164ms
✅ OPDS2PublicationImageTests 6 6 0 89ms
✅ OPDS2PublicationNarratorTests 3 3 0 158ms
✅ OPDS2PublicationTests 2 2 0 67ms
✅ OPDS2SamlIDPTests 6 6 0 102ms
✅ OPDS2SearchResultsContractTests 3 3 0 29ms
✅ OPDS2SubjectTests 2 2 0 5ms
✅ OPDS2SupportingTypesTests 5 5 0 38ms
✅ OPDSAcquisitionPathExpandedTests 15 15 0 157ms
✅ OPDSFeedCacheTests 14 14 0 178ms
✅ OPDSFeedMigrationTests 11 11 0 20ms
✅ OPDSFeedParsingTests 2 2 0 38ms
✅ OPDSFeedServiceStateMachineTests 3 3 0 191ms
✅ OPDSFeedServiceTests 2 2 0 12ms
✅ OPDSFormatTests 13 13 0 65ms
✅ OPDSParserCoreTests 4 4 0 3ms
✅ OPDSParserTests 4 4 0 29ms
✅ OPDSParsingTests 57 57 0 3.08s
✅ OfflineActionTests 29 29 0 144ms
✅ OfflineQueueCoordinatorTests 11 11 0 224ms
✅ OfflineQueueServiceExtendedTests 13 13 0 5.30s
✅ OfflineQueueServiceTests 17 17 0 8.36s
✅ OpenAccessAdapterTests 13 13 0 218ms
✅ OverdriveDeferredFulfillmentTests 6 6 0 243ms
✅ OverdriveDownloadHandlerTests 9 9 0 141ms
✅ OverdriveFulfillmentTests 25 24 0 403ms
✅ PDFExtensionsTests 20 20 0 622ms
✅ PDFKitThumbnailProviderTests 5 5 0 114ms
✅ PDFReaderTests 12 12 0 325ms
✅ PDFSearchEmptyStateTests 4 4 0 14ms
✅ PP3596RegressionTests 3 3 0 58ms
✅ Palace 2 2 0 <1ms
✅ PalaceCheckPropertyTests 8 8 0 83ms
✅ PalaceErrorCategoryTests 20 20 0 81ms
✅ PalaceErrorExtendedTests 23 23 0 60ms
✅ PalaceErrorTests 11 11 0 269ms
✅ PalaceHapticTests 4 4 0 11ms
✅ PalaceMotionTests 11 11 0 46ms
✅ PalacePDFViewTests 12 12 0 163ms
✅ PalacePressableButtonStyleTests 6 6 0 13ms
✅ PalaceTestSetupObservationTests 4 4 0 283ms
✅ PalaceWiringTestCaseTests 4 4 0 396ms
✅ ParserFuzzTests 4 4 0 13.53s
✅ PatronProfileContractTests 4 4 0 6ms
✅ PerformanceMonitorTests 14 14 0 399ms
✅ PerformanceReportTests 14 14 0 156ms
✅ PersistentLoggerTests 9 9 0 1.11s
✅ PlaybackBootstrapperAudioSessionTests 2 2 0 22ms
✅ PlaybackBootstrapperTests 8 8 0 53ms
✅ PlaybackFailureRecordTests 5 5 0 9ms
✅ PlaybackOpenPolicyTests 7 7 0 260ms
✅ PlaybackRateTests 18 18 0 42ms
✅ PlaybackTrackingRegressionTests 5 5 0 373ms
✅ PoolResponsivenessProbeTests 5 4 0 2.61s
✅ PositionPersistenceLogicTests 6 6 0 10ms
✅ PositionPersistenceTests 2 2 0 4ms
✅ PositionSyncServiceTests 13 13 0 397ms
✅ PositionSyncTests 5 5 0 217ms
✅ PositionWriterContractTests 6 6 0 147ms
✅ PostUpdateMigrationTests 5 5 0 32ms
✅ ProblemDocumentContractTests 4 4 0 7ms
✅ ProblemDocumentLoanExpiryTests 5 5 0 29ms
✅ ProblemDocumentTests 12 12 0 1.72s
✅ ProblemReportEmailTests 8 8 0 23ms
✅ RatingCardMotionGateTests 5 5 0 4ms
✅ RatingEligibilityPolicyTests 17 17 0 329ms
✅ RatingEngagementTrackerTests 9 9 0 153ms
✅ RatingFeedbackPresenterTests 3 3 0 2ms
✅ RatingPromptPresenterTests 15 15 0 160ms
✅ ReachabilityTests 10 10 0 13ms
✅ Reader2BookmarkContractTests 3 3 0 96ms
✅ Reader2PositionAdapterContractTests 4 3 0 251ms
✅ Reader2PositionResumeContractTests 3 3 0 279ms
✅ ReaderAccessibilityTests 7 7 0 66ms
✅ ReaderChromeToggleFadeTests 3 3 0 3ms
✅ ReaderEditingActionsTests 5 5 0 22ms
✅ ReaderErrorTests 5 5 0 25ms
✅ ReaderNavBarVoiceOverTests 2 2 0 64ms
✅ ReaderServicePDFRouteTests 3 3 0 3ms
✅ ReaderServiceSyncTests 3 3 0 44ms
✅ ReaderThemeTests 24 24 0 339ms
✅ ReadingPositionTests 22 22 0 288ms
✅ ReadingSessionTrackerTests 13 13 0 146ms
✅ ReadingStatsServiceTests 12 12 0 124ms
✅ ReadingStatsStoreTests 9 9 0 97ms
✅ RedirectHandlingIntegrationTests 4 4 0 1.43s
✅ RedirectPolicyTests 9 9 0 249ms
✅ RegistryFileRecoveryTests 21 21 0 320ms
✅ RemoteFeatureFlagsGapTests 4 4 0 31ms
✅ RemoteFeatureFlagsSideLoadingTests 5 5 0 134ms
✅ RemoteFeatureFlagsTests 21 21 0 2.99s
✅ ResourcePropertiesLengthTests 3 3 0 11ms
✅ RetryClassificationTests 17 17 0 36ms
✅ ReturnFlowTests 1 1 0 <1ms
✅ RightsManagementDetectionTests 5 5 0 8ms
✅ RightsManagementDispatcherTests 10 10 0 973ms
✅ RuntimeQuiescenceGateTests 11 10 0 1.19s
✅ RuntimeQuiescenceLintTests 5 5 0 907ms
✅ SAMLCookieSyncTests 5 5 0 358ms
✅ SAMLLogoutCallbackDetectionTests 4 4 0 656ms
✅ SAMLLogoutLinkParsingTests 5 5 0 42ms
✅ SAMLLogoutURLTests 4 4 0 197ms
✅ SAMLPlusBiblioBoardExpirationTests 8 8 0 298ms
✅ SEMigrationsTests 6 6 0 144ms
✅ SafeDictionaryTests 21 21 0 285ms
✅ SamplePlayerErrorTests 5 5 0 498ms
✅ SampleTypeTests 8 8 0 292ms
✅ SceneDelegateTests 1 1 0 <1ms
✅ ScopedResetTests 9 9 0 284ms
✅ SearchAccessibilityTests 11 11 0 21ms
✅ SearchFlowIntegrationTests 8 8 0 546ms
✅ SettingsViewModelComputedPropertyTests 6 6 0 418ms
✅ SettingsViewModelEdgeCaseTests 7 7 0 45ms
✅ SettingsViewModelGapTests 1 1 0 2ms
✅ SettingsViewModelSyncTests 14 14 0 226ms
✅ SettingsViewModelTests 33 33 0 1.17s
✅ SideloadImportContractTests 1 1 0 15ms
✅ SideloadedBookManagerTests 17 17 0 872ms
✅ SideloadedBookRegistryTests 14 14 0 56ms
✅ SideloadedLaneBridgeTests 6 6 0 90ms
✅ SideloadedLaneViewModelTests 7 7 0 640ms
✅ SignInFormPresentationTests 3 3 0 22ms
✅ SignInModalLifecycleTests 9 9 0 190ms
✅ SignInModalPredicateTests 3 3 0 44ms
✅ SignInModalSAMLOIDCTests 6 6 0 15ms
✅ SignInOAuthErrorPropagationTests 8 8 0 386ms
✅ SignInToReadFlowIntegrationTests 5 5 0 1.14s
✅ SignInWebSheetIntegrationTests 3 3 0 2m 1s
✅ SignInWebSheetViewModelTests 31 31 0 124ms
✅ SignOutCacheClearingTests 3 3 0 938ms
✅ SingletonResetRegistryTests 5 5 0 37ms
✅ SkeletonTests 22 22 0 771ms
✅ StatsViewModelTests 10 10 0 403ms
✅ StatusAnnouncementTests 22 22 0 1.40s
✅ StopPositionSaveTests 2 2 0 3ms
✅ StoreTests 5 5 0 110ms
✅ StreamingReaderPresentationContractTests 1 1 0 4ms
✅ StreamingReaderProgressStoreTests 7 7 0 73ms
✅ StreamingReaderViewControllerScrollRestoreTests 12 12 0 631ms
✅ StreamingReaderViewModelTests 9 9 0 86ms
✅ StringExtensionTests 8 8 0 36ms
✅ StringExtensionsTests 3 3 0 11ms
✅ StringHTMLEntitiesTests 7 7 0 36ms
✅ StringNYPLAdditionsTests 4 4 0 43ms
✅ String_NYPLAdditionsTests 4 4 0 50ms
✅ SupportSectionDecisionTests 5 5 0 182ms
✅ SyncConflictResolutionTests 3 3 0 2ms
✅ SyncDeletionGuardTests 5 5 0 37ms
✅ SyncDeletionRatioTests 6 6 0 8ms
✅ SyncPermissionTests 5 5 0 103ms
✅ TPPAccountAuthStateEnumTests 5 5 0 20ms
✅ TPPAccountListDataSourceTests 3 3 0 28ms
✅ TPPAdobeActivationSkipTests 6 6 0 215ms
✅ TPPAgeCheckCompletionTests 5 5 0 198ms
✅ TPPAgeCheckIsValidTests 5 5 0 105ms
✅ TPPAgeCheckStateMachineTests 4 4 0 560ms
✅ TPPAgeCheckTests 6 6 0 1.52s
✅ TPPAgeCheckVerifyDecisionTests 5 5 0 189ms
✅ TPPAlertUtilsTests 45 45 0 3.93s
✅ TPPAnnotationsHermeticTests 15 15 0 1.03s
✅ TPPAnnotationsOverrideTests 4 4 0 488ms
✅ TPPAnnotationsTests 29 29 0 2.66s
✅ TPPAnnouncementManagerTests 3 3 0 11ms
✅ TPPAuthDocumentContractTests 3 3 0 74ms
✅ TPPBackgroundExecutorTests 3 3 0 65ms
✅ TPPBadgeImageGapTests 2 2 0 9ms
✅ TPPBaseReaderViewControllerInitialLocationTests 10 10 0 57ms
✅ TPPBasicAuthTests 11 11 0 112ms
✅ TPPBookAccessibilityLabelTests 8 8 0 69ms
✅ TPPBookAuthorCoverageTests 3 3 0 2ms
✅ TPPBookAuthorTests 6 6 0 56ms
✅ TPPBookBearerTokenTests 9 8 0 508ms
✅ TPPBookButtonsStateTests 7 7 0 282ms
✅ TPPBookContentMetadataFilesHelperTests 9 9 0 123ms
✅ TPPBookContentTypeConverterStreamingHTMLTests 2 2 0 28ms
✅ TPPBookContentTypeConverterTests 4 4 0 368ms
✅ TPPBookContentTypeExtendedTests 4 4 0 25ms
✅ TPPBookContentTypeTests 14 14 0 43ms
✅ TPPBookCoverRegistryTests 17 17 0 721ms
✅ TPPBookCreationTests 7 7 0 33ms
✅ TPPBookExtensionsTests 21 21 0 70ms
✅ TPPBookIsDRMProtectedTests 9 9 0 500ms
✅ TPPBookLocationCoverageTests 7 7 0 5ms
✅ TPPBookLocationEdgeCaseTests 27 27 0 202ms
✅ TPPBookLocationKeyTests 3 3 0 7ms
✅ TPPBookLocationTests 11 11 0 59ms
✅ TPPBookModelGapTests 4 4 0 13ms
✅ TPPBookRegistryAsyncReadinessTests 3 3 0 161ms
✅ TPPBookRegistryAtomicWriteTests 7 7 0 2.30s
✅ TPPBookRegistryBookRetrievalTests 7 7 0 117ms
✅ TPPBookRegistryBookmarkTests 7 7 0 201ms
✅ TPPBookRegistryCorruptedDataTests 5 5 0 53ms
✅ TPPBookRegistryDataTests 4 4 0 47ms
✅ TPPBookRegistryDependencyTests 4 4 0 51ms
✅ TPPBookRegistryFulfillmentIdTests 4 4 0 58ms
✅ TPPBookRegistryLargeCorpusTests 5 5 0 1m 16s
✅ TPPBookRegistryLoadReentrancyTests 2 2 0 24ms
✅ TPPBookRegistryLocationTests 4 4 0 14.58s
✅ TPPBookRegistryMigrationTests 16 16 0 1.70s
✅ TPPBookRegistryPersistenceTests 10 10 0 2.05s
✅ TPPBookRegistryProcessingTests 2 2 0 19.20s
✅ TPPBookRegistryPublisherTests 6 6 0 94ms
✅ TPPBookRegistryRecordPersistenceTests 3 3 0 23ms
✅ TPPBookRegistryRecordTests 10 10 0 96ms
✅ TPPBookRegistryStateConcurrencyTests 2 2 0 86ms
✅ TPPBookRegistryStateManagementTests 11 11 0 86ms
✅ TPPBookRegistryThreadSafetyTests 3 3 0 385ms
✅ TPPBookRegistryUpdateAndRemoveTests 1 1 0 21ms
✅ TPPBookRequiresAdobeDRMTests 6 6 0 99ms
✅ TPPBookSerializationTests 13 13 0 127ms
✅ TPPBookStateInitializationTests 4 4 0 142ms
✅ TPPBookStateTests 4 4 0 6ms
✅ TPPBookTests 98 98 0 3.02s
✅ TPPBookmarkDeletionLogTests 11 11 0 84ms
✅ TPPBookmarkFactoryInitTests 2 2 0 8ms
✅ TPPBookmarkFactoryServerAnnotationEdgeCaseTests 5 5 0 4.09s
✅ TPPBookmarkFactoryTests 15 15 0 181ms
✅ TPPBookmarkR3ConversionTests 5 5 0 36ms
✅ TPPBookmarkR3LocationTests 13 13 0 84ms
✅ TPPBookmarkSpecTests 1 1 0 3ms
✅ TPPCachingTests 3 3 0 7ms
✅ TPPCapturedCredentialsTests 5 5 0 194ms
✅ TPPConfigurationCustomRegistryTests 16 16 0 50ms
✅ TPPConfigurationTests 22 22 0 212ms
✅ TPPContentTypeTests 9 9 0 137ms
✅ TPPCredentialConcurrencyTests 3 3 0 6ms
✅ TPPCredentialIsolationE2ETests 5 0 0 130ms
✅ TPPCredentialPersistenceTests 6 6 0 1.76s
✅ TPPCredentialSnapshotCoherenceTests 3 0 0 22ms
✅ TPPCredentialSnapshotTests 8 8 0 8ms
✅ TPPCredentialsCoverageTests 9 9 0 14ms
✅ TPPCredentialsTests 26 26 0 54ms
✅ TPPCrossLibrarySignOutTests 6 6 0 789ms
✅ TPPDRMFailureCredentialPreservationTests 4 4 0 136ms
✅ TPPErrorLoggerTests 27 27 0 3.70s
✅ TPPIdleSignOutRegressionTests 13 13 0 2.04s
✅ TPPJWKConversionTest 1 1 0 154ms
✅ TPPKeychainManagerTests 5 5 0 55ms
✅ TPPLastReadPositionPosterTests 13 13 0 383ms
✅ TPPLastReadPositionSynchronizerIntegrationTests 5 5 0 179ms
✅ TPPLastReadPositionSynchronizerTests 23 23 0 251ms
✅ TPPLastReadPositionSynchronizer_BehaviorDocumentationTests 5 5 0 1.34s
✅ TPPLastReadPositionSynchronizer_BookLocationTests 9 9 0 98ms
✅ TPPLastReadPositionSynchronizer_ConcurrencyTests 3 3 0 8ms
✅ TPPLastReadPositionSynchronizer_ReadiumBookmarkTests 9 9 0 105ms
✅ TPPLastReadPositionSynchronizer_SyncLogicTests 10 10 0 20ms
✅ TPPLastReadPositionSynchronizer_WriterDelegationTests 4 4 0 1.08s
✅ TPPLoginNoActivationTests 3 3 0 351ms
✅ TPPMainThreadCheckerTests 4 4 0 13ms
✅ TPPMigrationManagerTests 15 15 0 126ms
✅ TPPNetworkExecutorAPITests 14 14 0 125ms
✅ TPPNetworkExecutorConcurrencyTests 4 4 0 910ms
✅ TPPNetworkExecutorStubbedTests 17 17 0 573ms
✅ TPPNetworkExecutorTests 3 3 0 8ms
✅ TPPNetworkResponderAuthCoordinatorTests 5 5 0 1.06s
✅ TPPNetworkResponderSizeLimitTests 5 5 0 341ms
✅ TPPNetworkResponderTests 12 12 0 106ms
✅ TPPOPDSAcquisitionPathTests 5 5 0 67ms
✅ TPPOPDSEntryTests 5 5 0 178ms
✅ TPPOPDSFeedTests 3 3 0 61ms
✅ TPPOPDSGroupSwiftTests 3 3 0 178ms
✅ TPPOPDSLinkTests 7 7 0 23ms
✅ TPPOpenSearchDescriptionExpandedTests 10 10 0 125ms
✅ TPPOpenSearchDescriptionTests 1 1 0 4ms
✅ TPPPDFDocumentMetadataTests 15 15 0 72ms
✅ TPPPDFDocumentTests 8 8 0 263ms
✅ TPPPDFLocationCoverageTests 7 7 0 66ms
✅ TPPPDFLocationTests 10 10 0 141ms
✅ TPPPDFPageBookmarkTests 9 9 0 1.45s
✅ TPPPDFPageTests 5 5 0 18ms
✅ TPPPDFReaderModeTests 6 6 0 8ms
✅ TPPPDFReaderSearchBindingTests 3 3 0 4ms
✅ TPPPerAccountIsolationTests 8 0 0 791ms
✅ TPPPreferredAuthSelectionTests 8 8 0 441ms
✅ TPPProblemDocumentCacheManagerTests 12 12 0 100ms
✅ TPPProblemDocumentTests 21 21 0 1.46s
✅ TPPReaderAppearanceTests 4 4 0 6ms
✅ TPPReaderBlockNavigationTests 12 12 0 1.36s
✅ TPPReaderBookmarksBusinessLogicTests 12 12 0 1.28s
✅ TPPReaderBookmarksReadinessTests 2 2 0 72ms
✅ TPPReaderFontTests 4 4 0 15ms
✅ TPPReaderFootnoteAccessibilityTests 16 16 0 73ms
✅ TPPReaderPageListBusinessLogicTests 27 27 0 3.06s
✅ TPPReaderPositionReportTests 10 10 0 29ms
✅ TPPReaderPreferencesLoadTests 3 3 0 34ms
✅ TPPReaderSettingsTests 28 28 0 394ms
✅ TPPReaderTOCBusinessLogicTests 15 15 0 219ms
✅ TPPReaderTOCFlattenTests 2 2 0 116ms
✅ TPPReadiumBookmarkLocationMatchingTests 5 5 0 6ms
✅ TPPReadiumBookmarkTests 23 23 0 194ms
✅ TPPReauthenticatorMockTests 2 2 0 5ms
✅ TPPReauthenticatorTests 4 4 0 17ms
✅ TPPReturnPromptHelperTests 5 5 0 17ms
✅ TPPSAMLCookieExpirationTests 7 7 0 69ms
✅ TPPSAMLFlowTests 10 10 0 3.07s
✅ TPPSAMLReauthFlowTests 2 2 0 125ms
✅ TPPSAMLRegressionTests 4 4 0 231ms
✅ TPPSAMLSignInTests 26 26 0 15.29s
✅ TPPSAMLStateIsolationTests 4 4 0 192ms
✅ TPPSAMLStateMachineTests 6 6 0 468ms
✅ TPPSettingsTests 6 6 0 22.89s
✅ TPPSignInAdobeSkipTests 14 14 0 594ms
✅ TPPSignInAuthStateTransitionTests 3 3 0 109ms
✅ TPPSignInBusinessLogicExtendedTests 58 58 0 2.30s
✅ TPPSignInBusinessLogicOAuthTests 11 11 0 1.23s
✅ TPPSignInBusinessLogicSignOutTests 11 11 0 1.46s
✅ TPPSignInBusinessLogicStateMachineTests 10 10 0 427ms
✅ TPPSignInBusinessLogicTests 18 18 0 2.13s
✅ TPPSignInBusinessLogicTokenFlowTests 3 3 0 481ms
✅ TPPSignInBusinessLogicValidationCallbackOrderTests 2 2 0 122ms
✅ TPPSignInErrorHandlingTests 2 2 0 94ms
✅ TPPSignInProfileDocEdgeCaseTests 3 3 0 200ms
✅ TPPSignedInStateProviderTests 3 3 0 9ms
✅ TPPUserAccountAuthStateTests 6 6 0 5ms
✅ TPPUserAccountConcurrencyTests 1 1 0 2ms
✅ TPPUserAccountGapTests 4 4 0 11ms
✅ TPPUserAccountIsolationLintTests 3 3 0 547ms
✅ TPPUserAccountTestFactoryTests 7 0 0 395ms
✅ TPPUserFriendlyErrorTests 11 11 0 9ms
✅ TPPUserNotificationsTests 10 10 0 293ms
✅ TPPXMLSwiftTests 16 16 0 32ms
✅ TPPXMLTests 3 3 0 7ms
✅ TabBarModernizationTests 8 8 0 51ms
✅ TearDownRequiredLintTests 5 5 0 2.08s
✅ TestAppContainerFactoryTests 5 5 0 709ms
✅ TestTargetHermeticityRegressionTests 4 3 0 332ms
✅ TimeEntryTests 3 3 0 16ms
✅ TokenRefreshAndRetryQueueTests 9 9 0 5.00s
✅ TokenRefreshIntegrationTests 2 2 0 5.19s
✅ TokenRefreshInterceptorAuthCoordinatorTests 8 8 0 105ms
✅ TokenRefreshInterceptorTests 24 24 0 250ms
✅ TokenRefreshOnForegroundTests 10 10 0 2.23s
✅ TokenRefreshTests 25 25 0 1.04s
✅ TokenRefreshWatchdogTests 5 5 0 29ms
✅ TokenRequestCredentialGuardTests 13 13 0 176ms
✅ TokenRequestTests 11 11 0 356ms
✅ TokenResponseTests 21 21 0 730ms
✅ TriageBotKeyAdminTests 4 4 0 8ms
✅ TypographyPresetTests 21 21 0 181ms
✅ TypographyServiceTests 31 31 0 725ms
✅ TypographySettingsViewModelTests 27 27 0 3.36s
✅ UIAlertCACommitGuardTests 9 9 0 569ms
✅ UIColor_NYPLAdditionsTests 1 1 0 <1ms
✅ URLBackupExclusionTests 3 3 0 38ms
✅ URLExtensionTests 16 16 0 27ms
✅ URLExtensionsTests 11 11 0 25ms
✅ URLRequestExtensionsCoverageTests 3 3 0 23ms
✅ URLRequestExtensionsTests 11 11 0 28ms
✅ URLRequestNYPLAdditionsTests 11 11 0 88ms
✅ URLRequest_NYPLTests 1 1 0 <1ms
✅ URLResponseAuthenticationTests 10 10 0 24ms
✅ URLResponseNYPLTests 14 14 0 83ms
✅ URLSessionCredentialStorageTests 3 3 0 82ms
✅ URLSessionStubbingResetTests 2 2 0 20ms
✅ URLTypeTests 2 2 0 9ms
✅ URLValidationTests 5 5 0 237ms
✅ UnifiedOPDSServiceStateMachineTests 2 2 0 83ms
✅ UserAccountPublisherAuthStateTests 5 5 0 10ms
✅ UserAccountPublisherTests 14 14 0 327ms
✅ UserAccountValidationTests 11 11 0 600ms
✅ UserDefaultsIsolationLintTests 2 2 0 811ms
✅ UserProfileDocumentTests 7 7 0 89ms
✅ UserRetryTrackerTests 10 10 0 40ms
✅ XCTestCase_testUserDefaultsTests 3 3 0 26ms
✅ iPadOnMacRMSDKGuardTests 7 7 0 28ms

📊 Testing Coverage Breakdown

Unit Test Line Coverage (testable surfaces): 45.5%

Total coverage incl. UI/lifecycle: 44.5% (17 files excluded from testable denominator — see scripts/coverage-exclude.json)

Target Lines Covered
Palace.app 44.5%

Why two coverage numbers? Testable coverage subtracts files that can't be exercised from xcodebuild — SwiftUI views, UIKit VCs, lifecycle (see scripts/coverage-exclude.json) — so raising it means more testable logic is tested, not that we shipped less UI. Total coverage is kept for continuity. The excluded paths are covered by simdrive E2E journeys (see chaos-replay-on-pr.yml).


🔗 Interactive HTML Report | CI Run Details

📦 Downloadable Artifacts
Artifact Description
test-report 📄 Markdown + HTML reports
test-data 📊 JSON data for tooling
test-results 🔍 Full xcresult (open in Xcode)

t added 2 commits July 21, 2026 15:31
… (broke behavior)

The mybooks batch's join conversion of DownloadAuthRetryHandlerTests asserted
before the alert-publish/retry-download effect landed → 2 deterministic failures
(testAutoBorrowCompletion_whenBorrowFails, testHandle_401_withoutCredentials).
This class's async structure was flagged partial/complex; reverting its de-flake
(+ the prod seam) to develop's correct version is safer than shipping a broken
money-path join. The class may still occasionally flake under parallel load
(pre-existing) — that's a separate, non-regressing follow-up.

**Scope:** revert 3 files to develop; rest of the sweep unchanged.
@mauricecarrier7
mauricecarrier7 merged commit c04219b into develop Jul 21, 2026
4 checks passed
mauricecarrier7 pushed a commit that referenced this pull request Jul 22, 2026
…efresh async tests

Parallel-CI-clone starvation de-flake (continuation of #1319). Under CI's 2 sim
clones, tests that poll a fire-and-forget async op on a fixed wall-clock deadline
lose the CPU race and fail all 3 retries. Convert each to a deterministic JOIN
that awaits the ACTUAL async work — no clock, cannot starve.

- AccountsManager.swift: add an XCTest-gated first-run-task registry +
  `_awaitAllCrawlTasksForTesting()` join seam (mirrors the existing
  `_trackCrawlTask`/`fetchFromNetworkCountForTesting` conventions). Joins ONLY the
  first-run task (bundled decode → synchronous fetchFromNetwork kickoff), not the
  downstream live network crawl. Lock snapshot split into a synchronous helper
  (NSLock.lock/unlock are banned in async contexts under Swift 6).
- AccountsManagerFirstRunDecodeTests: 3 tests → async + await the seam (was
  RunLoop/wait(for:timeout:5)).
- CatalogRepositoryStaleWhileRevalidateTests: concurrent-reads test now joins
  BOTH background refreshes via _awaitAllBackgroundRefreshesForTesting() (was
  racily joining only the last-scheduled handle).
- TokenRefreshAndRetryQueueTests: every fire-and-forget refresh/retry wait → a
  semaphore signalled at the exact event, bridged to async off the cooperative
  pool via withCheckedContinuation + DispatchQueue.global (Task.detached's
  closure is itself async, so sem.wait() there is a Swift 6 error).

**Scope:** test-hermeticity + one XCTest-gated production seam on AccountsManager
(RELEASE byte-identical — the tracking arrays only populate under XCTest, the
join seam is the only consumer and production never calls it; verified
_trackCrawlTask is also XCTest-gated so the call-site swap is a no-op in RELEASE).
**Not done:** TokenRefreshInterceptorAuthCoordinatorTests (confirmed same
timing/join class, fix in a follow-up commit this session).
**Deferred:** the broader 135-file deadline-poll surface — only the observed-failing
tests are converted; more may surface per CI run and get the same treatment.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
mauricecarrier7 added a commit that referenced this pull request Jul 23, 2026
…k-wait conversions (#1331)

* [swarm_ad0b4c65] swarm scaffold: wall-clock-wait elimination plan + manifest

Architect triage of the ~675-wait-token population: collapses to 12 new
XCTest-gated Task-join seams across 16 contracts in 3 waves. Correctness
over volume — no bounded wait replaced by an unbounded await.

**Scope:** swarm scaffolding only (plan + manifest); per-module contracts,
implementer diffs, and integration land in subsequent commits on this branch.
**Not done:** the 16 per-module contract bodies + any code — pending user GO.

* [swarm_ad0b4c65] wave-1 infra contracts: S1/S2 registry, S3 network, S4/S11 download

**Scope:** the 3 critical-path wave-1 seam contracts only (prod-only, no test
files). Wave-2/3 contracts authored after wave-1 seams land (so they cite real
signatures).
**Not done:** wave-2/3 module contracts + all call-site conversions.

* [swarm_ad0b4c65] wave-1 infra seams: S1/S2 registry, S3 network, S4/S11 download

Adds deterministic, XCTest-gated Task-join / barrier-drain seams so Wave-2 test
conversions can await fire-and-forget async work instead of wall-clock polling.
BUILD SUCCEEDED on the Palace target (iPhone 16 Pro sim).

- S1 BookRegistryStore._awaitPendingWritesForTesting — trailing-barrier drain
  (concurrent-queue .barrier ⇒ always drains; no handle await).
- S2 TPPBookRegistry._awaitPendingWritesForTesting — forwards to S1 + one main hop;
  skips the intrinsic switch-back debounce.
- S3 TPPNetworkExecutor/Responder._awaitInFlightForTesting — grow-until-stable
  join over the completion Tasks fired off the URLSession delegate queue;
  terminal synchronous completion + watchdog deliberately not retained.
- S4 MyBooksDownloadCenter._awaitDownloadDispatchForTesting — grow-until-stable
  join over all 14 fire-and-forget Task spawns (retention gated by XCTest).
- S11 DownloadProgressPublisher throttle interval made injectable (prod default
  0.5s unchanged; RELEASE byte-identical).

All retention arrays populated ONLY under _isRunningUnderXCTest; RELEASE spawns
identical work and never reads/populates them. Every seam is BOUNDED — a barrier
that always drains or a retained Task that completes; no bare never-resuming
await, no added sleep/poll/Date/Timer; NSLock never held across a suspension.

**Scope:** wave-1 production seams only (6 files); no test files change here.
**Not done:** wave-2/3 module contracts + the ~550-620 call-site conversions
that consume these seams; those land in subsequent commits after per-contract
CI verification.

* [swarm_ad0b4c65] wave-2 conversion playbook (seam catalog + bounded-await rule + bucket protocol)

**Scope:** the shared wave-2 playbook only.
**Not done:** the 12 module conversions.

* [swarm_ad0b4c65] wave-2: land validated S1/S2 conversions; drop S3/S4/S11 (no/broken consumers)

Wave-2 fanned 12 module agents over the full PalaceTests suite to convert
wall-clock/deadline-poll waits to the wave-1 seams. Honest outcome: the
"~675 sites" premise was a mismeasure — most waits are already-converted (prior
#1319 sweep) or legitimate KEEP (bounded by a direct synchronous injected-mock
callback, the correct pattern). Real net-new conversions concentrate in the
registry seams.

LANDED (verified green — 161 tests, 0 failures on iPhone 16 Pro sim):
- S1 BookRegistryStore._awaitPendingWritesForTesting + S2 TPPBookRegistry (kept
  from the wave-1 commit) — ~51 real consumers across Book + BookRegistry.
- Converted: Book (BookRegistryStoreTests, BookRegistrySyncTests),
  BookRegistry (7 files), BookStateManagement (BookCellModelStateTests) — all
  wait(for:)/waitForExpectations on registry fire-and-forget writes → the S1/S2
  barrier-drain seams; async-context DispatchGroup waits use `await fulfillment`.
- Accounts (AccountsManagerTests, AccountsManagerStateMachineWiringTests) —
  6 conversions using EXISTING primitives (drainMainQueue / awaitCondition),
  no production seam; deleted a global().asyncAfter settle-pad + a Thread.sleep poll.

DROPPED (this commit reverts the wave-1 seams that didn't earn their place):
- S3 TPPNetworkExecutor/Responder._awaitInFlightForTesting — 1 consumer, and that
  conversion FAILED (testSessionInvalidationCallsPendingCompletionsWithCancelError:
  seam join returned without the cancellation completion). Marginal + broken → out.
- S4 MyBooksDownloadCenter + S11 DownloadProgressPublisher — 0 consumers
  (MyBooks tests use synchronous mocks per "never hit real singletons"). Unused
  test-only production surface is a blast-radius liability → out.

The 8 other modules correctly produced 0 conversions (already-done / legit KEEP /
UNMAPPED-needs-unbuilt-seam). UNMAPPED clusters flagged for a possible targeted
Wave 3: HoldsViewModel debounce (15), OfflineQueueService (12), AudiobookLoader
(5), BookmarkManager.waitForBarrier (~20), SignInLogic main-hops (46, mostly
drainMainQueueAsync-able). Full per-module transcripts under transcripts/.

**Scope:** S1/S2 registry seams + ~57 verified test-only conversions; drop
S3/S4/S11.
**Not done:** Wave-3 targeted seams (Holds/OfflineQueue) — deferred, pending a
decision they're worth the production surface. The remaining raw wait-token count
is intentional (legitimate KEEP), not a silent cap.

---------

Co-authored-by: t <t@t.io>
mauricecarrier7 added a commit that referenced this pull request Jul 23, 2026
…starvation (#1328)

Prevents reintroduction of recurrence class `parallel-clone-starvation`
(docs/regressions/recurrence-classes.md, fixed in #1319/#1321): tests that wait
on fire-and-forget async via a fixed wall-clock deadline
(fulfillment(of:timeout:), wait(for:timeout:), waitForExpectations(timeout:))
lose the CPU race under the 2 parallel sim clones on the CI macOS runner and fail
all 3 -retry-tests-on-failure iterations because the load persists across
iterations.

Three coordinated changes:

1. docs/Testing/Test_Patterns.md 10.1 — the old "Good" example WAS the
   anti-pattern (await fulfillment(of:[e], timeout: 5.0)). Rewrote it to explain
   the starvation failure mode and present the deterministic Task-join seam as
   the fix, with a before/after and the three real seams in the tree
   (AccountsManager._awaitAllCrawlTasksForTesting,
   CatalogRepository._awaitAllBackgroundRefreshesForTesting,
   TokenRefreshInterceptor._awaitAuthDispatchForTesting).

2. scripts/lint-test-quality.py — new STARVE-001 rule flagging NEW deadline-poll
   waits, DIFF-SCOPED to ADDED lines only (--diff <path|-> / --changed [BASE])
   so it never chokes on the ~675 legacy occurrences. Per-line // STARVE-001-OK
   escape hatch. Updated FLAKE-001 remediation text to stop recommending the
   XCTestExpectation deadline pattern and point at the Task-join seam. Existing
   rules and the full-scan exit behavior are untouched; STARVE-001 never runs in
   full-scan mode.

3. .github/workflows/tooling-checks.yml — new diff-scoped ubuntu `flake-lint`
   job runs the gate against the PR's base branch (fetch-depth: 0 + base fetch),
   failing the PR on a new deadline-poll. No Xcode/sim needed (~seconds).

Verification (green-board contract):
- scripts/tests/test_lint_test_quality.py (new, 16 tests): violation-path fires
  on all three deadline shapes; CLEAN-DIFF pass asserted (Task-join seam + pure
  sync); scoping guards (context lines, comments, allow-list, non-test paths);
  parser unit tests; existing MISSING-001 full-scan still fires and STARVE-001
  never leaks into full-scan; --changed git entry point end-to-end (flag +
  clean). 339/339 in scripts/tests/ pass.
- Dry-run `--changed origin/develop` on this branch: 0 findings (this PR adds no
  test files). Over a real 40-commit range: 30 true-positive historical adds, 0
  false positives, no crash.
- tooling-checks.yml parses (2 jobs); linter py_compiles; verify-pr.sh's
  --per-file invocation is unaffected by the new early-return modes.

**Scope:** CI-gating infra only — docs + Python linter + one CI job + its
pytest. No production Swift changed; the three cited Task-join seams already
exist on develop and are referenced, not modified.

**Not done:** the ~675 legacy deadline-poll occurrences are intentionally NOT
migrated here (added-line scoping keeps the board green); STARVE-001 is not
wired into the pre-commit hook (CI-gate only, by design). Migration of legacy
polls is separate follow-up work.


Claude-Session: https://claude.ai/code/session_016P51JUco66jhqqYE85XUvZ

Co-authored-by: t <t@t.io>
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign up for free to 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.

1 participant